diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..6ab0888f4b --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +* @krille-chan +pubspec.* @dependabot +lib/l10n/*.arb @weblate \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..402c3c7cf3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,13 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: krille +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: KrilleChritzelius +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..d241cf9181 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,73 @@ +name: 🐛 Bug report +description: Create a report to help us improve +labels: bug +body: + - type: textarea + id: bug-description + attributes: + label: "Bug Description" + description: "A clear and concise description of what the bug is. Please add screenshots if you have as they usually help us a lot." + placeholder: "Describe the bug here..." + validations: + required: true + - type: textarea + id: reproduce-steps + attributes: + label: "Steps to Reproduce" + description: "Steps to reproduce the behavior:" + placeholder: "1. Go to '...'\n2. Click on '...'\n3. Scroll down to '...'\n4. See error" + validations: + required: true + - type: textarea + id: expected-behavior + attributes: + label: "Expected Behavior" + description: "A clear and concise description of what you expected to happen." + placeholder: "Describe what you expected to happen here..." + validations: + required: true + - type: input + id: app-version + attributes: + label: "App Version" + description: "Please provide the version of the app you are using." + placeholder: "e.g. 1.12.0" + validations: + required: true + - type: dropdown + id: platform + attributes: + label: "Platform" + description: "Select the platform where the bug occurs." + options: + - Android (PlayStore) + - Android (F-Droid) + - Android (Other) + - iOS (iPhone) + - iOS (iPad) + - Web (Chrome(ium)) + - Web (Firefox) + - Web (Safari) + - Linux (Snap) + - Linux (Flatpak) + - Linux (Other) + - macOS (iOS/iPadOS version) + - macOS (Self-compiled) + - Windows (Self-compiled) + validations: + required: true + - type: input + id: platform-info + attributes: + label: "Additional Platform Information" + description: "Please provide the following information:" + placeholder: "Device: [e.g. iPhone6, PC, Pixel 3]\nOS: [e.g. iOS, Android, Windows, Linux, macOS]\nBrowser (if applicable): [e.g. Chrome, Safari]" + validations: + required: true + - type: textarea + id: additional-context + attributes: + label: "Additional Context" + description: "Add any other context about the problem here." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..ddcf8edba3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: 👬 FluffyChat Community + url: https://matrix.to/#/#fluffy-space:matrix.org + about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000000..4007c88370 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,34 @@ +name: 💡 Feature Request +description: Suggest an idea for this project +labels: enhancement +body: + - type: textarea + id: feature-description + attributes: + label: "Feature Description" + description: "Provide a clear and concise description of the feature." + placeholder: "Describe the feature here..." + validations: + required: true + - type: textarea + id: rationale + attributes: + label: "Rationale" + description: "Explain why this feature should be added." + placeholder: "Describe the rationale for the feature here..." + validations: + required: true + - type: textarea + id: mockup + attributes: + label: "Mockup" + description: "If applicable, add any visual mock-ups of the feature." + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: "Additional Context" + description: "Add any other context or screenshots about the feature request here." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/issue_pr_management.yml b/.github/ISSUE_TEMPLATE/issue_pr_management.yml new file mode 100644 index 0000000000..3a75092367 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue_pr_management.yml @@ -0,0 +1,27 @@ +name: Close Inactive Issues And PRs +on: + schedule: + - cron: "30 1 * * *" + +jobs: + close-issues: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/stale@v9 + with: + days-before-issue-stale: 365 + days-before-issue-close: 14 + stale-issue-label: "stale" + stale-issue-message: "This issue is stale because it has been open for 365 days with no activity." + close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale." + stale-pr-message: "This pull request is stale because it has been open for 365 days with no activity." + close-pr-message: "This pull request was closed because it has been inactive for 14 days since being marked as stale." + days-before-pr-stale: 365 + days-before-pr-close: 14 + exempt-milestones: true + exempt-assignees: krille-chan + operations-per-run: 500 + repo-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/test_report.md b/.github/ISSUE_TEMPLATE/test_report.md new file mode 100644 index 0000000000..fb97739bea --- /dev/null +++ b/.github/ISSUE_TEMPLATE/test_report.md @@ -0,0 +1,44 @@ +--- +name: 📝 Test +about: A detailed protocol for testing all features +title: 'Test Report' +labels: test +--- + +1. App receives push notifications over Firebase Cloud Messaging when it is in background/terminated: + - [ ] Android + - [ ] iOS +2. App receives push notifications over Unified Push when it is in background/terminated: + - [ ] Android +3. Notifications for rooms, which are not in foreground, are working: + - [ ] Web + - [ ] Linux +4. QR Code scanner can still scan links to start a new chat: + - [ ] Android + - [ ] iOS +5. Recording and playing voice messages works: + - [ ] Android + - [ ] iOS + - [ ] Web (play only) +6. Sending and downloading files/images works: + - [ ] Android + - [ ] iOS + - [ ] Web + - [ ] Linux +7. Sharing texts/files/images from other apps to FluffyChat works: + - [ ] Android + - [ ] iOS +8. Login with single sign on works: + - [ ] Android + - [ ] iOS + - [ ] Web + - [ ] Linux +9. Test if the app lock works as intended and appears on opening/resuming the app: + - [ ] Android + - [ ] iOS +10. Drag&Drop to send a file into a chat still works: + - [ ] Web + - [ ] Linux +11. Deeplinks are still working? https://matrix.to/#/@krille:janian.de + - [ ] Android + - [ ] iOS \ No newline at end of file diff --git a/.github/actions/free_up_space/action.yaml b/.github/actions/free_up_space/action.yaml new file mode 100644 index 0000000000..abe2c4b550 --- /dev/null +++ b/.github/actions/free_up_space/action.yaml @@ -0,0 +1,50 @@ +name: "Free up space" + +inputs: + target: + required: true + +runs: + using: "composite" + steps: + - name: Free up space + shell: bash + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /usr/local/share/boost + sudo rm -rf /usr/local/share/chromium + sudo rm -rf /usr/local/share/powershell + sudo rm -rf /usr/local/share/vcpkg + sudo rm -rf /usr/local/share/miniconda + sudo rm -rf /opt/ghc + sudo rm -rf /opt/hostedtoolcache/CodeQL + sudo rm -rf /opt/hostedtoolcache/go + sudo rm -rf /opt/hostedtoolcache/Python + sudo rm -rf /opt/hostedtoolcache/node + sudo rm -rf /opt/hostedtoolcache/R + sudo rm -rf /opt/hostedtoolcache/Java + sudo rm -rf /opt/hostedtoolcache/LLVM + sudo rm -rf /opt/hostedtoolcache/Swift + sudo rm -rf /opt/hostedtoolcache/Php + sudo rm -rf /opt/hostedtoolcache/Perl + sudo rm -rf /opt/hostedtoolcache/Scala + sudo rm -rf /opt/hostedtoolcache/Julia + sudo rm -rf /opt/hostedtoolcache/Mono + sudo rm -rf /opt/hostedtoolcache/PowerShell + sudo rm -rf /opt/hostedtoolcache/Crystal + sudo rm -rf /opt/hostedtoolcache/Elixir + sudo rm -rf /opt/hostedtoolcache/Erlang + sudo rm -rf /opt/hostedtoolcache/FSharp + sudo rm -rf /opt/hostedtoolcache/Haskell + sudo rm -rf /opt/hostedtoolcache/OCaml + sudo rm -rf /opt/hostedtoolcache/Sbt + sudo rm -rf /opt/hostedtoolcache/Solidity + sudo rm -rf /opt/hostedtoolcache/VisualStudio + sudo rm -rf /opt/hostedtoolcache/WinAppDriver + sudo rm -rf /opt/hostedtoolcache/Xamarin + sudo rm -rf /opt/hostedtoolcache/Yarn + sudo rm -rf /opt/hostedtoolcache/Zephyr + sudo rm -rf /opt/hostedtoolcache/zig + sudo rm -rf /opt/hostedtoolcache/zulu + sudo rm -rf /opt/hostedtoolcache/azcopy + echo "export CARGO_BUILD_JOBS=1" >> $GITHUB_ENV diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..37557f77eb --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,23 @@ +version: 2 +updates: + - package-ecosystem: "pub" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "*" + commit-message: + prefix: "build: " + include: "scope" + assignees: + - "krille-chan" + open-pull-requests-limit: 5 + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + allow: + - dependency-name: "*" + commit-message: + prefix: "build: " + include: "scope" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..26504d6575 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,12 @@ +- [ ] I have read and understood the [contributing guidelines](https://github.com/krille-chan/fluffychat/blob/main/CONTRIBUTING.md). + +### Pull Request has been tested on: + +- [ ] Android +- [ ] iOS +- [ ] Browser (Chromium based) +- [ ] Browser (Firefox based) +- [ ] Browser (WebKit based) +- [ ] Desktop Linux +- [ ] Desktop Windows +- [ ] Desktop macOS \ No newline at end of file diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml new file mode 100644 index 0000000000..55e577882b --- /dev/null +++ b/.github/workflows/integrate.yaml @@ -0,0 +1,230 @@ +name: Pull Request Workflow + +on: + pull_request: + merge_group: + +jobs: + code_tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: webiny/action-conventional-commits@v1.4.2 + - name: Check licenses + uses: fsfe/reuse-action@v6 + - run: ./scripts/generate-locale-config.sh + - run: git diff --exit-code + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - name: Check for empty translations + run: | + if grep -rn '": ""' lib/l10n/*.arb; then + echo "❌ Found empty translation strings." + exit 1 + fi + - run: flutter pub get + - name: Check if pubspec.lock is up to date + run: git diff --exit-code pubspec.lock + - name: Check formatting + run: dart format lib/ test/ --set-exit-if-changed + - name: Check license compliance + run: dart run license_checker check-licenses -c licenses.yaml --problematic + - name: Check for unused translations + run: | + dart pub global activate sweeper + dart pub global run sweeper check + - run: flutter analyze + - name: Search unused dependencies + run: | + dart pub global activate dependency_validator + dart pub global run dependency_validator + - run: dart run dart_code_linter:metrics analyze lib --reporter=github + - run: dart run dart_code_linter:metrics check-unused-code lib + - run: dart run dart_code_linter:metrics check-unused-files lib + - run: dart run dart_code_linter:metrics check-unused-l10n lib + - name: Check for commented-out Dart code with semicolons + run: | + if grep -R --include="*.dart" -nE '^[[:space:]]*//[^/<].*;[[:space:]]*$' lib/; then + echo "" + echo "❌ Found commented-out Dart code ending with semicolon." + exit 1 + fi + - name: Add Firebase Messaging + run: ./scripts/add-firebase-messaging.sh + - run: flutter analyze + - run: flutter test + + build_debug_apk: + needs: [ code_tests ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/free_up_space + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - uses: dtolnay/rust-toolchain@stable + - name: Cache Gradle + uses: actions/cache@v6 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: gradle-${{ runner.os }}- + - run: ./scripts/add-firebase-messaging.sh + - run: flutter build apk --debug --target-platform android-x64 + - name: Upload Debug APK + uses: actions/upload-artifact@v7 + with: + name: debug-apk-x64 + path: build/app/outputs/flutter-apk/app-debug.apk + + build_debug_web: + needs: [ code_tests ] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - uses: dtolnay/rust-toolchain@stable + - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - run: flutter build web + - name: Upload Web Build + uses: actions/upload-artifact@v7 + with: + name: Web Build + path: build/web + + build_debug_linux: + needs: [ code_tests ] + strategy: + matrix: + arch: [ x64, arm64 ] + runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}} + steps: + - uses: actions/checkout@v7 + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV + - name: Install Flutter + run: | + git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git + ./flutter/bin/flutter doctor + - uses: dtolnay/rust-toolchain@stable + - run: ./flutter/bin/flutter pub get + - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} + + build_debug_ios: + needs: [ code_tests ] + runs-on: macos-15 + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - name: Use specific XCode version + run: sudo xcode-select --switch /Applications/Xcode_26.3.app + - run: brew install sqlcipher + - uses: dtolnay/rust-toolchain@stable + - run: ./scripts/add-firebase-messaging.sh + - run: flutter pub get + - run: flutter build ios --no-codesign + - name: Ensure that iOS build files are up to date in git + run: | + git diff --quiet -- ios/ || exit 1 + + integration_test: + runs-on: ubuntu-latest + timeout-minutes: 60 + needs: [ code_tests ] + strategy: + matrix: + api-level: [34] + env: + ANDROID_USER_HOME: /home/runner/.android + ANDROID_EMULATOR_HOME: /home/runner/.android + ANDROID_AVD_HOME: /home/runner/.android/avd + AVD_CONFIG_PATH: "~/.android/avd/test.avd/config.ini" + steps: + - uses: actions/checkout@v7 + - uses: ./.github/actions/free_up_space + # https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-hosted-runners/ + - name: Enable KVM group perms + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: AVD cache + uses: actions/cache@v6 + id: avd-cache + with: + path: ~/.android/* + key: avd-${{ matrix.api-level }}-integration_docker + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86_64 + cores: 16 + ndk: 28.2.13676358 + force-avd-creation: false + disk-size: 4096M + ram-size: 4096M + sdcard-path-or-size: 4096M + emulator-options: -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: | + cat ${{ env.AVD_CONFIG_PATH }} + + sed -i.bak 's/hw.lcd.density = .*/hw.lcd.density=420/' ${{ env.AVD_CONFIG_PATH }} + sed -i.bak 's/hw.lcd.height = .*/hw.lcd.height=1920/' ${{ env.AVD_CONFIG_PATH }} + sed -i.bak 's/hw.lcd.width = .*/hw.lcd.width=1080/' ${{ env.AVD_CONFIG_PATH }} + + if ! grep -q "hw.lcd.density" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.density = 420" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi + if ! grep -q "hw.lcd.height" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.height = 1920" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi + if ! grep -q "hw.lcd.width" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.width = 1080" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi + + echo "Emulator settings (${{ env.AVD_CONFIG_PATH }})" + cat ${{ env.AVD_CONFIG_PATH }} + echo "Generated AVD snapshot for caching." + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - uses: dtolnay/rust-toolchain@stable + - name: Cache Gradle + uses: actions/cache@v6 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: gradle-${{ runner.os }}- + - name: Prepare Homeserver + run: ./scripts/prepare_integration_test.sh + - name: Integration tests + id: integration_tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86_64 + cores: 16 + ndk: 28.2.13676358 + force-avd-creation: false + disk-size: 4096M + ram-size: 4096M + sdcard-path-or-size: 4096M + emulator-options: -no-snapshot-save -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: flutter test integration_test/mobile_test.dart \ No newline at end of file diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml new file mode 100644 index 0000000000..6e88188bfd --- /dev/null +++ b/.github/workflows/main_deploy.yaml @@ -0,0 +1,81 @@ +name: Main Deploy Workflow + +on: + push: + branches: + - main + workflow_dispatch: + +concurrency: + group: main_deploy + cancel-in-progress: true + +jobs: + deploy_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + - uses: dtolnay/rust-toolchain@stable + - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu + - name: Prepare web + run: ./scripts/prepare-web.sh + - run: rm ./assets/vodozemac/.gitignore + - run: flutter pub get + - name: Build Release Web + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/nightly/" + - run: mv build/web/ public + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + destination_dir: nightly + + deploy_playstore_internal: + runs-on: ubuntu-latest + concurrency: + group: deploy_playstore + queue: max + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + - uses: ./.github/actions/free_up_space + - uses: dtolnay/rust-toolchain@stable + - name: Install Fastlane + run: gem install fastlane -NV + - name: Add Firebase Messaging + run: | + echo '${{secrets.GOOGLE_SERVICES_JSON}}' | base64 -d > android/app/google-services.json + ./scripts/add-firebase-messaging.sh + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - name: Build Android Release + run: flutter build appbundle --target-platform android-arm,android-arm64 + - name: Set changelog + working-directory: android/fastlane/metadata/android/en-US/changelogs + run: git log --no-merges -1 --pretty=%B > default.txt + - name: Deploy Android Release + run: | + mkdir -p build/android + cp build/app/outputs/bundle/release/app-release.aab build/android/ + cd android + bundle install + bundle update fastlane + bundle exec fastlane deploy_internal_test + cd .. diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml new file mode 100644 index 0000000000..f1583f11ab --- /dev/null +++ b/.github/workflows/matrix_notify.yaml @@ -0,0 +1,60 @@ +name: Matrix Notification + +on: + issues: + types: [opened] + pull_request_target: + types: [opened] + +jobs: + notify: + if: ${{ (github.event_name == 'issues' && github.event.issue.user.login != 'krille-chan') || (github.event_name == 'pull_request_target' && github.event.pull_request.user.login != 'krille-chan') }} + runs-on: ubuntu-latest + steps: + - name: Send notification to Matrix room + env: + HOMESERVER: ${{ secrets.MATRIX_HOMESERVER }} + ACCESS_TOKEN: ${{ secrets.MATRIX_ACCESS_TOKEN }} + ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }} + EVENT_NAME: ${{ github.event_name }} + ISSUE_TITLE: ${{ github.event.issue.title }} + ISSUE_URL: ${{ github.event.issue.html_url }} + ISSUE_LABELS: ${{ join(github.event.issue.labels.*.name, ', ') }} + ISSUE_AUTHOR: ${{ github.event.issue.user.login }} + PR_TITLE: ${{ github.event.pull_request.title }} + PR_URL: ${{ github.event.pull_request.html_url }} + PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ', ') }} + PR_AUTHOR: ${{ github.event.pull_request.user.login }} + run: | + if [ "${EVENT_NAME}" = "issues" ]; then + EMOJI="📝" + PREFIX="New Issue" + TITLE="${ISSUE_TITLE}" + URL="${ISSUE_URL}" + LABELS="${ISSUE_LABELS}" + AUTHOR="${ISSUE_AUTHOR}" + else + EMOJI="🔀" + PREFIX="New Pull Request" + TITLE="${PR_TITLE}" + URL="${PR_URL}" + LABELS="${PR_LABELS}" + AUTHOR="${PR_AUTHOR}" + fi + + AUTHOR_URL="https://github.com/${AUTHOR}" + PLAIN="${EMOJI} ${PREFIX} by ${AUTHOR}: ${TITLE} - ${URL}" + HTML="

${EMOJI} ${PREFIX}

" + HTML="${HTML}${TITLE}
" + HTML="${HTML}👤 ${AUTHOR}" + if [ -n "${LABELS}" ]; then + HTML="${HTML}
🏷️ ${LABELS}" + fi + TXN_ID=$(date +%s%N) + + curl -s -o /dev/null -w "%{http_code}" -X PUT \ + "${HOMESERVER}/_matrix/client/v3/rooms/${ROOM_ID}/send/m.room.message/${TXN_ID}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "$(jq -n --arg body "$PLAIN" --arg html "$HTML" \ + '{"msgtype":"m.notice","body":$body,"format":"org.matrix.custom.html","formatted_body":$html}')" \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000000..16e217d938 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,214 @@ +name: Release Workflow + +on: + release: + types: + - created + +concurrency: + group: release_workflow + cancel-in-progress: true + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build_web: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - uses: dtolnay/rust-toolchain@stable + - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu + - run: flutter pub get + - name: Prepare web + run: ./scripts/prepare-web.sh + - run: rm ./assets/vodozemac/.gitignore + - name: Build Release Web + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/web/" + - name: Create archive + run: tar -czf fluffychat-web.tar.gz build/web/ + - name: Upload Web Build + uses: actions/upload-artifact@v7 + with: + name: Web Build + path: fluffychat-web.tar.gz + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: fluffychat-web.tar.gz + asset_name: fluffychat-web.tar.gz + asset_content_type: application/gzip + - name: Clone fluffychat website + run: | + git clone https://github.com/krille-chan/fluffychat-website.git + cat CHANGELOG.md >> fluffychat-website/src/changelog.md + cat PRIVACY.md >> fluffychat-website/src/privacy.md + - name: Build website + working-directory: fluffychat-website + run: | + npm install tailwindcss @tailwindcss/cli + npx tailwindcss -i ./src/styles.css -o ./src/assets/tailwind.css --minify + npx @11ty/eleventy + mv public ../ + - name: Copy FluffyChat web into it + run: | + mkdir public/web + mkdir public/nightly + cp -r build/web/* public/web/ + cp -r build/web/* public/nightly/ + echo "fluffychat.im" >> public/CNAME + - name: Deploy to GitHub Pages + if: startsWith(github.ref, 'refs/tags/v') + uses: peaceiris/actions-gh-pages@v4 + with: + personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} + publish_dir: ./public + publish_branch: gh-pages + cname: fluffychat.im + + build_apk: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - name: Add Firebase Messaging + run: | + echo '${{secrets.GOOGLE_SERVICES_JSON}}' | base64 -d > android/app/google-services.json + ./scripts/add-firebase-messaging.sh + - uses: ./.github/actions/free_up_space + - uses: dtolnay/rust-toolchain@stable + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - run: flutter build apk --release --target-platform android-arm,android-arm64 + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: build/app/outputs/apk/release/app-release.apk + asset_name: fluffychat.apk + asset_content_type: application/vnd.android.package-archive + + build_linux: + strategy: + matrix: + arch: [ x64, arm64 ] + runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}} + steps: + - uses: actions/checkout@v7 + - name: Install dependencies + run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV + - name: Install Flutter + run: | + git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git + ./flutter/bin/flutter doctor + - uses: dtolnay/rust-toolchain@stable + - run: ./flutter/bin/flutter pub get + - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} + - name: Create archive + run: tar -czf fluffychat-linux-${{ matrix.arch }}.tar.gz -C build/linux/${{ matrix.arch }}/release/bundle/ . + - name: Upload to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.PAGES_DEPLOY_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: fluffychat-linux-${{ matrix.arch }}.tar.gz + asset_name: fluffychat-linux-${{ matrix.arch }}.tar.gz + asset_content_type: application/gzip + + deploy_playstore: + runs-on: ubuntu-latest + concurrency: + group: deploy_playstore + queue: max + steps: + - uses: actions/checkout@v7 + - uses: subosito/flutter-action@v2 + with: + flutter-version-file: .tool_versions.yaml + cache: true + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' + - uses: ./.github/actions/free_up_space + - uses: dtolnay/rust-toolchain@stable + - name: Install Fastlane + working-directory: android + run: gem install fastlane -NV + - name: Add Firebase Messaging + run: | + echo '${{secrets.GOOGLE_SERVICES_JSON}}' | base64 -d > android/app/google-services.json + ./scripts/add-firebase-messaging.sh + - run: flutter pub get + - name: Prepare Android Release Build + env: + FDROID_KEY: ${{ secrets.FDROID_KEY }} + FDROID_KEY_PASS: ${{ secrets.FDROID_KEY_PASS }} + PLAYSTORE_DEPLOY_KEY: ${{ secrets.PLAYSTORE_DEPLOY_KEY }} + run: ./scripts/prepare-android-release.sh + - name: Build Android Release + run: flutter build appbundle --target-platform android-arm,android-arm64 + - name: Get Tag Name + id: tag_name + run: echo "::set-output name=tag::$(echo ${GITHUB_REF#refs/tags/})" + - name: Deploy Android Release + run: | + mkdir -p build/android + cp build/app/outputs/bundle/release/app-release.aab build/android/ + cd android + bundle install + bundle update fastlane + bundle exec fastlane deploy_internal_test + if [[ $GITHUB_REF_NAME == rc* ]]; then + bundle exec fastlane deploy_candidate + else + bundle exec fastlane deploy_release + fi + cd .. + + deploy_docker: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Check out Git repository + uses: actions/checkout@v7 + - name: Log in to the Container registry + uses: docker/login-action@v4 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + - name: Build and push Docker image + uses: docker/build-push-action@v7 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 0000000000..4d7ecce829 --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,21 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v10 + with: + stale-issue-message: 'This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 30 days.' + stale-pr-message: 'This PR is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 30 days.' + close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.' + close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity.' + days-before-issue-stale: 365 + days-before-pr-stale: 365 + days-before-issue-close: 30 + days-before-pr-close: 30 + exempt-all-assignees: true + operations-per-run: 1000 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2f82071eb5..0a6ce2e1f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,20 +1,22 @@ +# +++++++++ Flutter Defaults +++++++++ +# From https://github.com/flutter/flutter/blob/master/.gitignore + # Miscellaneous *.class +*.lock *.log *.pyc *.swp -*.snap .DS_Store -.local/ .atom/ .buildlog/ .history .svn/ -lib/generated_plugin_registrant.dart -prime -# libolm package -/assets/js/package/* +# As packages are no longer pinned, we use a lockfile for testing locally. +# When unpinning packages, Using lockfiles ensures that failures in PRs are +# actually due to those PRs, not due to a package being updated. +!/pubspec.lock # IntelliJ related *.iml @@ -22,43 +24,177 @@ prime *.iws .idea/ -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ +# Visual Studio Code related +.classpath +.project +.settings/ +.vscode/* +.ccls-cache + +# This file, on the master branch, should never exist or be checked-in. +# +# On a *final* release branch, that is, what will ship to stable or beta, the +# file can be force added (git add --force) and checked-in in order to effectively +# "pin" the engine artifact version so the flutter tool does not need to use git +# to determine the engine artifacts. +# +# See https://github.com/flutter/flutter/blob/main/docs/tool/Engine-artifacts.md. +/bin/internal/engine.version + +# Flutter repo-specific +/bin/cache/ +/bin/internal/bootstrap.bat +/bin/internal/bootstrap.sh +/bin/internal/engine.realm +/bin/mingit/ +/dev/benchmarks/mega_gallery/ +/dev/bots/.recipe_deps +/dev/bots/android_tools/ +/dev/devicelab/ABresults*.json +/dev/docs/doc/ +/dev/docs/api_docs.zip +/dev/docs/flutter.docs.zip +/dev/docs/lib/ +/dev/docs/pubspec.yaml +/dev/integration_tests/**/xcuserdata +/dev/integration_tests/**/Pods +/packages/flutter/coverage/ +version +analysis_benchmark.json + +# packages file containing multi-root paths +.packages.generated # Flutter/Dart/Pub related **/doc/api/ .dart_tool/ -.flutter-plugins .flutter-plugins-dependencies +**/generated_plugin_registrant.dart .packages +.pub-preload-cache/ .pub-cache/ .pub/ -/build/ +build/ +flutter_*.png +linked_*.ds +unlinked.ds +unlinked_spec.ds + +# Android related +**/android/**/gradle-wrapper.jar +.gradle/ +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/**/GeneratedPluginRegistrant.java +**/android/key.properties +*.jks +local.properties +**/.cxx/ + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/.last_build_id +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Flutter.podspec +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/ephemeral +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# macOS +**/Flutter/ephemeral/ +**/Pods/ +**/macos/Flutter/GeneratedPluginRegistrant.swift +**/macos/Flutter/ephemeral +**/xcuserdata/ + +# Swift package manager (for code indexing) +**/.build/ + +# Windows +**/windows/flutter/ephemeral/ +**/windows/flutter/generated_plugin_registrant.cc +**/windows/flutter/generated_plugin_registrant.h +**/windows/flutter/generated_plugins.cmake -# Web related -lib/generated_plugin_registrant.dart -docs/build/ -docs/.jekyll-cache/ -docs/_site/ +# Linux +**/linux/flutter/ephemeral/ +**/linux/flutter/generated_plugin_registrant.cc +**/linux/flutter/generated_plugin_registrant.h +**/linux/flutter/generated_plugins.cmake + +# Coverage +coverage/ + +# Symbols +app.*.symbols # Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +!/dev/ci/**/Gemfile.lock +!.vscode/settings.json + +# Monorepo +.cipd +.gclient +.gclient_entries +.python-version +.gclient_previous_custom_vars +.gclient_previous_sync_commits + +# AI related +.agents/rules/personal-* +.agents/skills/personal-* +/.agent-shell/ +# +++++++++ Custom +++++++++ + +# Web +web/Imaging.js +web/Imaging.wasm +web/pkg/package.json +web/pkg/vodozemac_bindings_dart_bg.wasm +web/pkg/vodozemac_bindings_dart.js +web/native_executor.js* + +# Exclude generated translation dart files +lib/l10n/*.dart + +# Android keys /key.jks -/android/key.properties -**/android/app/.cxx +android/.kotlin +android/key.properties android/key.jks android/keys.json android/Gemfile.lock -lib/l10n_old -ios/Flutter/.last_build_id -ios/Podfile.lock - -/windows/out -/winuwp/out -/linux/out -/macos/out -.vs +android/app/google-services.json + +# iOS +ios/Runner.ipa +ios/Runner/GoogleServices-Info.plist diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 46abae8e82..0000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,363 +0,0 @@ -variables: - FLUTTER_VERSION: 3.0.2 - -image: cirrusci/flutter:${FLUTTER_VERSION} - -.shared_windows_runners: - tags: - - shared-windows - - windows - - windows-1809 - -stages: - - coverage - - release - - deploy - -code_analyze: - stage: coverage - script: [./scripts/code_analyze.sh] - artifacts: - reports: - codequality: code-quality-report.json - -code_analyze_beta: - extends: code_analyze - image: - name: cirrusci/flutter:beta - allow_failure: true - -test: - stage: coverage - script: [flutter test] - -integration_test: - image: registry.gitlab.com/famedly/company/frontend/flutter-dockerimages/integration/stable:${FLUTTER_VERSION} - stage: coverage - services: - - name: docker:dind - alias: docker - variables: - # activate container-to-container networking - FF_NETWORK_PER_BUILD: "true" - # Tell docker CLI how to talk to Docker daemon. - DOCKER_HOST: tcp://docker:2375/ - # Use the overlayfs driver for improved performance. - DOCKER_DRIVER: overlay2 - # Disable TLS since we're running inside local network. - DOCKER_TLS_CERTDIR: "" - before_script: - - chmod 777 -R /dev/kvm - - adb start-server - - emulator -avd test -no-audio -no-boot-anim -no-window -accel on -gpu swiftshader_indirect & - - apk update && apk add docker drill grep - - chown -R 991:991 integration_test/synapse - - docker run -d --name synapse --user 991:991 --network=host --volume="$(pwd)/integration_test/synapse/data":/data:rw -p 8008:8008 matrixdotorg/synapse:latest - - sleep 20 - # create three test user - - docker exec -i synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --user alice --password AliceInWonderland --admin - - docker exec -i synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --user bob --password JoWirSchaffenDas --admin - - docker exec -i synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml --user trudy --password HaveIBeenPwned --admin - script: - # properly set the homeserver IP for the test - - sed -i "s/10.0.2.2/$(drill docker | grep -m 1 -P "\d+\.\d+\.\d+.\d+" | awk -F ' ' '{print $NF}')/g" integration_test/users.dart - - curl docker:8008/_matrix/static/ 2> /dev/null | grep "It works! Synapse is running" - - git apply ./scripts/enable-android-google-services.patch - - flutter pub get - - flutter test integration_test - tags: - - famedly - - docker - timeout: 20m - -build_web: - stage: coverage - before_script: - [sudo apt update && sudo apt install curl -y, ./scripts/prepare-web.sh] - script: [./scripts/build-web.sh] - artifacts: - paths: - - build/web/ - -build_web_beta: - extends: build_web - image: - name: cirrusci/flutter:beta - allow_failure: true - -build_windows: - extends: - - .shared_windows_runners - stage: coverage - before_script: [./scripts/prepare-windows.ps1] - script: [./scripts/build-windows.ps1] - artifacts: - paths: - - build/windows/runner/Release - allow_failure: true - -build_android_debug: - stage: coverage - script: [./scripts/build-android-debug.sh] - artifacts: - when: on_success - paths: - - build/app/outputs/apk/debug/app-debug.apk - except: - - main - - tags - -build_android_apk: - stage: coverage - before_script: [./scripts/prepare-android-release.sh] - script: [./scripts/build-android-apk.sh] - artifacts: - when: on_success - paths: - - build/android/app-release.apk - only: - - main - - tags - -build_android_appbundle: - stage: coverage - before_script: [./scripts/prepare-android-release.sh] - script: [./scripts/release-playstore-beta.sh] - artifacts: - when: on_success - paths: - - build/android/app-release.aab - resource_group: playstore_release - only: - - main - -upload-fdroid: - stage: release - before_script: - - "which ssh-agent || (sudo apt-get update -y && sudo apt-get install openssh-client -y )" - - "which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )" - - "which pcregrep || (sudo apt-get update -y && sudo apt-get install pcregrep -y )" - - eval $(ssh-agent -s) - - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - - mkdir -p ~/.ssh - - chmod 700 ~/.ssh - - ssh-keyscan -t rsa ssh.fdroid.nordgedanken.dev >> ~/.ssh/known_hosts - script: - - cd build/android/ - - export UPDATE_VERSION=$(pcregrep -o1 'version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*' ../../pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}.apk" - - rsync -rav -e ssh ./ fluffy@ssh.fdroid.nordgedanken.dev:/opt/fdroid/fluffychat/repo - - ssh fluffy@ssh.fdroid.nordgedanken.dev -t '/bin/bash -i -l -c "cd /opt/fdroid/fluffychat && source ../fdroidserver-env/bin/activate && fdroid update --verbose && deactivate"' - needs: ["build_android_apk"] - resource_group: playstore_release - allow_failure: true - only: - - tags - -upload-fdroid-nightly: - stage: release - before_script: - - "which ssh-agent || (sudo apt-get update -y && sudo apt-get install openssh-client -y )" - - "which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )" - - "which pcregrep || (sudo apt-get update -y && sudo apt-get install pcregrep -y )" - - eval $(ssh-agent -s) - - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - - mkdir -p ~/.ssh - - chmod 700 ~/.ssh - - ssh-keyscan -t rsa ssh.fdroid.nordgedanken.dev >> ~/.ssh/known_hosts - script: - - cd build/android/ - - export UPDATE_VERSION=$(pcregrep -o1 'version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*' ../../pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}_$(date +%s).apk" - - rsync -rav -e ssh ./ fluffy@ssh.fdroid.nordgedanken.dev:/opt/fdroid/fluffychat-nightly/repo - - ssh fluffy@ssh.fdroid.nordgedanken.dev -t '/bin/bash -i -l -c "cd /opt/fdroid/fluffychat-nightly && source ../fdroidserver-env/bin/activate && fdroid update --verbose && deactivate"' - needs: ["build_android_apk"] - resource_group: playstore_release - allow_failure: true - only: - - main - -pages: - needs: ["build_web"] - stage: deploy - image: node - script: - - cd docs - - npx tailwindcss -o ./tailwind.css --minify - - cd .. - - mv docs public - - mv build/web/ public/web/ - artifacts: - paths: - - public - only: - - main - -build_linux_x86: - stage: coverage - before_script: - [ - sudo apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install keyboard-configuration -y && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 -y, - ] - script: [./scripts/build-linux.sh] - artifacts: - when: on_success - paths: - - build/linux/x64/release/bundle/ - -build_linux_arm64: - stage: coverage - before_script: [flutter upgrade] - script: [./scripts/build-linux.sh] - tags: [docker_arm64] - only: - - main - - tags - allow_failure: true - artifacts: - when: on_success - paths: - - build/linux/arm64/release/bundle/ - -build_linux_appimage_x86: - stage: deploy - image: appimagecrafters/appimage-builder - needs: [build_linux_x86] - only: - - main - - tags - script: - - cp -r build/linux/x64/release/bundle appimage/FluffyChat.AppDir - - cd appimage - - cp FluffyChat.desktop FluffyChat.AppDir/ - - cp AppRun FluffyChat.AppDir/ - - cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg - - appimagetool -u "zsync|https://gitlab.com/famedly/fluffychat/-/releases/permalink/latest/downloads/FluffyChat-x86_64.AppImage.zsync" FluffyChat.AppDir - allow_failure: true - artifacts: - when: on_success - paths: - - appimage/FluffyChat-x86_64.AppImage - - appimage/FluffyChat-x86_64.AppImage.zsync - -build_linux_appimage_arm64: - stage: deploy - image: appimagecrafters/appimage-builder - needs: [build_linux_arm64] - tags: [docker_arm64] - only: - - main - - tags - script: - - cp -r build/linux/arm64/release/bundle appimage/FluffyChat.AppDir - - cd appimage - - cp FluffyChat.desktop FluffyChat.AppDir/ - - cp AppRun FluffyChat.AppDir/ - - cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg - - appimagetool -u "zsync|https://gitlab.com/famedly/fluffychat/-/releases/permalink/latest/downloads/FluffyChat-arm64.AppImage.zsync" FluffyChat.AppDir - allow_failure: true - artifacts: - when: on_success - paths: - - appimage/FluffyChat-arm64.AppImage - - appimage/FluffyChat-arm64.AppImage.zsync - -update-dependencies: - stage: coverage - needs: [] - tags: - - docker - only: - - schedules - variables: - HOST: ${CI_PROJECT_URL} - UPDATE_BRANCH: ci-bot/dependency-updates - PRIVATE_TOKEN: ${GITLAB_API_TOKEN} - before_script: - - eval $(ssh-agent -s) - - echo "$SSH_PRIVATE_BOT_KEY" | tr -d '\r' | ssh-add - > /dev/null - - mkdir -p ~/.ssh - - chmod 700 ~/.ssh - - ssh-keyscan -t rsa gitlab.com >> ~/.ssh/known_hosts - - chmod 644 ~/.ssh/known_hosts - - git config --global user.email "bot@fluffy.chat" - - git config --global user.name "Dependency Update Bot" - - sudo apt-get update && sudo apt-get install -y curl - script: - - ./scripts/update-dependencies.sh - - git remote set-url --push origin git@gitlab.com:$CI_PROJECT_PATH - - 'git diff --exit-code || (git checkout -B ${UPDATE_BRANCH} && git add . && git commit -m "chore: Update dependencies" && git push -f origin ${UPDATE_BRANCH} && ./scripts/open-mr.sh)' - -.release: - stage: release - image: curlimages/curl:latest - rules: - - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' - - if: '$CI_COMMIT_TAG =~ /^rc\d+\.\d+\.\d+-\d+$/' - before_script: - - export RELEASE_TYPE=$(echo $CI_COMMIT_TAG | grep -oE "[a-z]+") - - export RELEASE_VERSION=$(echo $CI_COMMIT_TAG | grep -oE "\d+\.\d+\.\d+") - - export PACKAGE_REGISTRY_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/fluffychat/${RELEASE_VERSION}" - -upload-android: - extends: .release - script: - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file build/android/app-release.apk ${PACKAGE_REGISTRY_URL}/fluffychat.apk - -upload-web: - extends: .release - script: - - tar czf package.tar.gz -C build/web/ . - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz - -upload-linux-x86: - extends: .release - script: - - tar czf package.tar.gz -C build/linux/x64/release/bundle/ . - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-x86.tar.gz - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-x86_64.AppImage ${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-x86_64.AppImage.zsync ${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage.zsync - -upload-linux-arm64: - extends: .release - script: - - tar czf package.tar.gz -C build/linux/arm64/release/bundle/ . - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.tar.gz ${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-arm64.AppImage ${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file appimage/FluffyChat-arm64.AppImage.zsync ${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage.zsync - -upload-windows: - extends: .release - image: alpine:latest - script: - - apk add --no-cache curl zip - - cd build/windows/runner/Release; zip -r ../../../../package.zip . ; cd - - - | - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file package.zip ${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip - -upload-playstore: - stage: release - before_script: [./scripts/prepare-android-release.sh] - script: [./scripts/release-playstore.sh] - resource_group: playstore_release - only: - - tags - -release: - extends: .release - image: registry.gitlab.com/gitlab-org/release-cli:latest - - script: - - | - release-cli create --name "Release ${CI_COMMIT_TAG}" --tag-name $CI_COMMIT_TAG \ - --assets-link "{\"name\":\"fluffychat.apk\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat.apk\"}" \ - --assets-link "{\"name\":\"fluffychat-linux-x86.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-linux-x86.tar.gz\"}" \ - --assets-link "{\"name\":\"fluffychat-linux-arm64.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-linux-arm64.tar.gz\"}" \ - --assets-link "{\"name\":\"fluffychat-windows.zip\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-windows.zip\"}" \ - --assets-link "{\"name\":\"fluffychat-web.tar.gz\",\"url\":\"${PACKAGE_REGISTRY_URL}/fluffychat-web.tar.gz\"}" - --assets-link "{\"name\":\"FluffyChat-x86_64.AppImage\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage\",\"filepath\":\"/FluffyChat-x86_64.AppImage\"}" - --assets-link "{\"name\":\"FluffyChat-x86_64.AppImage.zsync\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-x86_64.AppImage.zsync\",\"filepath\":\"/FluffyChat-x86_64.AppImage.zsync\"}" - --assets-link "{\"name\":\"FluffyChat-arm64.AppImage\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage\",\"filepath\":\"/FluffyChat-arm64.AppImage\"}" - --assets-link "{\"name\":\"FluffyChat-arm64.AppImage.zsync\",\"url\":\"${PACKAGE_REGISTRY_URL}/FluffyChat-arm64.AppImage.zsync\",\"filepath\":\"/FluffyChat-arm64.AppImage.zsync\"}" diff --git a/.metadata b/.metadata index ce13b42014..ab6d41f12a 100644 --- a/.metadata +++ b/.metadata @@ -1,11 +1,11 @@ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # -# This file should be version controlled. +# This file should be version controlled and should not be manually edited. version: - revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - channel: stable + revision: "fcf2c11572af6f390246c056bc905eca609533a0" + channel: "stable" project_type: app @@ -13,26 +13,11 @@ project_type: app migration: platforms: - platform: root - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 - platform: android - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: ios - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: linux - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: macos - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: web - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - - platform: windows - create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 - base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851 + create_revision: fcf2c11572af6f390246c056bc905eca609533a0 + base_revision: fcf2c11572af6f390246c056bc905eca609533a0 # User provided section diff --git a/.tool_versions.yaml b/.tool_versions.yaml new file mode 100644 index 0000000000..83f4dbf021 --- /dev/null +++ b/.tool_versions.yaml @@ -0,0 +1,2 @@ +environment: + flutter: 3.44.4 # Keep in sync with snap/snapcraft.yaml \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..79ce38d317 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "[dart]": { + "editor.codeActionsOnSave": [ + "source.organizeImports" + ] + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index b88a3bd0c8..791449318d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,2330 @@ + + +## v2.7.2 +- fix: empty translations and add ci job (Christian Kußowski) + +## v2.7.1 +- chore(translations): Translated using Weblate (Galician) (josé m.) +- chore(translations): Translated using Weblate (Russian) (alexander kozlev) +- chore(translations): Translated using Weblate (Tamil) (தமிழ்நேரம்) +- chore: Improve message bubble design (Christian Kußowski) +- chore: switch out fluffy.chat with fluffychat.im url (Christian Kußowski) +- fix: scrolling in tofu dialog (Christian Kußowski) +- fix: send videos crashed duo type error (Christian Kußowski) +- fix: sharing images sometimes break them (Christian Kußowski) + +## v2.7.0 +- feat: Add ISRG X2 Root Certificate (Th0rOnDoR) +- feat: better crypto setup with custom passphrase (Christian Kußowski) +- feat: collapsible long messages with show more/less (Bidyut Mukherjee) +- feat: Filter encrypted room notifications with client-side push rules (Nick Hainke) +- feat: Open file after download via button (Christian Kußowski) +- feat: Redesign chat encryption page (Christian Kußowski) +- feat: Redesign timeline with timestamp every message (Christian Kußowski) +- feat: Replace encryption button with unverified devices warning and permission dialog (Christian Kußowski) +- feat: Switch between display navrail mode with menu button (Christian Kußowski) +- fix: All notification get cleared on normal every empty push (Christian Kußowski) +- fix: Make VOIP calls at least start again (Christian Kußowski) +- fix: oidc login (Christian Kußowski) +- fix: Wrong routing when starting app with content sharing (Christian Kußowski) +- refactor: Do not manually cancel push notifications (Christian Kußowski) +- refactor: New logo (krille-chan) +- refactor: Use text scaling via mediaquery (Christian Kußowski) +- build(deps): bump jwt in /ios in the bundler group across 1 directory (dependabot[bot]) +- build: (deps): bump chewie, wakelock_plus, package_info_plus, share_plus, device_info_plus and file_picker (dependabot[bot]) +- chore: Adjust paddings (Christian Kußowski) +- chore: Animated FAB (Christian Kußowski) +- chore: Correct direct chat notifications on android (Christian Kußowski) +- chore: Display master key in settings (Christian Kußowski) +- chore: Display tofu state in encryption page (Christian Kußowski) +- chore: Do not check bootstrap after logout (Christian Kußowski) +- chore: Improve favicon and notifications icon (Christian Kußowski) +- chore: Make chat context menu split up (Christian Kußowski) +- chore: Minify logos for in app use (Christian Kußowski) +- chore: Modernize legacy icon (Christian Kußowski) +- chore: Nicer UX for utd messages (Christian Kußowski) +- chore: Remove custom popup menu theme (Christian Kußowski) +- chore: Remove status header and adjust paddings (Christian Kußowski) +- chore: Remove unused translations (Christian Kußowski) +- chore: remove webcrypto override (Mira Chacku Purakal) +- chore: Simplify chat back button (Christian Kußowski) +- chore: Simplify input row buttons (Christian Kußowski) +- docs: Prohibit LLM for contributions (Christian Kußowski) +- build: (deps): bump dart_code_linter from 4.0.4 to 4.0.5 (dependabot[bot]) +- build: (deps): bump dart_code_linter from 4.0.5 to 4.1.2 (dependabot[bot]) +- build: (deps): bump flutter_local_notifications from 21.0.0 to 22.0.0 (dependabot[bot]) +- build: (deps): bump flutter_local_notifications from 22.0.0 to 22.0.1 (dependabot[bot]) +- build: (deps): bump flutter_secure_storage from 10.3.0 to 10.3.1 (dependabot[bot]) +- build: (deps): bump flutter_webrtc from 1.4.1 to 1.5.0 (dependabot[bot]) +- build: (deps): bump flutter_web_auth_2 from 5.0.2 to 5.0.3 (dependabot[bot]) +- build: (deps): bump geolocator from 14.0.2 to 14.0.3 (dependabot[bot]) +- build: (deps): bump go_router from 17.2.3 to 17.3.0 (dependabot[bot]) +- build: (deps): bump matrix from 7.1.2 to 7.2.0 (dependabot[bot]) +- build: (deps): bump open_file from 3.5.11 to 4.0.0 (dependabot[bot]) +- build: (deps): bump particles_network from 1.9.4 to 1.9.5 (dependabot[bot]) +- build: (deps): bump path_provider from 2.1.5 to 2.1.6 (dependabot[bot]) +- build: (deps): bump qr_code_scanner_plus from 2.1.1 to 2.1.2 (dependabot[bot]) +- build: Add multi_json to fastlane (Christian Kußowski) +- build: Bump matrix to 7.2.2 (Christian Kußowski) +- build: Follow up use main branch of matrix sdk (Christian Kußowski) +- build: Increase deployment target for iOS (Christian Kußowski) +- build: Update android gradle (Christian Kußowski) +- build: Update matrix dart sdk to 7.2.4 (Christian Kußowski) +- build: Update to flutter 3.44 (Christian Kußowski) +- build: Update to flutter 3.44.1 and modernize gitignore (Christian Kußowski) + +Also thanks to all translators but duo to weblate problems the commit history is +a little bit messed up and I don't have a full changelog this time. + +## v2.6.0 +- feat: Option to hide thumbnails of images and videos (Christian Kußowski) +- feat(chat): make messagePreviewMaxLines configurable, with default 128 (Halil Kaskavalci) +- feat: Add Android summary notification (krille-chan) +- feat: Enable push notifications for multi account (krille-chan) +- feat: hide rooms in spaces add a setting to hide rooms that are in spaces from the main chat list (twoneis) +- feat: Implement room tags (Christian Kußowski) +- feat: Persist chat filters (Christian Kußowski) +- feat: Paste files in chat (ION606) +- fix: add prepare-web.sh support for both python and go yq versions (Vitalii) +- fix: Chat view crashes if events list empty (Christian Kußowski) +- fix: DMs in spaces are displayed as empty chats (Christian Kußowski) +- fix: Getting logged out on dialog dismissed (Christian Kußowski) +- fix: Open deep link on android (Christian Kußowski) +- fix: Send on enter broken on iOS (Christian Kußowski) +- fix: UX feedback for sending events (krille-chan) +- refactor: Bring back notification web sound but make configurable (Christian Kußowski) +- refactor: Enable lint use_build_context_synchronously (Christian Kußowski) +- refactor: Populate client name in push notification additional properties (krille-chan) +- refactor: Rename clientName to appDisplayName (krille-chan) +- refactor: Summarize notifications per account (Christian Kußowski) +- build: (deps): bump async from 2.13.0 to 2.13.1 (dependabot[bot]) +- build: (deps): bump badges from 3.1.2 to 3.2.0 (dependabot[bot]) +- build: (deps): bump chewie from 1.13.0 to 1.13.1 (dependabot[bot]) +- build: (deps): bump dart_code_linter from 3.2.1 to 4.0.1 (dependabot[bot]) +- build: (deps): bump dart_code_linter from 4.0.1 to 4.0.2 (dependabot[bot]) +- build: (deps): bump dart_code_linter from 4.0.2 to 4.0.3 (dependabot[bot]) +- build: (deps): bump desktop_drop from 0.7.0 to 0.7.1 (dependabot[bot]) +- build: (deps): bump file_picker from 10.3.10 to 11.0.2 (dependabot[bot]) +- build: (deps): bump flutter_foreground_task from 9.2.1 to 9.2.2 (dependabot[bot]) +- build: (deps): bump flutter_map from 8.2.2 to 8.3.0 (dependabot[bot]) +- build: (deps): bump flutter_webrtc from 1.3.1 to 1.4.1 (dependabot[bot]) +- build: (deps): bump flutter_web_auth_2 from 5.0.1 to 5.0.2 (dependabot[bot]) +- build: (deps): bump go_router from 17.1.0 to 17.2.0 (dependabot[bot]) +- build: (deps): bump go_router from 17.2.0 to 17.2.1 (dependabot[bot]) +- build: (deps): bump go_router from 17.2.1 to 17.2.2 (dependabot[bot]) +- build: (deps): bump go_router from 17.2.2 to 17.2.3 (dependabot[bot]) +- build: (deps): bump image_picker from 1.2.1 to 1.2.2 (dependabot[bot]) +- build: (deps): bump matrix from 6.2.0 to 7.0.0 (dependabot[bot]) +- build: (deps): bump matrix from 7.0.0 to 7.1.0 (dependabot[bot]) +- build: (deps): bump package_info_plus from 9.0.0 to 9.0.1 (dependabot[bot]) +- build: (deps): bump particles_network from 1.9.3 to 1.9.4 (dependabot[bot]) +- build: (deps): bump record from 6.1.2 to 6.2.0 (dependabot[bot]) +- build: (deps): bump shared_preferences from 2.5.4 to 2.5.5 (dependabot[bot]) +- build: (deps): bump share_plus from 12.0.1 to 12.0.2 (dependabot[bot]) +- build: (deps): bump wakelock_plus from 1.5.0 to 1.5.1 (dependabot[bot]) +- build: (deps): bump wakelock_plus from 1.5.1 to 1.5.2 (dependabot[bot]) +- build: (deps): bump webiny/action-conventional-commits (dependabot[bot]) +- build: (deps): bump webrtc_interface from 1.4.0 to 1.5.1 (dependabot[bot]) +- build: bump addressable in /ios in the bundler group across 1 directory (dependabot[bot]) +- build: Update to flutter 3.41.9 (krille-chan) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Belarusian) (Alex Katon) +- chore(translations): Translated using Weblate (Catalan) (fadelkon) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- chore(translations): Translated using Weblate (Dutch) (Jelv) +- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Galician) (josé m.) +- chore(translations): Translated using Weblate (Indonesian) (Arif Budiman) +- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- chore(translations): Translated using Weblate (Latvian) (ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Polish) (gedeade) +- chore(translations): Translated using Weblate (Russian) (Alex Katon) +- chore(translations): Translated using Weblate (Russian) (alexander kozlev) +- chore(translations): Translated using Weblate (Russian) (Entar) +- chore(translations): Translated using Weblate (Russian) (PuppyLo) +- chore(translations): Translated using Weblate (Spanish) (Kimby) +- chore(translations): Translated using Weblate (Swedish) (Lennart Ochel) +- chore(translations): Translated using Weblate (Ukrainian) (Vadym Nekhai) +- chore(translations): Translated using Weblate (Ukrainian) (Vitalii Knysh) +- chore(translations): Translated using Weblate (Ukrainian) (XblateX) +- chore: Add integration tests (Christian Kußowski) +- chore: Highlight unread chats at timestamp (Christian Kußowski) +- chore: Move support banner to changelog notification (krille-chan) +- chore: Perform a one shot sync in every push helper execution (krille-chan) +- chore: Remove multi account beta warning (krille-chan) +- chore: Small design adjustments (Christian Kußowski) +- chore: Allow localhost with scheme as homeserver (Christian Kußowski) +- chore: Remove workaround for popup menu crash bug (Christian Kußowski) +- chore: no longer send deprecated score when reporting an event + +## v2.5.1 +Update to latest version of fcm_shared_isolate to fix push on iOS. + +## v2.5.0 +FluffyChat 2.5.0 introduces a new homeserver picker for onboarding, better image compression performance and several smaller new features, design adjustments and bug fixes. + +- feat: Add mute notification action (Christian Kußowski) +- feat: Add presetHomeserver config to enforce a homeserver for web (Christian Kußowski) +- feat: Display particle animation on login page (Christian Kußowski) +- feat: Display read receipts for every event (Christian Kußowski) +- feat: Enable audio recording on web (Christian Kußowski) +- feat: Implement low priority for rooms (Christian Kußowski) +- feat: Implement matrix native oidc (Christian Kußowski) +- feat: Implement new sign in flow (Christian Kußowski) +- feat: OIDC Login on same page (Christian Kußowski) +- feat: Reenable native imaging for all platforms (Christian Kußowski) +- feat: Remember last successful logged in homeserver (Christian Kußowski) +- Add lld to install custom dependency for Linux in README (Stephen) +- build: Add llvm-18 to packages for snap (krille-chan) +- build: Add maestro based integration tests (Christian Kußowski) +- chore(translations): Added translation using Weblate (Albanian) (Besnik Bleta) +- chore(translations): Added translation using Weblate (Kabyle) (Amadɣas) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Catalan) (fadelkon) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- chore(translations): Translated using Weblate (Croatian) (Milo Ivir) +- chore(translations): Translated using Weblate (Czech) (Matyáš Caras) +- chore(translations): Translated using Weblate (Danish) (Øjvind Fritjof Arnfred) +- chore(translations): Translated using Weblate (Dutch) (Jelv) +- chore(translations): Translated using Weblate (English) (Christian) +- chore(translations): Translated using Weblate (English) (SpikyBee) +- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Galician) (josé m.) +- chore(translations): Translated using Weblate (Georgian) (Dimitri Tabatadze) +- chore(translations): Translated using Weblate (Georgian) (Temuri Doghonadze) +- chore(translations): Translated using Weblate (German) (Christian) +- chore(translations): Translated using Weblate (German) (Ettore Atalan) +- chore(translations): Translated using Weblate (German) (nautilusx) +- chore(translations): Translated using Weblate (Hindi) (Vishal Singh) +- chore(translations): Translated using Weblate (Indonesian) (Arif Budiman) +- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- chore(translations): Translated using Weblate (Japanese) (NPL) +- chore(translations): Translated using Weblate (Japanese) (Sayaka Halton) +- chore(translations): Translated using Weblate (Kabyle) (Amadɣas) +- chore(translations): Translated using Weblate (Kabyle) (ButterflyOfFire) +- chore(translations): Translated using Weblate (Kabyle) (Christian) +- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (sunniva) +- chore(translations): Translated using Weblate (Persian) (saok91) +- chore(translations): Translated using Weblate (Polish) (gredzikk) +- chore(translations): Translated using Weblate (Portuguese (Brazil)) (Logaritmica) +- chore(translations): Translated using Weblate (Russian) (-) +- chore(translations): Translated using Weblate (Russian) (Artem Pereverzev) +- chore(translations): Translated using Weblate (Russian) (mikinol) +- chore(translations): Translated using Weblate (Spanish) (Kimby) +- chore(translations): Translated using Weblate (Spanish) (SpikyBee) +- chore(translations): Translated using Weblate (Swedish) (Malva Jakobsson) +- chore(translations): Translated using Weblate (Swedish) (spinningpaprika) +- chore(translations): Translated using Weblate (Tamil) (தமிழ்நேரம்) +- chore(translations): Translated using Weblate (Ukrainian) (Andriy Kushnir) +- chore(translations): Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore(translations): Translated using Weblate (Uzbek) (BeMeritus) +- chore: Add config search textfield (Christian Kußowski) +- chore: Add matrix notify workflow (Christian Kußowski) +- chore: Add recommended homeservers (Christian Kußowski) +- chore: Add reset button for config viewer (Christian Kußowski) +- chore: Add support button everywhere (Christian Kußowski) +- chore: Added deeplinks to test protocol (Christian Kußowski) +- chore: Adjust avatar size and chat list item design (krille-chan) +- chore: Adjust chat input row design (Christian Kußowski) +- chore: Adjust design (Christian Kußowski) +- chore: Adjust design of navrail (Christian Kußowski) +- chore: Adjust design of space avatars and more (Christian Kußowski) +- chore: Adjust design of user viewer and popup buttons (Christian Kußowski) +- chore: Adjust join space child UX (Christian Kußowski) +- chore: Adjust paddings (krille-chan) +- chore: Adjust power level UX (Christian Kußowski) +- chore: Adjust search field design (Christian Kußowski) +- chore: Adjust status header design (Christian Kußowski) +- chore: Adjust styles and animations (Christian Kußowski) +- chore: Adjust support button design (Christian Kußowski) +- chore: Always show filter for messages (Christian Kußowski) +- chore: Avoid unnecessary lambdas (Christian Kußowski) +- chore: Better context menu for space children (Christian Kußowski) +- chore: bump ios version (ShootingStarDragons) +- chore: Check conventional commits in CI (krille-chan) +- chore: Check if pubspec.lock is up to date in CI (Christian Kußowski) +- chore: Check of unused localizations (Christian Kußowski) +- chore: Clean up pages build (Christian Kußowski) +- chore: Display spaces filter chip when spaces present even without children (Christian Kußowski) +- chore: Execute dart code linter in CI (Christian Kußowski) +- chore: Exempt assignees from stale (Christian Kußowski) +- chore: Fix oidc login on web (Christian Kußowski) +- chore: Give issues and PRs more time for stale (Christian Kußowski) +- chore: Hide homepage button if not preset (Christian Kußowski) +- chore: Hide status list by default (Christian Kußowski) +- chore: Implement pick SSO provider from dialog and add tchncs.de (Christian Kußowski) +- chore: Introduce tool versions file (Christian Kußowski) +- chore: Login with localhost (Christian Kußowski) +- chore: Make banner light red (Christian Kußowski) +- chore: Make key fingerprints in chat encryption page selectable (Christian Kußowski) +- chore: make sendTimelineEventTimeout configurable (Christian Kußowski) +- chore: Make unread bubble full round (Christian Kußowski) +- chore: Move file cache to subdirectory (Christian Kußowski) +- chore: Move show image viewer one step up (Christian Kußowski) +- chore: Move website back to fluffychat.im (Christian Kußowski) +- chore: Only show confirm dialog once (Christian Kußowski) +- chore: Put oidc behind a feature flag until fixed (Christian Kußowski) +- chore: Remove converser from recommended homeservers as it doesn't have open registration (Christian Kußowski) +- chore: Remove frei.chat from homeserver list (Christian Kußowski) +- chore: Remove web notification custom sound (Christian Kußowski) +- chore: Replace duplicate check for stale bot (Christian Kußowski) +- chore: Retry sign in tap in tests (Christian Kußowski) +- chore: Run matrix notification in pull request target (Christian Kußowski) +- chore: Sanitize hash param for oidc (Christian Kußowski) +- chore: Set erase flag true on account deactivation (krille-chan) +- chore: Set operations per run to 1000 (krille-chan) +- chore: Skip matrix notify for events from myself (Christian Kußowski) +- chore: Update locale config (Christian Kußowski) +- chore: Update matrix ID localization (Christian Kußowski) +- chore: Update recommended homeservers (Christian Kußowski) +- chore: Update redirect android scheme (Christian Kußowski) +- chore: Use fixed version of fcm shared isolate (Christian Kußowski) +- fix: Add app id to TileLayer user agent (Vespe-r) +- fix: Add missing @@locale (Krille-chan) +- fix: Audioplayer on web buggy (Christian Kußowski) +- fix: build failed on archlinux (ShootingStarDragons) +- fix: Do not cancel notification on reply (Christian Kußowski) +- fix: Do not display formatted body if body is just filename (Christian Kußowski) +- fix: Do not route to backup on soft logout (Christian Kußowski) +- fix: Edit space child button opens space details page and not space child details page (Christian Kußowski) +- fix: Fix formatting of messages with newlines (Philip Fritzsche) +- fix: get correct aspect ratio from VideoPlayerController (Matias) +- fix: Join room by alias even if not found (Christian Kußowski) +- fix: Open deep links (Christian Kußowski) +- fix: Receipt row not auto updating (Christian Kußowski) +- fix: Receipts disappear after reaction (Christian Kußowski) +- fix: Reply voice message displays a broken html body (Christian Kußowski) +- fix: Send reply to voice messages (Christian Kußowski) +- fix: Set mimetype for video player on web (Christian Kußowski) +- fix: Use correct own person for android notification replies (Christian Kußowski) +- fix: Wrong placeholder in kab (Christian Kußowski) +- refactor: Add Flutter lints (Christian Kußowski) +- refactor: Add more linter rules (Christian Kußowski) +- refactor: Add more stricter lints (Christian Kußowski) +- refactor: Avoid redundant async (Christian Kußowski) +- refactor: Avoid unnecessary bool comparison (Christian Kußowski) +- refactor: Better UX for create space children (Christian Kußowski) +- refactor: Disable custom image resizer for macOS and windows (Christian Kußowski) +- refactor: Do show message bubble even for big emotes (Christian Kußowski) +- refactor: Enable avoid-returning-widgets lint (Christian Kußowski) +- refactor: Enable more strict lints (Christian Kußowski) +- refactor: Enable rule avoid dynamic (Christian Kußowski) +- refactor: Make file events more fail safe for failed to send (Christian Kußowski) +- refactor: Remove animation dependency (Christian Kußowski) +- refactor: Remove unused localizations (Christian Kußowski) +- refactor: Remove unused translations (Christian Kußowski) +- refactor: Use getCryptoIdentityState to check backup state (krille-chan) +- refactor: Use more robust and performant way to detect single emoji messages (Christian Kußowski) +- refactor: Use native uri data from bytes instead of html (Christian Kußowski) + +## v2.4.0 +FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to +easily add your own sticker packs. +It also improves the search and image gallery in chats, especially encrypted chats. +Besides that this update comes with a lot of fixes and improvements under the hood. + +- feat: Create new sticker packs (krille-chan) +- feat: Edit displayname and attribution for sticker packs (krille-chan) +- feat: Improved search (Christian Kußowski) +- feat: Set usage of custom emojis and stickers (krille-chan) +- feat: Upload multiple stickers at once (krille-chan) +- build: (deps): bump actions/checkout from 5 to 6 (dependabot[bot]) +- build: (deps): bump animations from 2.1.0 to 2.1.1 (dependabot[bot]) +- build: (deps): bump device_info_plus from 12.2.0 to 12.3.0 (dependabot[bot]) +- build: (deps): bump emoji_picker_flutter from 4.3.0 to 4.4.0 (dependabot[bot]) +- build: (deps): bump file_picker from 10.3.6 to 10.3.7 (dependabot[bot]) +- build: (deps): bump file_picker from 10.3.7 to 10.3.8 (dependabot[bot]) +- build: (deps): bump file_selector from 1.0.4 to 1.1.0 (dependabot[bot]) +- build: (deps): bump flutter_foreground_task from 9.1.0 to 9.2.0 (dependabot[bot]) +- build: (deps): bump flutter_webrtc from 1.2.0 to 1.2.1 (dependabot[bot]) +- build: (deps): bump go_router from 17.0.0 to 17.0.1 (dependabot[bot]) +- build: (deps): bump image from 4.5.4 to 4.6.0 (dependabot[bot]) +- build: (deps): bump image from 4.6.0 to 4.7.1 (dependabot[bot]) +- build: (deps): bump image from 4.7.1 to 4.7.2 (dependabot[bot]) +- build: (deps): bump matrix from 4.0.0 to 4.0.1 (dependabot[bot]) +- build: (deps): bump shared_preferences from 2.5.3 to 2.5.4 (dependabot[bot]) +- build: (deps): bump translations_cleaner from 0.0.5 to 0.1.0 (dependabot[bot]) +- build: (deps): bump universal_html from 2.2.4 to 2.3.0 (dependabot[bot]) +- build: Reenable shrink resources and minify in gradle (Christian Kußowski) +- build: Upgrade to flutter 3.38.4 (Christian Kußowski) +- build: Use matrix sdk vom pub.dev again (Christian Kußowski) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Belarusian) (Alex Katon) +- chore(translations): Translated using Weblate (Bengali) (Kom nake) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (Creeper) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- chore(translations): Translated using Weblate (Croatian) (Milo Ivir) +- chore(translations): Translated using Weblate (Czech) (arxari) +- chore(translations): Translated using Weblate (Dutch) (Jelv) +- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Finnish) (Ricky Tigg) +- chore(translations): Translated using Weblate (French) (hugues de keyzer) +- chore(translations): Translated using Weblate (Galician) (josé m.) +- chore(translations): Translated using Weblate (Georgian) (Nicholas Winterhalter) +- chore(translations): Translated using Weblate (Georgian) (Temuri Doghonadze) +- chore(translations): Translated using Weblate (German) (Bella) +- chore(translations): Translated using Weblate (German) (nautilusx) +- chore(translations): Translated using Weblate (Greek) (Rain4Cats) +- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- chore(translations): Translated using Weblate (Italian) (Alessio Olivieri) +- chore(translations): Translated using Weblate (Italian) (Claudio Maradonna) +- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Portuguese (Brazil)) (LucasMZ) +- chore(translations): Translated using Weblate (Russian) (BeMeritus) +- chore(translations): Translated using Weblate (Russian) (Christian) +- chore(translations): Translated using Weblate (Russian) (Дмитрий Михирев) +- chore(translations): Translated using Weblate (Serbian) (Luka) +- chore(translations): Translated using Weblate (Spanish) (Kimby) +- chore(translations): Translated using Weblate (Ukrainian) (Andriy Kushnir) +- chore(translations): Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore(translations): Translated using Weblate (Uzbek) (BeMeritus) +- chore(translations): Translated using Weblate (Uzbek) (Maftuna Vohidjonovna) +- chore: Allow all chars for emoji search (Christian Kußowski) +- chore: Allow export of readonly sticker packs (Christian Kußowski) +- chore: delete unrelated line (ShootingStarDragons) +- chore: Display attribution for sticker packs (krille-chan) +- chore: Escape title in check duplicates job (Christian Kußowski) +- chore: ignore for now deprecated regex (Christian Kußowski) +- chore: Improve room custom emote UX (krille-chan) +- chore: Improve sticker editor UX (krille-chan) +- chore: Improve text selection color for messages (Christian Kußowski) +- chore: Improve via calculation (Christian Kußowski) +- chore: Increase padding for code blocks (Christian Kußowski) +- chore: Link how do I get stickers FAQ entry (Christian Kußowski) +- chore: Localize emoji picker (Christian Kußowski) +- chore: Make attribution url field clickable (Christian Kußowski) +- chore: Make cross signing self sign mandatory for bootstrap (Christian Kußowski) +- chore: make locale for emoji suggestions configureable (krille-chan) +- chore: Make sticker previews in editor clickable (krille-chan) +- chore: Make stickers smaller than normal image messages (Christian Kußowski) +- chore: Override sqlcipher license (Christian Kußowski) +- chore: Remove horizontal scrolling for code blocks (Christian Kußowski) +- chore: remove the userId param (ShootingStarDragons) +- chore: Replace copy action with pin event action in UI (Christian Kußowski) +- chore: Request keys for last room messages after bootstrap (krille-chan) +- chore: Simplify adaptive bottom sheet code (Christian Kußowski) +- chore: Update privacy policy links (Christian Kußowski) +- chore: Update start poll design (Christian Kußowski) +- chore: Update user device keys before creating bootstrap (Christian Kußowski) +- chore: Use license_checker from pub again (Christian Kußowski) +- chore: Wait for secrets after bootstrap verification (Christian Kußowski) +- Fix regression after new linter rules (Andriy Kushnir) +- fix: Better wait for secrets after verification bootstrap (Christian Kußowski) +- fix: Broken ruzzian plurals (Christian Kußowski) +- fix: Do not auto load history in rooms with collapsed state only (Christian Kußowski) +- fix: Do not display empty file description body (Christian Kußowski) +- fix: Do not render html in unformatted messages (Christian Kußowski) +- fix: Do not request hero users for rooms with name (Christian Kußowski) +- fix: enable users without passwords to delete their accounts by using uia request in account deletion (ggurdin) +- fix: Hide no fcm warning after dismissed (Christian Kußowski) +- fix: jump cannot work properly when there are multi users (ShootingStarDragons) +- fix: Make keyboard moving bottom sheet up (Christian Kußowski) +- fix: No description for video and audio messages displayed (Christian Kußowski) +- fix: Render not permitted html tags as text instead of hiding (Christian Kußowski) +- fix: Scrolling in fragmented timeline (Christian Kußowski) +- fix: spoiler formatting in reply (denalena) +- fix: State problem when not changing emote name (krille-chan) +- fix: Unlock app with leading 0 in pin is not possible (Christian Kußowski) +- fix: when user has multi counts,notification not works well (ShootingStarDragons) +- refactor: Adjust state event design (Christian Kußowski) +- refactor: Always open Chat Backup as page right after login (Christian Kußowski) +- refactor: Display all sticker packs in same editor with filterchips (krille-chan) +- refactor: File selector just use default FileType and remove not working zip selector (Christian Kußowski) +- refactor: Improved design and UX for sticker editor (krille-chan) +- refactor: Remove native imaging and enable web worker (Christian Kußowski) +- refactor: Remove unused feature tor browser detector (Christian Kußowski) +- refactor: Remove unused html onfocus streams (Christian Kußowski) +- refactor: Remove unused msix (Christian Kußowski) +- refactor: Remove workaround for download files (Christian Kußowski) +- refactor: Update flutter lints (Christian Kußowski) +- refactor: Update to Dart 3.10 with . shorthands (Christian Kußowski) +- refactor: Use localized emojis for suggestion input (krille-chan) +- refactor: Use own highlight rendering with working scrollbar and text selection (Christian Kußowski) +- chore: Update links to matrix spaces to avoid confusion (Andriy Kushnir) + +## v2.3.0 + +FluffyChat v2.3.0 fixes a possible database corruption bug on Android, also fixes a +major performance leak and introduces polls and threads. + +- feat: Implement polls (Christian Kußowski) +- feat: Implement threads (krille-chan) +- fix: Database corruption because notification tab isolate starts too late (Christian Kußowski) +- fix: Import sticker packs (Christian Kußowski) +- refactor: Improved UIA support for OIDC and SSO (Christian Kußowski) +- refactor: Invite users when upgrading private room (Christian Kußowski) +- build: (deps): bump cross_file from 0.3.4+2 to 0.3.5 (dependabot[bot]) +- build: (deps): bump file_picker from 10.3.3 to 10.3.6 (dependabot[bot]) +- build: (deps): bump go_router from 16.3.0 to 17.0.0 (dependabot[bot]) +- build: (deps): bump http from 1.5.0 to 1.6.0 (dependabot[bot]) +- build: (deps): bump image_picker from 1.2.0 to 1.2.1 (dependabot[bot]) +- build: (deps): bump qr_code_scanner_plus from 2.0.13 to 2.0.14 (dependabot[bot]) +- build: (deps): bump video_player from 2.10.0 to 2.10.1 (dependabot[bot]) +- build: Switch back to stable web auth package (krille-chan) +- build: Use matrix sdk 4.0.0 (Christian Kußowski) +- build: Use secure storage from pub.dev again (krille-chan) +- chore: Remove Notification actions when using UnifiedPush (Christian Kußowski) +- chore(translations): Added translation using Weblate (Uzbek) (bahrom04) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Belarusian) (Alex Katon) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- chore(translations): Translated using Weblate (Dutch) (Jelv) +- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Finnish) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Finnish) (Ricky Tigg) +- chore(translations): Translated using Weblate (French) (luneth) +- chore(translations): Translated using Weblate (Galician) (josé m.) +- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Uzbek) (bahrom04) +- chore(translations): Translated using Weblate (Uzbek) (BeMeritus) + +## v2.2.0 + +FluffyChat 2.2.0 introduces a new UX for spaces and adds support for restricted +join rules. + +The app also now has a new design for recording voice messages including a new +pause button. + +You also now see the progress when downloading files. + +On web the performance for image compressing has been drastically improved. Also +the config.json file loading has finally been fixed. Please be aware that the format +has changed as the available configs are now generated automatically. + +Did you know that you can set a lot of additional configs in the new config viewer +inside the app? This now supports much more options but please use with care! + +On Android FluffyChat now supports notification actions (reply and mark as read) and +also now supports Android Auto integration. Please do not cause an accident when using +the app while driving! + +On iOS the notifications are now localized. Stay tuned for more improvements on iOS +notifications in the next releases! + +Besides that this release brings a ton of bug fixes and performance improvements and +of course updated translations. Big thanks to all the volunteers who have helped on weblate! + +- feat: Add donation buttons except for PlayStore&AppStore version (Christian Kußowski) +- feat: Add iOS Notification Service Extension for localizable push notifications (Christian Kußowski) +- feat: Add notification actions (krille-chan) +- feat: Add support for restricted join rule (Christian Kußowski) +- feat: Display progress for downloading content (Christian Kußowski) +- feat: Display progress on redact events and clear archive dialogs (Christian Kußowski) +- feat: Enable native imaging for web (Christian Kußowski) +- feat: Forward notifications to Android Auto (Christian Kußowski) +- feat: Nicer record voice message UI with pause function (Christian Kußowski) +- feat: Notification actions on android (krille-chan) +- design: Improved spaces UX (Christian Kußowski) +- fix: Correctly pass through obscure text (Christian Kußowski) +- fix: Create a subdirectory in the tmp directory (Inex Code) +- fix: Cupertino text dialogs (Christian Kußowski) +- fix: Null pointer crash in chat list item (Christian Kußowski) +- chore(translations): Translated using Weblate (Arabic) (jamazi) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Belarusian) (Alex Katon) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- chore(translations): Translated using Weblate (Croatian) (Milo Ivir) +- chore(translations): Translated using Weblate (Czech) (Flibble) +- chore(translations): Translated using Weblate (Dutch) (Jelv) +- chore(translations): Translated using Weblate (Esperanto) (Anonymous) +- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Finnish) (Aminda Suomalainen) +- chore(translations): Translated using Weblate (Galician) (josé m) +- chore(translations): Translated using Weblate (German) (Alex Katon) +- chore(translations): Translated using Weblate (German) (cheese1) +- chore(translations): Translated using Weblate (German) (Christian) +- chore(translations): Translated using Weblate (German) (Jana) +- chore(translations): Translated using Weblate (Greek) (Λευτέρης Τ) +- chore(translations): Translated using Weblate (Hebrew) (Anonymous) +- chore(translations): Translated using Weblate (Hungarian) (Balázs Meskó) +- chore(translations): Translated using Weblate (Indonesian) (Linerly) +- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- chore(translations): Translated using Weblate (Japanese) (Allan Nordhøy) +- chore(translations): Translated using Weblate (Korean) (loyedison92) +- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons) +- chore(translations): Translated using Weblate (Latvian) (ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)) +- chore(translations): Translated using Weblate (Lithuanian) (Anonymous) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (sunniva) +- chore(translations): Translated using Weblate (Polish) (Paweł Gronowski) +- chore(translations): Translated using Weblate (Portuguese (Brazil)) (LucasMZ) +- chore(translations): Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- chore(translations): Translated using Weblate (Romanian) (Anonymous) +- chore(translations): Translated using Weblate (Russian) (Christian) +- chore(translations): Translated using Weblate (Russian) (Дмитрий Михирев) +- chore(translations): Translated using Weblate (Russian) (Жора Змейкин) +- chore(translations): Translated using Weblate (Serbian) (Anonymous) +- chore(translations): Translated using Weblate (Slovak) (Anonymous) +- chore(translations): Translated using Weblate (Spanish) (Kimby) +- chore(translations): Translated using Weblate (Spanish) (LucasMZ) +- chore(translations): Translated using Weblate (Turkish) (Christian) +- chore(translations): Translated using Weblate (Turkish) (Ufuk Karal) +- chore(translations): Translated using Weblate (Vietnamese) (desperadohp) +- chore: add a link to the platforms' different behaviors for the 24h format (kaanelloed) +- chore: Add ActionsPadding in column mode (Christian Kußowski) +- chore: Add close icon to snackbar in column mode (Christian Kußowski) +- chore: Adjust chat details button design (Christian Kußowski) +- chore: Adjust encryption page design (Christian Kußowski) +- chore: Adjust input bar button design (Christian Kußowski) +- chore: Adjust material dialog button design (krille-chan) +- chore: Adjust padding for status msg list (Christian Kußowski) +- chore: Adjust status header design (krille-chan) +- chore: Better display rooms without known messages (Christian Kußowski) +- chore: Better routing to space id (Christian Kußowski) +- chore: Correctly remove knockRestricted from possible join rules (Christian Kußowski) +- chore: Fix load config.json (Christian Kußowski) +- chore: Go back to pub.dev matrix dep (Christian Kußowski) +- chore: Hide restricted and knock restricted for unsupported room versions (Christian Kußowski) +- chore: Hide topic if empty and cannot be changed (Christian Kußowski) +- chore: Improve chat details icon color design (Christian Kußowski) +- chore: Improve ignore list UX (Christian Kußowski) +- chore: Leave invites and DM rooms when blocking a user (Christian Kußowski) +- chore: Make privacy url not configurable (Christian Kußowski) +- chore: Make progress indicators rounder (Christian Kußowski) +- chore: Mention rebases (Christian Kußowski) +- chore: Move emote settings button to chat popup menu (Christian Kußowski) +- chore: Move encryption button to input row (Christian Kußowski) +- chore: Revert "refactor: Make ChatListItem cache lasteventbody for better performance" (Christian Kußowski) +- chore: Translate iOS notifications into german (Christian Kußowski) +- chore: Try out refactored user device keys update method (Christian Kußowski) +- chore: Update matrix dart sdk (Christian Kußowski) +- chore: use time format based on system settings (kaanelloed) +- ci: Build only for arm64 (Christian Kußowski) +- refactor: Make ChatListItem cache lasteventbody for better performance (Christian Kußowski) +- refactor: Remove unused directories (Christian Kußowski) +- refactor: Rename models for matrix spec 1.16 (Christian Kußowski) +- refactor: Replace flutter typeahead with autocomplete to fix (Christian Kußowski) +- refactor: Use AppSettings enum based configuration everywhere and fix load from json on web (Christian Kußowski) +- build: Flutter upgrade 3.35.5 (Christian Kußowski) +- build: Matrix version 3.0.0 (Christian Kußowski) +- build: Remove dependency for telephony (Christian Kußowski) +- build: Remove openssl dependency (Christian Kußowski) +- build: Use correct fcm_shared_isolate version (Christian Kußowski) +- build: Use correct version of vodozemac for web build (Christian Kußowski) + +## v2.1.1 +Bugfix release to trigger flatpak arm64 release again. + +- build: (deps): bump actions/checkout from 4 to 5 (dependabot[bot]) +- build: (deps): bump app_links from 6.4.0 to 6.4.1 (dependabot[bot]) +- build: (deps): bump file_picker from 10.2.3 to 10.3.1 (dependabot[bot]) +- build: (deps): bump msix from 3.16.10 to 3.16.12 (dependabot[bot]) +- build: (deps): bump package_info_plus from 8.3.0 to 8.3.1 (dependabot[bot]) +- build: (deps): bump share_plus from 11.0.0 to 11.1.0 (dependabot[bot]) +- build: Also build linux on github runners (Christian Kußowski) +- build: Update macos podfile (Christian Kußowski) +- chore: Follow up subtitle font style (Christian Kußowski) +- chore: Slightly adjust font sizes and design (Christian Kußowski) +- chore(translations): Translated using Weblate (Chinese (Traditional Han script)) (miullu) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Polish) (Piotr Orzechowski) +- feat: support xdp selector for linux (ShootingStarDragons) +- fix: Follow up fix rectangle avatars (Christian Kußowski) +- refactor: Remove broken push error reporter (Christian Kußowski) + +## v2.1.0 +FluffyChat 2.1.0 brings support for room version 12 and a lot of bugfixes, updated translations and performance improvements. Also chat state events are now collapsed by default. + +- feat: Collapse all state events by default (Christian Kußowski) +- feat(linux/notify): support avatar icon (ShootingStarDragons) +- build: (deps): bump archive from 3.6.1 to 4.0.7 (dependabot[bot]) +- build: (deps): bump chewie from 1.11.3 to 1.12.1 (dependabot[bot]) +- build: (deps): bump desktop_drop from 0.4.4 to 0.6.1 (dependabot[bot]) +- build: (deps): bump device_info_plus from 10.1.2 to 11.5.0 (dependabot[bot]) +- build: (deps): bump dynamic_color from 1.7.0 to 1.8.1 (dependabot[bot]) +- build: (deps): bump file_picker from 10.2.0 to 10.2.1 (dependabot[bot]) +- build: (deps): bump file_picker from 8.3.7 to 10.2.0 (dependabot[bot]) +- build: (deps): bump flutter_foreground_task from 6.5.0 to 9.1.0 (dependabot[bot]) +- build: (deps): bump flutter_local_notifications from 19.3.0 to 19.4.0 (dependabot[bot]) +- build: (deps): bump flutter_map from 6.2.1 to 8.1.1 (dependabot[bot]) +- build: (deps): bump flutter_map from 8.1.1 to 8.2.1 (dependabot[bot]) +- build: (deps): bump flutter_native_splash from 2.4.4 to 2.4.6 (dependabot[bot]) +- build: (deps): bump flutter_webrtc from 0.12.12+hotfix.1 to 1.0.0 (dependabot[bot]) +- build: (deps): bump geolocator from 13.0.4 to 14.0.2 (dependabot[bot]) +- build: (deps): bump go_router from 15.1.2 to 16.0.0 (dependabot[bot]) +- build: (deps): bump go_router from 16.0.0 to 16.1.0 (dependabot[bot]) +- build: (deps): bump just_audio from 0.9.46 to 0.10.4 (dependabot[bot]) +- build: (deps): bump matrix from 1.0.1 to 1.1.0 (dependabot[bot]) +- build: (deps): bump mime from 1.0.6 to 2.0.0 (dependabot[bot]) +- build: (deps): bump msix from 3.16.9 to 3.16.10 (dependabot[bot]) +- build: (deps): bump permission_handler from 11.4.0 to 12.0.1 (dependabot[bot]) +- build: (deps): bump pretty_qr_code from 3.4.0 to 3.5.0 (dependabot[bot]) +- build: (deps): bump share_plus from 10.1.4 to 11.0.0 (dependabot[bot]) +- build: (deps): bump sqflite_common_ffi from 2.3.5 to 2.3.6 (dependabot[bot]) +- build: (deps): bump sqlcipher_flutter_libs from 0.6.6 to 0.6.7 (dependabot[bot]) +- build: (deps): bump unifiedpush from 5.0.2 to 6.0.2 (dependabot[bot]) +- build: (deps): bump url_launcher from 6.3.1 to 6.3.2 (dependabot[bot]) +- build: Update Flutter 3.32.8 (Christian Kußowski) +- build: Upgrade emoji picker flutter (Christian Kußowski) +- build: Use gradle in kotlin (Christian Kußowski) +- build: Use macos-latest for debug ios job (Christian Kußowski) +- chore: Add CI workflow for thank you message after issue got completed (Christian Kußowski) +- chore: Add dependabot to code owners for pubspec (Christian Kußowski) +- chore: Add ISC as compatible license to aGPLv3 (Christian Kußowski) +- chore: Better error handling for push notifications (Christian Kußowski) +- chore: Bump Flutter version in pubspec.lock (Rafał Hirsch) +- chore: do format (ShootingStarDragons) +- chore: Fix snapcraft build (krille-chan) +- chore: Nicer own reaction color design (Christian Kußowski) +- chore: Remove double quotes from screenshot filenames (Christian Kußowski) +- chore: Remove lifecyclestate logs (Christian Kußowski) +- chore: Remove unused workflow (krille-chan) +- chore: Set height for screenshots in readme (krille-chan) +- chore: Set text message max length to 16384 but make it configurable (Christian Kußowski) +- chore: Update height for screenshots in readme (krille-chan) +- chore: Update screenshots in readme (krille-chan) +- fix: Add flexible to file messages to prevent long name overflow (Kelrap) +- fix: Avoid using MediaQuery.of() (imnotlxy) +- fix: Config viewer not updating state (Christian Kußowski) +- fix: Delete database correctly after corruption (krille-chan) +- fix: Design glitches in sticker dialog (Christian Kußowski) +- fix: limit characters and lines so redact message can't be too long (avashilling) +- fix: LoadingSnackBar consistently remains visible until the upload is complete (JaWeee) +- fix: notification clicked still cannot jump (ShootingStarDragons) +- fix: open chat from notification (ShootingStarDragons) +- fix: Open database crashes on start (krille-chan) +- fix: Open external account management when trying to delete devices (Christian Kußowski) +- fix: Use retry http client (Christian Kußowski) +- fix: Workaround for reversed width and height of compressed videos sent from Android (Christian Kußowski) +- refactor: Add support for Room version 12 via matrix dart sdk update +- refactor: Better UX for accepting declining invite (krille-chan) +- refactor: ignore bubble gradient when using system high contrast mode (Christian Kußowski) +- refactor: Make notification avatars rounded (krille-chan) +- refactor: Remove unused dependencies (krille-chan) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Belarusian) (Alex Katon) +- chore(translations): Translated using Weblate (German) (Christian) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Portuguese (Brazil)) (LucasMZ) +- chore(translations): Translated using Weblate (Spanish) (Fuan200) +- chore(translations): Translated using Weblate (Tamil) (தமிழ்நேரம்) +- chore(translations): Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Arabic) (LucasMZ) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional Han script)) (miullu) +- Translated using Weblate (Czech) (LucasMZ) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (LucasMZ) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Hebrew) (LucasMZ) +- Translated using Weblate (Hungarian) (LucasMZ) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Irish) (LucasMZ) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Italian) (LucasMZ) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Latvian) (LucasMZ) +- Translated using Weblate (Norwegian Bokmål) (Christian) +- Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- Translated using Weblate (Persian) (Alireza Rashidi) +- Translated using Weblate (Polish) (Piotr Orzechowski) +- Translated using Weblate (Portuguese (Brazil)) (LucasMZ) +- Translated using Weblate (Portuguese) (Ana Elisa Ramos) +- Translated using Weblate (Portuguese) (LucasMZ) +- Translated using Weblate (Russian) (LucasMZ) +- Translated using Weblate (Tamil) (தமிழ்நேரம்) +- Translated using Weblate (Tamil) (LucasMZ) +- Translated using Weblate (Telugu) (LucasMZ) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (LucasMZ) +- Translated using Weblate (Vietnamese) (LucasMZ) + +## v2.0.0 + +This version migrates to Vodozemac and Matrix Dart SDK 1.0.0. This is a breaking +change. The user should not notice the migration at all but downgrading from +v2.0.0 to a previous version is not possible without losing the session. + +- fix: Do not set read markers for sending events (Christian Kußowski) +- fix: fix compile error related to MxcImage (gilice) +- fix: Forward last version of events when forwarding (Christian Kußowski) +- fix: Ban button displayed for already banned users (Christian Kußowski) +- fix: Route back to room list after leaving a chat (Christian Kußowski) +- build: Switch to matrix sdk 1.0.0 (Christian Kußowski) +- build: Upgrade flutter to 3.32.2 (krille-chan) +- build: Update to flutter 3.32.4 (Christian Kußowski) +- chore: Add missing mounted check (Christian Kußowski) +- chore: highlight select mode actions (Christian Kußowski) +- refactor: sdk 1.0 (Christian Kußowski) +- refactor: New message context menu (Christian Kußowski) +- refactor: Nicer popupmenus (Christian Kußowski) +- Translated using Weblate (Spanish) (Kimby) + +## v1.27.0 +- feat: Add confirmation dialog before accepting invite (krille-chan) +- feat: Add feature flag for refresh tokens (Christian Kußowski) +- feat: add setting for whether to show space navigation rail on mobile (ggurdin) +- feat: Background audio player (Christian Kußowski) +- feat: Check markdown checkboxes in messages (krille-chan) +- feat: Create lists with checkboxes via + menu (krille-chan) +- feat: Limit height of text messages and expand if selected (krille-chan) +- feat: Move videoplayer into multi image viewer (Christian Kußowski) +- feat: Show all supported image-/video-files when sending images or videos (MoonlightWave-12) +- feat: Show WebM-videos when choosing video-files for sending (MoonlightWave-12) +- fix: Add missing mounted check to mxcImage (Christian Kußowski) +- fix: App crash on page navigation with open popup menu (Christian Kußowski) +- fix: App crashes on window resize in chat (krille-chan) +- fix: Change `PNGs` to `PNG` for consistency in file-selector (MoonlightWave-12) +- fix: Crash when going to settings in desktop mode (krille-chan) +- Fix: Fix jagged avatar edges Use anti-alias Clipping allowing for round Avatar circles (martin) +- fix: Join new room after room upgrade (krille-chan) +- fix: Keep state of text input dialogs (Christian Kußowski) +- fix: Localizations (krille-chan) +- fix: No crash on logging out in client chooser button (Christian Kußowski) +- fix: Show WebP-images with a file-extension written in lower-case (MoonlightWave-12) +- build: Update matrix dart sdk 0.40.2 (Christian Kußowski) +- build: Update record package (Christian Kußowski) +- build: Update shared preferences android (krille-chan) +- build: Upgrade to flutter 3.32.1 (Christian Kußowski) +- build: Use workaround for flutter secure storage on linux (krille-chan) +- chore: Crop shortcut file on android and cache it (krille-chan) +- chore: Display loading dialog when preparing voice message (Christian Kußowski) +- chore: Format lib/utils/file_selector.dart (MoonlightWave-12) +- chore: Let users decide for the title in error reporter (Christian Kußowski) +- chore: make space nav bar narrower on mobile and ensure space nav bar matches user's theme (ggurdin) +- chore: Nicer checkboxes (Christian Kußowski) +- chore: Preload server file config before upload files (Christian Kußowski) +- chore: Remove custom errorwidgetbuilder (Christian Kußowski) +- chore: Remove unused translations (Christian Kußowski) +- chore: Simplify voiceMessage getter (Christian Kußowski) +- chore: Update voice message localization (Christian Kußowski) +- refactor: Always use HtmlMessage (krille-chan) +- refactor: Reduce notification avatar size to 128 (krille-chan) +- Added translation using Weblate (Cantonese (Traditional Han script)) (Mike Evans) +- Added translation using Weblate (Danish) (Øjvind Fritjof Arnfred) +- Added translation using Weblate (Yue (yue_HK)) (Mike Evans) +- Translated using Weblate (Arabic) (abdelbasset jabrane) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Cantonese (Traditional Han script)) (Mike Evans) +- Translated using Weblate (Catalan) (Marc Pina Artigas) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Simplified Han script)) (Mike Evans) +- Translated using Weblate (Chinese (Traditional Han script)) (Mike Evans) +- Translated using Weblate (Chinese (Traditional Han script)) (miullu) +- Translated using Weblate (Danish) (Øjvind Fritjof Arnfred) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (sevonj) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (German) (JSchmerling) +- Translated using Weblate (Hebrew) (DavidEl-Natan) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Latvian) (ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Polish) (Piotr Orzechowski) +- Translated using Weblate (Portuguese (Brazil)) (Pedro Alves) +- Translated using Weblate (Russian) (Yurt Page) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.26.1 + +Updates the Matrix Dart SDK to fix multiple issues where messages can be missing in the timeline. + +- feat: Reenable archive feature after various fixes landed in sdk (krille-chan) +- build: Update matrix dart sdk to 0.40.0 (Christian Kußowski) +- chore: Adjust new chat page design (krille-chan) +- chore: Display count of invited in members page (krille-chan) +- chore: Do not load timeline while sync processing (Krille) +- chore: Do not store event from push in database (Krille) +- chore: Only show joined members in members list by default (Krille) +- chore: Remove matrix notification workflow (Krille) +- fix(docs): escape tag (Sophie L) +- fix: Crash when opening settings in column mode from popup menu (krille-chan) +- refactor: Display thread messages like replies as a thread fallback (Krille) + +## v1.26.0 + +- feat: Add advanced configuration page (Krille) +- feat: clearly mark when a video is to be downloaded (Rafał Hirsch) +- feat: Filter for room members page and easier approve knocking users (Krille) +- feat: Navigate in image viewer with keyboard keys (krille-chan) +- feat: New video file picker button (Krille) +- feat: Send optional message with images or files (Krille) +- feat: support inline video playback on macOS (Rafał Hirsch) +- build: Flutter 3.29.3 (Krille) +- build: Update gorouter package (Krille) +- build: Update kotlin gradle plugin (Krille) +- build: Update matrix dart sdk (Krille) +- build: Update openssl to 0.5.0 (Krille) +- build: use singleInstance as launchmode (krille-chan) +- chore: Add matrix notifications for issues (Krille) +- chore: Better error handling for image rendering (krille-chan) +- chore: Better no compression supported UX (Krille) +- chore: Correct availability of desktop builds (Lenni) +- chore: disable echoCancel for audio messages (Krille) +- chore: divider when scrolled up (krille-chan) +- chore: Improve avatar designg (Krille) +- chore: Make push gateway configurable (Krille) +- chore: Nicer colors for reactions (krille-chan) +- chore: Nicer scaffold dialog for column mode (Krille) +- chore: Simpler changing config variables (Krille) +- chore: Update locale config for localizations (Krille) +- chore: Update pubspec.lock (Krille) +- chore: upgrade chewie and video_player packages (Rafał Hirsch) +- chore: Use Cupertino Activity Indicator in ChatEventList (krille-chan) +- chore: Use other join endpoint for room upgrades (Krille) +- fix(macos): update dependencies to make the build work (Rafał Hirsch) +- fix: Add missing \ html tag to render (Krille) +- fix: Consistent element padding between server picker and login view (xegim) +- fix: Index of numbered lists are off (Krille) +- fix: never use a transition on the shell route (Rafał Hirsch) +- fix: Null error in ClientChooserButton (krille-chan) +- fix: prevent users from creating spaces with empty names (ggurdin) +- fix: properly dispose VideoPlayerController (Rafał Hirsch) +- fix: Remove too sensitive dismiss gesture on chat list items (Krille) +- fix: Text scale factor in Linkify widgets (Krille) +- fix: update condition in account deletion function to allow deletion to go through (ggurdin) +- refactor: Easier shift enter logic for text input (Krille) +- refactor: Formatting (Krille) +- refactor: Implement avatar image viewer and adjust design (Krille) +- refactor: Improved UX for room upgrades (Krille) +- refactor: Migrate more config options to config viewer (Krille) +- refactor: Move public room bottom sheet into dialog (Krille) +- refactor: Remove custom font and emoji font workaround (krille-chan) +- refactor: Replace user bottom sheet with menu and small dialog (Krille) +- Added translation using Weblate (Telugu) (katakam chakri) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified Han script)) (Poesty Li) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional Han script)) (Mare JP) +- Translated using Weblate (Chinese (Traditional Han script)) (miullu) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (French) (Antonin Del Fabbro) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (German) (Very Able) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Latvian) (ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝)) +- Translated using Weblate (Polish) (Piotr Orzechowski) +- Translated using Weblate (Russian) (Yurt Page) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Kimby) +- Translated using Weblate (Telugu) (katakam chakri) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.25.0 + +- feat: Display all push rules and allow to enable disable them (Krille) +- feat: Inspect and delete push rules (Krille) +- feat: Pick share keys with (Krille) +- feat: Select share keys with property in security settings (Krille) +- feat: Use dynamic gradient for chat bubbles (Krille) +- fix: Image search rendering problem (krille-chan) +- build: Add locale config for android (krille-chan) +- build: Add missing permissions (Krille) +- build: Automerge weblate PRs (Krille) +- build: Fix ios debug build (krille-chan) +- build: Follow up auto merge weblate (Krille) +- build: remove weblate auto merge (Krille) +- build: Switch to flutter_shortcuts_new (Krille) +- build: Update dependencies for flutter (Krille) +- build: Update dependencies to remove more flutter android v1 references (Krille) +- build: Update fcm_shared_isolate (Krille) +- build: Update flutter web uild (Krille) +- build: Update flutter_olm to 2.0.0 (Krille) +- build: Update gradle version (Krille) +- build: Update native_imaging (Krille) +- build: Update PAT (Krille) +- build: Update to flutter 3.27.4 (Krille) +- build: Update weblate auto merge (Krille) +- build: Upgrade gradle (Krille) +- chore: Add explanation for PlayStore Safety Standards (Krille) +- chore: Add medium font (Krille) +- chore: Add start to ordered list (Krille) +- chore: Add tooltip to links in html (Krille) +- chore: Adjust button icon colors (Krille) +- chore: Adjust design of adaptive dialogs (krille-chan) +- chore: Adjust navrail design (Krille) +- chore: Adjust share scaffold dialog design (Krille) +- chore: Better connection status indicator (Krille) +- chore: Design adjustments (krille-chan) +- chore: Make login with matrix id more prominent again (krille-chan) +- chore: Message bubble color follow up (krille-chan) +- chore: Remove gradle workaround (Krille) +- chore: Slightly adjust welcome screen (Krille) +- chore: Use UbuntuMono (Krille) +- docs: Fix snap store icon (krille-chan) +- refactor: Display navigationrail in settings page (krille-chan) +- refactor: Follow up fix types in localization files (Krille) +- refactor: Improve sso login UX on web (krille-chan) +- refactor: Migrate to maintained badge package (Krille) +- refactor: Migrate uni_links to app_links (Krille) +- refactor: New html rendering (Krille) +- refactor: Remove broken callkeep implementation (Krille) +- refactor: Remove unused class (krille-chan) +- refactor: Switch to maintained qr code package (Krille) +- refactor: Switch to ubuntu font (krille-chan) +- refactor: Update arb file types (Krille) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (玖然) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional Han script)) (玖然) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Slovak) (Anonymous) +- Translated using Weblate (Spanish) (Alfredo Sola) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.24.0 + +- build: Add missing libssl library (krille-chan) +- build: Update dart_webrtc package (Krille) +- build: Update matrix sdk and dependencies (Krille) +- build: Update to flutter 3.27 (Krille) +- chore: Better bottom sheets on desktop (krille-chan) +- chore: Check file size before loading (krille-chan) +- chore: Display normal Slider when no waveform provided in audioplayer (krille-chan) +- chore: Do not display sender prefix for DM rooms in notification ticker (krille-chan) +- chore: Enable share multiple files to app (krille-chan) +- chore: Improve alias UX in chat settings (Krille) +- chore: Improve join abandoned invite exception (Krille) +- chore: Improve UserBottomSheet UX (Krille) +- chore: Make message bubble color dark also in dark mode (krille-chan) +- chore: Remove conversationTitle if room is dm room in android notifications (krille-chan) +- feat: QR Code viewer for mxid sharing (Krille) +- fix: Do not set public visibility for private groups (Krille) +- fix: Use MB and KB instead of MiB and KiB for file sizes (Krille) +- refactor: Adjust chat list item UX (Krille) +- refactor: Better custom image resizer (Krille) +- refactor: Clean up android manifest (Krille) +- refactor: Implement own adaptive dialogs and remove package (krille-chan) +- refactor: Improve UX of user role in UserBottomSheet (Krille) +- refactor: Improved share / forward dialog (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Czech) (Erin) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Polish) (Piotr Orzechowski) +- Translated using Weblate (Russian) (-) +- Translated using Weblate (Tamil) (Christian) +- Translated using Weblate (Tamil) (தமிழ்நேரம்) +- Translated using Weblate (Turkish) (goknarbahceli) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Vietnamese) (Tewuzij) + +## v1.23.0 + +- design: Highlight emoji only messages (Krille) +- design: New login design (Krille) +- docs: fix snapstore badge on website (Krille) +- feat: Add about server page (Krille) +- feat: Add default chat wallpaper (Krille) +- feat: Add markdown context actions for text input (krille-chan) +- feat: Better wallpapers with blur and opacity sliders and improved styles page (krille-chan) +- feat: Display warning banner on unverified devices (krille-chan) +- feat: New audio message design with displayed body (krille-chan) +- feat: Nicer room creation UI (krille-chan) +- feat: Open account manage url when using MAS (krille-chan) +- feat: Sending multiple files at once (krille-chan) +- feat: Swipe to archive rooms (Krille) +- fix: Bypass image compression in flutter_file_picker (q234rty) +- fix: dont use thumbnails for emoticons (Marek Vospěl) +- fix: Public rooms always publicly visible even when turned off on creation (krille-chan) +- fix: Wait for room invite before open in pushhelper (krille-chan) +- refactor: Better future loading dialog without flickering (krille-chan) +- refactor: Display two lines on new messages (krille-chan) +- refactor: Improve delete device UX flow (krille-chan) +- refactor: Load bytes from sending files later to not let app crash (krille-chan) +- refactor: Migrate to newer keyboard shortcuts package (Krille) +- refactor: Move to upstream geolocator (Krille) +- refactor: Performance boost for avatar widget (Krille) +- refactor: Remove duplicated navigator workaround (krille-chan) +- refactor: Remove keyboard shortcuts (Krille) +- refactor: Remove unnecessary builder widget (krille-chan) +- refactor: Reuse flutter local notifications object (krille-chan) +- refactor: Use adaptive dialog action (Krille) +- refactor: Use file selector on linux (krille-chan) +- refactor: Use non nullable localizations builder and lazy load on web (krille-chan) +- Revert "chore: Follow up new chat design" (Krille) +- Revert "feat: Add default chat wallpaper" (Krille) +- Revert "refactor: Performance boost for avatar widget" (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (German) (Peter Wallerius) +- Translated using Weblate (Hungarian) (Zentropivity) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- Translated using Weblate (Irish) (Christian) +- Translated using Weblate (Italian) (Angelo Schirinzi) +- Translated using Weblate (Korean) (Bruno Roh) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Latvian) (GGLVXD) +- Translated using Weblate (Russian) (Pavel Kozhukhov) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Spanish) (Kimby) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.22.0 + +FluffyChat v1.22.0 brings a new design for spaces, replaces the bottom navigation bar with filter +chips and makes it finally possible to play ogg audio messages on iOS. A lot of other fixes and +improvements have also been added to this release. + +FluffyChat also now uses the new authenticated media endpoints if the server supports Matrix v1.11 +or +mentions the msc with the key `org.matrix.msc3916.stable` in the `unstable_features`. + +- design: Add snackbar with link to changelog on new version (Krille) +- docs: Update privacy policy (krille-chan) +- feat: Support for matrix auth media endpoints +- feat: Convert opus to aac on iOS before playing (Krille) +- feat: New spaces and chat list design (krille-chan) +- feat: Record voice message with opus/ogg if supported (Krille) +- feat: Send voice messages from web (Krille) +- feat: Add about server page (Krille) +- feat: Add default chat wallpaper (Krille) +- feat: Add markdown context actions for text input (krille-chan) +- feat: Better wallpapers with blur and opacity sliders and improved styles page (krille-chan) +- feat: Display warning banner on unverified devices (krille-chan) +- feat: New audio message design with displayed body (krille-chan) +- feat: Nicer room creation UI (krille-chan) +- feat: Open account manage url when using MAS (krille-chan) +- feat: Sending multiple files at once (krille-chan) +- feat: Swipe to archive rooms (Krille) +- fix: Display only available join rules (Krille) +- fix: Path correct userId to ignore list (krille-chan) +- fix: Scroll to event missing the position (Krille) +- Fix web base url and privacy url configuration processing (dlyrsk) +- refactor: Clean up some widths (krille-chan) +- refactor: Design polishment and better user viewer (Krille) +- refactor: Migrate android gradle plugin (Krille) +- refactor: Only initialize FlutterLocalNotificationsPlugin once (krille-chan) +- refactor: Recording dialog (Krille) +- Refactor: Reduce .of(context) calls theme (Thomas Klein Langenhorst) +- refactor: Use cached network image for mxc image uris (Krille) +- Translated using Weblate (Arabic) (kdh8219) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (kdh8219) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (kdh8219) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (kdh8219) +- Translated using Weblate (Chinese (Traditional)) (Lukas) +- Translated using Weblate (Chinese (Traditional)) (Ricky From Hong Kong) +- Translated using Weblate (Chinese (Traditional)) (不知火 Shiranui) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Dutch) (Guacamolie) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Dutch) (Thomas Klein Langenhorst) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Estonian) (kdh8219) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Sovkipyk) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Pixelcode) +- Translated using Weblate (German) (tct123) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (-) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Turkish) (kdh8219) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Bezruchenko Simon) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.21.2 + +Updates the Matrix Dart SDK to fix some minor bugs. + +- Added translation using Weblate (Lojban) (Zig-Rust-Odin) +- build: Update matrix dart sdk (Krille) +- chore: Update last event after decryption (Krille) +- fix: Correctly localize time of date (Krille) +- refactor: Omit local types (Krille) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Polish) (Eryk Michalak) +- Translated using Weblate (Portuguese (Brazil)) (lucasmz-dev) +- Translated using Weblate (Russian) (Nicholas Winterhalter) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.21.1 + +- build: Update Matrix Dart SDK (Krille) +- build: Update to Flutter 3.22.2 (krille-chan) +- feat: add option to configure reply swipe direction (MrSpoony) +- fix: Add missing unlock button to lockscreen textfield (Krille) +- fix: Auto unlock lock screen (krille-chan) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Rauno Ots) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Vietnamese) (Karo) + +## v1.21.0 + +FluffyChat v1.21.0 introduces the new search feature which also includes a gallery and files list +for each chat. Several performance improvements have been added under the hood, leading to a much +nicer user experience. + +- feat: Enable download images on iOS, not only share images (krille-chan) +- feat: Search feature (krille-chan) +- build: Update record package (krille-chan) +- build: Use correct pubspec.yaml format for hosted dependency (krille-chan) +- build: Use matrix sdk main branch (krille-chan) +- chore: Change default timeout to 30 min (krille-chan) +- chore: Go back to pub.dev matrix sdk (Krille) +- chore: Hotfix create missing objectbox (Krille) +- chore: Increase default network request timeout (Krille) +- chore: Make bottomnavbar labels always visible (krille-chan) +- chore: Nicer message animation (krille-chan) +- chore: Only load last event sender if necessary (Krille) +- chore: Set a maxsize for textfields (Krille) +- chore: upgrade flutter to 3.22.0 (lauren n. liberda) +- chore: upgrade flutter to 3.22.1 (lauren n. liberda) +- ci: run `flutter gen-l10n` on code_tests (lauren n. liberda) +- design: Improve design of Voice Messages and add 1.25 as speed (Krille) +- fastlane: i18n ru (Yurt Page) +- fastlane: improve full_description.txt (Yurt Page) +- fix: Broken localization with empty strings in it (krille-chan) +- fix: FakeMatrixApi check (krille-chan) +- fix: mxc reactions not rendered correctly (krille-chan) +- fix: Stickers from gboard have black background (Krille) +- fix: voip code breaking from 0.28 (td) +- refactor: Delete database file on failed app start (krille-chan) +- refactor: Display better command hints (Krille) +- refactor: Improve performance of chat list (krille-chan) +- refactor: Precache theme and directchatmatrixid to improve performance in chat list item ( + krille-chan) +- refactor: Update to Matrix Dart SDK 0.29.9 (Krille) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Jozef Mlich) +- Translated using Weblate (Georgian) (Nicholas Winterhalter) +- Translated using Weblate (German) (Gian Klug) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Norwegian Bokmål) (sunniva) +- Translated using Weblate (Turkish) (Oğuz Ersen) + +## v1.20.0 + +Design improvements and new advanced UI to manage rooms. + +- build: Fix google services patch (Krille) +- build: Update matrix dart sdk (krille-chan) +- build: Update to Flutter 3.19.6 (krille-chan) +- chore: Let error reporter fill out bug report (krille-chan) +- chore: More nicer event source display (krille-chan) +- chore: Update user has knocked localization with emoji (krille-chan) +- design: Adjust chat settings design (krille-chan) +- design: Adjust settings design (krille-chan) +- design: Fix color of invite button (krille-chan) +- design: Follow up chat settings design (krille-chan) +- design: Follow up settings design (krille-chan) +- design: Improve user permission settings (krille-chan) +- design: New chat access settings (krille-chan) +- design: Redesign permissions settings with dropdownbuttons (krille-chan) +- design: Remake UX of selecting messages and chats (krille-chan) +- refactor: Download on android and iOS with file_picker (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Dutch) (Anonymous) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Hungarian) (Máté Menyhárt) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Latvian) (Edgars Andersons) +- Translated using Weblate (Portuguese (Brazil)) (lucasmz) +- Translated using Weblate (Portuguese (Brazil)) (Rudah Ximenes Alvarenga) + +## v1.19.2 + +Bugfix release to mostly fix the new database encryption on Linux and update the translations. + +- build: (deps): bump peaceiris/actions-gh-pages from 3 to 4 (dependabot[bot]) +- build: Update all dependencies and remove vibrator package (krille-chan) +- build: Update emoji picker package (krille-chan) +- build: Update flutter_map package (krille-chan) +- docs: Fix typo in android app description (Krille) +- fix: Allow unencrypted database if gnome keyring not present or platform does not support it ( + krille-chan) +- fix: Background color of images with transparency (Krille) +- fix: Localizations from weblate confused by unknownEvent locale (Krille) +- fix: More logs when database fails to init and trycatch sendInitNotification (Krille) +- Added translation using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Catalan) (fadelkon) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Chinese (Traditional)) (D0735) +- Translated using Weblate (Chinese (Traditional)) (Kyanos Chiu) +- Translated using Weblate (Croatian) (v1s7) +- Translated using Weblate (English) (v1s7) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Filipino) (searinminecraft) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Interlingua) (kdh8219) +- Translated using Weblate (Italian) (Krystian) +- Translated using Weblate (Korean) (kdh8219) +- Translated using Weblate (Persian) (EndermanXD) +- Translated using Weblate (Polish) (Adam Strączek) +- Translated using Weblate (Polish) (Krystian) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (v1s7) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.19.1 + +Minor bugfix release for login with SSO on web. + +- feat: Show/hide third column in chat view (krille-chan) +- design: Adjust some colors in inputbar (krille-chan) +- fix: Login with SSO on web (krille-chan) +- fix: Make chat permission settings null and type safe (krille-chan) +- chore: do not use static openssl (ShootingStarDragons) +- refactor: Move room headers into appbar bottom field (krille-chan) +- refactor: new flutter only typing animation (krille-chan) + +## v1.19.0 + +FluffyChat v1.19.0 features an improved design for message bubbles and a lot of fixes under the +hood. + +- build: Update matrix dart sdk (Krille) +- build: Update to flutter 3.19.5 (krille-chan) +- chore: Add missing command hints (krille-chan) +- chore: Add pagekey to custom page builder (Krille) +- chore: Adjust design of typing indicator (Krille) +- chore: Adjust ticker of notifications for Android (Krille) +- chore: Calc blurhash in other thread (Krille) +- chore: Mark muted unread rooms with bold text (krille-chan) +- chore: More minimal matrix pill (Krille) +- chore: Try out CupertinoPage instead of custom transition in router (krille-chan) +- ci: add a license compliance check (lauren n. liberda) +- design: Connect bubbles from same sender (krille-chan) +- design: Display images in correct ratio in timeline (krille-chan) +- design: Make appbar in material you design for mobile mode (krille-chan) +- design: New sticker picker next to emoji picker (krille-chan) +- design: Nicer QR Code design (krille-chan) +- design: Nicer reactions design with size animations (Krille) +- feat: Add insert content via gboard (krille-chan) +- feat: Reply with one button in desktop (krille-chan) +- fix: Do not sync in background mode (krille-chan) +- fix: FluffyChat should assume m.change_password capabilitiy is supported if not present per spec ( + krille-chan) +- fix: never use root navigator for bottom sheets (The one with the braid) +- fix: Remove pantalaimon message with normal error message (krille-chan) +- fix: Search in spaces view (krille-chan) +- fix: Set read marker on web (Krille) +- fix: Point to correct path for auth.html so completing sso login flow no longer 404s (Gavin Mogan) +- refactor: Better logic for removing outdated notifications (Krille) +- refactor: Enhance logic when to mark room as read (krille-chan) +- refactor: Remove old aliases workaround (Krille) +- refactor: Sticker widget code (Krille) +- refactor: Use dart blurhash (Krille) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Interlingua) (Software In Interlingua) + +## v1.18.0 + +- feat: Add speed button for audioplayer (krille-chan) +- feat: enhanced send video functionality by adding toggle send original (Mubeen Rizvi) +- feat: add dialog to hide presence list with long-press (Marcus Hoffmann) +- feat: Add notification shortcuts to android (krille-chan) +- feat: make showing user presence info optional (Marcus Hoffmann) +- feat: Open chat on shortcut click on android (krille-chan) +- fix: BuildContext crash when joining room (krille-chan) +- fix: Export session (krille-chan) +- fix: Notifications open sometimes automatically on android (krille-chan) +- fix: Open room after join (krille-chan) +- fix: Open room by notification happened multiple times (krille-chan) +- fix: Open room links with event id (krille-chan) +- fix: properly initialize hideUnimportantStateEvents setting (Marcus Hoffmann) +- fix: Remove status msg not changeable from old cache (krille-chan) +- fix: use correct icons for chat pin/unpin (Marcus Hoffmann) +- fix: use correct icons for mark read/unread action (Marcus Hoffmann) +- build: Update Linux build files (krille-chan) +- build: Update to Flutter 3.19.1 (Krille) +- chore: Add more information to Person object in android notifications (krille-chan) +- chore: Thumbnail follow up for notifications (Krille) +- refactor: Better download UX with file picker for android and iOS (krille-chan) +- refactor: Use hashcode instead of string to id workaround for notifications (Krille) +- Added translation using Weblate (Belarusian) (kopatych) +- Added translation using Weblate (Interlingua) (Software In Interlingua) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Benjamin Wagner) +- Translated using Weblate (Greek) (Benjamin Wagner) +- Translated using Weblate (Russian) (Benjamin Wagner) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Сергій) + +## v1.17.3 + +- feat: New account data based wallpaper feature (Krille) +- build: Update dependencies (Krille) +- build: Update flutter to 3.16.9 (Krille) +- build: Update matrix dart sdk to 0.25.7 (Krille) +- build: Update minor versions (Krille) +- chore: Adjust status msg design (krille-chan) +- chore: Improved error handling for recovery key (Krille) +- chore: Make stickers smaller (Krille) +- chore: Wait for device keys before ask bootstrap (Krille) +- fix: Missing null check in public room bottom sheet (Krille) +- fix: onDragDone crashes when no files found (Krille) +- fix: Render tg-forward html tags (Krille) +- fix: Use HapticFeedback.selectionClick() for long press on message (Krille) +- fix: whitespaces sometimes encoded in html message (Krille) +- fix: Share invite links of public rooms (Krille) + +## v1.17.2 + +Another minor bugfix release which also implements private read receipts. + +- feat: Implement private read receipts (krille-chan) +- feat: Join room by alias by tpying alias in searchbar (krille-chan) +- fix: Add cancel button to key request dialog (Krille) +- fix: Encode component for links correctly (Krille) +- fix: Forward arbitrary message content (krille-chan) +- fix: Open publicroombottomsheet by alias (krille-chan) +- docs: Add noto animated emojis link (krille-chan) +- docs: New website (krille-chan) +- build: Do not load emojis at initial start on web (krille-chan) +- build: Update flutter to 3.16.8 (krille-chan) +- build: Update sdk to 0.25.6 (Krille) +- chore: Add more explaining text for key verification (krille-chan) +- chore: Resort settings and add more description text (krille-chan) +- refactor: Dialog BuildContext (krille-chan) +- refactor: Use popupmenudivider instead of workaround (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Swedish) (Flat) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Сергій) + +## v1.17.1 + +Minor bugfix release. + +- build: Update matrix sdk 0.25.5 (Krille) +- build: Update to flutter 3.16.7 (Krille) +- chore: Remove vibration on iOS for long press (Krille) +- design: Better paddings in tablet mode (krille-chan) +- docs: Fix typo in readme (Krille) +- Fix dependency. missing yq when invoking setup-web. also ensure updated config.json copied in ( + Isaac Johnson) +- fix: text nodes with multiple links crash the timeline (Krille) +- fix: URL too long when reporting bug (Krille) +- fix: Wait for user device keys before start verification (Krille) + +## v1.17.0 + +FluffyChat v1.17.0 refreshes the overall user experience, changes some design and fixes a lot of +bugs. It also replaces the stories feature with matrix presences, introduces a new kind of database +to store the messages locally and improves the performance and app stability. + +- change: Remove wallpaper feature (krille-chan) +- design: Adjust login page design (krille-chan) +- design: Adjust new chat page design (Krille) +- design: Adjust reply design (krille-chan) +- design: New design for login page (krille-chan) +- feat: Add registration buttons for servers with public registration url (krille-chan) +- feat: Animate in new events in timeline (krille-chan) +- feat: Block users who sent invites (krille-chan) +- feat: Display migration notification (Krille) +- feat: Hovermenu for messages for mouse (krille-chan) +- feat: New change password page with server capabilities check (krille-chan) +- feat: Search for public spaces (krille-chan) +- feat: Try out FluffyBox 2 database (Krille) +- fix: Add 3pid email for password reset (krille-chan) +- fix: Audiomessage break app (Krille) +- fix: Cannot change send on enter on desktop (krille-chan) +- fix: Darktheme contrast fixes with primary color (krille-chan) +- fix: Join public rooms (krille-chan) +- fix: Make user admin (krille-chan) +- fix: New json url for homeserver list (krille-chan) +- fix: Open notification for invite crashes app (krille-chan) +- fix: Remove web background (Krille) +- fix: Some links not clickable in messages (Krille) +- fix: Update manual endpoints (Krille) +- fix: Web SSO (Krille) +- refactor: More stable scroll to event (krille-chan) +- refactor: Reinvite other part instead of reopen dm (Krille) +- refactor: Remove todo list feature (krille-chan) +- refactor: Remove unnecessary setState in ChatPage for better performance (krille-chan) +- refactor: Remove unused code (krille-chan) +- refactor: Remove unused localization strings and add ci check (krille-chan) +- refactor: Replace stories feature with presence status msg (Krille) +- refactor: Spaces UX improvements (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Hindi) (immodded) +- Translated using Weblate (Italian) (Claudio Maradonna) +- Translated using Weblate (Italian) (Timothy Redaelli) +- Translated using Weblate (Portuguese (Brazil)) (Hermógenes Oliveira) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.16.1 + +Test candidate for the new database. + +## v1.16.0 + +- build: Set olm to 1.3.2 to fix android build (krille-chan) +- build: Update dependencies (krille-chan) +- build: Update flutter_olm (Krille) +- build: Update matrix dart sdk to 0.23.0 (Krille) +- build: Update Matrix Dart SDK to 0.24.0 (Krille) +- build: Update openssl crypto (Krille) +- build: Update to flutter 3.16.2 (krille-chan) +- build: Workaround for broken flutter secure storage on linux (krille-chan) +- chore: Add error report for incorrect recovery key (Krille) +- chore: Always show notification popup on android (krille-chan) +- chore: Do not ship unused emoji font for android and iOS (krille-chan) +- chore: Fetch cached presence (Krille) +- chore: Update pubspec.lock (Krille) +- chore: upgrade flutter to 3.16.0 (lauren n. liberda) +- docs: Fix links to GitHub (Jérémie Roquet) +- feat: Display presences in the app (krille-chan) +- feat: Enable experimental suport for dehydrated devices (Krille) +- feat: Improved UX design for new chat page (krille-chan) +- feat: New UX design for create group chat (krille-chan) +- fix: Block users (krille-chan) +- fix: Blurhash crashes on height 0 (krille-chan) +- fix: Do not hide push if app romm in foreground but is in background (krille-chan) +- fix: Do not scroll up on enter chat (Krille) +- fix: emoji import from ZIP file (The one with the braid) +- fix: Encryption dialog crashes in column mode (krille-chan) +- fix: Error widget spamming with dialogs (Krille) +- fix: fcm patch (lauren n. liberda) +- fix: Glitch in event info dialog (krille-chan) +- fix: message bubble position on desktop devices (The one with the braid) +- fix: navigating back from full screen video (Aryan Arora) +- fix: Only load first pinned event (krille-chan) +- fix: Userbottomsheet crash on some edge cases (krille-chan) +- fix: whatever happens with android native libraries since flutter 3.16 (lauren n. liberda) +- refactor: Check if app is in foreground on pushhelper (krille-chan) +- refactor: Event list (krille-chan) +- refactor: Migrate for Flutter 3.16.0 (Krille) +- refactor: Remove copy dialog before opening links (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Bengali) (Allan Nordhøy) +- Translated using Weblate (Bengali) (Anonymous) +- Translated using Weblate (Bengali) (Graeme Power) +- Translated using Weblate (Bengali) (Joaquim Homrighausen) +- Translated using Weblate (Bengali) (Raatty) +- Translated using Weblate (Bengali) (Sorunome) +- Translated using Weblate (Catalan) (Adolfo Jayme Barrientos) +- Translated using Weblate (Catalan) (Anonymous) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Catalan) (Joaquim Homrighausen) +- Translated using Weblate (Catalan) (Raatty) +- Translated using Weblate (Chinese (Simplified)) (Anonymous) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Traditional)) (Anonymous) +- Translated using Weblate (Chinese (Traditional)) (Joaquim Homrighausen) +- Translated using Weblate (Chinese (Traditional)) (Raatty) +- Translated using Weblate (Chinese (Traditional)) (SuperSonic) +- Translated using Weblate (Croatian) (Anonymous) +- Translated using Weblate (Czech) (Anonymous) +- Translated using Weblate (Czech) (Tomkoid) +- Translated using Weblate (Esperanto) (Anonymous) +- Translated using Weblate (Esperanto) (Joaquim Homrighausen) +- Translated using Weblate (Esperanto) (Raatty) +- Translated using Weblate (Esperanto) (Tirifto) +- Translated using Weblate (Finnish) (Anonymous) +- Translated using Weblate (French) (Anonymous) +- Translated using Weblate (French) (Mæve Rey) +- Translated using Weblate (Galician) (Anonymous) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Bella) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (Greek) (Anonymous) +- Translated using Weblate (Hebrew) (Anonymous) +- Translated using Weblate (Hebrew) (Joaquim Homrighausen) +- Translated using Weblate (Hebrew) (Raatty) +- Translated using Weblate (Hebrew) (Sorunome) +- Translated using Weblate (Hebrew) (y batvinik) +- Translated using Weblate (Hindi) (Anonymous) +- Translated using Weblate (Hungarian) (Anonymous) +- Translated using Weblate (Hungarian) (Joaquim Homrighausen) +- Translated using Weblate (Hungarian) (notramo) +- Translated using Weblate (Hungarian) (Raatty) +- Translated using Weblate (Indonesian) (Anonymous) +- Translated using Weblate (Irish) (Anonymous) +- Translated using Weblate (Irish) (Graeme Power) +- Translated using Weblate (Irish) (Joaquim Homrighausen) +- Translated using Weblate (Irish) (Raatty) +- Translated using Weblate (Italian) (Anonymous) +- Translated using Weblate (Italian) (J. Lavoie) +- Translated using Weblate (Italian) (Joaquim Homrighausen) +- Translated using Weblate (Italian) (Raatty) +- Translated using Weblate (Japanese) (Anonymous) +- Translated using Weblate (Japanese) (cPidx) +- Translated using Weblate (Korean) (Anonymous) +- Translated using Weblate (Korean) (Kim Tae Kyeong) +- Translated using Weblate (Korean) (Raatty) +- Translated using Weblate (Latvian) (Anonymous) +- Translated using Weblate (Lithuanian) (Anonymous) +- Translated using Weblate (Lithuanian) (Mind) +- Translated using Weblate (Norwegian Bokmål) (Allan Nordhøy) +- Translated using Weblate (Norwegian Bokmål) (Anonymous) +- Translated using Weblate (Norwegian Bokmål) (Joaquim Homrighausen) +- Translated using Weblate (Norwegian Bokmål) (Raatty) +- Translated using Weblate (Occidental) (Anonymous) +- Translated using Weblate (Occidental) (OIS) +- Translated using Weblate (Persian) (Anonymous) +- Translated using Weblate (Polish) (Anonymous) +- Translated using Weblate (Portuguese (Brazil)) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Anonymous) +- Translated using Weblate (Portuguese (Portugal)) (Joaquim Homrighausen) +- Translated using Weblate (Portuguese (Portugal)) (Raatty) +- Translated using Weblate (Portuguese (Portugal)) (Tmpod) +- Translated using Weblate (Portuguese) (Allan Nordhøy) +- Translated using Weblate (Portuguese) (Anonymous) +- Translated using Weblate (Portuguese) (Christian) +- Translated using Weblate (Portuguese) (Graeme Power) +- Translated using Weblate (Portuguese) (Joaquim Homrighausen) +- Translated using Weblate (Portuguese) (Raatty) +- Translated using Weblate (Portuguese) (Sorunome) +- Translated using Weblate (Romanian) (Anonymous) +- Translated using Weblate (Russian) (Anonymous) +- Translated using Weblate (Serbian) (Anonymous) +- Translated using Weblate (Serbian) (Joaquim Homrighausen) +- Translated using Weblate (Serbian) (Raatty) +- Translated using Weblate (Serbian) (Слободан Симић(Slobodan Simić)) +- Translated using Weblate (Slovak) (Allan Nordhøy) +- Translated using Weblate (Slovak) (Anonymous) +- Translated using Weblate (Slovak) (Graeme Power) +- Translated using Weblate (Slovak) (Joaquim Homrighausen) +- Translated using Weblate (Slovak) (Raatty) +- Translated using Weblate (Slovenian) (Anonymous) +- Translated using Weblate (Slovenian) (Joaquim Homrighausen) +- Translated using Weblate (Slovenian) (Raatty) +- Translated using Weblate (Spanish) (Anonymous) +- Translated using Weblate (Spanish) (Joaquim Homrighausen) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Mæve Rey) +- Translated using Weblate (Spanish) (programmerpony) +- Translated using Weblate (Spanish) (Raatty) +- Translated using Weblate (Swedish) (Anonymous) +- Translated using Weblate (Swedish) (Dennis) +- Translated using Weblate (Swedish) (Fredrik Lindqvist) +- Translated using Weblate (Swedish) (paintwithblue) +- Translated using Weblate (Tamil) (Anonymous) +- Translated using Weblate (Tamil) (Graeme Power) +- Translated using Weblate (Tamil) (Joaquim Homrighausen) +- Translated using Weblate (Tamil) (Raatty) +- Translated using Weblate (Tamil) (Sorunome) +- Translated using Weblate (Thai) (Anonymous) +- Translated using Weblate (Tibetan) (Anonymous) +- Translated using Weblate (Turkish) (Anonymous) +- Translated using Weblate (Turkish) (Yourredyknowwhoitisss) +- Translated using Weblate (Vietnamese) (Allan Nordhøy) +- Translated using Weblate (Vietnamese) (Anonymous) +- Translated using Weblate (Vietnamese) (Christian) +- Translated using Weblate (Vietnamese) (Graeme Power) +- Translated using Weblate (Vietnamese) (Joaquim Homrighausen) +- Translated using Weblate (Vietnamese) (Raatty) +- Translated using Weblate (Vietnamese) (Sorunome) + +## v1.15.1 + +- feat: Make all text in chat selectable on desktop (krille-chan) +- chore: Add border to images in timeline (krille-chan) +- chore: added android audio sharing intent (Aryan Arora) +- fix: Dockerfile: install jq in the builder image (David Douard) +- fix: Cannot pin messages of other users (Krille) +- fix: Emojipicker flickering because noRecent (krille-chan) +- fix: LoadProfileBottomSheet accessing disposed outerContext (Aryan Arora) +- fix: More stable scroll up to event (krille-chan) +- fix: Properly capitalize Linux window title (kramo) +- fix: Remove failed to sent events (krille-chan) +- fix: Routing glitch when using SSO on desktop (krille-chan) +- fix: SSO with no identity providers (krille-chan) +- refactor: Do not init client in background mode on Android (krille-chan) +- refactor: Store and fix missing persistence of some values (krille-chan) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Czech) (Vojtěch Fošnár) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (German) (Haui) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.15.0 + +- feat: Add experimental todo list for rooms (krille-chan) +- feat: better scroll to last read message handling (krille-chan) +- build: Add appid suffix to android debug builds (krille-chan) +- build: Download canvaskit on build for flutter web (krille-chan) +- build: Update to Flutter 3.13.9 (krille-chan) +- chore: Add descriptions in the areYouSure dialogs for better UX (krille-chan) +- chore: Adjust bitrate for smaller voice messages (krille-chan) +- chore: Change way how to seek in audioplayer (Krille) +- chore: Limit image file and video picker until we have a background service (krille-chan) +- chore: Minor design fixes (Krille) +- design: Make incoming messages color more light (krille-chan) +- design: Make key verification an adaptive dialog (krille-chan) +- design: Make own chat bubble primary color for better contrast (krille-chan) +- fix: Create chat dialog crashes sometimes and power level textfield does not validate input ( + krille-chan) +- fix: Remove uncompatible dependencies connectivity_plus and wakelock (Krille) +- fix: Use correct localization for redactedBy (krille-chan) +- fix: noFCM warning dialog (krille-chan) +- fix: render tg-forward as blockquote style (krille-chan) +- fix: Archive does not update its state +- refactor: Change audio codec to opus where supported to have better compatibility with Element ( + Krille) +- refactor: Make file dialog adaptive and adjust design (krille-chan) +- refactor: Preload notification sound on web (Krille) +- refactor: Remove unused config (krille-chan) +- refactor: Remove unused config params (krille-chan) +- refactor: Update FutureLoadingDialog (krille-chan) +- refactor: use locally hosted canvaskit instead of calling google (root) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Ettore Atalan) +- Translated using Weblate (Hungarian) (H Tamás) +- Translated using Weblate (Polish) (Tomasz W) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Slovak) (Jozef Gaal) +- Translated using Weblate (Thai) (Amy/Atius) + +## v1.14.5 + +- Hotfix iOS crashes on start +- Hotfix cannot reset applock + +## v1.14.4 + +Minor bugfix release. Please note that because of a Flutter update FluffyChat is no longer +compatible with iOS 11. + +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Spanish) (Yotta Mxt) +- build: Add custom iOS notification sound (Krille) +- build: Set minimum iOS version to 12 +- design: Hide Navigationbar labels (krille-chan) +- design: New notification sound (krille-chan) +- fix: Flutter warnings because of applock animation (krille-chan) +- fix: UIA requests with navigator (krille-chan) +- fix: open story from push notification (Krille-chan) +- refactor: Only preload client for GUI start (krille-chan) + +## v1.14.3 + +- hotfix app lock still displayed even when account is logged out +- Update to Flutter 3.13.6 + +## v1.14.2 + +- hotfix for broken applock screen + +## v1.14.1 + +- fix: Routing bug when adding second account via password login + +## v1.14.0 + +Release with a lot of bugfixes and refactorings under the hood. FluffyChat now uses go_router +instead of vrouter, works with the newest Flutter SDK and supports "reason" field for redactions. +For Android there is a new "background-fetch mode" for Push Notifications which should make +notifications in background faster and more reliable and reduce battery-usage. + +- feat: Background fetch mode on Android (krille-chan) +- feat: Improved mouse support for selecting events (krille-chan) +- feat: Write and display reason for redacting a message (krille-chan) +- build: Add curl to build packages (krille-chan) +- build: Re-add handywindow linux code lines (Krille) +- build: Update Matrix dart sdk to 0.22.3 (Krille) +- build: Update targetSdkVersion to 33 (Android 13) (Krille) +- build: Update to Flutter 3.13.1 (Krille) +- change: Remove widgets feature (Krille) +- chore: Add tailwind.css to gitignore (Krille) +- chore: Display username in userbottomsheet (krille-chan) +- chore: Make appbar buttons correct size (krille-chan) +- chore: Update file picker (krille-chan) +- ci: Build snap on snapcraft again and only promote from ci (krille-chan) +- ci: Test if app builds for iOS (krille-chan) +- design: Add scale animation hover effects on navrail and story buttons (Krille) +- design: Big redesign of three column mode to advanced two column mode (krille-chan) +- design: Chat list design adjustments (Krille) +- design: Display last story as tiny message bubble in chat list (krille-chan) +- design: Improve invite chat UX (krille-chan) +- design: Move chatbackup in adaptive bottom sheet (krille-chan) +- design: New three column layout for wide screens (krille-chan) +- design: Nicer user bottom sheet (krille-chan) +- design: Redesign style page (Krille) +- docs: Update readme (Krille) +- feat/ChatListItem: small changes (gilice) +- fix: Bootstrap on first try fails sometimes (krille-chan) +- fix: Cancel search on back button tap on android (Krille) +- fix: Do not allow empty search server (krille-chan) +- fix: First story appears to be unencrypted sometimes (krille-chan) +- fix: Remove mpv and zenity to fix linux snap builds (krille-chan) +- fix: Unable to send files from snap version (krille-chan) +- refactor: Change group description to chat description (krille-chan) +- refactor: Make router static (Krille) +- refactor: Migrate from pathsegment routing (Krille) +- refactor: Migrate routes to go router (krille-chan) +- refactor: Remove bubble size slider (Krille) +- refactor: Replace vrouter with gorouter (Krille) +- refactor: Space routes to normal room routes (Krille) +- refactor: Update badge (krille-chan) +- refactor: Update html build files (krille-chan) +- Added translation using Weblate (Toki Pona) (Sollee) +- Deleted translation using Weblate (Toki Pona) (Christian) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Czech) (Flibble) +- Translated using Weblate (Czech) (Matyáš Caras) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Christian) +- Translated using Weblate (Russian) (DarkCoder15) +- Translated using Weblate (Russian) (v1s7) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Skrripy) + +## v1.13.0 + +- feat: option to not send typing notifications (Bnyro) +- feat: small performance tweaks for Message (gilice) +- feat: New onboarding screen with SSO as first class feature +- feat: Import/Export emoji packs from/to zip file +- fix: Set iOS badge (Krille) +- refactor: Switch the dev hosting platform from GitLab to GitHub +- design: New more compact chat bubble design and other design tweaks +- design: Login now shows SSO more prominent and deprecates in-app registration in favor of SSO + registration +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Chinese (Simplified)) (Poesty Li) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (German) (nautilusx) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.12.0 + +- Added translation using Weblate (Toki Pona) (Mæve Rey) +- Translated using Weblate (Arabic) (Rex_sa) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Polish) (lauren n. liberda) +- Translated using Weblate (Romanian) (Riley) +- Translated using Weblate (Russian) (DarkCoder15) +- Translated using Weblate (Spanish) (José Muñoz) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- build: Remove dependency overwrite for ffi (Krille) +- build: Update dependencies (Krille) +- builds: Change minsdkversion of Android from 16 to 19 (Krille) +- builds: Do not allow failure for linux x86 (Krille) +- builds: Do not use verbose mode on building linux (Krille) +- builds: Linux with flutter 3.10 (Krille) +- builds: Remove workaround for building linux arm64 (Krille) +- builds: Update file_picker to 5.3.0 (Krille) +- builds: Update flutter table html (Krille) +- builds: Update flutter_html (Krille) +- builds: migrate to dart 3.0/flutter 3.10 (lauren n. liberda) +- chore: Add missing blockquote style (Krille) +- chore: Allow failure in build linux for now (Krille) +- chore: Ask for storage persistence (Krille) +- chore: Clean unused translations (Malin Errenst) +- chore: Enhance room pills (Krille) +- chore: Minor code clean up (Krille) +- chore: Update flutter webrtc (Krille) +- chore: Upgrade to Flutter 3.10.1 (Malin Errenst) +- chore: change release curl calls to use --fail-with-body (Tim Flink) +- chore: update macOS icons and add build script (TheOneWithTheBraid) +- design: Replace anime images with neutral cupertino icons (Krille) +- feat: Add toggle to mute notifications from chat groups (fbievan) +- feat: Allow ruby tags in html (Krille) +- feat: Display progress value for initial sync (Krille) +- feat: Implement new error reporting tool when critical features break like playing audio or video + messages or opening a chat (Krille) +- feat: clean up macOS build metadata (TheOneWithTheBraid) +- feat: set display information correctly (TheOneWithTheBraid) +- feat: update macOS build files (TheOneWithTheBraid) +- feat: update macOS build information for macOS Ventura (TheOneWithTheBraid) +- fix "Unhandled Exception: VRouter.of(context) was called with a context which does not contain a + VRouter." (Lauren N. Liberda) +- fix: Broken arb file (Krille) +- fix: Do not unnecessary request all members in public rooms (Krille) +- fix: Remove wrong rendered linebreak in html (Krille) +- fix: Scroll down button (Krille) +- fix: Scroll up and scroll down buttons in chat list (Krille) +- fix: Scrolldown button (Krille) +- fix: Too long file name cause a render overflow (Skying) +- fix: Try to reload timeline on IOException (Krille) +- fix: User pills (Krille) +- fix: broken CI artifact uploads (TheOneWithTheBraid) +- fix: custom emote placeholder (TheOneWithTheBraid) +- fix: path of libolm (TheOneWithTheBraid) +- fix: Quick account switching (JHansen) +- fix: read reciepts (JHansen) +- perf: Use valuenotifier to not rebuild chatlist (Krille) +- refactor: Reimplement flutter matrix html locally (Krille) +- refactor: Update Roboto and Noto Emoji (The one with the Braid) +- refactor: Use AnimatedSize for FAB (Krille) +- refactor: Use DateTime for weekday localization (Malin Errenst) + +## v1.11.2 + +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Polish) (Eryk Michalak) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- feat: Permission dialog before open link in browser (Krille) +- fix: Chats do not load (Krille) + +## v1.11.1 - 2023-04-20 + +- fix: Download files on web and iOS with correct mimetype + +## v1.11.0 - 2023-04-14 + +- feat: Add visual read marker (Krille) +- feat: Jump to last read event (Krille) +- feat: Use fragmented timeline to jump to event (Krille) +- feat: change to flutterwebauth2 (ShootingStarDragons) +- fix: Join public room (Krille) +- fix: Set fcm priority to max on android (Krille) +- refactor: CI scripts and old workarounds for build scripts (Krille) +- refactor: Client in ChatPage (Krille) +- refactor: Not nullable room in ChatPage (Krille) +- refactor: Switch to file_picker package and get rid of some dependency overrides (Krille) +- refactor: Use correct Matrix instance (Krille) +- style: Make emptypage logo bigger (Krille) +- style: Minor adjustments for modal bottom sheets (Krille) +- style: Move chats to top (Krille) +- style: Use SliverList for chatlist (Krille) +- refactor: Container -> SizedBox.shrink() (noob_tea) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Parsa) +- Translated using Weblate (Persian) (Siavash) +- Translated using Weblate (Polish) (Luna) +- Translated using Weblate (Swedish) (Kristoffer Grundström) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) + +## v1.10.0 - 2023-02-25 + +- Added translation using Weblate (Thai) (Wphaoka) +- Added translation using Weblate (Tibetan) (Nathan Freitas) +- Default hardcoded message when l10n is not available (fabienli) +- Fix: The stable repo fingerprint (TODO the qr-code should be updated) (machiav3lli) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Japanese) (Suguru Hirahara) +- Translated using Weblate (Persian) (Farooq Karimi Zadeh) +- Translated using Weblate (Swedish) (Joaquim Homrighausen) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Disable stable for web until script is fixed (Krille) +- chore: Display warning when logout without backup (Krille) +- chore: Downgrade flutter CI version (Krille) +- chore: Follow up audioplayer on linux (Krille) +- chore: Follow up chat encryption desgin (Krille) +- chore: Follow up fix audioplayer on android (Christian Pauly) +- chore: Follow up formatting (Christian Pauly) +- chore: Follow up formatting (Krille) +- chore: Follow up remove hero animation (Krille) +- chore: Follow up secrity settings design (Krille) +- chore: Follow up settings page (Krille) +- chore: Follow up settings page design (Christian Pauly) +- chore: Follow up style adjustments (Krille) +- chore: Lookup l10n in pushhelper if null (Krille) +- chore: Update matrix package to 0.17.0 (Krille) +- chore: Update to Flutter 3.7.1 (Krille) +- docs/qr-stable.svg: update the QR code (Aminda Suomalainen) +- feat: Enable audioplayer for web and linux (Christian Pauly) +- fix: Display error when user tries to send too large file (Christian Pauly) +- refactor: Do only instantiate AudioPlayer() object when in use (Christian Pauly) +- refactor: Remove syncstatus verbose logs (Christian Pauly) +- refactor: Store cached files in tmp directory so OS will clear file cache from time to time ( + Krille) +- style: Adjust key verification dialog (Christian Pauly) +- style: Bootstrap design adjustments (Christian Pauly) +- style: Encryption page adjustments (Christian Pauly) +- style: Enhance user device settings design (Krille) +- style: Enhanced chat details design (Krille) +- style: Give chat list list tiles rounded corners (Krille) +- style: Link underline color (Christian Pauly) +- style: Make adaptive bottom sheets scrollable by default (Krille) +- style: Make invite page more pretty (Krille) +- style: New settings design (Krille) +- style: Nicer chips in encryption settings and icons showing device status (Krille) +- style: Use emojis on web as well (Christian Pauly) +- style: Use robotomono to display device keys (Christian Pauly) +- utils/url_launcher: force opening http(s) links in external browser (Marcus Hoffmann) + +## v1.9.0 - 2023-01-29 + +- Translated using Weblate (Czech) (Michal Bedáň) +- Translated using Weblate (Czech) (grreby) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (josé m) +- Translated using Weblate (German) (Christian) +- Translated using Weblate (German) (Vri 🌈) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Korean) (Youngbin Han) +- Translated using Weblate (Polish) (Wiktor) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Change invite link textfield label (Krille) +- chore: Remove unused dependency (Krille) +- chore: Remove unused translations (Krille) +- chore: Update Matrix SDK and refactor (Krille) +- chore: Update dependencies (Krille) +- chore: Update flutter_map (Krille) +- chore: add integration tests (TheOneWithTheBraid) +- chore: add integration tests for spaces (TheOneWithTheBraid) +- design: More clear chat background and rounded popup menu (Krille) +- design: Nicer navigationrail (Krille) +- design: Upgrade to Flutter 3.7 +- feat: Bring back disabling the header bar on Linux desktop (q234rty) +- feat: Nicer design for abandonded DM rooms (Christian Pauly) +- fix: Archive (Krille) +- fix: Shared preferences package for flutter 3.7 (Christian Pauly) +- fix: permission of web builds (TheOneWithTheBraid) +- fix: Notification Settings (Krille) +- refactor: Migrate to Flutter 3.7.0 (Christian Pauly) +- refactor: Same animations everywhere in app (Krille) +- refactor: Stories header with futurebuilder (Krille) +- refactor: disable some redundant tests (TheOneWithTheBraid) +- style: Animate in out search results (Krille) +- style: New modal bottom sheets (Krille) +- style: Redesign public room bottomsheets (Krille) + +## v1.8.0 2022-12-30 + +- Added translation using Weblate (Yue (yue_HK)) (Raatty) +- Translated using Weblate (Chinese (Simplified)) (Mike Evans) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- design: New encryption page (Krille Fear) +- feat: Add audio message support to linux (Krille Fear) +- feat: Use Android system accent color (Krille Fear) +- feat: include olm to Windows builds (TheOneWithTheBraid) +- feat: Store drafts (Krille) +- fix: Android push notification follow-up (TheOneWithTheBraid) +- fix: Content banner (Krille Fear) +- fix: Correct redacted by username (Krille Fear) +- fix: Do not setup push on every app resume (Krille Fear) +- fix: Encryption button is orange in public rooms (Krille Fear) +- fix: File event design (Krille Fear) +- fix: Hide google services warning after marked (Krille Fear) +- fix: Improve story page appearance (Reinhart Previano Koentjoro) +- fix: Libhandy windows (Krille Fear) +- fix: Monochromatic icon rendering for Android 13+ (Reinhart Previano Koentjoro) +- fix: homeserver error text not visible in app bar (TheOneWithTheBraid) +- fix: minor issues in room list (TheOneWithTheBraid) + +## v1.7.2 2022-12-19 + +Update dependencies and translations. + +## v1.7.1 2022-11-23 + +Minor bugfix release to retrigger build for FlatPak and Android. Fixes some style bugs and updates +some translations + +## v1.7.0 2022-11-17 + +FluffyChat 1.7.0 features a new way to work with spaces via a bottom navigation bar. A lot of work +has also been done under the hood to make the app faster and more stable. The main color has +slightly changed and the design got some finetuning. + +- chore: Add keys to roomlist and stories header (Christian Pauly) +- chore: Add unread badge to navigation rail and adjust design (Christian Pauly) +- chore: Adjust colors (Christian Pauly) +- chore: Better design chat list items (Christian Pauly) +- chore: Better load first client (Christian Pauly) +- design: Hide unimportant state events instead of folding (Christian Pauly) +- design: Improve login design (Krille Fear) +- design: Nicer display notification short texts (Christian Pauly) +- feat: background and terminated calls [android] (td) +- feat: New navigation design (Christian Pauly) +- fix: Hide password at login page (Krille Fear) +- fix: Import session on iOS (Christian Pauly) +- fix: incorrect setState inside setState in ChatListController (td) +- fix: Password not obscure for a second when submitting login textfield (Christian Pauly) +- fix: Popup menu without elevation (Christian Pauly) +- fix: Push error message (Christian Pauly) +- fix: Remove emoji picker workaround (Christian Pauly) +- fix: Set theme after start app (Christian Pauly) +- fix: Settings profile picture (Christian Pauly) +- fix: Share files (Christian Pauly) +- fix: UIA request handler (Christian Pauly) +- fix: Update emoji picker for web and desktop (Christian Pauly) +- improved (most) icons/image scaling, including avatar scaling (Mg138) +- Mention Element instead of Riot (Has been renamed about a year ago) (jooooscha) +- refactor: Chat list body code (Christian Pauly) +- refactor: Minor chatlist refactoring (Christian Pauly) +- refactor: No longer need selected of chat list tile (Christian Pauly) +- refactor: Remove unused dependencies (Krille Fear) +- Added translation using Weblate (Hindi) (Hemish) +- Added translation using Weblate (Occidental) (OIS) +- Translated using Weblate (Basque) (xabirequejo) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Chinese (Simplified)) (Raatty) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Estonian) (Raatty) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Finnish) (Raatty) +- Translated using Weblate (French) (Anne Onyme 017) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (German) (Jana) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Lithuanian) (Anonimas) +- Translated using Weblate (Occidental) (OIS) +- Translated using Weblate (Persian) (Anastázius Darián) +- Translated using Weblate (Persian) (Anastázius Kaejatídarján) +- Translated using Weblate (Persian) (Seyedmahdi Moosavyan) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Turkish) (Raatty) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- Translated using Weblate (Ukrainian) (Raatty) + +## v1.6.4 - 2022-09-08 + +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Slovak) (Marek Ľach) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Adjust bubble color in dark mode (Christian Pauly) +- chore: Update matrix sdk (Christian Pauly) +- chore: Update to flutter 3.3.0 (Christian Pauly) +- feat: Automatic key requests and better key error dialog (Christian Pauly) +- fix: Styling and notification settings (Christian Pauly) +- fix: add missing command localizations (Christian Pauly) + +## v1.6.3 - 2022-08-25 + +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Russian) (Sergey Shavin) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Migrate back to flutter hive collections (Christian Pauly) +- chore: Update provider package and remove dep override (Christian Pauly) +- fix: Do not display push events for unknown event types (Christian Pauly) +- refactor: App widget (Christian Pauly) + +## v1.6.0 - 2022-07-31 + +FluffyChat 1.6.0 features a lot of bug fixes and improvements. The code base has been +simplified and the drawer on the chat list page got a come-back. Some new features like +the space hierarchy and session dump have been implemented. + +- feat: Added monochrome entry for themed icon support in Android 13 (James Reilly) +- feat: Display timeline of messages in android notification (Christian Pauly) +- feat: Emoji related fixes (TheOneWithTheBraid) +- feat: Implement deleting pushers in app (Christian Pauly) +- feat: New material 3 design (Christian Pauly) +- feat: Redesign bootsstrap and offer secure storage support (Christian Pauly) +- feat: Send multiple images at once (Christian Pauly) +- feat: implement session dump (TheOneWithTheBraid) +- feat: implement space hierarchy (TheOneWithTheBraid) +- feat: introduce extended integration tests (TheOneWithTheBraid) +- feat: libhandy integration (TheOneWithTheBraid) +- fix: Clearing push triggered when only one room got seen (Christian Pauly) +- fix: Dont display loading dialog when adding reaction (Christian Pauly) +- fix: Follow up for spaces hierarchy (TheOneWithTheBraid) +- fix: Missing null checks in chat details view (Christian Pauly) +- fix: Non FCM Android builds crash on start (Christian Pauly) +- fix: Permission chooser dialog on iOS (Christian Pauly) +- fix: Set avatar on only single action available (Christian Pauly) +- fix: Sharing on iOS and iPad (Christian Pauly) +- fix: Unread bubble is invisible in dark mode (Christian Pauly) +- fix: appimage builds (TheOneWithTheBraid) +- fix: only use custom http client on android (Jayesh Nirve) +- fix: pass isrg cert to http client (Jayesh Nirve) +- refactor: Chat view (Christian Pauly) +- refactor: Encryption button (Christian Pauly) +- refactor: Remove duplicated imports (Christian Pauly) +- refactor: Remove legacy store (Christian Pauly) +- refactor: Remove presence status feature (Christian Pauly) +- refactor: Simplify MxcImage and replace CachedNetworkImage (Christian Pauly) +- refactor: Switch to Hive Collections DB (Christian Pauly) +- refactor: move start chat FAB to implementation file (TheOneWithTheBraid) +- Translated using Weblate (Catalan) (Alfonso Montero López) +- Translated using Weblate (Catalan) (Auri B.P) +- Translated using Weblate (Chinese (Simplified)) (Eric) +- Translated using Weblate (Croatian) (Milo Ivir) +- Translated using Weblate (Dutch) (Jelv) +- Translated using Weblate (English) (Raatty) +- Translated using Weblate (Estonian) (Priit Jõerüüt) +- Translated using Weblate (Finnish) (Aminda Suomalainen) +- Translated using Weblate (Galician) (Xosé M) +- Translated using Weblate (Indonesian) (Linerly) +- Translated using Weblate (Persian) (Amir Hossein Maher) +- Translated using Weblate (Polish) (Przemysław Romanik) +- Translated using Weblate (Russian) (Nikita Epifanov) +- Translated using Weblate (Turkish) (Oğuz Ersen) +- Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore: Add border to avatars (Christian Pauly) +- chore: Add fancy hero animations (Christian Pauly) +- chore: Adjust appbar design (Christian Pauly) +- chore: Adjust design (Christian Pauly) +- chore: Adjust search bar design (Christian Pauly) +- chore: Always display header elevation in chat (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Design follow up fixes (Christian Pauly) +- chore: Disable integration tests without runners (Krille Fear) +- chore: Enhance invitiation UX (Christian Pauly) +- chore: Make push helper more fail safe (Christian Pauly) +- chore: Make push helper more stable (Christian Pauly) +- chore: Minor design improvements (Christian Pauly) +- chore: Pinned events design (Christian Pauly) +- chore: Remove permission handler dependency and increase compileSdkVersion (Christian Pauly) +- chore: Switch to flutter 3.0.5 (Krille Fear) +- chore: Update SDK (Christian Pauly) +- chore: remove snapping sheet (TheOneWithTheBraid) + ## v1.5.0 - 2022-06-03 + - Translated using Weblate (Ukrainian) (Ihor Hordiichuk) - feat: Better sign up UX and allow signup without password (Christian Pauly) - feat: Initial material you support (Christian Pauly) @@ -34,6 +2360,7 @@ - Translated using Weblate (Turkish) (Oğuz Ersen) ## v1.4.0 - 2022-04-23 + - design: Display icon for failed sent messages (Krille Fear) - design: Display own stories at first place and combine with new stories button (Krille Fear) - feat: Add "Show related DMs in spaces" settings (20kdc) @@ -88,6 +2415,7 @@ - refactor: New push (Krille Fear) ## v1.3.1 - 2022-03-20 + - Allow app to be moved to external storage (Marcel) - Translated using Weblate (Arabic) (Mads Louis) - Translated using Weblate (Basque) (Sorunome) @@ -126,14 +2454,19 @@ - refactor: Switch to just audio for playing sounds (Krille Fear) ## v1.3.0 - 2022-02-12 -FluffyChat 1.3.0 makes it possible to report offensive users to server admins (not only messages). It fixes + +FluffyChat 1.3.0 makes it possible to report offensive users to server admins (not only messages). +It fixes the video player, improves Linux desktop notifications, and the stories design. -The button to create a new story is now in the app bar of the main page so that users who don't want to use +The button to create a new story is now in the app bar of the main page so that users who don't want +to use this feature no longer have a whole list item pinned at the top of the chat list. -FluffyChat 1.3.0 is the first release with full null safe dart code. While this is a huge change under the -hood, it should improve the stability and performance of the app. It also builds now with Flutter 2.10. +FluffyChat 1.3.0 is the first release with full null safe dart code. While this is a huge change +under the +hood, it should improve the stability and performance of the app. It also builds now with Flutter +2.10. Thanks to all contributors and translators!! <3 @@ -173,6 +2506,7 @@ Thanks to all contributors and translators!! <3 - refactor: Migrate to null safety (Krille Fear) ## v1.2.0 - 2022-01-27 + FluffyChat 1.2.0 brings a new stories feature, a lot of bug fixes and improved voice messages. @@ -206,7 +2540,8 @@ voice messages. - followup: Improve stories (Krille Fear) - Improve website SEO tagging (Marcel) - Increase font size granularity (S1m) -- refactor: /command hints add tooltips, test for missing hints, script to generate glue code, hints for dm, create, clearcache, discardsession (Steef Hegeman) +- refactor: /command hints add tooltips, test for missing hints, script to generate glue code, hints + for dm, create, clearcache, discardsession (Steef Hegeman) - refactor: Make more files null safe (Krille Fear) - refactor: Make style settings null safe (Krille Fear) - systemNavigationBarColor ← appBar.backgroundColor (Steef Hegeman) @@ -236,6 +2571,7 @@ voice messages. - Translated using Weblate (Ukrainian) (Ihor Hordiichuk) ## v1.1.0 - 2021-12-08 + - CI: Add candidate release pipeline (Krille Fear) - Translated using Weblate (Dutch) (Jelv) - Translated using Weblate (Estonian) (Priit Jõerüüt) @@ -256,6 +2592,7 @@ voice messages. - refactor: Make user device list item null safe (Krille Fear) ## v1.0.0 - 2021-11-29 + - design: Chat backup dialog as a banner - design: Encrypted by design, all users valid is normal not green - design: Move video call button to menu @@ -313,7 +2650,9 @@ voice messages. - fix: Wrong version in snap packages ## v0.42.2 - 2021-11-04 -Minor bugfix release which fixes signing up on matrix.org and make FluffyChats voice messages playable in Element. + +Minor bugfix release which fixes signing up on matrix.org and make FluffyChats voice messages +playable in Element. - feat: Nicer registration form - feat: Nicer audio message design and send duration @@ -323,6 +2662,7 @@ Minor bugfix release which fixes signing up on matrix.org and make FluffyChats v - fix: Crash on logout ## v0.42.1 - 2021-10-26 + Minor bugfix release. - feat: Ignore users directly from bottom sheet @@ -333,6 +2673,7 @@ Minor bugfix release. - design: Make homepicker page nicer ## v0.42.0 - 2021-10-14 + This release fixes several bugs and makes E2EE enabled by default. - feat: Enable E2EE by default for new rooms @@ -343,17 +2684,20 @@ This release fixes several bugs and makes E2EE enabled by default. - feat: More finetuning for font sizes - chore: Updated translations (Thanks to all translators!) - fix: App crash on logout -- fix: Temporary disable sign-up for matrix.org (Currently gives "500: Internal Server Error" while FluffyChat **should** send the same requests like Element) +- fix: Temporary disable sign-up for matrix.org (Currently gives "500: Internal Server Error" while + FluffyChat **should** send the same requests like Element) - fix: Implement Roboto font to fix font issues on Linux Desktop and mobile - fix: QR Code scanning ## v0.41.3 - 2021-10-08 + Minor bugfix release. - fix: Last space is not visible - chore: Google services disabled by default for F-Droid ## v0.41.1 - 2021-09-15 + Minor bugfix release. - fix: Start up time waits for first sync @@ -363,7 +2707,10 @@ Minor bugfix release. And some other minor bugs. ## v0.41.0 - 2021-09-14 -This release features a lot of bug fixes and the new multi account feature which also include account bundles. + +This release features a lot of bug fixes and the new multi account feature which also include +account bundles. + - feat: Multiple accounts - feat: New splash screen - fix: Password reset @@ -375,21 +2722,28 @@ This release features a lot of bug fixes and the new multi account feature which - chore: Updated translations ## v0.40.1 - 2021-09-14 + Minor bug fixes. ## v0.40.0 - 2021-09-13 -This release contains a security fix. Red more about it here: https://matrix.org/blog/2021/09/13/vulnerability-disclosure-key-sharing + +This release contains a security fix. Red more about it +here: https://matrix.org/blog/2021/09/13/vulnerability-disclosure-key-sharing - New in-app registration - Design improvements - Minor fixes ## v0.39.0 - 2021-08-30 + - Hotfix a bug which produces problems in downloading files and playing audios - Hotfix a bug which breaks device management ## v0.39.0 - 2021-08-28 -This release fixes a bug which makes it impossible to send images in unencrypted rooms. It also implements a complete new designed new chat page which now uses a QR code based workflow to start a new chat. + +This release fixes a bug which makes it impossible to send images in unencrypted rooms. It also +implements a complete new designed new chat page which now uses a QR code based workflow to start a +new chat. - feat: Dismiss keyboard on scroll in iOS - feat: Implement QR code scanner @@ -402,11 +2756,13 @@ This release fixes a bug which makes it impossible to send images in unencrypted - fix: Open matrix.to urls - fix: Padding and colors - fix: Sharing invite link -- fix: Unread bubbles on iOS +- fix: Unread bubbles on iOS - fix: Sending images in unencrypted rooms ## v0.38.0 - 2021-08-22 -This release adds more functionality for spaces, enhances the html viewer, adds a brand new video player and brings some improvements for voice messages. Thanks to everyone involved! + +This release adds more functionality for spaces, enhances the html viewer, adds a brand new video +player and brings some improvements for voice messages. Thanks to everyone involved! ### All changes: @@ -431,7 +2787,8 @@ This release adds more functionality for spaces, enhances the html viewer, adds - fix: Display loading dialog on start DM - fix: Dont add/remove DMs to space - fix: Empty timelines crashing the room view -- fix: excessive CPU usage on Windows, as described in https://github.com/flutter/flutter/issues/78517#issuecomment-846436695 +- fix: excessive CPU usage on Windows, as described + in https://github.com/flutter/flutter/issues/78517#issuecomment-846436695 - fix: Joining room aliases not published into the room directory - fix: Keep display alive while recording - fix: Load space members to display DM rooms @@ -449,22 +2806,27 @@ This release adds more functionality for spaces, enhances the html viewer, adds - fix: Wrap login form into `AutofillGroup` ## v0.37.0 - 2021-08-06 + - Implement location sharing - Updated translations - Improved spaces support - Minor bug fixes ## v0.36.2 - 2021-08-03 + Hotfix a routing problem on web and desktop ## v0.36.1 - 2021-08-03 + - Hotfix uploading to many OTKs - Implement initial spaces UI ## v0.36.0 - 2021-07-31 + Minor design improvements and bug fixes. ### All changes: + * design: Make unread listtiles more visible * design: Move pinned icon in title * feat: Rate limit streams so that large accounts have a smoother UI @@ -477,10 +2839,13 @@ Minor design improvements and bug fixes. * fix: Tests ## v0.35.0 - 2021-07-24 + This release introduces stickers and a lot of minor bug fixes and improvements. ### All changes: + ### Feature + * Add sticker picker [205d7e8] * Also suggest username completions based on their slugs [3d980df] * Nicer mentions [99bc819] @@ -489,6 +2854,7 @@ This release introduces stickers and a lot of minor bug fixes and improvements. * Android SSO in webview [befd8e1] ### Fixes + * Reset bootstrap on bad ssss [b78b654] * Hide stickers button when there is not sticker pack [b71dd4b] * Download files on iOS [a8201c4] @@ -504,15 +2870,19 @@ This release introduces stickers and a lot of minor bug fixes and improvements. * Close safariviewcontroller on SSO [ba685b7] ### Refactor + * Rename store and allow storing custom values [b1c35e5] ## v0.34.1 - 2021-07-14 + Bugfix image picker on Android 11 ## v0.34.0 - 2021-07-13 + Mostly bugfixes and one new feature: Lottie file rendering. ### All changes: + * feat: Add rendering of lottie files * fix: Check for jitsi server in well-known lookup also on login screen * fix: show thumbnails in timeline on desktop @@ -524,21 +2894,27 @@ Mostly bugfixes and one new feature: Lottie file rendering. * fix: Don't allow backup of the android app ## v0.33.3 - 2021-07-11 + Another bugfixing release to solve some problems and republish the app on iOS. ### Changes + * Redesign SSO buttons * Update dependencies * Remove moor database (no migration from here possible) * fix: Keyboard hides imagePicker buttons on iOS ## v0.33.2 - 2021-06-29 + * Fix Linux Flatpak persistent storing of data ## v0.33.0 - 2021-06-26 -Just a more minor bugfixing release with some design changes in the settings, updated missing translations and for rebuilding the arm64 Linux Flatpak. + +Just a more minor bugfixing release with some design changes in the settings, updated missing +translations and for rebuilding the arm64 Linux Flatpak. ### Features + * redesigned settings * Updated translations - thanks to all translators * display progress bar in first sync @@ -546,23 +2922,31 @@ Just a more minor bugfixing release with some design changes in the settings, up * update some dependencies ### Fixes + * Favicon on web * Database not storing files correctly * Linux builds for arm64 * a lot of minor bugs ## v0.32.2 - 2021-06-20 + * fix: Broken hive keys ## v0.32.1 - 2021-06-17 -* fix: Hive breaks if room IDs contain emojis (yes there are users with hacked synapses out there who needs this) -* feat: Also migrate inbound group sessions +* fix: Hive breaks if room IDs contain emojis (yes there are users with hacked synapses out there + who needs this) +* feat: Also migrate inbound group sessions ## v0.32.0 - 2021-06-16 -FluffyChat 0.32.0 targets improved stability and a new onboarding flow where single sign on is now the more prominent way to get new users into the app. This release also introduces a complete rewritten database under the hood based on the key value store Hive instead of sqlite. This should improve the overall stability and the performance of the web version. + +FluffyChat 0.32.0 targets improved stability and a new onboarding flow where single sign on is now +the more prominent way to get new users into the app. This release also introduces a complete +rewritten database under the hood based on the key value store Hive instead of sqlite. This should +improve the overall stability and the performance of the web version. ### Feat + * Long-press reactions to see who sent this * New login UI * Shift+Enter makes a new line on web and desktop @@ -572,6 +2956,7 @@ FluffyChat 0.32.0 targets improved stability and a new onboarding flow where sin * Minor design tweaks ### Fixes + * Single sign on on iOS and web * Database corruptions * Minor fixes @@ -579,26 +2964,31 @@ FluffyChat 0.32.0 targets improved stability and a new onboarding flow where sin ## v0.31.3 - 2021-05-28 ### Fixes + * Build Linux * Multiline keyboard on web and desktop ## v0.31.2 - 2021-05-28 ### Fixes + * Setting up push was broken ## v0.31.0 - 2021-05-26 ### Chore + * Format iOS stuff [584c873] * LibOlm has been updated to 3.2.3 ### Feature + * Cute animation for hiding the + button in inputbar [37c40a2] * Improved chat bubble design and splash animations [0b3734f] * Zoom page transition on Android and Fuchsia [e6c20dd] ### Fixes + * "Pick an image" button in emote settings doesn't do anything [e6be684] * Formatting and style [2540a6c] * Emoji picker [e1bd4e1] @@ -612,9 +3002,11 @@ FluffyChat 0.32.0 targets improved stability and a new onboarding flow where sin * Send read markers [08dd2d7] ### Docs + * Update code style [3e7269d] ### Refactor + * Structure files in more directories [ebc598a] * Rename UI to Views [e44de26] * rename UI to View and MVC login page [cc113bb] @@ -627,40 +3019,58 @@ FluffyChat 0.32.0 targets improved stability and a new onboarding flow where sin ## v0.30.2 - 2021-05-13 ### Feature + * Implement registration with email [19616f3] ### Fixes + * Android input after sending message [4488520] ### Changes + * Switch to tchncs.de as default homeserver ### Refactor + * UIA registering [48bf116] ## v0.30.1 - 2021-05-07 ### Chore + * Update translations ### Fixes + * Record audio on iOS [cd1e9ae] ## v0.30.0 - 2021-05-01 -In this release we have mostly focused on bugfixing and stability. We have switched to the new Flutter 2 framework and have done a lot of refactoring under the hood. The annoying freezing bug should now be fixed. Voice messages now have a new backend which should improve the sound quality and stability. There is now a more professional UI for editing aliases of a room. Users can now see a list of all aliases, add new aliases, delete them and mark one alias as the canonical (or main) alias. Some minor design changes and design fixes should improve the overall UX of the app exspecially on tablets. +In this release we have mostly focused on bugfixing and stability. We have switched to the new +Flutter 2 framework and have done a lot of refactoring under the hood. The annoying freezing bug +should now be fixed. Voice messages now have a new backend which should improve the sound quality +and stability. There is now a more professional UI for editing aliases of a room. Users can now see +a list of all aliases, add new aliases, delete them and mark one alias as the canonical (or main) +alias. Some minor design changes and design fixes should improve the overall UX of the app +exspecially on tablets. -Version 0.30.0 will be the first version with arm64 support. You can download binaries from the CI and we will try to publish it on Flathub. Together with the new Linux Desktop Notifications feature, this might be interesting for the Librem 5 or the PinePhone. Sadly I don't own one of these very interesting devices. If you have one, I would very like to see some screenshots of it! :-) +Version 0.30.0 will be the first version with arm64 support. You can download binaries from the CI +and we will try to publish it on Flathub. Together with the new Linux Desktop Notifications feature, +this might be interesting for the Librem 5 or the PinePhone. Sadly I don't own one of these very +interesting devices. If you have one, I would very like to see some screenshots of it! :-) ### Chore + * Update UP and automatically re-register UP on startup [aa3348e] ### Feature + * Desktop notifications on Linux Desktop [25e76f0] * Much better alias managing [642db67] * Archive with clean up [f366ab6] ### Fixes + * Lock screen [f8ba7bd] * Freeze bug [15c3178] * UserBottomSheet [dbb0464] @@ -675,6 +3085,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Chat UI doesnt load [4f20ea4] ### Refactor + * Remove unused variable [b9f5c94] * Remove flutter_sound [334d4c0] * Switch to record package [2cf4f47] @@ -705,9 +3116,11 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.29.1 - 2021-04-13 ### Chore + * Bump version [215f3c8] ### Fixes + * Save file [3f854d6] * Routing broken in chat details [f1166b2] * Tests [e75a5a0] @@ -715,6 +3128,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * nogooglewarning [7619941] ### Refactor + * MVC archive [c2cbad7] * MVC sign up password view [fa0162a] * MVC sign up view [db19b37] @@ -723,6 +3137,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.29.0 - 2021-04-09 ### Chore + * Clean up repo [ef7ccef] * Bump version [81a4c26] * Nicer FAB icon [3eeb9a9] @@ -731,9 +3146,11 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Remove unused dependencies [c505c50] ### Feature + * Experimental support for room upgrades [a3af5a9] ### Fixes + * Room upgrade again [1d40705] * Better padding [c79562f] * Room upgrade [dac26dd] @@ -757,9 +3174,11 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Select room version [2f5a73f] ### Docs + * Add code style [035ad96] ### Refactor + * Move app_config to /configs [8b9f4a4] * homeserver picker view [8e828d8] * widgets dir [c9ab69a] @@ -767,12 +3186,15 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.28.1 - 2021-03-28 ### Chore + * Update version [518634a] ### Feature + * Implement new search view design [e42dd4b] ### Fixes + * Share on iOS [ea31991] * Permission to send video call [4de6d16] * Unread badge color [49d5f86] @@ -783,11 +3205,13 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Set status missing [17a3311] ### Refactor + * push stuff [b6eaf5b] ## v0.28.0 - 2021-03-16 ### Chore + * Bump version [f8ee682] * Change push gateway url [078aefa] * Update file picker cross dependency [91c6912] @@ -797,12 +3221,14 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Update famedlySdk [ec64cf6] ### Feature + * Cache and resend status message [c8a7031] * New experimental design [94aa9a3] * Better verification design [9bcd6b2] * Verify and block devices in devices list [8ebacfe] ### Fixes + * substring in reply key respects unicode runes [5695342] * Resend status message [05cd699] * Remove test push [a838d90] @@ -844,10 +3270,12 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Use single-isolate push [949771d] ### Docs + * Update readme and contributing [449e46d] * Update Turkish translation for website [4a664eb] ### Refactor + * Update SDK and enable login with email and phone [864b665] * Migrate to flutter 2 [bb97b1b] * Switch to TextButton [55803d1] @@ -855,6 +3283,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.27.0 - 2021-02-17 ### Chore + * Switch to experimental new hedwig [30a1fb0] * update sdk & remove selfSign [26f7cb3] * Update sdk [cde8a30] @@ -862,6 +3291,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Change push gateway port [8f36140] ### Feature + * localize bootstrap [395e62e] * Add more bootstrap features [e4db84a] * Add some tooltipps [b9eb8d1] @@ -876,6 +3306,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Implement autofillhints [41a2457] ### Fixes + * Website [080a909] * docs _site dir [875d652] * Bootstrap dialog [c72da0a] @@ -912,29 +3343,35 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * iOS push [c01bdf7] ### Docs + * Fix qr-codes [c7f0a74] * grammar fixes [c4d569b] ### Refactor + * Theme colors [fe13778] * border radius [ddd10d1] ## v0.26.1 - 2021-01-26 ### Chore + * Update SDK [e9df6bf] * Bump version [d79b356] * Update dependencies [6159f99] ### Feature + * Add unified push as push provider [124a5ee] ### Fixes + * Link color [16d6623] ## v0.26.0 - 2021-01-25 ### Chore + * Redesign textfields [aef8090] * Simplify bootstrap [2df4a78] * Update audio player icons [3f14d5e] @@ -950,6 +3387,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Use correct paths on new server [2f00007] ### Feature + * emoji working on desktop [c3feb65] * Implement sso [d1d470d] * Implement app lock [77ee2ef] @@ -957,6 +3395,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Display version number in app [e1e60c4] ### Fixes + * Dark mode fixes [36746c8] * Dark theme [0bd0e58] * clean up iOS dir [6ae59a8] @@ -990,6 +3429,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Readme [dda0925] ### Docs + * Make howtofork.md less misunderstandable [96de54a] * Add howtofork.md [f091469] * Mention emoji font [bb53714] @@ -997,23 +3437,28 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Update fdroid button [ea7e20b] ### Refactor + * Theme and iOS stuff [189f65a] * Upgrade to latest flutter_sound_lite [2f7dece] ## v0.25.1 - 2021-01-17 ### Chore + * Bump version [c881424] ### Fixes + * Change size [83e2385] ### Refactor + * remove deprecated approute [be08de5] ## v0.25.0 - 2021-01-16 ### Chore + * Minor design improvements [d4dbe83] * Minor design tweaks [06581e2] * Bump version [7f51f7f] @@ -1021,6 +3466,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Better authwebview [d76df0a] ### Fixes + * Share files [d018a4b] * Typing update [9b5a3ca] * Status [d27dbe0] @@ -1043,9 +3489,11 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Minor apl bugs [05b9551] ### Docs + * Update fdroid logo [31d16a0] ### Refactor + * Use APL [cbcfa15] * Use Provider [880f9cc] * Use adaptive_theme [5d52c26] @@ -1053,29 +3501,35 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.24.3 - 2021-01-15 ### Chore + * Bump version [46c8386] * Update SDK [ba0726c] * Update fdroid domain [f130681] * Update dependencies [611e5e3] ### Feature + * Add Turkish translations for website [817c7dd] * Handle matrix: URIs as per MSC2312 [1da643f] ### Fixes + * Format [84b2ac9] * Push gateway url [ed2fbf7] ## v0.24.2 - 2021-01-08 ### Chore + * Update linux version [ef9369c] * Update SDK [4a006c9] ### Feature + * Regulate when thumbnails are animated as per MSC2705 [f5e11c2] ### Fixes + * Don't allow an empty ssss passphrase in key verification [3a0ce79] * reactions [92684da] * Reply fallback sometimes being stripped incorrectly [e9ec699] @@ -1083,11 +3537,13 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Properly handle url encoding in matrix.to URLs [baccd0a] ### Refactor + * Switch to loading dialog [e84bc25] ## v0.24.1 - 2020-12-24 ### Chore + * Update linux build [a91407f] * Add website to main repo [4df33a1] * Update dependencies [0d9f418] @@ -1097,11 +3553,13 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Update SDK [e802593] ### Feature + * Better invite search bar [3c4a29b] * Open alias in discover page [f0d1f5a] * Implement logger [714c7b4] ### Fixes + * auto-dep update [d9e8c5f] * Read receipts and filtered events [0ae36f0] * Don't re-render the lock icon nearly as often [00a56a7] @@ -1120,6 +3578,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.24.0 - 2020-12-18 ### Chore + * Update dependencies [550cb4a] * Update SDK [775a33b] * Update dependencies [644433c] @@ -1128,6 +3587,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Update dependencies [5af4eab] ### Feature + * Add languages to iOS [68a5efb] * Bring back config.json [b6a0d37] * Implement emojipicker for reactions [20b3157] @@ -1143,6 +3603,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Implement rich notification settings [87a73dd] ### Fixes + * Update typing [3d70b1e] * Build in dev [f892a9f] * Fix that damn regex [8961bff] @@ -1159,16 +3620,19 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * CI [da5bc56] ### Refactor + * Update sdk [32acc21] ## v0.23.1 - 2020-11-25 ### Fixes + * Release CI [14d8c80] ## v0.23.0 - 2020-11-25 ### Chore + * Update adaptive dialogs [0061660] * Prettier redacted events [d1e291e] * Minor design changes in user viewer [b4fb283] @@ -1177,6 +3641,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Only load google services if needed [bae779a] ### Feature + * Next version [1af048e] * Annoy user with dialog to add a recovery method [d9ec9f6] * Implement password recovery [4b2fef5] @@ -1185,6 +3650,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Improved encryption UI [2516848] ### Fixes + * Broken dialog [97bb692] * set email dialog [72e325a] * Minor fixes [11e2dd5] @@ -1200,17 +3666,20 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Suggest correct rooms [59ec9de] ### Refactor + * Make verification in dialogs [1f9e953] * matrix to link prefix [1aa9c08] ## v0.22.1 - 2020-11-21 ### Fixes + * Input bar not working, making app unusable [10773b4] ## v0.22.0 - 2020-11-21 ### Chore + * fix CI [00ed0d6] * fix CI [bb4bb9f] * Fix CI variables [d3822b0] @@ -1224,6 +3693,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Remove unused dependency [d12de2d] ### Feature + * Add svg support and better image handling [f70bbc3] * add config.json [4b7fb6b] * persistent upload of release artifacts [1b2481b] @@ -1231,28 +3701,33 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Better encryption / verification [1ff986e] ### Fixes + * iOS [26731ab] * resolve some sentry issues [61f35e8] * resolve some sentry issues [2c3693e] * iOS build [9fee409] * Automatic update deps job [255c05d] -* Don't re-render message widgets on insertion of new messages, making e.g. audio playing not stop [25b2997] +* Don't re-render message widgets on insertion of new messages, making e.g. audio playing not + stop [25b2997] * Add missing safearea [caab868] * no pushers enpdoint [b3942ad] * Sentry and small null fix [5dc22be] ### Refactor + * CI [34d7fdd] * SDK update [7e23280] ## v0.21.1 - 2020-10-28 ### Chore + * update version code [d1dfa9c] ## v0.21.0 - 2020-10-28 ### Chore + * Change compileSdkVersion again [f93f9c2] * Update packages [b471bd0] * Update SDK [86a385d] @@ -1263,6 +3738,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * release [844b4a8] ### Fixes + * CompileSDKVersion [bcf75fc] * Target sdk [c3e23b6] * File picker issue [aa191c1] @@ -1278,6 +3754,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.20.0 - 2020-10-23 ### Chore + * update dependencies [427cdc0] * upate matrix link text [0892ca9] * Change default linux window size [719323a] @@ -1289,6 +3766,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Make app ready for flutter 1 22 [e5b23fa] ### Feature + * Implement mouse select chat list items [6d41136] * Implement linux desktop notifications [75cd6f1] * Implement change device name [bfd3888] @@ -1301,6 +3779,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Enable macOS build [a845209] ### Fixes + * return text field to the previous state after editing message [08e61c0] * Web server picker [4cb19be] * Some single-emoji names crashing [b29ebce] @@ -1343,6 +3822,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi ## v0.19.0 - 2020-09-21 ### Chore + * Version update & olm-CI [0f805a2] * Update SDK & Changelog [1825543] * Add new language [c6d67ad] @@ -1356,6 +3836,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * update sdk [954eedb] ### Feature + * Implement send reactions [6bf25b7] * Improve design [c8a63c6] * Display emotes/emojis bigger [9cccd07] @@ -1371,6 +3852,7 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * New notification sound [8a5be21] ### Fixes + * Last bits for the release [1db9bdd] * Small stuff [9d3f272] * Search bar [eca25de] @@ -1386,5 +3868,5 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi * Send read receipt only on focus [98316f1] * Desktop notifications [b05bfa6] - -This CHANGELOG.md was generated with [**Changelog for Dart**](https://pub.dartlang.org/packages/changelog) +This CHANGELOG.md was generated with [**Changelog for Dart +**](https://pub.dartlang.org/packages/changelog) diff --git a/docs/code_style.md b/CONTRIBUTING.md similarity index 65% rename from docs/code_style.md rename to CONTRIBUTING.md index 712830d545..ac02973405 100644 --- a/docs/code_style.md +++ b/CONTRIBUTING.md @@ -1,7 +1,48 @@ + + +# Contributing to FluffyChat +Contributions are always welcome. Yet we might lack manpower to review all of them in time. + +To improve the process please make sure that you read the following guidelines carefully: + +## Contributing Guidelines + +1. Always create a Pull Request for any changes. +2. Usage of LLMs to generate code or documentation is strictly prohibited. +3. Whenever possible please make sure that your Pull Request only contains **one** commit. Cases where multiple commits make sense are very rare. +4. Do not add merge commits. Use rebases. +5. Every Pull Request should change only one thing. For bigger changes it is often better to split them up in multiple Pull Requests. +6. [Sign your commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits). +7. Format the commit message as [Conventional Commits](https://www.conventionalcommits.org). +8. For bigger or complex changes (more than a couple of code lines) write an issue or refer to an existing issue and ask for approval from the maintainers (@krille-chan) **before** starting to implement it. This way you reduce the risk that your Pull Request get's declined. +9. Prefer simple and easy to maintain solutions over complexity and fancy ones. + # Code Style FluffyChat tries to be as minimal as possible even in the code style. We try to keep the code clean, simple and easy to read. The source code of the app is under `/lib` with the main entry point `/lib/main.dart`. + + + + + +**Table of Contents** + +- [Directory Structure:](#directory-structure) +- [Separation of Controllers and Views](#separation-of-controllers-and-views) +- [Formatting](#formatting) +- [Code Analyzis](#code-analyzis) + + + + + + ### Directory Structure: @@ -26,7 +67,7 @@ FluffyChat tries to be as minimal as possible even in the code style. We try to - main.dart -Most of the business model is in the Famedly Matrix Dart SDK. We try to not keep a model inside of the source code but extend it under `/utils`. +Most of the business model is in the Matrix Dart SDK. We try to not keep a model inside of the source code but extend it under `/utils`. ### Separation of Controllers and Views @@ -122,7 +163,7 @@ To run code after the widget was created first we use the WidgetBindings in the ```dart @override void initState() { - WidgetsBinding.instance!.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) { // Do something when build is finished }); super.initState(); @@ -135,4 +176,4 @@ We do not allow code with wrong formatting. Please run `flutter format lib` if y ### Code Analyzis -We do not allow codes with dart errors or warnings. We use the [pedantic](https://pub.dev/packages/pedantic) package for static code analysis with additional rules under `analysis_options.yaml`. +We do not allow codes with dart errors or warnings. We use the [flutter_lints](https://pub.dev/packages/flutter_lints) package for static code analysis with additional rules under `analysis_options.yaml`. diff --git a/Dockerfile b/Dockerfile index 269f8774b3..ba244305df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,26 @@ -FROM cirrusci/flutter as builder -RUN sudo apt update && sudo apt install curl -y +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +FROM ghcr.io/cirruslabs/flutter as builder +RUN sudo apt update && sudo apt install curl wget jq build-essential -y + +WORKDIR /tmp +RUN wget https://github.com/mikefarah/yq/releases/download/v4.40.5/yq_linux_amd64.tar.gz +RUN tar -xzvf ./yq_linux_amd64.tar.gz +RUN mv yq_linux_amd64 /usr/bin/yq + COPY . /app WORKDIR /app +RUN curl https://sh.rustup.rs -sSf | bash -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" +RUN rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu RUN ./scripts/prepare-web.sh -RUN ./scripts/build-web.sh +COPY config.* /app/ +RUN flutter pub get +RUN flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps FROM docker.io/nginx:alpine RUN rm -rf /usr/share/nginx/html -COPY --from=builder /app/build/web /usr/share/nginx/html \ No newline at end of file +COPY --from=builder /app/build/web /usr/share/nginx/html diff --git a/LICENSES/AGPL-3.0-or-later.txt b/LICENSES/AGPL-3.0-or-later.txt new file mode 100644 index 0000000000..0c97efd25b --- /dev/null +++ b/LICENSES/AGPL-3.0-or-later.txt @@ -0,0 +1,235 @@ +GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + Preamble + +The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. + +A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. + +The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. + +An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. + +The precise terms and conditions for copying, distribution and modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the Program. + +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". + + c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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, either version 3 of the License, or (at your option) any later version. + + 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 . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, 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 . diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000000..137069b823 --- /dev/null +++ b/LICENSES/Apache-2.0.txt @@ -0,0 +1,73 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt new file mode 100644 index 0000000000..13ca539f37 --- /dev/null +++ b/LICENSES/CC-BY-4.0.txt @@ -0,0 +1,156 @@ +Creative Commons Attribution 4.0 International + + Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/PRIVACY.md b/PRIVACY.md index 6092557751..dc15f4c440 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,40 +1,41 @@ + + # Privacy -FluffyChat is available on Android, iOS and as a web version. Desktop versions for Windows, Linux and macOS may follow. +FluffyChat is available on Android, iOS, Linux and as a web version. Desktop versions for Windows and macOS may follow. -* [Matrix](#1) -* [Sentry](#2) -* [Database](#3) -* [Encryption](#4) -* [App Permissions](#5) -* [Push Notifications](#6) -* [Stories](#7) +* [Matrix](#matrix) +* [Database](#database) +* [Encryption](#encryption) +* [App Permissions](#app-permissions) +* [Push Notifications](#push-notifications) +* [PlayStore Safety Standards](#playstore-safety) -## Matrix +## # Matrix FluffyChat uses the Matrix protocol. This means that FluffyChat is just a client that can be connected to any compatible matrix server. The respective data protection agreement of the server selected by the user then applies. For convenience, one or more servers are set as default that the FluffyChat developers consider trustworthy. The developers of FluffyChat do not guarantee their trustworthiness. Before the first communication, users are informed which server they are connecting to. -FluffyChat only communicates with the selected server, with sentry.io if enabled and with [OpenStreetMap](https://openstreetmap.org) to display maps. +FluffyChat only communicates with the selected server and with [OpenStreetMap](https://openstreetmap.org) to display maps. More information is available at: [https://matrix.org](https://matrix.org) -## Sentry -FluffyChat uses Sentry for crash reports if the user allows it. - -More information is available at: [https://sentry.io](https://sentry.io) - -## Database -FluffyChat caches some data received from the server in a local database on the device of the user. +## # Database +FluffyChat caches some data received from the server in a local sqflite database on the device of the user. On web indexedDB is used. FluffyChat always tries to encrypt the database by using SQLCipher and stores the encryption key in the [Secure Storage](https://pub.dev/packages/flutter_secure_storage) of the device. -More information is available at: [https://pub.dev/packages/hive](https://pub.dev/packages/hive) +More information is available at: [https://pub.dev/packages/sqflite](https://pub.dev/packages/sqflite) and [https://pub.dev/packages/sqlcipher_flutter_libs](https://pub.dev/packages/sqlcipher_flutter_libs) -## Encryption +## # Encryption All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it. -FluffyChat is able to use End-To-End-Encryption as a tech preview. +FluffyChat also uses End-To-End-Encryption by using [Vodozemac](https://github.com/matrix-org/vodozemac) and enables it by default for private chats. -## App Permissions +## # App Permissions The permissions are the same on Android and iOS but may differ in the name. This are the Android Permissions: @@ -57,7 +58,7 @@ The user is able to send files from the device's file system. #### Location FluffyChat makes it possible to share the current location via the chat. When the user shares their location, FluffyChat uses the device location service and sends the geo-data via Matrix. -## Push Notifications +## # Push Notifications FluffyChat uses the Firebase Cloud Messaging service for push notifications on Android and iOS. This takes place in the following steps: 1. The matrix server sends the push notification to the FluffyChat Push Gateway 2. The FluffyChat Push Gateway forwards the message in a different format to Firebase Cloud Messaging @@ -65,7 +66,7 @@ FluffyChat uses the Firebase Cloud Messaging service for push notifications on A 4. The device receives the push notification from Firebase Cloud Messaging and displays it as a notification The source code of the push gateway can be viewed here: -[https://gitlab.com/famedly/services/famedly-push-gateway](https://gitlab.com/famedly/services/famedly-push-gateway) +[https://github.com/krille-chan/fluffygate](https://github.com/krille-chan/fluffygate) `event_id_only` is used as the format for the push notification. A typical push notification therefore only contains: - Event ID @@ -88,7 +89,9 @@ A typical push notification could look like this: "app_id": "chat.fluffy.fluffychat", "pushkey": "V2h5IG9uIGVhcnRoIGRpZCB5b3UgZGVjb2RlIHRoaXM/", "pushkey_ts": 12345678, - "data": {}, + "data": { + "client_name": "" + }, "tweaks": { "sound": "bing" } @@ -100,22 +103,30 @@ A typical push notification could look like this: FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data. -## Stories -FluffyChat supports stories which is a feature similar to WhatsApp status or Instagram stories. However it is just a different GUI for the same room-related communication. More information about the feature can be found here: +# # Explanation of FluffyChat's Compliance with Google Play Store's Safety Standards + +FluffyChat is committed to promoting a safe and respectful environment for all users. As a Matrix client, FluffyChat connects users to various Matrix servers. Please note that FluffyChat does not host or manage any servers directly, and as such, we do not have the capability to enforce content moderation or deletion within the app itself. + +To enhance user safety and help protect against the sexual abuse and exploitation of children, FluffyChat enables users to report inappropriate content directly to server administrators. + +#### Reporting Content or Users: -https://github.com/krillefear/matrix-doc/blob/main/proposals/3588-stories-as-rooms.md +1. Mark a message in the chat: Tap and hold the message you wish to report. +2. Report the message: Select the "Report" option. +3. Provide a reason and score: Enter the reason for reporting and assign a score from 1-100 to indicate how offensive the content is. +4. Notification to admin: The server administrator will be notified of the reported content. -Stories are basically: +In addition to reporting messages, users can also report other users following a similar process. -- End to end encrypted rooms -- Read-only rooms with only one admin who can post stuff (while there is no technical limitation to have multiple admins) +We encourage server administrators to adhere to strict safety standards and provide mechanisms for addressing and moderating inappropriate content. For more information on the Matrix protocol and its safety standards, please refer to the following link: https://matrix.org/docs/older/moderation/ -By default: +## Impressum -- The user has to invite all contacts manually to a story room -- The user can only invite contacts (matrix users the user shares a DM room with) to the story room -- The story room is created when the first story is posted -- User can mute and leave story rooms +krille-chan - Christian Kußowski +c/o Online-Impressum #8198 +Europaring 90 +53757 St Augustin -The user is informed in the app that in theory all contacts can see each other in the story room. The user must give consent here. However the user is at any time able to create a group chat and invite all of their contacts to this chat in any matrix client which has the same result. +E-Mail: christian-kussowski[at)posteo.de +[Zweiter Kontaktweg](https://mein.online-impressum.de/krille-chan/#Zweiter_Kontaktweg) \ No newline at end of file diff --git a/README.md b/README.md index 2f8a43753e..e4773d2e0c 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,135 @@ -![](https://i.imgur.com/wi7RlVt.png) - -

- Join the community - Follow me on Mastodon - Translate FluffyChat - Translate the website - Website - Famedly Matrix SDK - Server hosting and professional support -

- - -FluffyChat is an open source, nonprofit and cute matrix messenger app. The app is easy to use but secure and decentralized. - -## Features - -- Send all kinds of messages, images and files -- Voice messages -- Location sharing -- Push notifications -- Unlimited private and public group chats -- Public channels with thousands of participants -- Feature rich group moderation including all matrix features -- Discover and join public groups -- Dark mode -- Custom themes -- Hides complexity of Matrix IDs behind simple QR codes -- Custom emotes and stickers -- Spaces -- Compatible with Element, Nheko, NeoChat and all other Matrix apps -- End to end encryption -- Emoji verification & cross signing -- And much more... + + +![Screenshot](https://github.com/krille-chan/fluffychat/blob/main/assets/banner_transparent.png?raw=true) + +[FluffyChat](https://fluffy.chat) is an open source, nonprofit and cute [[matrix](https://matrix.org)] client written in [Flutter](https://flutter.dev). The goal of the app is to create an easy to use instant messenger which is open source and accessible for everyone. + +### Links: + +- 🌐 [[Weblate] Translate FluffyChat into your language](https://hosted.weblate.org/projects/fluffychat/) +- 🌍 [[m] Join the community](https://matrix.to/#/#fluffy-space:matrix.org) +- 📰 [[Mastodon] Get updates on social media](https://troet.cafe/@krille) +- 💝 [[Liberapay] Support FluffyChat development](https://de.liberapay.com/KrilleChritzelius) + +Buy Me a Coffee at ko-fi.com + +### Screenshots: + + + + +# Features + +- 📩 Send all kinds of messages, images and files +- 🎙️ Voice messages +- 📍 Location sharing +- 🔔 Push notifications +- 💬 Unlimited private and public group chats +- 📣 Public channels with thousands of participants +- 🛠️ Feature rich group moderation including all matrix features +- 🔍 Discover and join public groups +- 🌙 Dark mode +- 🎨 Material You design +- 📟 Hides complexity of Matrix IDs behind simple QR codes +- 😄 Custom emotes and stickers +- 🌌 Spaces +- 🔄 Compatible with Element, Nheko, NeoChat and all other Matrix apps +- 🔐 End to end encryption +- 🔒 Encrypted chat backup +- 😀 Emoji verification & cross signing + +... and much more. + # Installation -Please visit our website for installation instructions: +Please visit the website for installation instructions: -https://fluffychat.im +- https://fluffy.chat # How to build -Please visit our Wiki for build instructions: +1. To build FluffyChat you need [Flutter](https://flutter.dev) and [Rust](https://www.rust-lang.org/tools/install) + +2. Clone the repo: +``` +git clone https://github.com/krille-chan/fluffychat.git +cd fluffychat +``` +3. Choose your target platform below and enable support for it. +3.1 If you want, enable Googles Firebase Cloud Messaging: + +`./scripts/add-firebase-messaging.sh` + +4. Debug with: `flutter run` + +### Android -https://gitlab.com/famedly/fluffychat/-/wikis/How-To-Build +* Build with: `flutter build apk` + +### iOS / iPadOS + +* Have a Mac with Xcode installed, and set up for Xcode-managed app signing +* If you want automatic app installation to connected devices, make sure you have Apple Configurator installed, with the Automation Tools (`cfgutil`) enabled +* Set a few environment variables + * FLUFFYCHAT_NEW_TEAM: the Apple Developer team that your certificates should live under + * FLUFFYCHAT_NEW_GROUP: the group you want App IDs and such to live under (ie: com.example.fluffychat) + * FLUFFYCHAT_INSTALL_IPA: set to `1` if you want the IPA to be deployed to connected devices after building, otherwise unset +* Run `./scripts/build-ios.sh` + +### Web + +* Build with: +```bash +./scripts/prepare-web.sh # To install Vodozemac +flutter build web --release +``` + +* Optionally configure by serving a `config.json` at the same path as fluffychat. + An example can be found at `config.sample.json`. All values there are optional. + **Please only the values, you really need**. If you e.g. only want + to change the default homeserver, then only modify the `defaultHomeserver` key. + +### Desktop (Linux, Windows, macOS) + +* Enable Desktop support in Flutter: https://flutter.dev/desktop + +#### Install custom dependencies (Linux) + +```bash +sudo apt install libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.0-dev lld +``` + +* Build with one of these: +```bash +flutter build linux --release +flutter build windows --release +flutter build macos --release +``` + +## How to run integration tests + +You need to have docker installed locally! Run the preparation script before every test run: + +```sh +./scripts/prepare_integration_test.sh +``` + +Then run all tests with: + +```sh +flutter test integration_test/mobile_test.dart +``` # Special thanks -* Fabiyamada is a graphics designer from Brasil and has made the fluffychat logo and the banner. Big thanks for her great designs. +* Fabiyamada is a graphics designer and has made the fluffychat logo and the banner. Big thanks for her great designs. * Advocatux has made the Spanish translation with great love and care. He always stands by my side and supports my work with great commitment. @@ -50,8 +137,6 @@ https://gitlab.com/famedly/fluffychat/-/wikis/How-To-Build * Also thanks to all translators and testers! With your help, fluffychat is now available in more than 12 languages. -* Noto Emoji Font for the awesome emojis. - * WoodenBeaver sound theme for the notification sound. -* The Matrix Foundation for making and maintaining the [emoji translations](https://github.com/matrix-org/matrix-doc/blob/main/data-definitions/sas-emoji.json) used for emoji verification, licensed Apache 2.0 +* The Matrix Foundation for making and maintaining the [emoji translations](https://github.com/matrix-org/matrix-spec/blob/main/data-definitions/sas-emoji.json) used for emoji verification, licensed Apache 2.0 diff --git a/REUSE.toml b/REUSE.toml new file mode 100644 index 0000000000..b57e009535 --- /dev/null +++ b/REUSE.toml @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +version = 1 + +[[annotations]] +path = [ + ".mailmap", + ".tool_versions.yaml", + "pubspec.lock", + "*.json", + ".vscode/**", + "lib/l10n/**", + "assets/vodozemac/**", + ".github/**", + ".gitignore", + ".metadata", + "android/**", + "ios/**", + "linux/**", + "macos/**", + "integration_test/.gitignore", + "integration_test/data/**", + "integration_test/synapse/**", + "snap/**", + "windows/**", + "web/**" +] +precedence = "aggregate" +SPDX-FileCopyrightText = "2019-Present Christian Kußowski" +SPDX-License-Identifier = "AGPL-3.0-or-later" + +[[annotations]] +path = [ + "assets/sounds/**" +] +SPDX-FileCopyrightText = "Pixabay" +SPDX-License-Identifier = "CC-BY-4.0" + +[[annotations]] +path = [ + "assets/sas-emoji.json" +] +SPDX-FileCopyrightText = "Matrix Foundation" +SPDX-License-Identifier = "Apache-2.0" + +# App Logo +[[annotations]] +path = [ + "assets/logo/**", + "android/app/src/main/res/mipmap**/**", + "ios/Runner/Assets.xcassets/AppIcon.appiconset/**", + "macos/Runner/Assets.xcassets/AppIcon.appiconset/**", + "web/icons/**", + "web/splash/**", + "snap/gui/*.png", + "windows/runner/resources/app_icon.ico" +] +precedence = "aggregate" +SPDX-FileCopyrightText = "2017-Present Fabiyamada" +SPDX-License-Identifier = "CC-BY-4.0" \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..69c3413ef1 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,22 @@ + + +# Security Policy + +If you believe you have discovered a security vulnerability in this project, **do not open a public issue**. + +To report a security issue responsibly, please go to the Security tab or visit: + +https://github.com/krille-chan/fluffychat/security/advisories/new + +The following information can help us address the issue: + +- Clear steps to reproduce the vulnerability +- The software version you are using +- The affected platforms + +We appreciate your report and will respond as quickly as possible. Please note that this project is maintained by volunteers and is provided without guarantees. diff --git a/TRANSLATORS_GUIDE.md b/TRANSLATORS_GUIDE.md deleted file mode 100644 index d5bc4f8fe6..0000000000 --- a/TRANSLATORS_GUIDE.md +++ /dev/null @@ -1,35 +0,0 @@ -# Translators Guide - -There are 3 main types of strings to be translated. - -## Simple -``` -Add new friend -``` -They are just plain text and are to be translated in full. - -## Placeholder -``` -{username} changed their avatar -``` -Contains one or more words surrounded by curly brackets "`{}`". Anything outside of the curly brackets is to be translated as normal, but the words in the curly brackets are **NOT** to be translated. In the above example "`{username}`" will be replaced by the users actual username by FluffyChat. - -## Plural - -- {count,plural, =1{**1 more event**} other{{count} **more events**}} - -This is the most complicated string type, the parts in bold are the only parts that need translating in this string. You can identify plural strings by seeing the pattern `{word,plural,` at the start. `=1` and `other` are "selectors" so you can have multiple different translations for different quantities. `other` is the only required selector and will be chosen if the count does not match any other selectors. - -Selector | Matches ----|--- -=0 | a count of exactly 0 -=1 | a count of exactly 1 -=2 | a count of exactly 2 -other | any number unless it matches a more specific rule - -There is also "few" and "many", but they seem to have language specific meaning. - -Also the selectors do not need to match the English version such as your language may not even use different words for when there is more than one of something so: - - {count,plural, other{{count} \}} - -could be a perfectly resonable way to translate. diff --git a/analysis_options.yaml b/analysis_options.yaml index 6de1bcc6b2..42da8cc566 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,52 +1,81 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + include: package:flutter_lints/flutter.yaml linter: rules: - - camel_case_types + - directives_ordering - avoid_print - constant_identifier_names - prefer_final_locals - prefer_final_in_for_each - sort_pub_dependencies + - require_trailing_commas + - omit_local_variable_types + - cancel_subscriptions + - always_declare_return_types + - avoid_void_async + - no_adjacent_strings_in_list + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - avoid_bool_literals_in_conditional_expressions + - prefer_single_quotes + - prefer_const_declarations + - unnecessary_lambdas + - combinators_ordering + - noop_primitive_operations + - unnecessary_null_checks + - unnecessary_null_in_if_null_operators + - unnecessary_to_list_in_spreads + - use_is_even_rather_than_modulo + - use_super_parameters + # Flutter specific: + - use_colored_box analyzer: + plugins: + - dart_code_linter errors: todo: ignore - import_of_legacy_library_into_null_safe: ignore exclude: - - lib/generated_plugin_registrant.dart - lib/l10n/*.dart -dart_code_metrics: - metrics: - cyclomatic-complexity: 20 - number-of-arguments: 4 - maximum-nesting-level: 5 - source-lines-of-code: 50 - maintainability-index: 40 +dart_code_linter: rules: - - no-boolean-literal-compare - - no-empty-block - - prefer-conditional-expressions + # Dart specific: + - avoid-dynamic + - avoid-redundant-async + - avoid-unnecessary-type-assertions + - avoid-unnecessary-type-casts + - avoid-unrelated-type-assertions - no-equal-then-else - - no-magic-number: - severity: style - - avoid-late-keyword: - severity: style - - avoid-non-null-assertion: - severity: style - - avoid-unused-parameters - - binary-expression-operand-order - - avoid-unnecessary-setstate + - prefer-first + - prefer-last + - prefer-immediate-return + - prefer-enums-by-name + - avoid-unnecessary-conditionals + # TODO: + # - member-ordering + # - avoid-global-state + # - prefer-match-file-name + # - avoid-banned-imports: + # entries: + # - paths: ['some/folder/.*\.dart', 'another/folder/.*\.dart'] + # deny: ['package:flutter/material.dart'] + # message: 'Do not import Flutter Material Design library, we should not depend on it!' + # - no-magic-number: + # allowed: [-1, 0, 1,2,4,6,8,12,16,32,40,56,64] + # allow-only-once: true + # Flutter specific: + - prefer-media-query-direct-access - avoid-wrapping-in-padding - - prefer-const-border-radius - - prefer-single-widget-per-file: - ignore-private-widgets: true - - prefer-extracting-callbacks - metrics-exclude: - - test/** - rules-exclude: - - test/** - anti-patterns: - - long-method - - long-parameter-list + - prefer-correct-edge-insets-constructor + - avoid-returning-widgets + # TODO: + # - prefer-single-widget-per-file: + # ignore-private-widgets: true + # - prefer-extracting-callbacks diff --git a/android/.gitignore b/android/.gitignore index bc2100d8f7..6f568019d3 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -5,3 +5,9 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/Gemfile b/android/Gemfile index 7a118b49be..7a06eb1ac3 100644 --- a/android/Gemfile +++ b/android/Gemfile @@ -1,3 +1,4 @@ source "https://rubygems.org" gem "fastlane" +gem "multi_json" \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index fba903e3a4..0000000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,85 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} - -android { - compileSdkVersion 32 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "chat.fluffy.fluffychat" - minSdkVersion 16 - targetSdkVersion 30 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled true - } - - signingConfigs { - release { - if (keystorePropertiesFile.exists()) { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile file(keystoreProperties['storeFile']) - storePassword keystoreProperties['storePassword'] - } - } - } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - signingConfig signingConfigs.release - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 - implementation 'androidx.multidex:multidex:2.0.1' -} - -//apply plugin: 'com.google.gms.google-services' diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000000..0aa18d9b38 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,95 @@ +import java.util.Properties +import java.io.FileInputStream + +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +if (file("google-services.json").exists()) { + apply(plugin = "com.google.gms.google-services") +} + +dependencies { + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4") // For flutter_local_notifications // Workaround for: https://github.com/MaikuB/flutter_local_notifications/issues/2286 + implementation("androidx.core:core-ktx:1.17.0") // For Android Auto +} + + +// Workaround for https://pub.dev/packages/unifiedpush#the-build-fails-because-of-duplicate-classes +configurations.all { + // Use the latest version published: https://central.sonatype.com/artifact/com.google.crypto.tink/tink-android + val tink = "com.google.crypto.tink:tink-android:1.17.0" + // You can also use the library declaration catalog + // val tink = libs.google.tink + resolutionStrategy { + force(tink) + dependencySubstitution { + substitute(module("com.google.crypto.tink:tink")).using(module(tink)) + } + } +} + + +android { + namespace = "chat.fluffy.fluffychat" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + isCoreLibraryDesugaringEnabled = true + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + signingConfigs { + create("release") { + keyAlias = "dummyAlias" + keyPassword = "dummyPassword" + storeFile = file("dummy.keystore") + storePassword = "dummyStorePassword" + } + } + + val keystoreProperties = Properties() + val keystorePropertiesFile = rootProject.file("key.properties") + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + signingConfigs.getByName("release").apply { + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storeFile = keystoreProperties["storeFile"]?.let { file(it) } + storePassword = keystoreProperties["storePassword"] as String + } + } + + defaultConfig { + applicationId = "chat.fluffy.fluffychat" + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + ndk { // Workaround for https://github.com/flutter/flutter/issues/162153#issuecomment-2612443642 + abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86_64", "x86") + } + } + + buildTypes { + release { + signingConfig = signingConfigs.getByName("release") + isMinifyEnabled = true + isShrinkResources = true + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + } +} + +flutter { + source = "../.." +} diff --git a/android/app/google-services.json b/android/app/google-services.json deleted file mode 100644 index e33988c404..0000000000 --- a/android/app/google-services.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "project_info": { - "project_number": "865731724731", - "project_id": "fluffychat-ef3e8", - "storage_bucket": "fluffychat-ef3e8.appspot.com" - }, - "client": [ - { - "client_info": { - "mobilesdk_app_id": "1:865731724731:android:ec427b3b1dcd4a1e64309e", - "android_client_info": { - "package_name": "chat.fluffy.fluffychat" - } - }, - "oauth_client": [ - { - "client_id": "865731724731-od6969v178ul9970elgacpt936v5t7qg.apps.googleusercontent.com", - "client_type": 3 - } - ], - "api_key": [ - { - "current_key": "AIzaSyBLdZpGSPjcinikB4lAU6awW_h88NG17Sg" - } - ], - "services": { - "appinvite_service": { - "other_platform_oauth_client": [ - { - "client_id": "865731724731-od6969v178ul9970elgacpt936v5t7qg.apps.googleusercontent.com", - "client_type": 3 - }, - { - "client_id": "865731724731-ofdr7e6m04murgb1bvchlj9oaos0q5i3.apps.googleusercontent.com", - "client_type": 2, - "ios_info": { - "bundle_id": "im.fluffychat.app" - } - } - ] - } - } - } - ], - "configuration_version": "1" -} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000000..d0e0fbc9b9 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1 @@ +-keep class net.sqlcipher.** { *; } \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index fc480dc268..0000000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ff394d9db6..eab308e632 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + android:installLocation="auto"> + + + + + + + @@ -58,47 +63,51 @@ android:scheme="https" android:host="matrix.to"/> + + + + + + + + - - - - - - + - + - + - + - + @@ -109,19 +118,17 @@ - - + + - - - - - - - - + + + + + diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt index d9930f557e..0db8bdcaea 100644 --- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt +++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt @@ -2,17 +2,9 @@ import com.famedly.fcm_shared_isolate.FcmSharedIsolateService -import chat.fluffy.fluffychat.MainActivity - -import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine -import io.flutter.view.FlutterMain import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint - import android.content.Context -import android.os.Bundle -import android.util.Log -import android.view.WindowManager class FcmPushService : FcmSharedIsolateService() { override fun getEngine(): FlutterEngine { diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt index 1afc460628..c65f9874d8 100644 --- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt +++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt @@ -1,16 +1,14 @@ package chat.fluffy.fluffychat -import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.engine.FlutterEngine import android.content.Context -import androidx.multidex.MultiDex -class MainActivity : FlutterActivity() { +class MainActivity : FlutterFragmentActivity() { override fun attachBaseContext(base: Context) { super.attachBaseContext(base) - MultiDex.install(this) } diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/UnifiedPushService.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/UnifiedPushService.kt deleted file mode 100644 index c5d4ba9d7c..0000000000 --- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/UnifiedPushService.kt +++ /dev/null @@ -1,23 +0,0 @@ -package chat.fluffy.fluffychat - -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.embedding.engine.dart.DartExecutor -import org.unifiedpush.flutter.connector.UnifiedPushReceiver - -import android.content.Context - -class UnifiedPushReceiver : UnifiedPushReceiver() { - override fun getEngine(context: Context): FlutterEngine { - var engine = MainActivity.engine - if (engine == null) { - engine = MainActivity.provideEngine(context) - engine.localizationPlugin.sendLocalesToFlutter( - context.resources.configuration - ) - engine.dartExecutor.executeDartEntrypoint( - DartExecutor.DartEntrypoint.createDefault() - ) - } - return engine - } -} \ No newline at end of file diff --git a/android/app/src/main/res/drawable-anydpi-v24/notifications_icon.xml b/android/app/src/main/res/drawable-anydpi-v24/notifications_icon.xml deleted file mode 100644 index 21b574637d..0000000000 --- a/android/app/src/main/res/drawable-anydpi-v24/notifications_icon.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png new file mode 100644 index 0000000000..c39b3f6466 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..3a514ed796 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000..87fd2633c6 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-hdpi/notifications_icon.png b/android/app/src/main/res/drawable-hdpi/notifications_icon.png index 3ff16e6d2a..5ba483c6d9 100644 Binary files a/android/app/src/main/res/drawable-hdpi/notifications_icon.png and b/android/app/src/main/res/drawable-hdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png new file mode 100644 index 0000000000..8d9cc1c255 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..1116df6e13 Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000..4fcb9e7fea Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-mdpi/notifications_icon.png b/android/app/src/main/res/drawable-mdpi/notifications_icon.png index eb0c4a0315..8b0f8d69af 100644 Binary files a/android/app/src/main/res/drawable-mdpi/notifications_icon.png and b/android/app/src/main/res/drawable-mdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000000..6546be8fae Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..7093798ec4 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000..0dd0c27b20 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/notifications_icon.png b/android/app/src/main/res/drawable-xhdpi/notifications_icon.png index 7233042160..2f1f78c366 100644 Binary files a/android/app/src/main/res/drawable-xhdpi/notifications_icon.png and b/android/app/src/main/res/drawable-xhdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000..6031e62825 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..69072f1633 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000..ad85e0b39f Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png b/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png index 489b245d99..7a3b4886c4 100644 Binary files a/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png and b/android/app/src/main/res/drawable-xxhdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000..1bb23775d2 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000..f03ed0d73f Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png new file mode 100644 index 0000000000..8e0ffc82df Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png b/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png index fcd0f6e4a9..87a29b65a5 100644 Binary files a/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png and b/android/app/src/main/res/drawable-xxxhdpi/notifications_icon.png differ diff --git a/android/app/src/main/res/drawable/ic_launcher_monochrome.xml b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml new file mode 100644 index 0000000000..f0b10e7d69 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index ef49c99170..854fef6f41 100644 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,14 @@ - - - - \ No newline at end of file + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 54dd74b567..d17b8e5134 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 6fc0dcbfb9..efeaadbed7 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index dd6dcadacd..7849fbe6d4 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index ea5d85515a..547f4bb158 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 8d4f59224a..6c34cd97a0 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/xml/automotive_app_desc.xml b/android/app/src/main/res/xml/automotive_app_desc.xml new file mode 100644 index 0000000000..dd5581b2a1 --- /dev/null +++ b/android/app/src/main/res/xml/automotive_app_desc.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/android/app/src/main/res/xml/locale_config.xml b/android/app/src/main/res/xml/locale_config.xml new file mode 100644 index 0000000000..bb9924bc0c --- /dev/null +++ b/android/app/src/main/res/xml/locale_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index fc480dc268..0000000000 --- a/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 85aa864702..0000000000 --- a/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - ext.kotlin_version = '1.6.10' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - //classpath 'com.google.gms:google-services:4.3.8' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000000..89176ef44e --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile index a0d4846754..804cd4b2b6 100644 --- a/android/fastlane/Fastfile +++ b/android/fastlane/Fastfile @@ -10,6 +10,9 @@ # https://docs.fastlane.tools/plugins/available-plugins # +# Workaround for https://github.com/fastlane/fastlane/issues/21507#issuecomment-1723116829 +ENV['SUPPLY_UPLOAD_MAX_RETRIES']='5' + # Uncomment the line if you want fastlane to automatically update itself update_fastlane @@ -41,14 +44,28 @@ platform :android do json_key: "./keys.json" ) last_version = versions[0].to_i - upload_to_play_store(track: 'internal', aab: '../build/app/outputs/bundle/release/app-release.aab', version_code: "#{last_version+1}") + upload_to_play_store( + track: 'internal', + aab: '../build/app/outputs/bundle/release/app-release.aab', + version_code: "#{last_version+1}", + ) end lane :deploy_candidate do - upload_to_play_store(track: 'internal', track_promote_to: "beta", deactivate_on_promote: false, skip_upload_changelogs: true) + upload_to_play_store( + track: 'internal', + track_promote_to: "beta", + deactivate_on_promote: false, + skip_upload_changelogs: true, + ) end lane :deploy_release do - upload_to_play_store(track: 'beta', track_promote_to: "production", deactivate_on_promote: false, skip_upload_changelogs: true) + upload_to_play_store( + track: 'internal', + track_promote_to: "production", + deactivate_on_promote: false, + skip_upload_changelogs: true, + ) end end diff --git a/android/fastlane/README.md b/android/fastlane/README.md index aa5e6dbbcc..300ccee8c1 100644 --- a/android/fastlane/README.md +++ b/android/fastlane/README.md @@ -1,39 +1,56 @@ fastlane documentation -================ +---- + # Installation Make sure you have the latest version of the Xcode command line tools installed: -``` +```sh xcode-select --install ``` -Install _fastlane_ using -``` -[sudo] gem install fastlane -NV -``` -or alternatively using `brew install fastlane` +For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) # Available Actions + ## Android + ### android set_build_code_internal -``` -fastlane android set_build_code_internal + +```sh +[bundle exec] fastlane android set_build_code_internal ``` + + ### android deploy_internal_test + +```sh +[bundle exec] fastlane android deploy_internal_test ``` -fastlane android deploy_internal_test + + + +### android deploy_candidate + +```sh +[bundle exec] fastlane android deploy_candidate ``` + + ### android deploy_release + +```sh +[bundle exec] fastlane android deploy_release ``` -fastlane android deploy_release -``` + ---- This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. -More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). -The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). + +More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). + +The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt b/android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt deleted file mode 100644 index 10f77f4f91..0000000000 --- a/android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt +++ /dev/null @@ -1 +0,0 @@ -Check out https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/CHANGELOG.md for the changelog. \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/default.txt b/android/fastlane/metadata/android/en-US/changelogs/default.txt new file mode 100644 index 0000000000..51bb84ab2e --- /dev/null +++ b/android/fastlane/metadata/android/en-US/changelogs/default.txt @@ -0,0 +1 @@ +FluffyChat 2.7.0 improves the login process, makes the end-to-end encryption more secure and brings a lot of UX design improvements and bug fixes. \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/full_description.txt b/android/fastlane/metadata/android/en-US/full_description.txt index 2118515f44..64d6b1cefb 100644 --- a/android/fastlane/metadata/android/en-US/full_description.txt +++ b/android/fastlane/metadata/android/en-US/full_description.txt @@ -1,4 +1,4 @@ -FluffyChat is an open, nonprofit and cute matrix messenger app for Ubuntu Touch, Android and iOS. +FluffyChat is an open, nonprofit and cute Matrix messenger app for Ubuntu Touch, Android and iOS. Open Opensource and open development where everyone can join. @@ -9,7 +9,7 @@ FluffyChat is donation funded. Cute ♥ Cute design and many theme settings including a dark mode. -One-to-one and groupchats +One-to-one and group chats Unlimited groups and direct chats. Easy @@ -22,11 +22,11 @@ Decentralized There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host your own. Compatible -Compatible with Riot, Fractal, Nekho and all matrix messengers. +Compatible with Element, Fractal, Nheko and all Matrix messengers. FluffyChat comes with a dream Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends. -A world where there are no companies spying on you when you send selfies to friends and lovers. -And a world where apps are made for fluffyness and not for profit. ♥ \ No newline at end of file +A world where there are no companies spying on you when you send selfies to friends and your loved. +And a world where apps are made for fluffyness and not for profit. ♥ diff --git a/android/fastlane/report.xml b/android/fastlane/report.xml index 2123376e30..96f7a8a63b 100644 --- a/android/fastlane/report.xml +++ b/android/fastlane/report.xml @@ -5,17 +5,17 @@ - + - + - + diff --git a/android/gradle.properties b/android/gradle.properties index 19c6710d52..d68b5abd88 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,8 @@ -org.gradle.jvmargs=-Xmx1536M -android.enableR8=true +org.gradle.jvmargs=-Xmx4608m android.useAndroidX=true android.enableJetifier=true -android.enableR8.fullMode=true \ No newline at end of file +kotlin.jvm.target.validation.mode=IGNORE +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 71a1ffc9eb..9c957989de 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Mon Mar 17 08:36:03 CET 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 5a2f14fb18..0000000000 --- a/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000000..a5d070147f --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,28 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.9.1" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false + if (file("app/google-services.json").exists()) { + id("com.google.gms.google-services") version "4.3.8" apply false + } +} + +include(":app") diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle deleted file mode 100644 index e7b4def49c..0000000000 --- a/android/settings_aar.gradle +++ /dev/null @@ -1 +0,0 @@ -include ':app' diff --git a/appimage/.gitignore b/appimage/.gitignore deleted file mode 100644 index eeda4edb4a..0000000000 --- a/appimage/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -FluffyChat.AppDir -*.AppImage -*.AppImage.zsync diff --git a/appimage/AppRun b/appimage/AppRun deleted file mode 100755 index 95b7c05684..0000000000 --- a/appimage/AppRun +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -cd "$(dirname "$0")" -exec ./fluffychat \ No newline at end of file diff --git a/appimage/FluffyChat.desktop b/appimage/FluffyChat.desktop deleted file mode 100644 index ceee4c91d1..0000000000 --- a/appimage/FluffyChat.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Version=1.0 -Name=FluffyChat -Comment=Matrix Client. Chat with your friends -Exec=AppRun -Icon=fluffychat -Terminal=false -Categories=Network;Chat;InstantMessaging;X-Matrix; \ No newline at end of file diff --git a/appimage/README.md b/appimage/README.md deleted file mode 100644 index 60f82dea06..0000000000 --- a/appimage/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# FluffyChat AppImage - -FluffyChat is provided as AppImage too. To Download, visit fluffychat.im. - -## Building - -- Ensure you install `appimagetool` - -```shell -flutter build linux - -# copy binaries to appimage dir -cp -r build/linux/{x64,arm64}/release/bundle appimage/FluffyChat.AppDir -cd appimage - -# prepare AppImage files -cp FluffyChat.desktop FluffyChat.AppDir/ -mkdir -p FluffyChat.AppDir/usr/share/icons -cp ../assets/logo.svg FluffyChat.AppDir/fluffychat.svg -cp AppRun FluffyChat.AppDir - -# build the AppImage -appimagetool FluffyChat.AppDir -``` diff --git a/assets/backup.png b/assets/backup.png deleted file mode 100644 index b17a7614ac..0000000000 Binary files a/assets/backup.png and /dev/null differ diff --git a/assets/banner.png b/assets/banner.png deleted file mode 100644 index d85c897281..0000000000 Binary files a/assets/banner.png and /dev/null differ diff --git a/assets/banner_dark.png b/assets/banner_dark.png deleted file mode 100644 index 3a2fb2a7c0..0000000000 Binary files a/assets/banner_dark.png and /dev/null differ diff --git a/assets/chat.svg b/assets/chat.svg deleted file mode 100644 index b80f20d6bd..0000000000 --- a/assets/chat.svg +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/assets/colors.png b/assets/colors.png deleted file mode 100644 index 27c996adb6..0000000000 Binary files a/assets/colors.png and /dev/null differ diff --git a/assets/favicon.ico b/assets/favicon.ico deleted file mode 100644 index 52c44a4345..0000000000 Binary files a/assets/favicon.ico and /dev/null differ diff --git a/assets/favicon.png b/assets/favicon.png deleted file mode 100644 index d55415b199..0000000000 Binary files a/assets/favicon.png and /dev/null differ diff --git a/assets/info-logo.png b/assets/info-logo.png deleted file mode 100644 index 1232a3c173..0000000000 Binary files a/assets/info-logo.png and /dev/null differ diff --git a/assets/js/package/olm.js b/assets/js/package/olm.js deleted file mode 100644 index a0a08e3d3b..0000000000 --- a/assets/js/package/olm.js +++ /dev/null @@ -1 +0,0 @@ -// Dummy file :-) diff --git a/assets/l10n/intl_ar.arb b/assets/l10n/intl_ar.arb deleted file mode 100644 index 7472f94618..0000000000 --- a/assets/l10n/intl_ar.arb +++ /dev/null @@ -1,2766 +0,0 @@ -{ - "@@locale": "ar", - "@@last_modified": "2021-08-14 12:41:10.156221", - "about": "حول", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "أقبل", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} قبل الدعوة", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "الحساب", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "معلومات الحساب", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} فعَّل تشفير طرف لطرف", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "أضف وصف للمجموعة", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "المدير", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "اللقب", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "عندك حساب؟", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} أجاب على المكالمة", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "يمكن لأي أحد الدخول", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "الأرشيف", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "غرفة مؤرشفة", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "هل يُسمح للزوار الدخول", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "أمتأكد؟", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "لتتمكن من التأكد من الشخص الآخر، يرجى إدخال عبارة المرور أو مفتاح الاسترداد.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "يرجى إدخال عبارة المرور أو مفتاح الاسترداد للتحقق من جلستك.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "أتقبل طلب تحقق {username}؟", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "الاستيثاق", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "غُيّرت الصورة الشخصية", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "حظر من المحادثة", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "محظور", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} حظر {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "أُحظر الجهاز", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "المفاتيح المخزنة على الذاكرة المؤقتة", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "ألغِ", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "غيَّر {username} صورة المحادثة", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "غيَّر {username} وصف المحادثة الى: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "غيَّر {username} اسم المحادثة الى: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "غيَّر {username} أذون المحادثة", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} غير إسمه العلني إلى: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "غيّر {username} قواعد وصول الزوار", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "غيّر {username} قواعد وصول الزوار الى: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "غيَّر {username} مرئية التأريخ", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "غيَّر {username} مرئية التأريخ الى: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "غيَّر {username} قواعد الانضمام", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "غيَّر {username} قواعد الانضمام الى: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "غيّر {username} صورته الشخصية", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "غيّر {username} ألقاب الغرف", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "غيّر {username} رابط الدعوة", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "سجل التغييرات", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "حُفظت التغييرات", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "غيّر الخادم", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "غيّر أسلوبك", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "غيِّر اسم المجموعة", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "غيِّر الخادم", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "غيِّر الخلفية", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "فسُد التشفير", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "محادثة", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "تفاصيل المحادثة", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "اختر كلمة سر قوية", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "اختر اسم المستخدم", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "اغلق", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "تأكد من أن هذه الإيموجي تطابق الموجودة على الأجهزة الأخرى:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "تأكد من أن هذه الأرقام تطابق الموجودة على الأجهزة الأخرى:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "أكّد", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "اتصل", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "فشلت محاولة الاتصال", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "دعيَ المراسل للمجموعة", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "عارض المحتوى", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "نُسخ للحافظة", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "انسخ", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "تعذر فك تشفير الرسالة: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "تعذر تعيين الصورة الشخصية", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "تعذر تعيين الاسم العلني", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} منتسبا", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "أنشئ", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "أنشئ حسابًا الآن", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "أنشأ {username} المحادثة", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "أنشئ مجموعة جديدة", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "التأكد المتبادل متوقف", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "التأكد المتبادل مفعل", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "نشطٌ حاليا", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "داكن", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "لا مجال للعودة، أتأكد تعطيل حسابك؟", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "delete": "احذف", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "احذف الحساب", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "حذف الرسالة", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "رفض", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "جهاز", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "الأجهزة", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "أهمل الصورة", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "غُيِّر الاسم العلني", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "تبرع", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "نزِّل الملف", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "حرر الاسم العلني", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "غيِّر خادم جيتسي", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "الانفعالة موجودة مسبقا!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "رمز الانفعالة غير صالح!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "اعدادات الانفعالات", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "رمز الانفعالة", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "اختر صورة ورمزا للانفعالة!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "محادثة فارغة", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "لن يمكنك تعطيل التشفير أبدا، أمتأكد؟", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "التشفير", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "خوارزمية التشفير", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "التشفير معطل", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "إعدادات تشفير الطرف لطرف", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "أنهى {senderName} المكالمة", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "أدخل اسم المجموعة", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "أدخل اسم المستخدم", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "أدخل الخادم", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "اسم الملف", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "حجم الملف", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "فلافي-شات", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "أعد التوجيه", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "الجمعة", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "من بعد الانضمام", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "من بعد الدعوة", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "المجموعة", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "وصف المجموعة", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "غُيِّر وصف المجموعة", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "المجموعة عامة", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "في مجموعة مع {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "يمنع الزوار", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "يمكن للزوار الانضمام", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "سحب {username} دعوة {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "المساعدة", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "الخادم ليس متوافقًا", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "المعرّف", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "المُعرّف", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "المستخدمون المتجاهلون", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "يمكنك تجاهل المستخدمين المزعجين، لن يتمكنوا من مراسلتك أو دعوتك لغرفة ما داموا في قائمة التجاهل.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "تجاهل اسم المستخدم", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "عبارة مرور أو مفتاح استرداد خطأ", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "دعوة مراسل", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "أدعو مراسلا الى {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "دُعيَ", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} دعى {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "المستخدمون المدعوون فقط", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "دعاك {username} لاستخدام فلافي-شات. \n1. ثبت فلافي-شات: https://fluffychat.im \n2. لج أو سجل\n3. افتح رابط الدعوة: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "هل مفتاح الجهاز صحيح؟", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "يكتب…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "انضم {username} للمحادثة", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "انضم للمحادثة", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "المفاتيح محفوظة على ذاكرة التخزين المؤقتة", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "المفاتيح مفقودة", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} طرد {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} طرد وحظر {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "طرد من المحادثة", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "آخر نشاط: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "آخر عنوان IP مسجل", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "آخر ظهور كان منذ زمن طويل", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "غادر", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "غادر المحادثة", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "الرخصة", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "فاتح", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "حمِّل {count} منتسبًا إضافيًا", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "يحمّل… يرجى الانتظار.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "حمِّل المزيد…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "لِج", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "لِج ل {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "اخرج", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "اجعله مشرفًا", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "اجعله مديرًا", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "تأكد من صحة المعرّف", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "ستحذف الرسالة عند كل المنتسبين", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "مشرف", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "الثلاثاء", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "أكتم الماحدثة", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "اعلم أننا نستخدم بانتاليمون للتشفير طرفا لطرف.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "رسالة جديدة في فلافي-شات", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "طلب تحقق جديد!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "no": "لا", - "@no": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat حالياً لا يدعم تفعيل التأكد المتبادل. الرجاء تفعيله من خلال تطبيق Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "لم يُعثر على انفعالة. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "يبدو أنك لا تستخدم خدمات غوغل على هاتفك. هذا قرار جيد للحفاظ على خصوصيتك! من أجل استلام الإشعارات في FluffyChat نقترح استخدام https://microg.org أو https://unifiedpush.org.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "يرجى تشغيل النسخ الاحتياطي عبر الإنترنت من داخل تطبيق Element بدلاً من ذلك.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "بدون", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "بدون اذن", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "لم يُعثر على غرف…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "غير مدعوم في الويب", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "حُدد {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "ok": "موافق", - "@ok": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "تم تعطيل النسخ الاحتياطي للمفاتيح عبر الإنترنت", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "تم تفعيل النسخ الاحتياطي للمفاتيح عبر الإنترنت", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "عذراً، هناك خطأ ما…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "افتح التطبيق لقراءة الرسائل", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "افتح الكميرا", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "اسم المجموعة (اختياري)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "أجهزة المنتسبين", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "عبارة المرور أو مفتاح الاستعادة", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "كلمة السر", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "غُيّرت كلمة السر", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "pickImage": "اختر صورة", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "ثبِّت", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "شغّل {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "اختر اسم المستخدم", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "أدخل معرف Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "أدخل كلمة السر", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "أدخل اسم المستخدم", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "privacy": "الخصوصية", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "الغرف العامة", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "يسجل", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "حذف {username} حدثًا", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "رفض", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "رفض {username} الدعوة", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "أعد الانضمام", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "أزِل", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "أزِل كل الأجهزة الأخرى", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "أزاله {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "أزل جهازا", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "فك حجبه من المحادثة", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "أزل رسالة", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "صيّر الرسائل ذات المحتوى الكبير", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "ردّ", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "أطلب إذنا", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "أطلب السماح بقراءة الرسائل القديمة", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "أبطل كل الأذون", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "رُقيّت الغرفة", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "السبت", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "ابحث عن محادثة", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "رآه {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{رآه {username} و {count} أخرون}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "رآه {username} و {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "أرسل", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "أرسل رسالة", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "أرسل ملفًا صوتيًا", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "اسمح بإرسال تقريرات عن العلل باستخدام sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "أرسل ملف", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "أرسل صورة", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "أرسل الملف الأصلي", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "أرسل فيديو", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "أرسلَ {username} ملفًا", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "أرسلَ {username} ملفًا صوتيًا", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "أرسلَ {username} صورة", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "أرسلَ {username} ملصقا", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "أرسلَ {username} فيديو", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "أرسل {senderName} معلومات مكالمة", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "معلومات عن خصوصيتك: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "تُحقق من الجلسة", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "عيّن صورة ملف شخصي", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "عيّن وصفا للمجموعة", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "عيّن رابط الدعوة", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "عيّن الحالة", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "الإعدادات", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "شارك", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "شارك {username} موقعه", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "سجّل", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "تخط", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "الشفرة المصدرية", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "بدأ {senderName} مكالمة", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "ابدأ محادثتك الأولى! 🙂\n- أنقر زر 'رسالة جديدة'\n- اسمح رمز الاستجابة السريعة لصديقك\n- اكتب ما يحلو لك", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "ماهو وضعك؟", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "أرسل", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "الأحد", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "النظام", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "اضغط لعرض القائمة", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "لا يتطبقان", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "متطبقان", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "أُرشِفت هته الغرفة.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "الخميس", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "فلافي-شات", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "حاول إعادة الارسال", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "الثلاثاء", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "ألغى {username} حظر {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "ألغ حظر الجهاز", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "جهز مجهول", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "خوارزمية تشفير مجهولة", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "حدث مجهول '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "الجلسة مجهولة، تحقق منها", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "ألغِ كتم المحادثة", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "ألغِ التثبيت", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 محادثة غير مقروءة} other{{unreadCount} محادثات غير مقروءة}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 رسالة غير مقروءة} other{{unreadEvents} رسائل غير مقروءة}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "هل تريد استخدم ألوان متوافقة مع AMOLED؟", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} و {count} أخرون يكتبون…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} و {username2} يكتبان…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} يكتب…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "غادر {username} المحادثة", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "اسم المستخدم", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "أرسل {username} حدث {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "تُحقق من الجلسة بنجاح!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "تحقق", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "تحقق يدويا", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "ابدأ التحقق", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "تُحقق منك بنجاح!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "يتحقق من الحساب الآخر", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "تحقق من مستخدم", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "مكالمة فيديو", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "مرئية تأريخ المحادثة", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "مرئي لكل المنتسبين", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "مرئي للجميع", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "رسالة صوتية", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "ينتظر قبول الشريك للطلب…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "ينتظر قبول الشريك لإيموجي…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "ينتظر قبول الشريك للأرقام…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "الخلفية", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "تحذير!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "التشفير طرفا لطرف لا يزال في مرحلة البيتا! استخدمه تحت مسؤوليتك!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "الأربعاء", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "مرحبا بك في أظرف مراسل فروري لمايتركس.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "من يسمح له الانضمام للمجموعة", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "اكتب رسالة…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "نعم", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "انت", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "دُعيتَ لهذه المحادثة", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "لم تعد منتسبا لهذه المحادثة", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "لا يمكنك دعوة نفسك", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "حُظرت من هذه المحادثة", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "اسم المستخدم الخاص بك", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "مجموعات عمومية", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "people": "أشخاص", - "@people": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "امسح رمز الاستجابة السريعة", - "@scanQrCode": {}, - "typeInInviteLinkManually": "اكتب رابط الدعوة...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "شارك رابط الدعوة", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "اطلب من أصدقائك مسح رمز الاستجابة السريعة أو أرسل لهم رابط الدعوة.", - "@createNewChatExplaination": {}, - "noMatrixServer": "{server1} ليس خادم ماتريكس، بدلًا منه أتريد استخدام {server2}؟", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noDescription": "بدون وصف", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "انقطع الاتصال بالخادم", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "next": "التالي", - "@next": { - "type": "text", - "placeholders": {} - }, - "newChat": "محادثة جديدة", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "messages": "الرسائل", - "@messages": { - "type": "text", - "placeholders": {} - }, - "mention": "اذكر", - "@mention": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "تغييرات تخص الأعضاء", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "loginWith": "لج عبر {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "invalidEmail": "بريد إلكتروني غير صالح", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "غير مسيء", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "نقرت على الرابط", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "ignore": "تجاهل", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "ما مدى سوء هذا المحتوى؟", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "اخف الأحداث المجهولة", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "groups": "المجموعات", - "@groups": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "انتقل للغرفة الجديدة", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "friends": "الأصدقاء", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fontSize": "حجم الخط", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "مسيئة للغاية", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "كل شيء جاهز!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "homeserver": "الخادم", - "@homeserver": {}, - "enterASpacepName": "أدخل اسم الفضاء", - "@enterASpacepName": {}, - "enterAnEmailAddress": "أدخل عنوان بريد إلكتروني", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "encrypted": "مشفر", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "فعّل التشفير", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "حزمة الوجوه التعبيرية للغرفة", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "عدّل الصورة الرمزية للغرفة", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "عدّل الخوادم المحجوبة", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "edit": "عدّل", - "@edit": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "ألغ ولاتسأل مجددًا", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "اكتشف مجموعات", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "اكتشف", - "@discover": { - "type": "text", - "placeholders": {} - }, - "directChats": "محادثات مباشرة", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "deviceId": "معرّف الجهاز", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "فضاء جديد", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "انسخ الى الحافظة", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "أّرسل الابلاغ الى مدير الخادم", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "يحوي اسم المستخدم", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "يحوي الاسم العلني", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "commandMissing": "{command} ليس بأمر.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandInvalid": "أمر غير صالح", - "@commandInvalid": { - "type": "text" - }, - "commandHint_unban": "فك الحظر عن المستخدم المذكور في هذه الغرفة", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandHint_send": "أرسل نصًا", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_react": "أرسل ردًا كتفاعل", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_plain": "أرسل نصًا غير منسق", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_op": "عين مستوى نفوذ المستخدم في هذه الغرفة (الافتراضي: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_myroomnick": "عين اسمًا لك مخصص لهذه الغرفة", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_me": "صف نفسك", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_leave": "تغادر هذه الغرفة", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_kick": "يزيل المستخدم المذكور من الغرفة", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_join": "تنضم الى الغرفة المذكورة", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_invite": "يدعو المستخدم المذكور الى الغرفة", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_html": "أرسل نصًا بتنسيق HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_ban": "يحظر المستخدم المذكور من هذه الغرفة", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "clearText": "امسح النص", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "امسح الأرشيف", - "@clearArchive": {}, - "chats": "المحادثات", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "أُزيلت المحادثة من هذا الفضاء", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "أُضيفت المحادثة الى هذا الفضاء", - "@chatHasBeenAddedToThisSpace": {}, - "chatBackup": "انسخ احتياطيًا المحادثة", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "غيّر الصورة الرمزية", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "changePassword": "غيّر كلمة السر", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "غيّر اسم الجهاز", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "تعذر فتح المسار {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "blocked": "محجوب", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "أرسل عند الدخول", - "@sendOnEnter": {}, - "autoplayImages": "شغِّل الملصقات والوجوه المتحركة تلقائيا", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "audioPlayerPlay": "شغّل", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "ألبث", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "أمتأكد من الخروج؟", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "appLock": "قفل التطبيق", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "allChats": "كل المحادثات", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "all": "الكل", - "@all": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "أضفه لفضاء", - "@addToSpace": {}, - "addNewFriend": "أضف صديقًا جديدًا", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addEmail": "أضف بريدًا إلكترونيًا", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "لم يّعثر على أي غرف عمومية…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "لم تضف أي طريقة لاستعادة كلمة السر.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "newUsernameDescription": "سيكون معرفك على شكل @username:servername", - "@newUsernameDescription": {}, - "newPasswordDescription": "لتتمكن من استعادة كلمة السر في حالة فقدانها أضف عنوان بريد إلكتروني لاحقًا.", - "@newPasswordDescription": {}, - "notifications": "الإشعارات", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "reason": "السبب", - "@reason": { - "type": "text", - "placeholders": {} - }, - "search": "ابحث", - "@search": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "خدمات الموقع معطلة. مكنها لتتمكن من مشاركة موقعك.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "خطأ أثناء الحصول على الموقع: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "enableChatBackup": "فعّل النسخ الاحتياطي للمحادثة كي لا تخسر الوصول إليها.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "عدّل الاسم المميز للغرفة", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "عدّل تصاريح المحادثة", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "configureChat": "ضبط المحادثة", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "النسخ الاحتياطي لمحادثاتك مأمن بمفتاح، تأكد ألّا تفقده.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "شارك الموقع", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "اختر رمز المرور", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "اختر رجاء", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "استعادة كلمة السر", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "نسيتَ كلمة السر", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "participant": "منتسب", - "@participant": { - "type": "text", - "placeholders": {} - }, - "or": "أو", - "@or": { - "type": "text", - "placeholders": {} - }, - "serverRequiresEmail": "يتطلب هذا الخادم التحقق من بريدك الإلكتروني.", - "@serverRequiresEmail": {}, - "link": "رابط", - "@link": {}, - "openInMaps": "افتح في الخريطة", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "enableMultiAccounts": "(ميزة تجربية) فعّل تعدد الحسابات", - "@enableMultiAccounts": {}, - "bundleName": "اسم الحزمة", - "@bundleName": {}, - "removeFromBundle": "أزله من الحزمة", - "@removeFromBundle": {}, - "addToBundle": "أضفه الى حزمة", - "@addToBundle": {}, - "editBundlesForAccount": "عدّل حزم هذا الحساب", - "@editBundlesForAccount": {}, - "addAccount": "أضف حسابًا", - "@addAccount": {}, - "online": "متصل", - "@online": { - "type": "text", - "placeholders": {} - }, - "offline": "غير متصل", - "@offline": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count} يكتبون…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "notificationsEnabledForThisAccount": "الإشعارات مفعلة لهذا الحساب", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "الفضاء عمومي", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "بدّل حالة التفضيل", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "علّمه كمقروء/غير مقروء", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "انقر على الجهاز لتوثيقه", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "unavailable": "غير متوفر", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "لماذا تريد الإبلاغ عنه؟", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "يمكنك استعادة كلمة السر بهذه العناوين.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "صغّر", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "كبّر", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "تسجيل دخول أحادي", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "بدّل حالة الكتم", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "showPassword": "أظهر كلمة السر", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "الصوت والاهتزاز ولون ضوء الإشعار", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "يُزامن محادثاتك…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "المستخدم غير موثّق", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "موثّق", - "@verified": { - "type": "text", - "placeholders": {} - }, - "spaceName": "اسم الفضاء", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "يُزامن… يرجى الانتظار.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "انقر على صورة لإظهارها", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "طابات كثيرة. حاول مجددًا لاحقًا!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "فك قفل النسخ الاحتياطي للمحادثة", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userVerified": "المستخدم موثّق", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "أرسلنا لك رسالة بالبريد الإلكتروني", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "مفتاحك العمومي", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "سيتم وصلك بـ {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "status": "الحالة", - "@status": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "حالة توثيق المستخدم مجهولة", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "أنقله من جهاز آخر", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "أتريد حذف النسخ الاحتياطي للمحادثة لإنشاء مفتاح أمان جديد؟", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "saveFile": "احفظ الملف", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "security": "الأمان", - "@security": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "أزل الصورة الرمزية", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "securityKey": "مفتاح الأمان", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "botMessages": "رسائل البوت", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "فقدت مفتاح الأمان؟", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "أرسل نصًا", - "@sendAsText": { - "type": "text" - }, - "sendMessages": "إرسال رسائل", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "دعوات لي", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "استبدل الغرفة باصدار أحدث", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "register": "سجّل", - "@register": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "يحصل على الموقع…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "حُفظ الملف كـ {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "sendSticker": "أرسل ملصقًا", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "مستوى الأذونات الإفتراضي", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "تعيين مستوى الأذونات", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "عيّن وجوهًا تعبيرية مخصصة", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "أُ خرج أحد العملاء الذي تسختدمها", - "@oneClientLoggedOut": {}, - "pleaseEnter4Digits": "أدخل 4 أرقام أو أتركه فارغ لتعطيل القفل.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "publicKey": "المفتاح العمومي", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "أدخل مفتاح الأمان:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "فضاء عام", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "احذف رسالة", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "أبلغ عن الرسالة", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "إصدار الغرفة", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "احفظ الملف في هذا المجلد", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "معرّف المستخدم:", - "@yourUserId": {}, - "deviceVerifyDescription": "لن يكون التشفير آمنا إلا بعد التحقق من جميع الأجهزة.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "iWroteDownTheKey": "كتبتُ المفتاح", - "@iWroteDownTheKey": {}, - "setupChatBackupDescription": "لحماية رسائلك، أنشأنا مفتاح أمان لك.\nيرجى الاحتفاظ به في مكان آمن، كمدير لكلمات السر.", - "@setupChatBackupDescription": {}, - "passwordsDoNotMatch": "كلمتا السر لا تتطبقان!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "رجاءً أدخل بيردًا إلكترونيًا صالحًا.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "كرّر كلمة السر", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "رجاءً اختر ما لا يقل عن {min} محرف.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "removeFromSpace": "أزل من الفضاء", - "@removeFromSpace": {}, - "unverified": "غير مؤكد", - "@unverified": {}, - "whoCanPerformWhichAction": "من يستطيع القيام بأي عمل", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "messageInfo": "معلومات الرسالة", - "@messageInfo": {}, - "messageType": "نوع الرسالة", - "@messageType": {}, - "sender": "المرسل", - "@sender": {}, - "openGallery": "افتخ المعرض", - "@openGallery": {}, - "time": "الوقت", - "@time": {}, - "badServerLoginTypesException": "يدعم الخادم المستخدم أنواع تسجيل الدخول التالية:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "setupChatBackup": "إعداد النسخ الاحتياطي للمحادثة", - "@setupChatBackup": {}, - "commandHint_clearcache": "مسح الذاكرة المؤقتة", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "enableEmotesGlobally": "تفعيل حزمة التعبيرات بشكل عام", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "إخفاء الأحداث المنقحة", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 حدث إضافي} other{{count} أحداث إضافية}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "commandHint_discardsession": "إنهاء الجلسة", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "locationPermissionDeniedNotice": "تم رفض إذن الموقع. الرجاء منح الإذن للقدرة على مشاركة موقعك.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "loginWithOneClick": "تسجيل الدخول بكبسة واحدة", - "@loginWithOneClick": {}, - "badServerVersionsException": "يدعم الخادم الرئيسي المستخدم إصدارات المواصفات:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "offensive": "عدواني", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "bubbleSize": "حجم الفقاعة", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "تم إعداد النسخ الاحتياطي لمحادثاتك.", - "@yourChatBackupHasBeenSetUp": {}, - "noEncryptionForPublicRooms": "يمكنك فقط تفعيل التشفير عندما تصبح الغرفة غير متاحة للعامة.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "emojis": "إيموجي", - "@emojis": {}, - "voiceCall": "مكالمة صوتية", - "@voiceCall": {}, - "unsupportedAndroidVersion": "نسخة أندرويد غير مدعومة", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "تتطلب هذه الميزة إصدار Android أحدث. يرجى التحقق من وجود تحديثات أو دعم Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "thisUserHasNotPostedAnythingYet": "هذا المستخدم لم ينشر أي شيء في قصته حتى الآن", - "@thisUserHasNotPostedAnythingYet": {}, - "storyPrivacyWarning": "يرجى ملاحظة أنه يمكن للأشخاص رؤية بعضهم البعض والتواصل مع بعضهم البعض في قصتك. ستكون قصصك مرئية لمدة 24 ساعة ولكن ليس هناك ما يضمن حذفها من جميع الأجهزة والخوادم.", - "@storyPrivacyWarning": {}, - "experimentalVideoCalls": "مكالمات الفيديو التجريبية", - "@experimentalVideoCalls": {}, - "commandHint_create": "أنشأ محادثة جماعية فارغة\nاستخدم --لا-تشفير لتعطيل التشفير", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "إبدأ محادثة مباشرة\nاستخدم --لا-تشفير لتعطيل التشفير", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "oopsPushError": "عذراً! للأسف، حدث خطأ أثناء إعداد الإشعارات.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "يرجى اتباع التعليمات الموجودة على الموقع والنقر على التالي.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKeyDescription": "لإلغاء قفل النسخة الاحتياطية للمحادثة، يرجى إدخال مفتاح الأمان الذي تم إنشاؤه في جلسة سابقة. مفتاح الأمان الخاص بك ليس كلمة مرورك.", - "@pleaseEnterSecurityKeyDescription": {}, - "noStatusesFound": "لم يتم العثور على حالات حتى الآن.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "removeFromSpaceDescription": "هذا يزيل هذه المحادثة من الفضاء الحالي. ستبقى بعد ذلك موجودة ضمن \"جميع الدردشات\".", - "@removeFromSpaceDescription": {}, - "commandHint_myroomavatar": "حدد صورتك لهذه الغرفة (عن طريق mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "videoCallsBetaWarning": "يرجى ملاحظة أن مكالمات الفيديو حالياً في مرحلة تجريبية. قد لا تعمل كما هو متوقع أو تعمل على الإطلاق على جميع المنصات.", - "@videoCallsBetaWarning": {}, - "placeCall": "إجراء مكالمة", - "@placeCall": {}, - "replyHasBeenSent": "تم إرسال الرد", - "@replyHasBeenSent": {}, - "videoWithSize": "فيديو ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "رسالة من {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "يرجى ملاحظة أنه يمكن للأشخاص رؤية بعضهم البعض والتواصل مع بعضهم البعض في قصتك.", - "@whoCanSeeMyStoriesDesc": {}, - "emailOrUsername": "البريد الإلكتروني أو اسم المستخدم", - "@emailOrUsername": {}, - "dismiss": "رفض", - "@dismiss": {}, - "matrixWidgets": "إضافات ماتريكس", - "@matrixWidgets": {}, - "integrationsNotImplemented": "تعديل الإضافات والتكاملات ليس ممكنا حتى الآن.", - "@integrationsNotImplemented": {}, - "editIntegrations": "تعديل الإضافات والتكاملات", - "@editIntegrations": {}, - "iUnderstand": "أنا أتفهم", - "@iUnderstand": {}, - "whatIsGoingOn": "ما الذي يحصل؟", - "@whatIsGoingOn": {}, - "addDescription": "إضافة وصف", - "@addDescription": {}, - "setAsCanonicalAlias": "تعيين كاسم مستعار رئيسي", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "يرجى النقر على الرابط الموجود في البريد الإلكتروني ثم المتابعة.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "الرجاء إدخال رقم التعريف الشخصي الخاص بك", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pushRules": "قواعد الإشعارات", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reactedWith": "{sender} تفاعل ب {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "saveTheSecurityKeyNow": "احفظ مفتاح الأمان الآن", - "@saveTheSecurityKeyNow": {}, - "markAsRead": "حدد كمقروء", - "@markAsRead": {}, - "openVideoCamera": "افتح الكاميرا لمقطع فيديو", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "start": "إبدأ", - "@start": {}, - "setupChatBackupNow": "قم بإعداد النسخة الاحتياطية للمحادثة الآن", - "@setupChatBackupNow": {}, - "publish": "انشر", - "@publish": {}, - "whoCanSeeMyStories": "من يمكنه رؤية قصصي؟", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "إلغاء الإشتراك بالقصص", - "@unsubscribeStories": {}, - "yourStory": "قصتك", - "@yourStory": {}, - "addToSpaceDescription": "إختر فضاء لإضافة هذه المحادثة إليه.", - "@addToSpaceDescription": {}, - "addToStory": "إضافة للقصة", - "@addToStory": {}, - "reportUser": "التبيلغ عن المستخدم", - "@reportUser": {}, - "openChat": "فتح المحادثة", - "@openChat": {}, - "pinMessage": "تثبيت في الغرفة", - "@pinMessage": {}, - "pinnedEventsError": "خطأ في تحميل الرسائل المثبتة", - "@pinnedEventsError": {}, - "confirmEventUnpin": "هل أنت متأكد من إلغاء تثبيت الحدث بشكل دائم؟", - "@confirmEventUnpin": {} -} diff --git a/assets/l10n/intl_bn.arb b/assets/l10n/intl_bn.arb deleted file mode 100644 index 78ef4c201c..0000000000 --- a/assets/l10n/intl_bn.arb +++ /dev/null @@ -1,30 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:10.154280", - "about": "সম্পর্কে", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "স্বীকার করি", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "অ্যাকাউন্ট", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "অ্যাকাউন্ট তথ্য", - "@accountInformation": { - "type": "text", - "placeholders": {} - } -} \ No newline at end of file diff --git a/assets/l10n/intl_ca.arb b/assets/l10n/intl_ca.arb deleted file mode 100644 index 03b924fc50..0000000000 --- a/assets/l10n/intl_ca.arb +++ /dev/null @@ -1,2529 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:10.145728", - "about": "Quant a", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Accepta", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} ha acceptat la invitació", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Compte", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informació del compte", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ha activat el xifratge d’extrem a extrem", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Afegeix descripció de grup", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administració", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "àlies", - "@alias": { - "type": "text", - "placeholders": {} - }, - "allChats": "Tots els xats", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Ja teniu un compte?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} ha respost a la trucada", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Qualsevol pot unir-se", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Blocatge de l’aplicació", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arxiu", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Sala arxivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Accés dels usuaris convidats", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "N’esteu segur?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Introduïu la frase de seguretat o la clau de recuperació per a desar les claus en memòria cau.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Introduïu la frase de seguretat o clau de recuperació per a verificar la vostra sessió.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Voleu acceptar aquesta sol·licitud de verificació de: {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autenticació", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "L’avatar ha canviat", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Veta del xat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Vetat", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} ha vetat a {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloca el dispositiu", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Missatges del bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Claus desades a la memòria cau", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancel·la", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "No es pot obrir l’URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Canvia el nom del dispositiu", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ha canviat la imatge del xat", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} ha canviat la descripció del xat a: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} ha canviat el nom del xat a: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} ha canviat els permisos del xat", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRules": "{username} ha canviat les normes d’accés dels convidats", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} ha canviat les normes d’accés dels convidats a: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} ha canviat la visibilitat de l’historial", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} ha canviat la visibilitat de l’historial a: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} ha canviat les normes d’unió", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} ha canviat les normes d’unió a: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} ha canviat la seva imatge de perfil", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} ha canviat l’àlies de la sala", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} ha canviat l’enllaç per a convidar", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Registre de canvis", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Canvia la contrasenya", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "S’han desat els canvis", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Canvia el servidor", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Canvia l’estil", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Canvia el nom del grup", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Canvia el servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Canvia el fons", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "El xifratge s’ha corromput", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Xat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detalls del xat", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Xats", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Trieu una contrasenya forta", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Trieu un nom d’usuari", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Tanca", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_html": "Envia text en format HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_leave": "Abandona aquesta sala", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_op": "Estableix el nivell d'autoritat de l'usuari (per defecte: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Envia text sense format", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "Envia text", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "compareEmojiMatch": "Compareu i assegureu-vos que els emojis següents coincideixen amb els de l’altre dispositiu:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Compareu i assegureu-vos que els nombres següents coincideixen amb els de l’altre dispositiu:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirma", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Connecta", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Ha fallat l’intent de connexió", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Conté l'àlies", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Conté el nom d’usuari", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visualitzador de continguts", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "S’ha copiat al porta-retalls", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copia", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "No s'ha pogut desxifrar el missatge: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "No s'ha pogut establir la imatge de perfil", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "No s’ha pogut definir l'àlies", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participants", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Crea", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Crea un compte ara", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} ha creat el xat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Crea un grup nou", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Signatura creuada desactivada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Signatura creuada activada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Actiu actualment", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Fosc", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuari. Això no es pot desfer! Esteu segur de fer-ho?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "delete": "Suprimeix", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Suprimeix el compte", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Suprimeix el missatge", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Denega", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Dispositiu", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Id. de dispositiu", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Dispositius", - "@devices": { - "type": "text", - "placeholders": {} - }, - "directChats": "Xats directes", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Descarta la imatge", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Ha canviat l'àlies", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Donació", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Baixa el fitxer", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Edita", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Edita l'àlies", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Canvia la instància de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "L'emoticona ja existeix!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Codi d'emoticona invàlid!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Paquet d'emoticones de la sala", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Paràmetres de les emoticones", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Codi d'emoticona", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Has de seleccionar un codi d'emoticona i una imatge!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Xat buit", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Activa el paquet d'emoticones global", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "No podreu desactivar el xifratge mai més. N’esteu segur?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Xifrat", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Xifratge", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algorisme de xifratge", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "El xifratge no s’ha activat", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Paràmetres del xifratge d’extrem a extrem", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} ha finalitzat la trucada", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Introduïu un nom de grup", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Introduïu una adreça electrònica", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Introduïu un nom d’usuari", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Introdueix el teu servidor", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nom del fitxer", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Mida del fitxer", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Reenvia", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "divendres", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Des de la unió", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Des de la invitació", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Grup", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Descripció de grup", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descripció de grup canviada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "El grup és públic", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grup amb {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Els convidats no poden unir-se", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Els convidats es poden unir", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} ha retirat la invitació de {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Ajuda", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Amaga els esdeveniments velats", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Amaga els esdeveniments desconeguts", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "El servidor no és compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "Id.", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identitat", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Usuaris ignorats", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Pots ignorar els usuaris que et molestin. No rebràs els missatges ni les invitacions dels usuaris que es trobin a la teva llista personal d'ignorats.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignora nom d'usuari", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "He fet clic a l'enllaç", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frase de seguretat o clau de recuperació incorrecta", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Convida contacte", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Convida contacte a {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Convidat", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} ha convidat a {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Només usuaris convidats", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Invitació per a mi", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Instal·la FluffyChat: https://fluffychat.im\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "És correcta la següent clau de dispositiu?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "escrivint…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} s'ha unit al xat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Uneix-te a la sala", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Les claus estan desades a la memòria cau", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Falten les claus", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} ha expulsat a {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} ha expulsat i vetat a {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Expulsa del xat", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Actiu per última vegada: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Última direcció IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vist va molt de temps", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Abandona", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Ha marxat del xat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Llicència", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Clar", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Carrega {count} participants més", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "S’està carregant… Espereu.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Carrega’n més…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "S’han desactivat els serveis d’ubicació. Activeu-los per a compartir la vostra ubicació.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "S’ha rebutjat el permís d’ubicació. Atorgueu-lo per a poder compartir la vostra ubicació.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Inicia la sessió", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Inicia sessió a {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Inicia la sessió amb {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Finalitza la sessió", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Crea un moderador", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Crea un administrador", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Assegura't que l'identificador sigui vàlid", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Canvis de participants", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Menciona", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "El missatge s'eliminarà per a tots els participants", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderador", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "dilluns", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Silencia el xat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Tingueu en compte que, ara per ara, us cal el Pantalaimon per a poder utilitzar el xifratge d’extrem a extrem.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Missatge nou al FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nova sol·licitud de verificació!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "no": "No", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Sense connexió al servidor", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "De moment FluffyChat no és compatible amb la signatura creuada. Activa-la des d'Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "No s’ha trobat cap emoticona. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem utilitzar https://microg.org/ o https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "De moment FluffyChat no és compatible amb la còpia de seguretat de claus en línia. Activa-la des d'Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Cap", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Encara no heu afegit cap mètode per a poder recuperar la contrasenya.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Sense permís", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "No s’ha trobat cap sala…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notificacions", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notificacions activades per a aquest compte", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "No compatible amb la versió web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seleccionat/s", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} usuaris escrivint…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offline": "Fora de línia", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "D'acord", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "En línia", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "La còpia de seguretat de claus en línia està desactivada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "La còpia de seguretat de claus en línia està activada", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Alguna cosa ha anat malament…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Obre l'aplicació per llegir els missatges", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Obre la càmera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcional) Nom del grup", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "O", - "@or": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositius d'usuari participant", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "contrasenya o clau de recuperació", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Contrasenya", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Contrasenya oblidada", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "La contrasenya ha canviat", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Recuperació de contrassenya", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Selecciona una imatge", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Fixa", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Reproduir {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAPasscode": "Tria un codi d'accés", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Tria un nom d'usuari", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Fes clic a l'enllaç del correu i, després, segueix.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Introdueix 4 dígits o deixa-ho buit per desactivar el bloqueig.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Introdueix un identificador de Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Introdueix la teva contrasenya", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Introdueix el teu nom d'usuari", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privadesa", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Sales públiques", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Regles push", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "recording": "Enregistrant", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} ha velat un esdeveniment", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Rebutja", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} ha rebutjat la invitació", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Torna-t'hi a unir", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Elimina", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Elimina tots els altres dispositius", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Eliminat per {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Elimina dispositiu", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Desfés l'expulsió", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Elimina missatge", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Mostra el contingut enriquit dels missatges", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Respon", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Sol·licita permís", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Sol·licita llegir els missatges antics", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revoca tots els permisos", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "La sala s'ha actualitzat", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "dissabte", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Cerca un xat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Seguretat", - "@security": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Vist per {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Vist per {username} i {count} més}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Vist per {username} i {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Envia", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Envia un missatge", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Envia com a text", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Envia un àudio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Permet l'enviament d'informes d'error amb sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Envia un fitxer", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Envia una imatge", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Envia l’original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Envia adhesiu", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Envia un vídeo", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} ha enviat un fitxer", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} ha enviat un àudio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} ha enviat una imatge", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} ha enviat un adhesiu", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} ha enviat un vídeo", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} ha enviat informació de trucada", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informació sobre la vostra privadesa: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "S’ha verificat la sessió", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Defineix una foto de perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Defineix la descripció del grup", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Defineix l’enllaç per a convidar", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Defineix el nivell de permisos", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Defineix l’estat", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Paràmetres", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Comparteix", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} n’ha compartit la ubicació", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Registre", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Autenticació única", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Omet", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "So, vibració i color de LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Codi font", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} ha iniciat una trucada", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Creeu el vostre primer xat ara mateix! 🙂\n- Feu clic al botó 'Nou xat'\n- Escanegeu el codi QR d’un conegut\n- Gaudiu del xat", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Com us sentiu avui?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Envia", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "diumenge", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Toqueu per a mostrar la imatge", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toqueu per a mostrar el menú", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "No coincideixen", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Coincideixen", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Aquesta sala ha estat arxivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "dijous", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Marca com a llegit/sense llegir", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Massa sol·licituds. Torna-ho a provar més tard!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Intenta tornar a enviar", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "dimarts", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "No disponible", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} ha tret el veto a {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Desbloqueja dispositiu", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Dispositiu desconegut", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "L’algorisme de xifratge és desconegut", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Esdeveniment desconegut '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "La sessió és desconeguda; verifiqueu-la", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Deixa de silenciar el xat", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Deixa de fixar", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 xat no llegit} other{{unreadCount} xats no llegits}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 missatge no llegit} other{{unreadEvents} missatges no llegits}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Voleu utilitzar colors adients per a AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} i {username2} estan escrivint…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} està escrivint…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} ha marxat del xat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nom d’usuari", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} ha enviat un esdeveniment {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Sessió verificada amb èxit!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verifica", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifica manualment", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Inicia la verificació", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "T'has verificat correctament!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verificant un altre compte", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifica usuari", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videotrucada", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilitat de l’historial del xat", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible per a tots els participants", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visible per a tothom", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Missatge de veu", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "S’està esperant que l’altre accepti l’emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "S’està esperant que l’altre accepti els nombres…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Fons", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Atenció!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "El xifrat d'extrem a extrem es troba actualment en proves (Beta. Utilitza'l sota la teva responsabilitat!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "dimecres", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Us donem la benvinguda a l’aplicació de missatgeria instantània més maca de la xarxa Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Us hem enviat un missatge de correu electrònic", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Qui pot unir-se a aquest grup", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Amb aquestes adreces, si ho necessiteu, podeu recuperar la vostra contrasenya.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Escriviu un missatge…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Sí", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Vós", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Us han convidat a aquest xat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Ja no participeu en aquest xat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "No us podeu convidar a vós mateix", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Has estat vetat d'aquest xat", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "El vostre nom d’usuari", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "La vostra clau pública", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "all": "Tot", - "@all": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Afegeix una amistat", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Posa en pausa", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Afegeix a un espai", - "@addToSpace": {}, - "audioPlayerPlay": "Reprodueix", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Segur que voleu finalitzar la sessió?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Afegeix una adreça electrònica", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "El xat s’ha tret d’aquest espai", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearText": "Neteja el text", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "commandInvalid": "L’ordre no és vàlida", - "@commandInvalid": { - "type": "text" - }, - "fontSize": "Mida de la lletra", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Ves a la sala nova", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "next": "Següent", - "@next": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "No s’ha trobat cap sala pública…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grups públics", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "link": "Enllaç", - "@link": {}, - "people": "Gent", - "@people": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Espai públic", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Vela el missatge", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Envia en prémer Retorn", - "@sendOnEnter": {}, - "clearArchive": "Neteja l’arxiu", - "@clearArchive": {}, - "chatBackupDescription": "La còpia de seguretat dels xats és protegida amb una clau. Assegureu-vos de no perdre-la.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Clau pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "S’estan sincronitzant els vostres xats…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "El xat s’ha afegit a aquest espai", - "@chatHasBeenAddedToThisSpace": {}, - "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "chatBackup": "Còpia de seguretat del xat", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blocat", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Tot és a punt!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nom de l’espai", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "search": "Cerca", - "@search": { - "type": "text", - "placeholders": {} - }, - "verified": "Verificat", - "@verified": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Cap descripció", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Activeu la còpia de seguretat del xat per a mai perdre accés a les converses.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "newChat": "Xat nou", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Canvia l’avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Apropa", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Allunya", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignora", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Desa el fitxer en aquesta carpeta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Us connectareu a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "commandHint_react": "Envia una resposta com a reacció", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "defaultPermissionLevel": "Nivell de permisos per defecte", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremadament ofensiu", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "iWroteDownTheKey": "He escrit la clau", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "S’ha configurat la còpia de seguretat del xat.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Hem generat una clau de seguretat per a protegir els vostres missatges.\nConserveu-la en un lloc segur, com ara un gestor de contrasenyes.", - "@setupChatBackupDescription": {}, - "setupChatBackup": "Configura la còpia de seguretat dels xats", - "@setupChatBackup": {}, - "contentHasBeenReported": "El contingut s’ha denunciat als administradors del servidor", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "El vostre id. d’usuari:", - "@yourUserId": {}, - "deviceVerifyDescription": "El xifratge només és segur quan tots els dispositius s’han verificat.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Activa el xifratge", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Introduïu un nom d’espai", - "@enterASpacepName": {}, - "noStatusesFound": "Encara no s’ha trobat cap estat.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "addAccount": "Afegeix un compte", - "@addAccount": {}, - "noEncryptionForPublicRooms": "Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "newUsernameDescription": "El vostre identificador d’usuari tindrà el format @nom-d’usuari:nom-del-servidor", - "@newUsernameDescription": {}, - "roomVersion": "Versió de la sala", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Clau de seguretat", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Heu perduda la clau de seguretat?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Envia missatges", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Desa el fitxer", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "S’ha desat el fitxer com a {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "pleaseFollowInstructionsOnWeb": "Seguiu les instruccions al lloc web i toqueu «Següent».", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Denuncia el missatge", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Defineix com a àlies principal", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "status": "Estat", - "@status": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Toqueu un dispositiu per a verificar-lo", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Commuta l’estat «preferit»", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Commuta l’estat «silenci»", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transfereix des d’un altre dispositiu", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Desbloca la còpia de seguretat del xat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "L’usuari no s’ha verificat", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Defineix emoticones personalitzades", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Qui pot efectuar quina acció", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Per què voleu denunciar això?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Voleu suprimir la còpia de seguretat dels xats per a crear una clau de seguretat nova?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "S’està esperant que l’altre accepti la sol·licitud…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "L’estat de verificació de l’usuari és desconegut", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "L’usuari s’ha verificat", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "No verificat", - "@unverified": {}, - "commandHint_me": "Descriviu-vos", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandMissing": "{command} no és una ordre.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "configureChat": "Configura el xat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copia al porta-retalls", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Espai nou", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancel·la i no m’ho tornis a preguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "S’ha produït un error en obtenir la ubicació: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "friends": "Amistats", - "@friends": { - "type": "text", - "placeholders": {} - }, - "groups": "Grups", - "@groups": { - "type": "text", - "placeholders": {} - }, - "messages": "Missatges", - "@messages": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Mostra la contrasenya", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "L’espai és públic", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "Escaneja un codi QR", - "@scanQrCode": {}, - "obtainingLocation": "S’està obtenint la ubicació…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Comparteix la ubicació", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "S’està sincronitzant… Espereu.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "reason": "Raó", - "@reason": { - "type": "text", - "placeholders": {} - }, - "changedTheDisplaynameTo": "{username} ha canviat el seu àlies a: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "howOffensiveIsThisContent": "Com d’ofensiu és aquest contingut?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "commandHint_clearcache": "Neteja la memòria cau", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_join": "Uneix-te a la sala", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Elimina l'usuari indicat d'aquesta sala", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_myroomavatar": "Establiu la imatge per a aquesta sala (per mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_dm": "Inicia un xat directe\nUsa --no-encryption per desactivar l'encriptatge", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_invite": "Convida l'usuari indicat a aquesta sala", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_ban": "Prohibeix l'usuari indicat d'aquesta sala", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_create": "Crea un xat de grup buit\nUsa --no-encryption per desactivar l'encriptatge", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Descarta la sessió", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "passwordsDoNotMatch": "Les contrasenyes no coincideixen!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Introduïu una adreça electrònica vàlida.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Repetiu la contrasenya", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Seleccioneu almenys {min} caràcters.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "bubbleSize": "Mida de la bombolla", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomnick": "Estableix el teu àlies per a aquesta sala", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "editBlockedServers": "Edita els servidors bloquejats", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "El servidor admet els inicis de sessió:\n{serverVersions}\nPerò l'aplicació només admet:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "discoverGroups": "Descobreix grups", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "Descobreix", - "@discover": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Edita els permisos del xat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_cs.arb b/assets/l10n/intl_cs.arb deleted file mode 100644 index 72c369fb0c..0000000000 --- a/assets/l10n/intl_cs.arb +++ /dev/null @@ -1,2864 +0,0 @@ -{ - "@@locale": "cs", - "@@last_modified": "2021-08-14 12:41:10.131133", - "about": "O aplikaci", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Přijmout", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} přijali pozvání", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Účet", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informace o účtu", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktivoval koncové šifrování", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Přidat e-mail", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Přidat popis skupiny", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Přidat nového přítele", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Správce", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Vše", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Všechny chaty", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Máte již účet?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} odpověděl na hovor", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Kdokoliv se může připojit", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Zámek aplikace", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archivovat", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archivovaná místnost", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Mohou se připojit hosté", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Jste si jistý?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Opravdu se chcete odhlásit?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Prosím zadejte vaší přístupovu frázi k „bezpečnému úložišti“ anebo „klíč na obnovu“ pro uložení klíčů.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Pro ověření této osoby zadejte prosím přístupovou frázi k „bezpečnému úložišti“ anebo „klíč pro obnovu“.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Zadejte prosím vaší přístupovou frází k „bezpečnému úložišti“ anebo „klíč pro obnovu“ pro ověření vaší relace.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Přijmout žádost o ověření od {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pozastavit", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Přehrát", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Ověření", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automaticky přehrajte animované nálepky a emoce", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar byl změněn", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Homeserver podporuje přihlášení typu:\n{serverVersions}\nAle tato aplikace podporuje pouze:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Homeserver podporuje specifikaci verzí:\n{serverVersions}\nAle tato aplikace podporuje pouze verze {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Zakázat chat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Zakázán", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} zakázal {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blokovat zařízení", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Zakázán", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Zprávy od bota", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Klíče v mezipaměti", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Zrušit", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Nelze otevřít URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Změnit název zařízení", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} změnil avatar chatu", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} změnil popis chatu na: „{description}“", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} změnil jméno chatu na: „{chatname}“", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} změnili nastavení oprávnění v chatu", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} změnili svoji přezdívku na: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} změnili přístupová práva pro hosty", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} změnili přístupová práva pro hosty na: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} změnili nastavení viditelnosti historie diskuze", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} změnili nastavení viditelnosti historie diskuze na: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} změnili nastavení pravidel připojení", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} změnili nastavení pravidel připojení na: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} změnili svůj avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} změnili nastavení aliasů místnosti", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} změnili odkaz k pozvání do místnosti", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Historie změn", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Změnit heslo", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Změny byly uloženy", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Změnit domovský server", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Změňte svůj styl", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Změnit název skupiny", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Změňte server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Změnit pozadí", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Změňte svůj avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Šifrování bylo poškozeno", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Záloha chatu", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Záloha chatu je zabezpečena bezpečnostním klíčem. Ujistěte se, že klíč neztratíte.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Bližší údaje o chatu", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Chaty", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Vyberte silné heslo", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Vyberte uživatelské jméno", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Vymazat archiv", - "@clearArchive": {}, - "clearText": "Smazat text", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Zavřít", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Zakázat danému uživateli přístup do této místnosti", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Odeslat text ve formátu HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Pozvěte daného uživatele do této místnosti", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Připojte se k dané místnosti", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Odeberte daného uživatele z této místnosti", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Opusťte tuto místnost", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Představ se", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Nastavte si obrázek pro tuto místnost (autor mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Nastavte si váš zobrazovaný název pro tuto místnost", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Nastavit úroveň práv daného uživatele (výchozí: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Odeslat neformátovaný text", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Odeslat odpověď jako reakci", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Poslat zprávu", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Zrušte zákaz přístupu daného uživatele do této místnosti", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Příkaz je neplatný", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} není příkaz.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Porovnejte a přesvědčete se, že následující emotikony se shodují na obou zařízeních:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Porovnejte a přesvědčete se, že následující čísla se shodují na obou zařízeních:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Nastavení chatu", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Potvrdit", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Připojit", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Pokus o připojení selhal", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt byl pozván do skupiny", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Obsahuje zobrazovaný název", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Obsahuje uživatelské jméno", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Obsah byl nahlášen správcům serveru", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Prohlížeč obsahu", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Zkopírováno do schránky", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopírovat", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Zkopírovat do schránky", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nebylo možné dešifrovat zprávu: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Nebylo možné nastavit avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nebylo možné nastavit přezdívku uživatele", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} účastníků", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Vytvořit", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Vytvořit účet teď", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} založil chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Založit novou skupinu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nový prostor", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Křížové ověření je vypnuté", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Křížové ověření je zapnuté", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Aktuálně aktivní", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tmavé", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}. {month}. {year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Tímto krokem se deaktivuje váš uživatelský účet. Akci nelze vrátit zpět! Jste si jistí?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Výchozí úroveň oprávnění", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Smazat", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Smazat účet", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Smazat zprávu", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Odmítnout", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Zařízení", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID zařízení", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Zařízení", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Šifrování je bezpečné pouze tehdy, kdy jsou ověřená všechna zařízení.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Přímé chatování", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Zahodit obrázek", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Objevit", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Objevte skupiny", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Přezdívka byla změněna", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Přispějte", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Zrušit a znovu se neptat", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Stáhnout soubor", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Upravit", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Upravit zakázané servery", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Upravit oprávnění chatu", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Změnit přezdívku", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Nastavení komunikátoru Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Upravit aliasy místností", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Upravit avatara místnosti", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotikona již existuje!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Neplatný kód emotikony!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Balíček emotikonů pro místnost", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Nastavení emotikonů", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Klávesová zkratka emotikonu", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Musíte si vybrat klávesovou zkratku emotikonu a obrázek!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Prázdný chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Povolte zálohu chatu, abyste nikdy neztratili přístup ke svým chatům.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Povolit balíček emotikon všude", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Povolit šifrování", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Šifrování již nebude možné vypnout. Jste si tím jisti?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Šifrováno", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Šifrování", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Šifrovací algoritmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Šifrování není aktivní", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Nastavení koncového šifrování", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} ukončil hovor", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Zadejte název skupiny", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Zadejte e-mailovou adresu", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Zadejte název prostoru", - "@enterASpacepName": {}, - "enterAUsername": "Zadejte uživatelské jméno", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Zadejte svůj domovský server", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Chyba při získávání polohy: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Vše připraveno!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extrémně urážlivé", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Název souboru", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Velikost souboru", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Velikost písma", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Přeposlat", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Pátek", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Přátelé", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Od vstupu", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Od pozvání", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Přejít do nové místnost", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Skupina", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Popis skupiny", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Popis skupiny byl změněn", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Skupina je veřejná", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Skupiny", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Skupina s {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Hosté jsou zakázáni", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Hosté se mohou připojit", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} stáhl pozvánku pro {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Pomoc", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Skrýt redigované události", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Skrýt neznámé události", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Domácí server není kompatibilní", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Jak urážlivý je tento obsah?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identita", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorovat", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignorovaní uživatelé", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Můžete ignorovat uživatele, kteří vás znepokojují. Nebudete moci přijímat žádné zprávy nebo pozvánky od uživatelů na vašem osobním seznamu ignorovaných.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorovat uživatelské jméno", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Klikl jsem na odkaz", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Nesprávné přístupové heslo anebo klíč pro obnovu", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Neškodný", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Neplatný e-mail", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Pozvat kontakt", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Pozvat kontakt do {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Pozvaný", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} pozvali {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Pouze pozvaní uživatelé", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Pozvěte mě", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainstalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte se anebo se přihlašte\n3. Otevřete odkaz na pozvánce: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Je následjící klíč zařízení správný?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "píše…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} se připojili k chatu", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Připojte se k místnosti", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Klíče jsou uloženy v mezipaměti", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Chybí klíče", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} vyhodil {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} vyhodili a zakázali {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Vyhodit z chatu", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Naposledy aktivní: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Naposledy viděná IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Viděn velmi dávno", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Opustit", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Opustil chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licence", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Světlé", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Načíst dalších {count} účastníků", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Načítání… Prosíme vyčkejte.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Načíst další…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Služby určování polohy jsou deaktivovány. Povolte jim, aby mohli sdílet vaši polohu.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Oprávnění k poloze odepřeno. Udělte jim prosím možnost sdílet vaši polohu.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Přihlásit se", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Přihlášení k {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Přihlásit se pomocí {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Odhlásit", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Přidat práva moderátora", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Přidat práva administrátora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Ujistěte se, že je identifikátor validní", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Změny členů", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Zmínit se", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Zprávy", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Zpráva bude odstraněna pro všechny účastníky", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderátor", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Pondělí", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count, plural, =1{1 další událost} other{{count} dalších událostí}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Ztlumit chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Prosím vezměte na vědomí, že pro použití koncového šifrování je prozatím potřeba použít Pantalaimon.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nový chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nová zpráva ve FluffyChatu", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nová žádost o ověření!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Další", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Ne", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Žádné připojení k serveru", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychet momentálně nepodporuje aktivaci křížového podpisu. Prosím aktivujte si ho z prostředí Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Bez popisu", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nebyly nalezeny žádné emotikony. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Můžete aktivovat šifrování jakmile místnost přestane být veřejně dostupná.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Zdá se, že v telefonu nemáte žádné služby Google. To je dobré rozhodnutí pro vaše soukromí! Chcete-li dostávat push oznámení ve FluffyChat, doporučujeme použít: https://microg.org/ nebo https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} není matrixový server, použít místo toho server {server2}?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Místo toho prosím zapněte online zálohování klíčů z prostředí Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Žádný", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Dosud jste nepřidali způsob, jak obnovit své heslo.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Chybí oprávnění", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Nebyly nalezeny žádné veřejné místnosti…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nebyly nalezeny žádné místnosti…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Dosud nebyly nalezeny žádné stavy.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Oznámení", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Oznámení povolena pro tento účet", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Web není podporován", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} označených zpráv", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} uživatelé píší…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Získávání polohy…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Urážlivé", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Odpojeni", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Připojeni", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online záloha klíčů je vypnutá", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online záloha kíčů je zapnuta", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Jejda! Při nastavování oznámení push došlo bohužel k chybě.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Jejda, něco se pokazilo…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Otevřete aplikaci pro přečtení zpráv", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Otevřít fotoaparát", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Otevřít v mapách", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Volitelné) Vaše e-mailová adresa", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Volitelné) Název skupiny", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Nebo", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Účastník", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Připojená zařízení uživatele", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "heslo nebo klíč pro obnovení", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Heslo", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Zapomenuté heslo", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Heslo bylo změněno", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Obnova hesla", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Lidé", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Zvolit obrázek", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Připnout zprávu", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Přehrát {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Prosím vyberte si", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Vyberte přístupový kód", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Zvolte si prosím uživatelské jméno", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Klikněte na odkaz v e-mailu a pokračujte.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Chcete-li deaktivovat zámek aplikace, zadejte 4 číslice nebo nechte prázdné.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Prosím zadejte identifikátor sítě Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Zadejte svůj bezpečnostní klíč:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Zadejte prosím své heslo", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Zadejte svůj PIN", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Zadejte prosím své uživatelské jméno", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Postupujte podle pokynů na webu a klepněte na další.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Soukromí", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Veřejné skupiny", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Veřejný klíč", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Veřejné místnosti", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Veřejný prostor", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Pravidla push", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Důvod", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Nahrávání", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} opravili událost", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Redigovat zprávu", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registrovat", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Zamítnout", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} odmítli pozvání", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Znovu se připojte", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Odstranit", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Odstranit všechna další zařízení", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Odstraněno {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Odstraňit zařízení", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Zrušit zákaz chatu", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Odstranit zprávu", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Odstraňte svého avatara", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Zobrazit bohatě vykreslený obsah zpráv", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Nahradit místnost novou verzí", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Odpovědět", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Nahlásit zprávu", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Vyžádat oprávnění", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Vyžádat přečtení starších zpráv", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Zrušit všechna oprávnění", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Místnost byla upgradována", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Verze místnosti", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sobota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Uložený soubor jako {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Uložit soubor", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Uložte soubor do této složky", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Hledat", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Vyhledat chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Bezpečnostní", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Bezpečnostní klíč", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ztratili jste bezpečnostní klíč?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Viděno uživatelem {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Viděno uživatelem {username} a {count} dalšími}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Viděno uživateli {username} a {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Odeslat", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Odeslat zprávu", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Odeslat jako text", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Odeslat audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Povolte zasílání hlášení o chybách prostřednictvím sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Odeslat soubor", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Odeslat obrázek", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Odeslat zprávy", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Odeslat originál", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Odeslat nálepku", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Odeslat video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} poslali soubor", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} poslali zvukovou nahrávku", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} poslali obrázek", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} poslali samolepku", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} poslali video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} odeslal informace o hovoru", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informace o vašem soukromí: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sezení je ověřené", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Nastavit profilový obrázek", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Nastavit jako hlavní alias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Nastavit vlastní emotikony", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Nastavit popis skupiny", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Nastavit zvací odkaz", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Nastavit úroveň oprávnění", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Nastavit stav", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Nastavení", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Sdílet", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} sdílel jejich polohu", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Sdílet polohu", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Zobrazit heslo", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Přihlásit se", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Jedinečné přihlášení", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Přeskočit", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Zvuk, vibrace LED barvy", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Zdrojové kódy", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Prostor je veřejný", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Název prostoru", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} zahájil hovor", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Začněte svůj první chat hned teď! 🙂\n- Klepněte na 'Nový chat'\n- Naskenujte QR kód přítele\n- Bavte se chatováním", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Stav", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Jak se dneska máš?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Odeslat", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Neděle", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchronizace ... Čekejte prosím.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Téma systému", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Klepněte na zařízení pro jeho ověření", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Klepnutím zobrazíte obrázek", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Klepněte pro zobrazení menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Neshodují se", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Shodují se", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Tato místnost byla archivována.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Čtvrtek", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Přepnout Oblíbené", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Přepnout ztlumené", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Označit jako přečtené/nepřečtené", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Příliš mnoho požadavků. Prosím zkuste to znovu později!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Přenos z jiného zařízení", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Zkuste odeslat znovu", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Úterý", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nedostupní", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} zrušili zákaz pro {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Odblokovat zařízení", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Neznámé zařízení", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Neznámý šifrovací algoritmus", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Neznámá událost „{type}“", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Neznámé sezení, prosíme o ověření", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Odemknout zálohu chatu", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Zrušit ztlumení chatu", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Odepnout zprávu", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 nepřečtený chat} other{{unreadCount} nepřečtené chaty}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 nepřečtená zpráva} other{{unreadEvents} nepřečtených zpráv}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Použít barvy kompatibilní s AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} a {count} dalších píší…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} a {username2} píší…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} píše…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} opustili chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Uživatelské jméno", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Uživatel není ověřen", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} poslali událost {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Stav ověření uživatele je neznámý", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Uživatel je ověřen", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Ověřeno", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sezení úspěšně ověřeno!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Ověřit", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Ověřit ručně", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Zahájit ověření", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Ověření proběhlo úspěšně!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Ověřuji druhý účet", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Ověřit uživatele", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Video hovor", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Viditelnost historie chatu", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Viditelné pro všechny účastnící se", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Viditelné pro všechny", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Hlasová zpráva", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Čeká se na potvrzení žádosti partnerem…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Čeká se na potvrzení emoji partnerem…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Čekání na partnera až přijme čísla…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Pozadí", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Varování!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Koncové šifrování je momentálně ve verzi Beta! Používejte na vlastní nebezpečí!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Středa", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Vítejte v nejroztomilejší diskuzní aplikaci pro síť Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Zaslali jsme vám e-mail", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Kdo může provést jakou akci", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kdo se může připojit do této skupiny", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Proč to chcete nahlásit?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Chcete vymazat zálohu chatu a vytvořit nový bezpečnostní klíč?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "S těmito adresami můžete obnovit své heslo.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Napište zprávu…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Ano", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Vy", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Jste zváni do tohoto chatu", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Tohoto chatu se nadále neúčastníte", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Nemůžete pozvat sami sebe", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Byl vám zablokován přístup k tomuto chatu", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Vaše chaty se synchronizují…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Vaše vlastní uživatelské jméno", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Váš veřejný klíč", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Budete připojeni k {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Přiblížit", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Oddálit", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Chat byl z tohoto prostoru odstraněn", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Do tohoto prostoru byl přidán chat", - "@chatHasBeenAddedToThisSpace": {}, - "addToSpace": "Přidat do prostoru", - "@addToSpace": {}, - "scanQrCode": "Naskenujte QR kód", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Ručně zadejte odkaz na pozvánku ...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Sdílejte váš odkaz na pozvání", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Pokud nejste vedle sebe, stačí naskenovat QR kód nebo sdílet odkaz na pozvánku.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Odeslat při vstupu", - "@sendOnEnter": {}, - "homeserver": "Domácí server", - "@homeserver": {}, - "serverRequiresEmail": "Tento server potřebuje k registraci ověřit vaši e -mailovou adresu.", - "@serverRequiresEmail": {}, - "newUsernameDescription": "Vaše ID uživatele pak bude mít formát @uživatelské jméno: název serveru", - "@newUsernameDescription": {}, - "newPasswordDescription": "Abyste mohli obnovit své heslo, měli byste ke svému účtu později přidat e -mailovou adresu.", - "@newPasswordDescription": {}, - "addToBundle": "Přidat do balíčku", - "@addToBundle": {}, - "setupChatBackup": "Nastavit zálohu chatu", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Níže jsem napsal klíč", - "@iWroteDownTheKey": {}, - "addAccount": "Přidat účet", - "@addAccount": {}, - "bundleName": "Název balíčku", - "@bundleName": {}, - "link": "Odkaz", - "@link": {}, - "yourChatBackupHasBeenSetUp": "Vaše záloha chatu byla nastavena.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Abychom chránili vaše zprávy, vygenerovali jsme pro vás bezpečnostní klíč.\n Uchovejte ho na bezpečném místě, například ve správci hesel.", - "@setupChatBackupDescription": {}, - "yourUserId": "Vaše uživatelské ID:", - "@yourUserId": {}, - "editBundlesForAccount": "Upravit balíčky pro tento účet", - "@editBundlesForAccount": {}, - "enableMultiAccounts": "(BETA) Na tomto zařízení povolte více účtů", - "@enableMultiAccounts": {}, - "oneClientLoggedOut": "Jeden z vašich klientů byl odhlášen", - "@oneClientLoggedOut": {}, - "removeFromBundle": "Odstranit z tohoto balíčku", - "@removeFromBundle": {}, - "unverified": "Neověřeno", - "@unverified": {}, - "messageInfo": "Informace o zprávě", - "@messageInfo": {}, - "time": "Čas", - "@time": {}, - "messageType": "Typ zprávy", - "@messageType": {}, - "sender": "Odesílatel", - "@sender": {}, - "pleaseChooseAtLeastChars": "Vyberte prosím alespoň {min} znaků.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "passwordsDoNotMatch": "Hesla se neshodují!", - "@passwordsDoNotMatch": {}, - "repeatPassword": "Zopakujte heslo", - "@repeatPassword": {}, - "pleaseEnterValidEmail": "Prosím zadejte platnou emailovou adresu.", - "@pleaseEnterValidEmail": {}, - "openGallery": "Otevřít galerii", - "@openGallery": {}, - "addToSpaceDescription": "Vyberte umístění, do kterého chcete tento chat přidat.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Přihlaste se jedním kliknutím", - "@loginWithOneClick": {}, - "start": "Start", - "@start": {}, - "removeFromSpaceDescription": "Tímto se chat odstraní z aktuálního místa. Poté bude stále viditelný v sekci \"Všechny chaty\".", - "@removeFromSpaceDescription": {}, - "removeFromSpace": "Odstranit z tohoto místa", - "@removeFromSpace": {}, - "setupChatBackupNow": "Nastavte si zálohu chatu hned teď", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Uložte bezpečnostní klíč nyní", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Chcete-li odemknout zálohu chatu, zadejte svůj bezpečnostní klíč, který byl vygenerován v předchozí relaci. Váš bezpečnostní klíč NENÍ vaše heslo.", - "@pleaseEnterSecurityKeyDescription": {}, - "commandHint_clearcache": "Vymazat mezipamět", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "Zahodit relaci", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Zahajte přímý chat\nK deaktivaci šifrování použijte --no-encryption", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_create": "Vytvořte prázdný skupinový chat\n K deaktivaci šifrování použijte --no-encryption", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "openVideoCamera": "Otevřete fotoaparát pro video", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "Přidat do příběhu", - "@addToStory": {}, - "publish": "Uveřejnit", - "@publish": {}, - "whoCanSeeMyStories": "Kdo může vidět moje příběhy?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Odhlásit příběhy", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Tento uživatel zatím nic ve svém příběhu nezveřejnil", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Váš příběh", - "@yourStory": {}, - "replyHasBeenSent": "Odpověď byla odeslána", - "@replyHasBeenSent": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "Příběh z {date}:\n {body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Upozorňujeme, že lidé se ve vašem příběhu mohou navzájem vidět a kontaktovat.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Co se děje?", - "@whatIsGoingOn": {}, - "addDescription": "Přidat popis", - "@addDescription": {}, - "iUnderstand": "Rozumím", - "@iUnderstand": {}, - "markAsRead": "Označit jako přečtené", - "@markAsRead": {}, - "bubbleSize": "Velikost bubliny", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "reportUser": "Nahlásit uživatele", - "@reportUser": {}, - "openChat": "Otevřete chat", - "@openChat": {}, - "storyPrivacyWarning": "Upozorňujeme, že lidé se ve vašem příběhu mohou navzájem vidět a kontaktovat. Vaše příběhy budou viditelné po dobu 24 hodin, ale není zaručeno, že budou smazány ze všech zařízení a serverů.", - "@storyPrivacyWarning": {}, - "dismiss": "Zavrhnout", - "@dismiss": {}, - "matrixWidgets": "Matrix widgety", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Úpravy widgetů a integrace nejsou zatím možné.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Upravte widgety a integrace", - "@editIntegrations": {}, - "reactedWith": "{sender} reagoval s {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Emojis", - "@emojis": {}, - "voiceCall": "Hlasový hovor", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Nepodporovaná verze Androidu", - "@unsupportedAndroidVersion": {}, - "videoCallsBetaWarning": "Upozorňujeme, že videohovory jsou aktuálně ve verzi beta. Nemusí fungovat podle očekávání nebo fungovat vůbec na všech platformách.", - "@videoCallsBetaWarning": {}, - "placeCall": "Zavolejte", - "@placeCall": {}, - "emailOrUsername": "E-mail nebo uživatelské jméno", - "@emailOrUsername": {}, - "experimentalVideoCalls": "Experimentální videohovory", - "@experimentalVideoCalls": {}, - "unsupportedAndroidVersionLong": "Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "pinnedEventsError": "Při načítání připnutých zpráv došlo k chybě", - "@pinnedEventsError": {}, - "pinMessage": "Připnout zprávu do místnosti", - "@pinMessage": {}, - "confirmEventUnpin": "Opravdu chcete událost trvale odepnout?", - "@confirmEventUnpin": {}, - "separateChatTypes": "Odděĺlit přímé chaty, skupiny a prostory", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "youKicked": "Vykopli jste uživatele {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "switchToAccount": "Přepnout na účet {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "previousAccount": "Předchozí účet", - "@previousAccount": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "youAcceptedTheInvitation": "Přijal jsi pozvání", - "@youAcceptedTheInvitation": {}, - "showSpaces": "Zobrazit seznam prostorů", - "@showSpaces": {}, - "youJoinedTheChat": "Připojili jste se k chatu", - "@youJoinedTheChat": {}, - "youInvitedBy": "Byli jste pozváni uživatelem {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "nextAccount": "Další účet", - "@nextAccount": {}, - "editWidgets": "Upravit widgety", - "@editWidgets": {}, - "addWidget": "Přidat widget", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Textová poznámka", - "@widgetEtherpad": {}, - "widgetName": "Jméno", - "@widgetName": {}, - "youBannedUser": "Zakázali jste uživatele {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Pozvali jste uživatele {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Vykopli jste a zakázali jste uživatele {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Zrušili jste zákaz uživateli {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "showDirectChatsInSpaces": "Zobrazit související přímé chaty ve službě Spaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "widgetCustom": "Vlastní", - "@widgetCustom": {}, - "youRejectedTheInvitation": "Odmítli jste pozvání", - "@youRejectedTheInvitation": {}, - "youHaveWithdrawnTheInvitationFor": "Stáhli jste pozvánku pro uživatele {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "widgetUrlError": "Toto není platná adresa URL.", - "@widgetUrlError": {}, - "widgetNameError": "Zadejte jméno pro zobrazení.", - "@widgetNameError": {}, - "errorAddingWidget": "Chyba při přidávání widgetu.", - "@errorAddingWidget": {}, - "noEmailWarning": "Prosím zadejte platnou emailovou adresu. V opačném případě nebudete moci obnovit heslo. Pokud nechcete, pokračujte dalším klepnutím na tlačítko.", - "@noEmailWarning": {} -} diff --git a/assets/l10n/intl_de.arb b/assets/l10n/intl_de.arb deleted file mode 100644 index 0313abe0a5..0000000000 --- a/assets/l10n/intl_de.arb +++ /dev/null @@ -1,2864 +0,0 @@ -{ - "@@locale": "de", - "@@last_modified": "2021-08-14 12:41:10.119255", - "about": "Über", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Annehmen", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} hat die Einladung angenommen", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Konto", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Kontoinformationen", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} hat Ende-zu-Ende Verschlüsselung aktiviert", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "E-Mail hinzufügen", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Eine Beschreibung für die Gruppe hinzufügen", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Neuen Freund hinzufügen", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "Alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Alle", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Alle Chats", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Hast du schon ein Konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} hat den Anruf angenommen", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Jeder darf beitreten", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Anwendungssperre", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archivierter Raum", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Dürfen Gäste beitreten", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Bist du sicher?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Willst du dich wirklich abmelden?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Bitte gib dein Secure-Store Passwort oder Wiederherstellungsschlüssel ein, um die Keys zu cachen.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Bitte gib, um die andere Person signieren zu können, dein Sicherheitsschlüssel oder Wiederherstellungsschlüssel ein.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Bitte gib, um deine Session zu verifizieren, dein Secure-Store-Passwort oder Wiederherstellungsschlüssel ein.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Diese Bestätigungsanfrage von {username} annehmen?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Abspielen", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authentifizierung", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar wurde geändert", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Der Homeserver unterstützt diese Anmelde-Typen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Der Homeserver unterstützt die Spec-Versionen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Aus dem Chat verbannen", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Verbannt", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} hat {targetName} verbannt", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blockiere Gerät", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blockiert", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot-Nachrichten", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Schlüssel zwischengespeichert", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Abbrechen", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Die URI {uri} kann nicht geöffnet werden", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Gerätenamen ändern", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} hat den Chat-Avatar geändert", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} hat die Chat-Beschreibung geändert zu: „{description}“", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} hat den Chat-Namen geändert zu: „{chatname}“", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} hat die Chat-Berechtigungen geändert", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} hat den Nicknamen geändert zu: „{displayname}“", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} hat die Zugangsregeln für Gäste geändert", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} hat die Zugangsregeln für Gäste geändert zu: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} hat die Sichtbarkeit des Chat-Verlaufs geändert", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} hat die Sichtbarkeit des Chat-Verlaufs geändert zu: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} hat die Zugangsregeln geändert", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} hat die Zugangsregeln geändert zu: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} hat das Profilbild geändert", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} hat die Raum-Aliasse geändert", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} hat den Einladungslink geändert", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Protokoll der Änderungen", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Passwort ändern", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Änderungen wurden gespeichert", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Anderen Homeserver verwenden", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Ändere Deinen Style", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Gruppenname ändern", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Ändere den Server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Hintergrund ändern", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Deinen Avatar ändern", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Die Verschlüsselung wurde korrumpiert", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Chat-Backup", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Dein Chat-Backup ist mit einem Sicherheitsschlüssel gesichert. Bitte stelle sicher, dass du diesen nicht verlierst.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Gruppeninfo", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Chats", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Wähle ein sicheres Passwort", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Wähle einen Benutzernamen", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Archiv leeren", - "@clearArchive": {}, - "clearText": "Text löschen", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Schließen", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Verbanne den übergebenen Benutzer aus diesen Raum", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Sende HTML-formatierten Text", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Lade den Benutzer in diesen Raum ein", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Betrete den übergebenen Raum", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Entferne den übergebenen Benutzer aus diesem Raum", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Diesen Raum verlassen", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Beschreibe dich selbst", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Setze dein Profilbild nur für diesen Raum (MXC-Uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Setze deinen Anzeigenamen nur für diesen Raum", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Setze den übergeben Powerlevel des Benutzers (Standard: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Sende unformatierten Text", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Sende die Antwort als Reaction", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Text senden", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Hebe die Verbannung dieses Benutzers in diesem Raum auf", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Befehl ungültig", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} ist kein Befehl.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Vergleiche und stelle sicher, dass die folgenden Emoji mit denen des anderen Gerätes übereinstimmen:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Vergleiche und stelle sicher, dass die folgenden Zahlen mit denen des anderen Gerätes übereinstimmen:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Chat konfigurieren", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Bestätigen", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Verbinden", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Verbindungsversuch fehlgeschlagen", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt wurde in die Gruppe eingeladen", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Enthält Anzeigenamen", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Enthält Benutzernamen", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Der Inhalt wurde den Serveradministratoren gemeldet", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Content Viewer", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Wurde in die Zwischenablage kopiert", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopieren", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "In Zwischenablage kopieren", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nachricht konnte nicht entschlüsselt werden: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Profilbild konnte nicht gesetzt werden", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Anzeigename konnte nicht gesetzt werden", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} Mitglieder", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Erstellen", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Konto jetzt erstellen", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} hat den Chat erstellt", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Neue Gruppe", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Neuer Space", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Cross-Signing ist deaktiviert", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Cross-Signing ist aktiviert", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Jetzt gerade online", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Dunkel", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Dies deaktiviert dein Konto. Es kann nicht rückgängig gemacht werden! Bist du sicher?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Standardberechtigungsstufe", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Löschen", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Konto löschen", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Nachricht löschen", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Ablehnen", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Gerät", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Geräte-ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Geräte", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Die Verschlüsselung ist erst sicher, wenn alle Geräte verifiziert sind.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Direkte Chats", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Bild verwerfen", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Entdecken", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Gruppen entdecken", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Anzeigename wurde geändert", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Spenden", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Abbrechen und nicht erneut fragen", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Datei herunterladen", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Bearbeiten", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Blockierte Server einstellen", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Chatberechtigungen bearbeiten", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Anzeigename ändern", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Jitsi-Instanz ändern", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Raum-Aliase bearbeiten", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Raumavatar bearbeiten", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emoticon existiert bereits!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Ungültiges Emoticon-Kürzel!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emoticon-Bündel für Raum", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emoticon-Einstellungen", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emoticon-Kürzel", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Wähle ein Emoticon-Kürzel und ein Bild!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Leerer Chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Aktiviere das Chat-Backup, um niemals den Zugang zu deinen Nachrichten zu verlieren.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Aktiviere Emoticon-Bündel global", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Verschlüsselung anschalten", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Du wirst die Verschlüsselung nicht mehr ausstellen können. Bist Du sicher?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Verschlüsselt", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Verschlüsselung", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Verschlüsselungsalgorithmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Verschlüsselung ist nicht aktiviert", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Ende-zu-Ende-Verschlüsselung", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} hat den Anruf beendet", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Gib einen Gruppennamen ein", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Gib eine E-Mail-Adresse ein", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Namen für den Space eingeben", - "@enterASpacepName": {}, - "enterAUsername": "Gib einen Benutzernamen ein", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Gib Deinen Homeserver ein", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Fehler beim Suchen des Standortes: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Alles fertig!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extrem beleidigend", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Dateiname", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Dateigröße", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Schriftgröße", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Weiterleiten", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Freitag", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Freunde", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Ab dem Beitritt", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Ab der Einladung", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Zum neuen Raum wechseln", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Gruppe", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Gruppenbeschreibung", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Gruppenbeschreibung wurde geändert", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Öffentliche Gruppe", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Gruppen", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Gruppe mit {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gäste sind verboten", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gäste dürfen beitreten", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} hat die Einladung für {targetName} zurückgezogen", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Hilfe", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Gelöschte Nachrichten ausblenden", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Unbekannte Ereignisse ausblenden", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver ist nicht kompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Wie beleidigend ist dieser Inhalt?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identität", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorieren", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignorierte Personen", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Du kannst störende Personen ignorieren. Du bist dann nicht mehr in der Lage, Nachrichten oder Raumeinladungen von diesen zu erhalten.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignoriere Benutzername", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Ich habe den Link angeklickt", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Falsches Passwort oder Wiederherstellungsschlüssel", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Harmlos", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Ungültige E-Mail", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Kontakt einladen", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Kontakt in die Gruppe {groupName} einladen", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Eingeladen", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} hat {targetName} eingeladen", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Nur eingeladene Mitglieder", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Einladung für mich", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} hat Dich zu FluffyChat eingeladen. \n1. Installiere FluffyChat: https://fluffychat.im \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Ist der folgende Geräteschlüssel korrekt?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "schreibt …", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} ist dem Chat beigetreten", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Raum beitreten", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Keys sind gecached", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Keys fehlen", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} hat {targetName} hinausgeworfen", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} hat {targetName} hinausgeworfen und verbannt", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Aus dem Chat hinauswerfen", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Zuletzt aktiv: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Letzte bekannte IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vor sehr langer Zeit gesehen", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Verlassen", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Hat den Chat verlassen", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Lizenz", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Hell", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "{count} weitere Mitglieder laden", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Lade … Bitte warten.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Mehr laden …", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Standort ist deaktiviert. Bitte aktivieren, um den Standort teilen zu können.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Standort-Berechtigung wurde abgelehnt. Bitte akzeptieren, um den Standort teilen zu können.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Anmelden", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Bei {homeserver} anmelden", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Anmelden mit", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Abmelden", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Zum Moderator ernennen", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Zum Admin ernennen", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Gib bitte einen richtigen Benutzernamen ein", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Änderungen der Mitglieder", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Erwähnen", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Nachrichten", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Nachricht wird für alle Mitglieder entfernt", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Montag", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 weiteres Ereignis} other{{count} weitere Ereignisse}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Stummschalten", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Bitte beachte, dass du Pantalaimon brauchst, um Ende-zu-Ende-Verschlüsselung benutzen zu können.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Neuer Chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Neue Nachricht in FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Neue Verifikationsanfrage!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Weiter", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Nein", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Keine Verbindung zum Server", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat kann Cross-Signing noch nicht einschalten. Bitte schalte es innerhalb von Element an.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Keine Beschreibung", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Keine Emoticons gefunden. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Du kannst die Verschlüsselung erst aktivieren, sobald dieser Raum nicht mehr öffentlich zugänglich ist.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Es sieht so aus, als hättest du keine Google-Dienste auf deinem Gerät. Das ist eine gute Entscheidung für deine Privatsphäre! Um Push-Benachrichtigungen in FluffyChat zu erhalten, empfehlen wir die Verwendung von microG https://microg.org/ oder Unified Push https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "FluffyChat kann die Online-Schlüsselsicherung noch nicht aktivieren. Bitte schalte es innerhalb von Element an.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Keiner", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Du hast bisher keine Möglichkeit hinzugefügt, um dein Passwort zurückzusetzen.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Keine Berechtigung", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Keine öffentlichen Räume gefunden …", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Keine Räume gefunden …", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Keine Einträge gefunden.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Benachrichtigungen", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Benachrichtigungen für dieses Konto aktiviert", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Wird in der Web-Version nicht unterstützt", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} ausgewählt", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} Mitglieder schreiben …", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Standort wird ermittelt …", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Beleidigend", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online-Schlüsselsicherung ist deaktiviert", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online-Schlüsselsicherung ist aktiviert", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Hoppla! Leider ist beim Einrichten der Push-Benachrichtigungen ein Fehler aufgetreten.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Hoppla! Etwas ist schief gelaufen…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "App öffnen, um Nachrichten zu lesen", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Kamera öffnen", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "In Maps öffnen", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Optional) Ihre E-Mail-Adresse", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optional) Name für die Gruppe", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Oder", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Mitglieder", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Teilnehmende Geräte", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "Passwort oder Wiederherstellungsschlüssel", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Passwort", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Passwort vergessen", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Passwort wurde geändert", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Passwort wiederherstellen", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Personen", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Bild wählen", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Anpinnen", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "{fileName} abspielen", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Bitte wählen", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Bitte einen Code festlegen", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Bitte wähle einen Benutzernamen", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Bitte auf den Link in der E-Mail klicken und dann fortfahren.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Bitte 4 Ziffern eingeben oder leer lassen, um die Anwendungssperre zu deaktivieren.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Bitte eine Matrix-ID eingeben.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Bitte Sicherheitsschlüssel eingeben:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Bitte dein Passwort eingeben", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Bitte gib deine Pin ein", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Bitte deinen Benutzernamen eingeben", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Bitte folge den Anweisungen auf der Website und tippe auf Weiter.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privatsphäre", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Öffentliche Gruppen", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Öffentlicher Schlüssel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Öffentliche Räume", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Öffentlicher Space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Push-Regeln", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Grund", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Aufnahme", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} hat ein Ereignis entfernt", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Nachricht löschen", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registrieren", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Ablehnen", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} hat die Einladung abgelehnt", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Wieder beitreten", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Entfernen", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Alle anderen Geräte entfernen", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Entfernt von {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Gerät entfernen", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Verbannung aufheben", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Nachricht entfernen", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Deinen Avatar löschen", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Zeige Nachrichtenformatierungen an", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Raum mit neuer Version ersetzen", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Antworten", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Nachricht melden", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Berechtigung anfragen", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Anfrage um ältere Nachrichten zu lesen", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Alle Berechtigungen zurücknehmen", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Der Raum wurde ge-upgraded", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Raumversion", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Samstag", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Datei gespeichert als {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Datei speichern", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Datei in diesem Ordner speichern", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Suchen", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Chat suchen", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Sicherheit", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Sicherheitsschlüssel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Sicherheitsschlüssel verloren?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Gelesen von {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Gelesen von {username} und {count} anderen}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Gelesen von {username} und {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Senden", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Nachricht schreiben", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Sende als Text", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Sende Audiodatei", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Erlaube das Senden von Fehlermeldungen via sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Datei senden", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Bild senden", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Nachrichten senden", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Sende Original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Sticker senden", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Sende Video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} hat eine Datei gesendet", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} hat eine Audio-Datei gesendet", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} hat ein Bild gesendet", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} hat einen Sticker gesendet", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} hat ein Video gesendet", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} hat Anrufinformationen geschickt", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Information über deine Privatsphäre: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sitzung ist verifiziert", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Ein Profilbild festlegen", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Als Haupt-Alias festlegen", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Eigene Emoticons einstellen", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Gruppenbeschreibung festlegen", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Einladungslink festlegen", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Berechtigungsstufe einstellen", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Status ändern", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Einstellungen", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Teilen", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} hat den Standort geteilt", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Standort teilen", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Passwort anzeigen", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registrieren", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Einmalige Anmeldung", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Überspringe", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Ton, Vibration, LED-Farbe", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Quellcode", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Space ist öffentlich", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Space-Name", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} hat einen Anruf getätigt", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Starte jetzt deinen ersten Chat! 🙂\n- Tippe auf Nachrichten-Button\n- Gib einen Benutzernamen ein\n- Viel Spaß beim Chatten", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Wie geht es dir heute?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Absenden", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Sonntag", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchronisiere... Bitte warten.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "System", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Auf Gerät tippen zum Verifizieren", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Antippen, um das Bild anzuzeigen", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tippen, um das Menü anzuzeigen", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Stimmen nicht überein", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Stimmen überein", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Dieser Raum wurde archiviert.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Donnerstag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Favorite umschalten", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Stummgeschaltete umschalten", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Markieren als gelesen/ungelesen", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Zu viele Anfragen. Bitte versuche es später noch einmal!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Von anderem Gerät übertragen", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Nochmal versuchen zu senden", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Dienstag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nicht verfügbar", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} hat die Verbannung von {targetName} aufgehoben", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Geräteblockierung aufheben", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Unbekanntes Gerät", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Unbekannter Verschlüsselungsalgorithmus", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Unbekanntes Ereignis „{type}“", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Unbekannte Sitzung, bitte verifiziere diese", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Chat-Backup entsperren", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Stumm aus", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Abpinnen", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 ungelesene Unterhaltung} other{{unreadCount} ungelesene Unterhaltungen}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 ungelesene Nachricht} other{{unreadEvents} ungelesene Nachrichten}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED-optimierte Farben verwenden?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} und {count} andere schreiben …", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} und {username2} schreiben …", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} schreibt …", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} hat den Chat verlassen", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Benutzername", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Mitglied ist nicht verifiziert", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} hat ein {type}-Ereignis gesendet", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Mitglied hat einen unbekannten Verifikationsstatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Mitglied ist verifiziert", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Verifiziert", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sitzung erfolgreich verifiziert!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Bestätigen", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifiziere manuell", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Starte Verifikation", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Erfolgreich verifiziert!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Anderes Konto wird verifiziert", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifiziere Mitglied", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videoanruf", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Sichtbarkeit des Chat-Verlaufs", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Sichtbar für alle Mitglieder", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Für jeden sichtbar", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Sprachnachricht", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Warte darauf, dass der Partner die Anfrage annimmt …", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Warte darauf, dass der Partner die Emoji annimmt …", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Warten, dass der Partner die Zahlen annimmt …", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Hintergrund", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Achtung!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Ende-zu-Ende-Verschlüsselung ist im Beta-Status. Benutzung auf eigene Gefahr!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Mittwoch", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Herzlich willkommen beim knuffigsten Instant-Messenger im Matrix-Netzwerk.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Wir haben dir eine E-Mail gesendet", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Wer kann welche Aktion ausführen", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Wer darf der Gruppe beitreten", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Warum willst du dies melden?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Chat-Backup löschen, um neuen Sicherheitsschlüssel zu erstellen?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Mit diesen Adressen kannst du dein Passwort wiederherstellen, wenn du es vergessen hast.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Schreibe eine Nachricht …", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Ja", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Du", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Du wurdest in diesen Chat eingeladen", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Du bist kein Mitglied mehr in diesem Chat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Du kannst dich nicht selbst einladen", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Du wurdest aus dem Chat verbannt", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Deine Chats werden synchronisiert …", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Dein eigener Benutzername", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Dein öffentlicher Schlüssel", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Du wirst mit {homeserver} verbunden", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Vergrößern", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Verkleinern", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} ist kein Matrix-Server, stattdessen {server2} benutzen?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "scanQrCode": "QR-Code scannen", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Einladungslink manuell eingeben ...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Teile deinen Einladungslink", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Einfach den QR-Code scannen oder teile deinen Einladungslink, falls ihr nicht nebeneinander steht.", - "@createNewChatExplaination": {}, - "chatHasBeenRemovedFromThisSpace": "Chat wurde aus dem Weltraum entfernt", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat wurde zum Space hinzugefügt", - "@chatHasBeenAddedToThisSpace": {}, - "autoplayImages": "Animierte Sticker und Emotes automatisch abspielen", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "addToSpace": "Zum Space hinzufügen", - "@addToSpace": {}, - "serverRequiresEmail": "Dieser Server muss deine E-Mail-Adresse für die Registrierung überprüfen.", - "@serverRequiresEmail": {}, - "enableMultiAccounts": "(BETA) Aktiviere Multi-Accounts für dieses Gerät", - "@enableMultiAccounts": {}, - "bundleName": "Name des Bundles", - "@bundleName": {}, - "removeFromBundle": "Von diesem Bundle entfernen", - "@removeFromBundle": {}, - "addToBundle": "Zu einem Bundle hinzufügen", - "@addToBundle": {}, - "editBundlesForAccount": "Bundles für dieses Konto bearbeiten", - "@editBundlesForAccount": {}, - "addAccount": "Konto hinzufügen", - "@addAccount": {}, - "oneClientLoggedOut": "Einer deiner Clients wurde abgemeldet", - "@oneClientLoggedOut": {}, - "newUsernameDescription": "Deine User-ID wird das Format @username:servername haben", - "@newUsernameDescription": {}, - "newPasswordDescription": "Um dein Passwort wiederherstellen zu können, füge später bitte eine E-Mail-Adresse zu deinem Konto hinzu.", - "@newPasswordDescription": {}, - "homeserver": "Homeserver", - "@homeserver": {}, - "sendOnEnter": "Senden mit Enter", - "@sendOnEnter": {}, - "link": "Link", - "@link": {}, - "setupChatBackup": "Chat-Backup einrichten", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Ich habe den Schlüssel aufgeschrieben", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Dein Chat-Backup wurde eingerichtet.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Um deine Nachrichten zu schützen, haben wir einen Sicherheitsschlüssel für dich generiert.\nBewahre ihn bitte an einem sicheren Ort auf, wie zum Beispiel einem Passwort-Manager.", - "@setupChatBackupDescription": {}, - "unverified": "Unverifiziert", - "@unverified": {}, - "yourUserId": "Deine Benutzer-ID:", - "@yourUserId": {}, - "messageInfo": "Nachrichten-Info", - "@messageInfo": {}, - "time": "Zeit", - "@time": {}, - "messageType": "Nachrichtentyp", - "@messageType": {}, - "sender": "Absender:in", - "@sender": {}, - "openGallery": "Galerie öffnen", - "@openGallery": {}, - "removeFromSpace": "Aus dem Space entfernen", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Dadurch wird dieser Chat aus dem aktuellen Space entfernt. Er ist dann weiterhin unter \"Alle Chats\" sichtbar.", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Wähle einen Space aus, um diesen Chat hinzuzufügen.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Anmelden mit einem Klick", - "@loginWithOneClick": {}, - "start": "Start", - "@start": {}, - "setupChatBackupNow": "Richte jetzt ein Chat-Backup ein", - "@setupChatBackupNow": {}, - "passwordsDoNotMatch": "Passwörter stimmen nicht überein!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Bitte gib eine gültige E-Mail-Adresse ein.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Passwort wiederholen", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Bitte wähle mindestens {min} Zeichen.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "pleaseEnterSecurityKeyDescription": "Um deinen Chat-Backup zu entsperren, gib bitte deinen Sicherheitsschlüssel ein, der in einer früheren Sitzung generiert wurde. Der Sicherheitsschlüssel ist NICHT dein Passwort.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Jetzt Sicherheitsschlüssel speichern", - "@saveTheSecurityKeyNow": {}, - "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption um die Verschlüsselung auszuschalten", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_discardsession": "Sitzung verwerfen", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_clearcache": "Zwischenspeicher löschen", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Erstelle ein leeren Gruppenchat\nBenutze --no-encryption um die Verschlüsselung auszuschalten", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "yourStory": "Deine Story", - "@yourStory": {}, - "replyHasBeenSent": "Antwort wurde gesendet", - "@replyHasBeenSent": {}, - "storyFrom": "Story von {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "openVideoCamera": "Video aufnehmen", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "whoCanSeeMyStoriesDesc": "Bitte beachte, dass sich Leute in deiner Story sehen und kontaktieren können.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Story hinzufügen", - "@addToStory": {}, - "publish": "Veröffentlichen", - "@publish": {}, - "whoCanSeeMyStories": "Wer kann meine Storys sehen?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Story deabbonieren", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Dieses Mitglied hat noch keine Story gepostet", - "@thisUserHasNotPostedAnythingYet": {}, - "whatIsGoingOn": "Was gibt es neues?", - "@whatIsGoingOn": {}, - "addDescription": "Beschreibung hinzufügen", - "@addDescription": {}, - "storyPrivacyWarning": "Bitte beachte, dass sich die Leute in deiner Story sehen und kontaktieren können. Ihre Stories sind 24 Stunden lang sichtbar, aber es gibt keine Garantie dafür, dass sie von allen Geräten und Servern gelöscht werden.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Ich habe verstanden", - "@iUnderstand": {}, - "bubbleSize": "Sprechblasengröße", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "pinMessage": "An Raum anheften", - "@pinMessage": {}, - "pinnedEventsError": "Angeheftete Nachrichten nicht gefunden", - "@pinnedEventsError": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Anruf tätigen", - "@placeCall": {}, - "voiceCall": "Sprachanruf", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Nicht unterstützte Android-Version", - "@unsupportedAndroidVersion": {}, - "videoCallsBetaWarning": "Bitte beachte, dass sich Videoanrufe derzeit in der Beta-Phase befinden. Sie funktionieren möglicherweise nicht wie erwartet oder überhaupt nicht auf allen Plattformen.", - "@videoCallsBetaWarning": {}, - "emailOrUsername": "E-Mail oder Benutzername", - "@emailOrUsername": {}, - "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder Lineage OS-Unterstützung.", - "@unsupportedAndroidVersionLong": {}, - "experimentalVideoCalls": "Experimentelle Videoanrufe", - "@experimentalVideoCalls": {}, - "matrixWidgets": "Matrix-Widgets", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Das Bearbeiten von Widgets und Integrationen ist noch nicht möglich.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Bearbeiten Sie Widgets und Integrationen", - "@editIntegrations": {}, - "reactedWith": "{sender} reagierte mit {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "markAsRead": "Als gelesen markiert", - "@markAsRead": {}, - "reportUser": "Benutzer melden", - "@reportUser": {}, - "openChat": "Chat öffnen", - "@openChat": {}, - "confirmEventUnpin": "Möchtest du das Ereignis wirklich dauerhaft lösen?", - "@confirmEventUnpin": {}, - "dismiss": "Verwerfen", - "@dismiss": {}, - "switchToAccount": "Zum Account {number} wechseln", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Nächster Account", - "@nextAccount": {}, - "editWidgets": "Widgets bearbeiten", - "@editWidgets": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Angepasst", - "@widgetCustom": {}, - "widgetEtherpad": "Textnotiz", - "@widgetEtherpad": {}, - "addWidget": "Widget hinzufügen", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetName": "Name", - "@widgetName": {}, - "widgetUrlError": "Das ist keine gültige URL.", - "@widgetUrlError": {}, - "errorAddingWidget": "Fehler beim Hinzufügen des Widgets.", - "@errorAddingWidget": {}, - "previousAccount": "Vorheriger Account", - "@previousAccount": {}, - "separateChatTypes": "Separate Direktchats, Gruppen und Spaces", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showSpaces": "Bereichsliste anzeigen", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Zugehörige Direkt-Chats in Spaces anzeigen", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "widgetNameError": "Bitte gib einen Anzeigenamen an.", - "@widgetNameError": {}, - "youKicked": "Du hast {user} rausgeworfen", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Du hast {user} rausgeworfen und verbannt", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Du hast die Verbannung von {user} rückgängig gemacht", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youRejectedTheInvitation": "Du hast die Einladung abgelehnt", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "Du bist dem Chat beigetreten", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Du hast die Einladung angenommen", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "Du hast den {user} verbannt", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Du hast die Einladung für {user} zurückgezogen", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "Du wurdest von {user} eingeladen", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Du hast {user} eingeladen", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "noEmailWarning": "Bitte gib eine gültige E-Mail-Adresse ein. Andernfalls kannst du dein Passwort nicht zurücksetzen. Wenn du das nicht möchtest, tippe erneut auf die Schaltfläche, um fortzufahren.", - "@noEmailWarning": {} -} diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb deleted file mode 100644 index 8474b178f8..0000000000 --- a/assets/l10n/intl_en.arb +++ /dev/null @@ -1,2854 +0,0 @@ -{ - "@@locale": "en", - "@@last_modified": "2021-08-14 12:38:37.885451", - "passwordsDoNotMatch": "Passwords do not match!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Please enter a valid email address.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Repeat password", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Please choose at least {min} characters.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "about": "About", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Accept", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} accepted the invitation", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Account", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Account information", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} activated end to end encryption", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Add email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Add a group description", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Add new friend", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Add to space", - "@addToSpace": {}, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "All", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "All chats", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Already have an account?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} answered the call", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Anyone can join", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "App lock", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archive", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archived Room", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Are guest users allowed to join", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Are you sure?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Are you sure you want to log out?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "To be able to sign the other person, please enter your secure store passphrase or recovery key.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Please enter your secure store passphrase or recovery key to verify your session.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Accept this verification request from {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Play", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authentication", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatically play animated stickers and emotes", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar changed", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "Send on enter", - "@sendOnEnter": {}, - "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Ban from chat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Banned", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} banned {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Block Device", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blocked", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot messages", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "bubbleSize": "Bubble size", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Keys cached", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancel", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Can't open the URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Change device name", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} changed the chat avatar", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} changed the chat description to: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} changed the chat name to: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} changed the chat permissions", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} changed their displayname to: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} changed the guest access rules", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} changed the guest access rules to: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} changed the history visibility", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} changed the history visibility to: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} changed the join rules", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} changed the join rules to: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} changed their avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} changed the room aliases", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} changed the invitation link", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Changelog", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Change password", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Changes have been saved", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Change the homeserver", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Change your style", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Change the name of the group", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Change the server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Change wallpaper", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Change your avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "The encryption has been corrupted", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Your user ID:", - "@yourUserId": {}, - "iWroteDownTheKey": "I wrote down the key", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Your chat backup has been set up.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "Chat backup", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "setupChatBackupDescription": "To protect your messages, we have generated a recovery key for you.\nPlease keep this in a safe place, such as a password manager.", - "@setupChatBackupDescription": {}, - "chatBackupDescription": "Your old messages are secured with a recovery key. Please make sure you don't lose it.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Chat details", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat has been added to this space", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Chat has been removed from this space", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "Chats", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Choose a strong password", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Choose a username", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Clear archive", - "@clearArchive": {}, - "clearText": "Clear text", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Close", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Ban the given user from this room", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "Clear cache", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Create an empty group chat\nUse --no-encryption to disable encryption", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Discard session", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Start a direct chat\nUse --no-encryption to disable encryption", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_html": "Send HTML-formatted text", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Invite the given user to this room", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Join the given room", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Remove the given user from this room", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Leave this room", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Describe yourself", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Set your picture for this room (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Set your display name for this room", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Set the given user's power level (default: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Send unformatted text", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Send reply as a reaction", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Send text", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Unban the given user from this room", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Command invalid", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} is not a command.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Compare and make sure the following emoji match those of the other device:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Compare and make sure the following numbers match those of the other device:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configure chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirm", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Connect", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Connection attempt failed", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Contains display name", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contains username", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "The content has been reported to the server admins", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Content viewer", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copied to clipboard", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copy", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copy to clipboard", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Could not decrypt message: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Could not set avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Could not set displayname", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participants", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Create", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Create account now", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} created the chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Create new group", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "New space", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Cross-signing off", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Cross-signing on", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Currently active", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Dark", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "This will deactivate your user account. This can not be undone! Are you sure?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Default permission level", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Delete", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Delete account", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Delete message", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Deny", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Device", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Device ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Devices", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "The encryption is only secure when all devices have been verified.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Direct Chats", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Discard picture", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Discover", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Discover groups", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Displayname has been changed", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Donate", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancel and don't ask again", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Download file", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Edit", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Edit blocked servers", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Edit chat permissions", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Edit displayname", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Edit Jitsi instance", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Edit room aliases", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Edit room avatar", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emote already exists!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Invalid emote shortcode!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emote packs for room", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emote Settings", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emote shortcode", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "You need to pick an emote shortcode and an image!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Empty chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Enable the chat backup to never lose access to your chats.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Enable emote pack globally", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Enable encryption", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "You won't be able to disable the encryption anymore. Are you sure?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Encrypted", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Encryption", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Encryption algorithm", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Encryption is not enabled", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "End-to-end encryption settings", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} ended the call", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Enter a group name", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Enter an email address", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Enter a space name", - "@enterASpacepName": {}, - "enterAUsername": "Enter a username", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Homeserver", - "@homeserver": {}, - "enterYourHomeserver": "Enter your homeserver", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Error obtaining location: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Everything ready!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremely offensive", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "File name", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "File size", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Font size", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Forward", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Friday", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Friends", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "From joining", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "From the invitation", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Go to the new room", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Group", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Group description", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Group description changed", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Group is public", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Groups", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Group with {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Guests are forbidden", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Guests can join", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} has withdrawn the invitation for {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Help", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Hide redacted events", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Hide unknown events", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver is not compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "How offensive is this content?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identity", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignore", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignored users", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "You can ignore users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal ignore list.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignore username", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "I have clicked on the link", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Incorrect passphrase or recovery key", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Inoffensive", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Invalid email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Invite contact", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Invite contact to {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Invited", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} invited {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Invited users only", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Invite for me", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} invited you to FluffyChat. \n1. Install FluffyChat: https://fluffychat.im \n2. Sign up or sign in \n3. Open the invite link: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Is the following device key correct?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "is typing…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} joined the chat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Join room", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Keys are cached", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Keys are missing", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} kicked {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} kicked and banned {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Kick from chat", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Last active: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Last seen IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Seen a long time ago", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Leave", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Left the chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "License", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Light", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Load {count} more participants", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Loading… Please wait.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "showSpaces": "Show spaces list", - "@showSpaces": {}, - "loadMore": "Load more…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Location services are disabled. Please enable them to be able to share your location.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Location permission denied. Please grant them to be able to share your location.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Login", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Log in to {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWithOneClick": "Sign in with one click", - "@loginWithOneClick": {}, - "logout": "Logout", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Make a moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Make an admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Make sure the identifier is valid", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Member changes", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Mention", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Messages", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Message will be removed for all participants", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Monday", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 more event} other{{count} more events}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Mute chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Please be aware that you need Pantalaimon to use end-to-end encryption for now.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "New chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "New message in FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "New verification request!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "No", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "No connection to the server", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat currently does not support enabling Cross-Signing. Please enable it from within Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "No description", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "No emotes found. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "You can only activate encryption as soon as the room is no longer publicly accessible.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "It seems that you have no google services on your phone. That's a good decision for your privacy! To receive push notifications in FluffyChat we recommend using https://microg.org/ or https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} is no matrix server, use {server2} instead?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "createNewChatExplaination": "Just scan the QR code or share your invite link if you are not next to each other.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Share your invite link", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Type in invite link manually...", - "@typeInInviteLinkManually": {}, - "scanQrCode": "Scan QR code", - "@scanQrCode": {}, - "noMegolmBootstrap": "Please turn on online key backup from within Element instead.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "None", - "@none": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "In order to be able to recover your password, you should later add an email address to your account.", - "@newPasswordDescription": {}, - "newUsernameDescription": "Your user ID will then have the format @username:servername", - "@newUsernameDescription": {}, - "noPasswordRecoveryDescription": "You have not added a way to recover your password yet.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "No permission", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "No public rooms found…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "No rooms found…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "No statuses found so far.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notifications", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notifications enabled for this account", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Not supported in web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selected", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} users are typing…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Obtaining location…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Offensive", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online Key Backup is disabled", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online Key Backup is enabled", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oops! Unfortunately, an error occurred when setting up the push notifications.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oops, something went wrong…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Open app to read messages", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Open camera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openVideoCamera": "Open camera for a video", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "One of your clients has been logged out", - "@oneClientLoggedOut": {}, - "addAccount": "Add account", - "@addAccount": {}, - "editBundlesForAccount": "Edit bundles for this account", - "@editBundlesForAccount": {}, - "addToBundle": "Add to bundle", - "@addToBundle": {}, - "removeFromBundle": "Remove from this bundle", - "@removeFromBundle": {}, - "bundleName": "Bundle name", - "@bundleName": {}, - "enableMultiAccounts": "(BETA) Enable multi accounts on this device", - "@enableMultiAccounts": {}, - "openInMaps": "Open in maps", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "link": "Link", - "@link": {}, - "serverRequiresEmail": "This server needs to validate your email address for registration.", - "@serverRequiresEmail": {}, - "optionalGroupName": "(Optional) Group name", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Or", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Participant", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Participating user devices", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "passphrase or recovery key", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Password", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Password forgotten", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Password has been changed", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Password recovery", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "People", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Pick an image", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Pin", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Play {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Please choose", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Please choose a pass code", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Please choose a username", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Please click on the link in the email and then proceed.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Please enter 4 digits or leave empty to disable app lock.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Please enter a Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterRecoveryKey": "Please enter your recovery key:", - "@pleaseEnterRecoveryKey": {}, - "pleaseEnterYourPassword": "Please enter your password", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Please enter your pin", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Please enter your username", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Please follow the instructions on the website and tap on next.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacy", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Public Groups", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Public Key", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Public Rooms", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Public space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Push rules", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Reason", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Recording", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} redacted an event", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Redact message", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Register", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Reject", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} rejected the invitation", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Rejoin", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Remove", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Remove all other devices", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Removed by {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Remove device", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Unban from chat", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Remove message", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Remove your avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Render rich message content", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Replace room with newer version", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Reply", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Report message", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Request permission", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Request to read older messages", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revoke all permissions", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Room has been upgraded", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Room version", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Saturday", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Saved file as {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Save file", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Save file to this folder", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Search", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Search for a chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Security", - "@security": { - "type": "text", - "placeholders": {} - }, - "recoveryKey": "Recovery key", - "@recoveryKey": {}, - "recoveryKeyLost": "Recovery key lost?", - "@recoveryKeyLost": {}, - "seenByUser": "Seen by {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Seen by {username} and {count} others}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Seen by {username} and {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Send", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Send a message", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Send as text", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Send audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Allow sending bug reports with sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Send file", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Send image", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Send messages", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Send original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Send sticker", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Send video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} sent a file", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} sent an audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} sent a picture", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} sent a sticker", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} sent a video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} sent call information", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Information about your privacy: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Session is verified", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "separateChatTypes": "Separate Direct Chats, Groups, and Spaces", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Set a profile picture", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Set as main alias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Set custom emotes", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Set group description", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Set invitation link", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Set permissions level", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Set status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Settings", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Share", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} shared their location", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Share location", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Show related Direct Chats in Spaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Show password", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Sign up", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Single Sign on", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Skip", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Sound, vibration LED-color", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Source code", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Space is public", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Space name", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} started a call", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Start your first chat right now! 🙂\n- Tap on 'New chat'\n- Scan the QR code of a friend\n- Have fun chatting", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "How are you today?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Submit", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Sunday", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchronizing… Please wait.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "System", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tap on a device to verifiy", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tap to show image", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tap to show menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "They Don't Match", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "They Match", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "This room has been archived.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Thursday", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Toggle Favorite", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Toggle Muted", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Mark Read/Unread", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Too many requests. Please try again later!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transfer from another device", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Try to send again", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Tuesday", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Unavailable", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} unbanned {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Unblock Device", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Unknown device", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Unknown encryption algorithm", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Unknown event '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Unknown session, please verify", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Unlock chat backup", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Unmute chat", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Unpin", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} unread messages}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Use AMOLED compatible colors?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} and {count} others are typing…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} and {username2} are typing…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} is typing…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} left the chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Username", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "User is not verified", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} sent a {type} event", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "User has an unknown verification status", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "User is verified", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "Unverified", - "@unverified": {}, - "verified": "Verified", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Successfully verified session!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verify", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verify Manually", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Start Verification", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "You successfully verified!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verifying other account", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verify User", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Video call", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibility of the chat history", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible for all participants", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visible for everyone", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Voice message", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Waiting for partner to accept the request…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Waiting for partner to accept the emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Waiting for partner to accept the numbers…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Wallpaper", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Warning!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "End to end encryption is currently in Beta! Use at your own risk!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Wednesday", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Welcome to the cutest instant messenger in the Matrix network.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "We sent you an email", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Who can perform which action", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Who is allowed to join this group", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Why do you want to report this?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Wipe your chat backup to create a new recovery key?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "With these addresses you can recover your password.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Write a message…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Yes", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "You", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "You are invited to this chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "You are no longer participating in this chat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "You cannot invite yourself", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "You have been banned from this chat", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Your chats are being synced…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Your own username", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Your public key", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "You will be connected to {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Zoom in", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Zoom out", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "messageInfo": "Message info", - "@messageInfo": {}, - "time": "Time", - "@time": {}, - "messageType": "Message Type", - "@messageType": {}, - "sender": "Sender", - "@sender": {}, - "openGallery": "Open gallery", - "@openGallery": {}, - "removeFromSpace": "Remove from space", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "This removes this chat from the current space. It will then still be visible under \"All chats\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Select a space to add this chat to it.", - "@addToSpaceDescription": {}, - "start": "Start", - "@start": {}, - "setupChatBackupNow": "Set up your chat backup now", - "@setupChatBackupNow": {}, - "pleaseEnterRecoveryKeyDescription": "To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.", - "@pleaseEnterRecoveryKeyDescription": {}, - "saveTheRecoveryKeyNow": "Save the recovery key now", - "@saveTheRecoveryKeyNow": {}, - "addToStory": "Add to story", - "@addToStory": {}, - "publish": "Publish", - "@publish": {}, - "whoCanSeeMyStories": "Who can see my stories?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Unsubscribe stories", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "This user has not posted anything in their story yet", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Your story", - "@yourStory": {}, - "replyHasBeenSent": "Reply has been sent", - "@replyHasBeenSent": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "Story from {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Please note that people can see and contact each other in your story.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "What is going on?", - "@whatIsGoingOn": {}, - "addDescription": "Add description", - "@addDescription": {}, - "storyPrivacyWarning": "Please note that people can see and contact each other in your story. Your stories will be visible for 24 hours but there is no guarantee that they will be deleted from all devices and servers.", - "@storyPrivacyWarning": {}, - "iUnderstand": "I understand", - "@iUnderstand": {}, - "openChat": "Open Chat", - "@openChat": {}, - "markAsRead": "Mark as read", - "@markAsRead": {}, - "reportUser": "Report user", - "@reportUser": {}, - "dismiss": "Dismiss", - "@dismiss": {}, - "matrixWidgets": "Matrix Widgets", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Editing widgets and integrations is not possible yet.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Edit widgets and integrations", - "@editIntegrations": {}, - "reactedWith": "{sender} reacted with {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "pinMessage": "Pin to room", - "@pinMessage": {}, - "pinnedEventsError": "Error loading pinned messages", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Are you sure to permanently unpin the event?", - "@confirmEventUnpin": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Place call", - "@placeCall": {}, - "voiceCall": "Voice call", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Unsupported Android version", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "This feature requires a newer Android version. Please check for updates or Lineage OS support.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Experimental video calls", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Email or username", - "@emailOrUsername": {}, - "switchToAccount": "Switch to account {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Next account", - "@nextAccount": {}, - "previousAccount": "Previous account", - "@previousAccount": {}, - "editWidgets": "Edit widgets", - "@editWidgets": {}, - "addWidget": "Add widget", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Text note", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Custom", - "@widgetCustom": {}, - "widgetName": "Name", - "@widgetName": {}, - "widgetUrlError": "This is not a valid URL.", - "@widgetUrlError": {}, - "widgetNameError": "Please provide a display name.", - "@widgetNameError": {}, - "errorAddingWidget": "Error adding the widget.", - "@errorAddingWidget": {}, - "youRejectedTheInvitation": "You rejected the invitation", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "You joined the chat", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "You accepted the invitation", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "You banned {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "You have withdrawn the invitation for {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "You have been invited by {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "You invited {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "You kicked {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "You kicked and banned {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "You unbanned {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "noEmailWarning": "Please enter a valid email address. Otherwise you won't be able to reset your password. If you don't want to, tap again on the button to continue.", - "@noEmailWarning": {}, - "stories": "Stories", - "@stories": {}, - "users": "Users", - "@users": {}, - "enableAutoBackups": "Enable auto backups", - "@enableAutoBackups": {}, - "unlockOldMessages": "Unlock old messages", - "@unlockOldMessages": {}, - "storeInSecureStorageDescription": "Store the recovery key in the secure storage of this device.", - "@storeInSecureStorageDescription": {}, - "saveKeyManuallyDescription": "Save this key manually by triggering the system share dialog or clipboard.", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "Store in Android KeyStore", - "@storeInAndroidKeystore": {}, - "storeInAppleKeyChain": "Store in Apple KeyChain", - "@storeInAppleKeyChain": {}, - "storeSecurlyOnThisDevice": "Store securely on this device", - "@storeSecurlyOnThisDevice": {} -} diff --git a/assets/l10n/intl_eo.arb b/assets/l10n/intl_eo.arb deleted file mode 100644 index eb14f24401..0000000000 --- a/assets/l10n/intl_eo.arb +++ /dev/null @@ -1,2561 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:10.107750", - "about": "Prio", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Akcepti", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} akceptis la inviton", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Konto", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informoj pri konto", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktivigis tutvojan ĉifradon", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Aldoni retpoŝtadreson", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Aldoni priskribon de grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Aldoni novan amikon", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Administranto", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "kromnomo", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Ĉio", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Ĉiuj babiloj", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Ĉu vi jam havas konton?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} respondis la vokon", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Ĉiu ajn povas aliĝi", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Ŝlosado", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arĥivo", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arĥivita ĉambro", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Ĉu gastoj rajtas aliĝi", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ĉu vi certas?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Ĉu vi certe volas adiaŭi?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Bonvolu enigi pasfrazon de via sekura deponejo aŭ rehavan ŝlosilon por kaŝmemori la ŝlosilojn.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Por ke vi povu kontroli (subskribi) la alian personon, bonvolu enigi pasfrazon de via sekreta deponejo aŭ vian rehavan ŝlosilon.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Bonvolu enigi pasfrazon de via sekura deponejo aŭ vian rehavan ŝlosilon por kontroli vian salutaĵon.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Ĉu akcepti ĉi tiun kontrolpeton de {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Paŭzigi", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Ludi", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Aŭtentikigo", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Profilbildo ŝanĝiĝis", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "La hejmservilo subtenas la jenajn specojn de salutoj:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "La hejmservilo subtenas la jenajn version de la specifaĵo:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Forbari de babilo", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Forbarita", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} forbaris uzanton {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloki aparaton", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blokita", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Mesaĝoj de robotoj", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Kaŝmemoris ŝlosilojn", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Nuligi", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Ne povis malfermi URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Ŝanĝi nomon de aparato", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ŝanĝis bildon de la babilo", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} ŝanĝis priskribon de la babilo al: «{description}»", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} ŝanĝis nomon de la babilo al: «{chatname}»", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} ŝanĝis permesojn pri la babilo", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} ŝanĝis sian prezentan nomon al: {username}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} ŝanĝis regulojn pri aliro de gastoj", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} ŝanĝis regulojn pri aliro de gastoj al: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} ŝanĝis videblecon de la historio", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} ŝanĝis videblecon de la historio al: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} ŝanĝis regulojn pri aliĝado", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} ŝanĝis regulojn pri aliĝado al: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} ŝanĝis sian profilbildon", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} ŝanĝis la kromnomojn de la ĉambro", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} ŝanĝis la invitan ligilon", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Protokolo de ŝanĝoj", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Ŝanĝi pasvorton", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Ŝanĝoj konserviĝis", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Ŝanĝi hejmservilon", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Ŝanĝu la haŭton", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Ŝanĝi nomon de la grupo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Ŝanĝi la servilon", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Ŝanĝi fonbildon", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Ŝanĝi vian profilbildon", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "La ĉifrado estas difektita", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Babilo", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Savkopiado de babilo", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Via savkopio de babilo estas sekurigita per sekureca ŝlosilo. Bonvolu certigi, ke vi ne perdos ĝin.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detaloj pri babilo", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Babiloj", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Elektu fortan pasvorton", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Elektu uzantonomon", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Vakigi arĥivon", - "@clearArchive": {}, - "clearText": "Forigi tekston", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Fermi", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Forbari la donitan uzanton de ĉi tiu ĉambro", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Sendi tekston formatan je HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Inviti la donitan uzanton al ĉi tiu ĉambro", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Aliĝi al la donita ĉambro", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Forigi la donitan uzanton de ĉi tiu ĉambro", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Foriri de ĉi tiu ĉambro", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Priskribu vian agon", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Agordi vian profilbildon por ĉi tiu ĉambro (laŭ mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Agordi vian prezentan nomon en ĉi tiu ĉambro", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Agordi povnivelon de la donita uzanto (implicite: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Sendi senformatan tekston", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Sendi respondon kiel reagon", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_unban": "Malforbari la donitan uzanton de ĉi tiu ĉambro", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Nevalida ordono", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} ne estas ordono.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Komparu kaj certigu, ke la jenaj bildosignoj samas en ambaŭ aparatoj:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Komparu kaj certigu, ke la jenaj numeroj samas en ambaŭ aparatoj:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Agordi babilon", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Konfirmi", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Konektiĝi", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Malsukcesis provo konektiĝi", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakto invitiĝis al la grupo", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Enhavas prezentan nomon", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Enhavas uzantonomon", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "La enhavo raportiĝis al la administrantoj de la servilo", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Vidilo de enhavo", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kopiite al tondujo", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopii", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopii al tondujo", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Ne povis malĉifri mesaĝon: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Ne povis agordi profilbildon", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Ne povis agordi prezentan nomon", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} partoprenantoj", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Krei", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Krei konton nun", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} kreis la babilon", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Krei novan grupon", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nova aro", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Delegaj subskriboj estas malŝaltitaj", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Delegaj subskriboj estas ŝaltitaj", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Nun aktiva", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Malhela", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}a de la {month}a", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}a de la {month}a de {year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Ĉi tio malaktivigos vian konton de uzanto. Ne eblas tion malfari! Ĉu certe vi certas?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Norma nivelo de permesoj", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Forigi", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Forigi konton", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Forigi mesaĝon", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Malakcepti", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Aparato", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Identigilo de aparato", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Aparatoj", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Ĉifrado nur sekuras kiam ĉiuj aparatoj kontroliĝis.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Rektaj babiloj", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Forĵeti bildon", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Trovi", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Trovu grupojn", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Prezenta nomo ŝanĝiĝis", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Donaci", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Nuligi kaj ne redemandi", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Elŝuti dosieron", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Redakti", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Redakti blokitajn servilojn", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Redakti permesojn de babilo", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Redakti prezentan nomon", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Redakti provizanton de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Ŝanĝi kromnomojn de ĉambro", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Redakti bildon de ĉambro", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Mieneto jam ekzistas!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Nevalida mallongigo de mieneto!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Mienetaroj por la ĉambro", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Agordoj pri mienetoj", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Mallongigo de mieneto", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Vi devas elekti mallongigon de mieneto kaj bildon!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Malplena babilo", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Ŝaltu savkopiadon de babiloj por neniam ree perdi aliron al viaj babiloj.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Ŝalti mienetaron ĉie", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Ŝalti ĉifradon", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Vi ne povos malŝalti la ĉifradon. Ĉu vi certas?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Ĉifrite", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Ĉifrado", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Ĉifra algoritmo", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Ĉifrado ne estas ŝaltita", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Agordoj pri tutvoja ĉifrado", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} finis la vokon", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Enigu nomon de grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Enigu retpoŝtadreson", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Enigi nomon de aro", - "@enterASpacepName": {}, - "enterAUsername": "Enigu uzantonomon", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Enigu vian hejmservilon", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Eraris akirado de loko: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Ĉio pretas!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Tre ofenda", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Dosiernomo", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Grandeco de dosiero", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Grandeco de tiparo", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Plusendi", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Vendredo", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amikoj", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Ekde aliĝo", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Ekde la invito", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Iri al la nova ĉambro", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupo", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Priskribo de grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Priskribo de grupo ŝanĝiĝis", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Grupo estas publika", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupoj", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupo kun {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gastoj estas malpermesitaj", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gastoj povas aliĝi", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} nuligis la inviton por {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Helpo", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Kaŝi obskurigitajn eventojn", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Kaŝi nekonatajn eventojn", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Hejmservilo ne estas interkonforma", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Kiel ofenda estas ĉi tiu enhavo?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "Identigilo", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identeco", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Malatenti", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Malatentitaj uzantoj", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Vi povas malatenti uzantojn, kiuj vin ĝenas. Vi ne povos ricevi mesaĝojn nek invitojn al ĉambroj de la uzantoj sur via listo de malatentatoj.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Malatenti uzantonomon", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Mi klakis la ligilon", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Neĝusta pasfrazo aŭ rehava ŝlosilo", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Neofenda", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Nevalida retpoŝtadreso", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Inviti kontakton", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Inviti kontakton al {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Invitita", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} invitis uzanton {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Nur invititoj", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Invito por mi", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} invitis vin al FluffyChat. \n1. Instalu la aplikaĵon FluffyChat: https://fluffychat.im \n2. Registriĝu aŭ salutu \n3. Malfermu la invitan ligilon: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Ĉu la jena identigilo de aparato estas ĝusta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "tajpas…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} aliĝis al la babilo", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Aliĝi al ĉambro", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Ŝlosiloj estas kaŝmemoritaj", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Ŝlosiloj mankas", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} forpelis uzanton {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} forpelis kaj forbaris uzanton {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Forpeli de babilo", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Lastafoje aktiva: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Lastafoje vidita IP-adreso", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vidita antaŭ longe", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Foriri", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Foriris de la ĉambro", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Permesilo", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Hela", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Enlegi {count} pliajn partoprenantojn", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Enlegante… bonvolu atendi.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Enlegi pli…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Saluti", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Saluti servilon {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Saluti per {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Adiaŭi", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Igi reguligisto", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Igi administranto", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Certigu, ke la identigilo estas valida", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Ŝanĝoj de anoj", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Mencii", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Mesaĝoj", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Mesaĝo foriĝos por ĉiuj partoprenantoj", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Reguligisto", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Lundo", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 plia evento} other{{count} pliaj eventoj}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Silentigi babilon", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Bonvolu scii, ke vi ankoraŭ bezonas la programon Pantalaimon por uzi tutvojan ĉifradon.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nova babilo", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nova mesaĝo en FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nova kontrolpeto!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Sekva", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Ne", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Neniu konekto al la servilo", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat ankoraŭ ne subtenas ŝaltadon de delegaj subskriboj. Bonvolu ŝalti ilin per Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sen priskribo", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Neniuj mienetoj troviĝis. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Vi nur povas aktivigi ĉifradon kiam la ĉambro ne plu estas publike alirebla.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Ŝajnas, ke via telefono ne havas servojn de Google. Tio estas bona decido por via privateco! Por ricevadi pasivajn sciigojn en FluffyChat, ni rekomendas, ke vi uzu la https://microg.org/ aŭ https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "FluffyChat ankoraŭ ne subtenas ŝaltadon de enreta savkopiado de ŝlosiloj. Bonvolu ŝalti ĝin per Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Neniu", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Vi ankoraŭ ne aldonis manieron rehavi vian pasvorton.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Neniu permeso", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Neniuj publikaj ĉambroj troviĝis…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Neniuj ĉambroj troviĝis…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Neniuj statoj troviĝis ankoraŭ.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Sciigoj", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Sciigoj ŝaltiĝis por ĉi tiu konto", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nesubtenata de la TTT-versio", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} elektitaj", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} uzantoj tajpas…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Akirante lokon…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Ofenda", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Eksterrete", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "bone", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Enrete", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Enreta savkopiado de ŝlosiloj estas malŝaltita", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Enreta savkopiado de ŝlosiloj estas ŝaltita", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oj! Bedaŭrinde eraris la agordado de pasivaj sciigoj.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oj! Io misokazis…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Malfermu la aplikaĵon por legi mesaĝojn", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Malfermi fotilon", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Malnepre) Via retpoŝtadreso", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Malnepra) Nomo de grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Aŭ", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Partoprenanto", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Partoprenantaj aparatoj de uzanto", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "pasfrazo aŭ rehava ŝlosilo", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Pasvorto", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Forgesita pasvorto", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Pasvorto ŝanĝiĝis", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Rehavo de pasvorto", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Personoj", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Elekti bildon", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Fiksi", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Ludi {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Bonvolu elekti", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Bonvolu elekti paskodon", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Bonvolu elekti uzantonomon", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Bonvolu klaki la ligilon en la retletero kaj pluiĝi.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Bonvolu enigi 4 ciferojn, aŭ nenion por malŝalti ŝlosadon de la aplikaĵo.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Bonvolu enigi identigilon de Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Bonvolu enigi vian sekurecan ŝlosilon:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Bonvolu enigi vian pasvorton", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Bonvolu enigi vian personan identigan numeron", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Bonvolu enigi vian uzantonomon", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Bonvolu sekvi la instrukciojn de la retejo kaj tuŝetu al «Sekva».", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privateco", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Publikaj grupoj", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Publika ŝlosilo", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Publikaj ĉambroj", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Publika aro", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Reguloj de pasivaj sciigoj", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Kialo", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Registrante", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} obskurigis eventon", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Obskurigi mesaĝon", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registriĝi", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Rifuzi", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} rifuzis la inviton", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Ree aliĝi", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Forigi", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Forigi ĉiujn aliajn aparatojn", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Forigita de {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Forigi aparaton", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Malforbari", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Forigi mesaĝon", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Forigi vian profilbildon", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Bildigi riĉforman enhavon de mesaĝoj", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Anstataŭigi ĉambron per nova versio", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Respondi", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Raporti mesaĝon", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Peti permeson", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Peti legi pli malnovajn mesaĝojn", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Nuligi ĉiujn permesojn", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Ĉambro gradaltiĝis", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versio de ĉambro", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sabato", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Konservi dosieron kun la nomo: {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Konservi dosieron", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Konservi dosieron al tiu ĉi dosierujo", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Serĉi", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Serĉi babilon", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Sekureco", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Sekureca ŝlosilo", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ĉu vi perdis sekurecan ŝlosilon?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Vidita de {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Vidita de {username} kaj {count} aliaj}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Vidita de {username} kaj {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Sendi", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Sendi mesaĝon", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Sendi sondosieron", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Permesi raportadon de eraroj per sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Sendi dosieron", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Sendi bildon", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Sendi mesaĝojn", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Sendi originalon", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Sendi glumarkon", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Sendi filmon", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} sendis dosieron", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} sendis sondosieron", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} sendis bildon", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} sendis glumarkon", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} sendis filmon", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} sendis informojn pri voko", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informoj pri via privateco: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Salutaĵo estas kontrolita", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Agordi profilbildon", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Agordi kiel ĉefan kromnomon", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Agordi proprajn mienetojn", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Agordi priskribon de grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Agordi invitan ligilon", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Agordi nivelon de permesoj", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Agordi staton", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Agordoj", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Konigi", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} konigis sian lokon", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Konigi lokon", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Montri pasvorton", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registriĝi", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Ununura saluto", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Preterpasi", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Sono, LED-koloro de vibrado", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Fontkodo", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Aro estas publika", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nomo de aro", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} komencis vokon", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Komencu nun vian unuan babilon! 🙂\n• Tuŝetu al la butono de mesaĝo\n• Enigu la uzantonomon de amiko\n• Ĝuu babiladon", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Stato", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Kiel vi fartas?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Sendi", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Dimanĉo", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Spegulante… Bonvolu atendi.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tuŝetu aparaton por kontroli", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tuŝetu por montri bildon", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tuŝetu por montri menuon", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Ili ne akordas", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Ili akordas", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ĉi tiu ĉambro arĥiviĝis.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Ĵaŭdo", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Baskuli elstarigon", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Basklui silentigon", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Baskuli legitecon", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Tro multaj petoj. Bonvolu reprovi poste!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transporti de alia aparato", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Reprovi sendi", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Mardo", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nedisponeble", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} malforbaris uzanton {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Malbloki aparaton", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Nekonata aparato", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Nekonata ĉifra algoritmo", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Nekonata evento «{type}»", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Nekonata salutaĵo; bonvolu kontroli", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Malŝlosi savkopion de babilo", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Malsilentigi babilon", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Malfiksi", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 nelegita babilo} other{{unreadCount} nelegitaj babiloj}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 nelegita mesaĝo} other{{unreadEvents} nelegitaj mesaĝoj}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Ĉu uzi kolorojn adaptitajn por AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} kaj {count} aliaj tajpas…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} kaj {username2} tajpas…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} tajpas…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} foriris de la babilo", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Uzantonomo", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Uzanto ne kontroliĝis", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} sendis eventon de speco {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Uzanto havas nekonatan staton de kontrolo", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Uzanto kontroliĝis", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Kontrolita", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sukcese kontrolis salutaĵon!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Kontroli", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Kontroli permane", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Komenci kontrolon", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Vi sukcese kontrolis!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Kontrolante alian konton", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Kontroli uzanton", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Vidvoko", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Videbleco de historio de la babilo", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Videbla al ĉiuj partoprenantoj", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Videbla al ĉiuj", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Voĉmesaĝo", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Atendante konfirmon de peto de la kunulo…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Atendante akcepton de la bildosignoj de la kunulo…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Atendante akcepton de la numeroj, de la kunulo…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Fonbildo", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Averto!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Tutvoja ĉifrado estas ankoraŭ beta-versia! Uzu je via propra risko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Merkredo", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bonvenu al la plej ĉarma tujmesaĝilo en la reto de Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Ni sendis retleteron al vi", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Kiu povas kion", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kiu rajtas aliĝi al ĉi tiu grupo", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Kial vi volas tion ĉi raporti?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Ĉu forviŝi la savkopion de via babilo por krei novan sekurecan ŝlosilon?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Per tiuj ĉi adresoj vi povas rehavi vian pasvorton.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Skribi mesaĝon…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Jes", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Vi", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Vi estas invitita al ĉi tiu babilo", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Vi ne plu partoprenas ĉi tiun babilon", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Vi ne povas inviti vin mem", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Vi estas forbarita de ĉi tiu babilo", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Viaj babiloj estas spegulataj…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Via propra uzantonomo", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Via publika ŝlosilo", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Vi konektiĝos al {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Zomi", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Malzomi", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Sendi kiel tekston", - "@sendAsText": { - "type": "text" - }, - "noMatrixServer": "{server1} ne estas matriksa servilo, eble provu anstataŭe servilon {server2}?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "commandHint_send": "Sendi tekston", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "chatHasBeenRemovedFromThisSpace": "Babilo foriĝis de ĉi tiu aro", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Babilo aldoniĝis al ĉi tiu aro", - "@chatHasBeenAddedToThisSpace": {}, - "autoplayImages": "Memage ludi movbildajn glumarkojn kaj mienetojn", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "addToSpace": "Aldoni al aro", - "@addToSpace": {}, - "homeserver": "Hejmservilo", - "@homeserver": {}, - "sendOnEnter": "Sendi per eniga klavo", - "@sendOnEnter": {} -} diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb deleted file mode 100644 index 9c15f60d19..0000000000 --- a/assets/l10n/intl_es.arb +++ /dev/null @@ -1,2677 +0,0 @@ -{ - "@@locale": "es", - "@@last_modified": "2021-08-14 12:41:10.097243", - "about": "Acerca de", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Aceptar", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} aceptó la invitación", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Cuenta", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Información de la cuenta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} activó el cifrado de extremo a extremo", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Añadir dirección de correo", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Agregar una descripción al grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administrador", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "¿Ya tienes una cuenta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} respondió a la llamada", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Cualquiera puede unirse", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Archivo", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Sala archivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "¿Pueden unirse los usuarios visitantes?", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "¿Estás seguro?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "¿Confirma que quiere cerrar sesión?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Ingrese su contraseña de almacenamiento segura (SSSS) o la clave de recuperación para almacenar en caché las claves.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Para poder confirmar a la otra persona, ingrese su contraseña de almacenamiento segura o la clave de recuperación.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Por favor, ingrese su contraseña de almacenamiento seguro (SSSS) o la clave de recuperación para verificar su sesión.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "¿Aceptar esta solicitud de verificación de {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autenticación", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Imagen de perfil modificada", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "El servidor soporta los siguientes mecanismos para autenticación:\n{serverVersions}\npero esta aplicación sólo soporta:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "El servidor soporta las siguientes versiones de la especificación:\n{serverVersions}\npero esta aplicación sólo soporta las versiones {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Vetar del chat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Vetado", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} vetó a {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloquear dispositivo", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bloqueado", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Claves almacenadas en caché", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancelar", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Cambiar el nombre del dispositivo", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} cambió el icono del chat", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} cambió la descripción del chat a: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} cambió el nombre del chat a: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} cambió los permisos del chat", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} cambió su nombre visible a: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} cambió las reglas de acceso de visitantes", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} cambió las reglas de acceso de visitantes a: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} cambió la visibilidad del historial", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} cambió la visibilidad del historial a: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} cambió las reglas de ingreso", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} cambió las reglas de ingreso a {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} cambió su imagen de perfil", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} cambió el alias de la sala", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} cambió el enlace de invitación", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Registro de cambios", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Cambiar la contraseña", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Los cambios se han guardado", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Cambiar el servidor", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Cambia tu estilo", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Cambiar el nombre del grupo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Cambiar el servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Cambiar el fondo de pantalla", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "El cifrado se ha corrompido", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Copia de respaldo del chat", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "La copia de respaldo del chat está protegida por una clave de seguridad. Procure no perderla.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detalles del chat", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Conversaciones", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Elija una contraseña segura", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Elija un nombre de usuario", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Borrar archivo", - "@clearArchive": {}, - "close": "Cerrar", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Compare y asegúrese de que los siguientes emoji coincidan con los del otro dispositivo:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Compare y asegúrese de que los siguientes números coincidan con los del otro dispositivo:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirmar", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Conectar", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Falló el intento de conexión", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "El contacto ha sido invitado al grupo", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visor de contenido", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copiado al portapapeles", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copiar", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copiar al portapapeles", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "No se pudo descifrar el mensaje: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "No se pudo establecer la imagen de perfil", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "No se pudo establecer el nombre visible", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participantes", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Crear", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Crear cuenta ahora", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} creó el chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Crear grupo nuevo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "La confirmación cruzada está deshabilitada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "La confirmación cruzada está habilitada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Actualmente activo", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Oscuro", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Se desactivará su cuenta de usuario. ¡La operación no se puede cancelar! ¿Está seguro?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "delete": "Eliminar", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Cancelar cuenta", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Eliminar mensaje", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Rechazar", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Dispositivo", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "Dispositivos", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "El cifrado solo es seguro cuando se han verificado todos los dispositivos.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Descartar imagen", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "El nombre visible ha cambiado", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Donar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Descargar archivo", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Editar nombre visible", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Cambiar la instancia de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Editar alias de la sala", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "¡El emote ya existe!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "¡El atajo del emote es inválido!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Paquetes de emoticonos para la habitación", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Configuración de emotes", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Atajo de emote", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "¡Debes elegir un atajo de emote y una imagen!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Chat vacío", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Habilitar paquete de emoticonos a nivel general", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Ya no podrá deshabilitar el cifrado. ¿Estás seguro?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "Cifrado", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritmo de cifrado", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "El cifrado no está habilitado", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Configuración del cifrado de extremo a extremo", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} terminó la llamada", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Ingrese un nombre de grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Introducir una dirección de correo electrónico", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Ingrese un nombre de usuario", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Ingrese su servidor", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "¡Todo listo!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nombre del archivo", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Tamaño del archivo", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Reenviar", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Viernes", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Desde que se unió", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Desde la invitación", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Grupo", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Descripción del grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "La descripción del grupo ha sido cambiada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "El grupo es público", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupo con {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Los visitantes están prohibidos", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Los visitantes pueden unirse", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} ha retirado la invitación para {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Ayuda", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Ocultar sucesos censurados", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Ocultar sucesos desconocidos", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "El servidor no es compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "Identificación", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identidad", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Usuarios ignorados", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Puede ignorar a los usuarios que le molesten. No podrá recibir mensajes ni invitaciones a salas de los usuarios de su lista personal de ignorados.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorar nombre de usuario", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frase de contraseña o clave de recuperación incorrecta", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Invitar contacto", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Invitar contacto a {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Invitado", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} invitó a {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Sólo usuarios invitados", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} te invitó a FluffyChat.\n1. Instale FluffyChat: https://fluffychat.im\n2. Regístrate o inicia sesión \n3. Abra el enlace de invitación: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "¿Es correcta la siguiente clave de dispositivo?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "está escribiendo…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} se unió al chat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Unirse a la sala", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Las claves están en caché", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Faltan las claves", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} echó a {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} echó y vetó a {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Echar del chat", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Última vez activo: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Última dirección IP vista", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto hace mucho tiempo", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Abandonar", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Abandonó el chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licencia", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Claro", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Mostrar {count} participantes más", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Cargando… Por favor espere.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Mostrar más…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Acceso", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Iniciar sesión en {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Cerrar sesión", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Hacer un moderador/a", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Hacer un administrador/a", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Asegúrese de que el identificador es válido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "mention": "Mencionar", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "El mensaje será eliminado para todos los participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderador", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Lunes", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 evento más} other{{count} más eventos}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Silenciar chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Tenga en cuenta que necesita Pantalaimon para utilizar el cifrado de extremo a extremo por ahora.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nuevo mensaje en FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "¡Nueva solicitud de verificación!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Siguiente", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "No", - "@no": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat actualmente no soporta la activación de Cross-Signing. Por favor, actívelo dentro de Riot.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Ningún emote encontrado. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Sólo se puede activar el cifrado en cuanto la sala deja de ser de acceso público.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Parece que no tienes servicios de Google en tu teléfono. ¡Esa es una buena decisión para tu privacidad! Para recibir notificaciones instantáneas en FluffyChat, recomendamos usar microG: https://microg.org/", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Fluffychat actualmente no soporta la activación de Online Key Backup. Por favor, actívalo dentro de Riot.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ninguno", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Sin autorización", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Sin salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Ninguna sala encontrada…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "No es compatible con la versión web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seleccionado(s)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "offline": "Desconectado", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Conectado", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "La copia de seguridad de la clave en línea está deshabilitada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "La copia de seguridad de la clave en línea está habilitada", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Ups, algo salió mal…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Abrir la aplicación para leer los mensajes", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Abrir cámara", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcional) Nombre del grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositivos de usuario participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "contraseña o clave de recuperación", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Contraseña", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "La contraseña ha sido cambiada", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "people": "Personas", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Elegir imagen", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Pin", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Reproducir {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Por favor, elija un nombre de usuario", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Haga clic en el enlace del correo electrónico y luego continúe.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Por favor, ingrese un identificador Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Por favor, introduzca su clave de seguridad:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Por favor ingrese su contraseña", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Por favor ingrese su nombre de usuario", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Por favor, siga las instrucciones del sitio web y presione \"siguiente\".", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacidad", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grupos públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Salas públicas", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "Grabando", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} censuró un suceso", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Rechazar", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} rechazó la invitación", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Volver a unirse", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Eliminar", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Eliminar todos los otros dispositivos", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Eliminado por {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Eliminar dispositivo", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Eliminar la expulsión", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Eliminar mensaje", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Mostrar el contenido con mensajes enriquecidos", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Responder", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Solicitar permiso", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Solicitar poder leer mensajes antiguos", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revocar todos los permisos", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "La sala ha subido de categoría", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versión de sala", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Buscar un chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Clave de seguridad", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "¿Perdiste tu llave de seguridad?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Visto por {username} y {count} más}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto por {username} y {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Enviar", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Enviar un mensaje", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Enviar audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Permite el envió de informes de errores con sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Enviar un archivo", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Enviar una imagen", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Enviar el original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Enviar video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} envió un archivo", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} envió un audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} envió una imagen", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} envió un sticker", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} envió un video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} envió información de la llamada", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Información sobre tu privacidad: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "La sesión está verificada", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Establecer una foto de perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Fijar alias principal", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Establecer descripción del grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Establecer enlace de invitación", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Establecer estado", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Ajustes", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Compartir", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} compartió la ubicación", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "Mostrar contraseña", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registrarse", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Omitir", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Código fuente", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} comenzó una llamada", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "¡Inicie su primer chat ahora mismo! 🙂\n- Toque el botón de \"Nueva conversación\"\n- Escaneé el código QR de un amigo \n- Diviértanse chateando", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "¿Cómo estás hoy?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Enviar", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Domingo", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Toque en otro dispositivo para verificar", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toca para mostrar el menú", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "No coinciden", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Coinciden", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Esta sala ha sido archivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Jueves", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transferir desde otro dispositivo", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Intentar enviar nuevamente", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Martes", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Indisponible", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} admitió a {targetName} nuevamente", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Desbloquear dispositivo", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Dispositivo desconocido", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Algoritmo de cifrado desconocido", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Evento desconocido '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Sesión desconocida, por favor verifíquela", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Dejar de silenciar el chat", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Despinchar", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 chat no leído} other{{unreadCount} chats no leídos}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 mensaje no leído} other{{unreadEvents} mensajes no leídos}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "¿Usar colores compatibles con AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} y {count} más están escribiendo…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} y {username2} están escribiendo…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} está escribiendo…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} abandonó el chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nombre de usuario", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} envió un evento {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verified": "Verificado", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "¡Sesión verificada exitosamente!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verificar", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verificar manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Comenzar verificación", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "¡Has verificado exitosamente!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verificando la otra cuenta", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verificar usuario", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Video llamada", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilidad del historial del chat", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible para todos los participantes", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visible para todo el mundo", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Mensaje de voz", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Esperando a que el socio acepte la solicitud…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Esperando a que el socio acepte los emojis…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Esperando a que el socio acepte los números…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Fondo de pantalla", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "¡Advertencia!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "¡El cifrado de extremo a extremo está actualmente en período de prueba! ¡Úselo bajo su propio riesgo!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Miércoles", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bienvenidos al mensajero instantáneo más lindo de la red de Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Te enviamos un correo electrónico", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Quién tiene permitido unirse al grupo", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Escribe un mensaje…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Sí", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Tú", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Estás invitado a este chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Ya no estás participando en este chat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "No puedes invitarte a tí mismo", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Has sido vetado de este chat", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Tu nombre de usuario", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Serás conectado a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Acercar zoom", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Alejar zoom", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Reproducir emoticonos y stickers animados automáticamente", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "allChats": "Todos los chats", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Agregar al espacio", - "@addToSpace": {}, - "cantOpenUri": "No puedo abrir el URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "addNewFriend": "Agregar nuevo amigo", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "all": "Todo", - "@all": { - "type": "text", - "placeholders": {} - }, - "appLock": "Bloqueo de aplicación", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Pausa", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Encender", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Mensajes de bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "Se ha cerrado en la sesión de uno de sus clientes", - "@oneClientLoggedOut": {}, - "addAccount": "Añadir cuenta", - "@addAccount": {}, - "editBundlesForAccount": "Editar paquetes para esta cuenta", - "@editBundlesForAccount": {}, - "addToBundle": "Agregar al paquete", - "@addToBundle": {}, - "bundleName": "Nombre del paquete", - "@bundleName": {}, - "saveFile": "Guardar el archivo", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Enviar stickers", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Establecer nivel de permisos", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Compartir ubicación", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Inicio de sesión único", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "status": "Estado", - "@status": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sincronizando... por favor espere.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "El usuario no está verificado", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "El usuario está verificado", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "He hecho clic en el enlace", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "clearText": "Borrar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "directChats": "Chat directo", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Error al obtener la ubicación: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "howOffensiveIsThisContent": "¿Cuán ofensivo es este contenido?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Invitar por mí", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Aún no ha agregado una forma de recuperar su contraseña.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count} usuarios están escribiendo…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "or": "O", - "@or": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "El espacio es público", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "El chat se ha agregado a este espacio", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "El chat se ha eliminado de este espacio", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "commandInvalid": "Comando inválido", - "@commandInvalid": { - "type": "text" - }, - "passwordRecovery": "Recuperación de contraseña", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Iniciar sesión con {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "security": "Seguridad", - "@security": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremadamente ofensivo", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Clave pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Editar servidores bloqueado", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configurar chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sin descripción", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Sin conexión al servidor", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Tu clave pública", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Contraseña olvidada", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Inofensivo", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "reason": "Razón", - "@reason": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Sonido, vibración LED de color", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Cambios de miembros", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nuevo espacio", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "edit": "Editar", - "@edit": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Establecer emoticonos personalizados", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Ingrese nombre de espacio", - "@enterASpacepName": {}, - "ignore": "Ignorar", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notificaciones", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notificaciones habilitadas para esta cuenta", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "offensive": "Ofensiva", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "serverRequiresEmail": "Este servidor necesita validar su dirección de correo electrónico para registrarse.", - "@serverRequiresEmail": {}, - "pleaseChoose": "Por favor elija", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Reemplazar habitación con una versión más nueva", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "El contenido ha sido reportado a los administradores del servidor", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupos", - "@groups": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Mensaje de informe", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Archivo guardado como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "search": "Buscar", - "@search": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Permiso de ubicación denegado. Concédeles que puedan compartir tu ubicación.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Nivel de permiso predeterminado", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Obteniendo ubicación…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "participant": "Participante", - "@participant": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Regla de Push", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "register": "Registrarse", - "@register": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Enviar como texto", - "@sendAsText": { - "type": "text" - }, - "toggleMuted": "Alternar silenciado", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Demasiadas solicitudes. ¡Por favor inténtelo más tarde!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Con esta dirección puede recuperar su contraseña.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Guardar archivo en esta carpeta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "commandHint_send": "Enviar texto", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "deviceId": "ID del dispositivo", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contiene nombre de usuario", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar y no volver a preguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "¡UPS¡ Desafortunadamente, se produjo un error al configurar las notificaciones push.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Quitar tu avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Descubrir grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Habilitar la encriptación", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Tus chats se están sincronizando…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "messages": "Mensajes", - "@messages": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Tamaño de fuente", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Prohibir al usuario dado en esta sala", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_unban": "Des banear al usuario dado en esta sala", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandMissing": "{command} no es un comando.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "discover": "Descubrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Editar permisos de chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "friends": "Amigos", - "@friends": { - "type": "text", - "placeholders": {} - }, - "createNewChatExplaination": "Simplemente escaneé el código QR o comparta su enlace de invitación si no están uno al lado del otro.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Compartir tu enlace de invitación", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Escriba el enlace de invitación manualmente...", - "@typeInInviteLinkManually": {}, - "scanQrCode": "Escanear código QR", - "@scanQrCode": {}, - "unlockChatBackup": "Desbloquear la copia de seguridad del chat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Homeserver", - "@homeserver": {}, - "newChat": "Nuevo chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Espacio público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "commandHint_join": "Únete a la sala indicada", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "sendOnEnter": "Enviar con enter", - "@sendOnEnter": {}, - "changeYourAvatar": "Cambiar tu avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "commandHint_me": "Descríbete", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_html": "Enviar texto con formato HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Invitar al usuario indicado a esta sala", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_kick": "Eliminar el usuario indicado de esta sala", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Deja esta sala", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_myroomavatar": "Selecciona tu foto para esta sala (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Establece tu nombre para mostrar para esta sala", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Establece el nivel de potencia del usuario dado (default: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Enviar texto sin formato", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Enviar respuesta como reacción", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "containsDisplayName": "Contiene nombre para mostrar", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Habilitar la copia de seguridad del chat para no perder nunca el acceso a su chats.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Editar avatar de sala", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Los servicios de ubicación están deshabilitado. Habilite para poder compartir su ubicación.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Encriptado", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Ir a la nueva sala", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} no es un servidor matrix, usar {server2} en su lugar?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "invalidEmail": "Correo inválido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "Para poder recuperar su contraseña más tarde, debe agregar una dirección de correo electrónico", - "@newPasswordDescription": {}, - "newUsernameDescription": "Su ID de usuario tendrá el formato @username:servername", - "@newUsernameDescription": {}, - "noStatusesFound": "Hasta ahora no se han encontrado estados.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Abrir en maps", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "removeFromBundle": "Quitar de este paquete", - "@removeFromBundle": {}, - "link": "Link", - "@link": {}, - "enableMultiAccounts": "(BETA) habilite varias cuenta en este dispositivo", - "@enableMultiAccounts": {}, - "pleaseEnter4Digits": "Ingrese 4 dígitos o déjelo en blanco para deshabilitar el bloqueo de la aplicación.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Elija un código de acceso", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Por favor ingrese su PIN", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Censurar mensaje", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Enviar mensajes", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nombre del espacio", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Toque para mostrar la imagen", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Alternar favorito", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Marcar como: leído / no leído", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "El usuario tiene un estado de verificación desconocido", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Quién puede realizar qué acción", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "¿Por qué quieres denunciar esto?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "¿Limpiar la copia de seguridad de su chat para crear una nueva clave de seguridad?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "iWroteDownTheKey": "He escrito la clave", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Se ha configurado la copia de respaldo del chat.", - "@yourChatBackupHasBeenSetUp": {}, - "unverified": "No verificado", - "@unverified": {}, - "setupChatBackupDescription": "Para proteger sus mensajes, hemos generado una clave de seguridad.\nConsérvela en un sitio seguro, como un gestor de contraseñas.", - "@setupChatBackupDescription": {}, - "yourUserId": "Su id. de usuario:", - "@yourUserId": {}, - "setupChatBackup": "Configurar copia de respaldo de chat", - "@setupChatBackup": {}, - "commandHint_clearcache": "Limpiar cache", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "loginWithOneClick": "Iniciar sesión con un click", - "@loginWithOneClick": {}, - "messageInfo": "Información del mensaje", - "@messageInfo": {}, - "time": "Tiempo", - "@time": {}, - "openVideoCamera": "Abrir la cámara para un video", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "passwordsDoNotMatch": "¡Las contraseñas no coinciden!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Por favor ingrese un correo electrónico válido.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Repetir la contraseña", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Por favor elegir al menos {min} carácteres", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "removeFromSpace": "Eliminar del espacio", - "@removeFromSpace": {}, - "addToSpaceDescription": "Elige un espacio para añadir este chat a el.", - "@addToSpaceDescription": {}, - "openGallery": "Abrir galería", - "@openGallery": {}, - "start": "Iniciar", - "@start": {}, - "saveTheSecurityKeyNow": "Guardar la clave de seguridad ahora", - "@saveTheSecurityKeyNow": {}, - "replyHasBeenSent": "La respuesta se ha enviado", - "@replyHasBeenSent": {}, - "whatIsGoingOn": "¿Qué está pasando?", - "@whatIsGoingOn": {}, - "addDescription": "Añadir descripción", - "@addDescription": {}, - "commandHint_discardsession": "Descartar sesión", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "messageType": "Tipo de Mensaje", - "@messageType": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "pleaseEnterSecurityKeyDescription": "Para desbloquear el respaldo de tu chat, por favor ingresa tu clave de seguridad que ha sido generada en una sesión previa. Tu clave de seguridad NO es tu contraseña.", - "@pleaseEnterSecurityKeyDescription": {}, - "publish": "Publicar", - "@publish": {} -} diff --git a/assets/l10n/intl_et.arb b/assets/l10n/intl_et.arb deleted file mode 100644 index ca3ba6899b..0000000000 --- a/assets/l10n/intl_et.arb +++ /dev/null @@ -1,2864 +0,0 @@ -{ - "@@locale": "et", - "@@last_modified": "2021-08-14 12:41:10.079944", - "about": "Rakenduse teave", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Nõustu", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} võttis kutse vastu", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Kasutajakonto", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Kasutajakonto teave", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} võttis kasutusele läbiva krüptimise", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Lisa e-posti aadress", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Lisa vestlusrühma kirjeldus", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Lisa uus sõber", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Peakasutaja", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Kõik", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Kõik vestlused", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Sul juba on kasutajakonto olemas?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} vastas kõnele", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Kõik võivad liituda", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Rakenduse lukustus", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arhiiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arhiveeritud jututuba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Kas külalised võivad liituda", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Kas sa oled kindel?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Kas sa oled kindel, et soovid välja logida?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Krüptovõtmete puhverdamiseks palun sisesta oma turvahoidla paroolifraas või taastevõti.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla paroolifraas või taastevõti.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Oma sessiooni verifitseerimiseks palun sisesta oma turvahoidla paroolifraas või taastevõti.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Kas võtad vastu selle verifitseerimispalve kasutajalt {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Peata", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Esita", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentimine", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Esita liikuvad kleepse ja emotikone automaatselt", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Tunnuspilt on muutunud", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "See koduserver toetab Matrixi võrku sisselogimiseks:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi võimalusi:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "See koduserver toetab Matrixi spetsifikatsioonist järgmisi versioone:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi versioone: {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Keela ligipääs vestlusele", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Ligipääs vestlusele on keelatud", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} keelas ligipääsu kasutajale {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blokeeri seade", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blokeeritud", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Robotite sõnumid", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Puhverdatud krüptovõtmed", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Katkesta", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "{uri} aadressi avamine ei õnnestu", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Muuda seadme nime", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} muutis vestluse tunnuspilti", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} muutis vestluse uueks kirjelduseks „{description}“", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} muutis oma uueks kuvatavaks nimeks „{chatname}“", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} muutis vestlusega seotud õigusi", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} muutis uueks kuvatavaks nimeks: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} muutis külaliste ligipääsureegleid", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} muutis külaliste ligipääsureegleid järgnevalt: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} muutis sõnumite ajaloo nähtavust", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} muutis sõnumite ajaloo nähtavust järgnevalt: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} muutis liitumise reegleid", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} muutis liitumise reegleid järgnevalt: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} muutis oma tunnuspilti", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} muutis jututoa aliast", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} muutis kutse linki", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Muudatuste logi", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Muuda salasõna", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Salvestasin muudatused", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Muuda koduserverit", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Muuda oma stiili", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Muuda vestlusrühma nime", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Muuda serverit", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Muuda taustapilti", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Muuda oma tunnuspilti", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Kasutatud krüptimine on vigane", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Vestlus", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Varunda vestlus", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Sinu vestluste varukoopia on krüptitud taastamiseks mõeldud turvavõtmega. Palun vaata, et sa seda ei kaota.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Vestluse teave", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Vestlused", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Vali korralik salasõna", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Vali kasutajanimi", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Kustuta arhiiv", - "@clearArchive": {}, - "clearText": "Kustuta tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Sulge", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Sea sellele kasutajale antud jututoas suhtluskeeld", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Saada HTML-vormingus tekst", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Kutsu see kasutaja antud jututuppa", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Liitu selle jututoaga", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Eemalda antud kasutaja sellest jututoast", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Lahku sellest jututoast", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Kirjelda ennast", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Määra selles jututoas oma tunnuspilt (mxc-uri vahendusel)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Määra selles jututoas oma kuvatav nimi", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Seadista selle kasutaja õigusi (vaikimisi: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Saada vormindamata tekst", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Saada vastus reaktsioonina", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Saada sõnum", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Eemalda sellelt kasutajalt antud jututoas suhtluskeeld", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Vigane käsk", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} ei ole käsk.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Võrdle ja kontrolli, et emotikonid on teises seadmes täpselt samad:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Võrdle ja kontrolli, et järgnevad numbrid on teises seadmes täpselt samad:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Seadista vestlust", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Kinnita", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Ühenda", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Ühenduse loomise katse ebaõnnestus", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma vestlusrühma", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Sisaldab kuvatavat nime", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Sisaldab kasutajanime", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Saatsime selle sisu kohta teate koduserveri haldajate", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Sisukuvaja", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kopeerisin lõikelauale", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopeeri", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopeeri lõikelauale", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Sõnumi dekrüptimine ei õnnestunud: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Tunnuspildi seadmine ei õnnestunud", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kuvatava nime määramine ei õnnestunud", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} osalejat", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Loo", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Tee nüüd kasutajakonto", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} algatas vestluse", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Loo uus vestlusrühm", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Uus kogukond", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Risttunnustamine ei ole kasutusel", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Risttunnustamine on kasutusel", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Hetkel aktiivne", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tume", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}.{month}.{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Järgnevaga eemaldatakse sinu konto kasutusest. Seda tegevust ei saa tagasi pöörata! Kas sa ikka oled kindel?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Vaikimisi õigused", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Kustuta", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Kustuta kasutajakonto", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Kustuta sõnum", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Keela", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Seade", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Seadme tunnus", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Seadmed", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Krüptimisel on mõte vaid siis, kui ka kõik vestlusega seotud seadmed on verifitseeritud.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Otsevestlused", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Emalda pilt", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Avasta", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Otsi vestlusrühmi", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Kuvatav nimi on muudetud", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Toeta", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Katkesta ja ära küsi enam uuesti", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Laadi fail alla", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Muuda", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Muuda blokeeritud serverite loendit", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Muuda vestluse õigusi", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Muuda kuvatavat nime", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Muuda Jitsi liidestust", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Muuda jututoa aliast", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Muuda jututoa tunnuspilti", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Selline emotsioonitegevus on juba olemas!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Vigane emotsioonitegevuse lühikood!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emotsioonitegevuste pakid jututoa jaoks", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emotsioonitegevuste seadistused", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emotsioonitegevuse lühikood", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Sa pead valima emotsioonitegevuse lühikoodi ja pildi!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Vestlust pole olnud", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Selleks, et sa ei kaotaks ligipääsu oma vestlustele, palun võta kasutusele vestluste varundamine.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Võta emotsioonitegevuste pakid läbivalt kasutusele", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Kasuta krüptimist", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Sa ei saa hiljem enam krüptimist välja lülitada. Kas oled kindel?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Krüptitud", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Krüptimine", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Krüptoalgoritm", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Krüptimine ei ole kasutusel", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Läbiva krüptimise seadistused", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} lõpetas kõne", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Sisesta vestlusrühma nimi", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Sisesta e-posti aadress", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Sisesta kogukonna nimi", - "@enterASpacepName": {}, - "enterAUsername": "Sisesta kasutajanimi", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Sisesta oma koduserveri aadress", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Viga asukoha tuvastamisel: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Kõik on valmis!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Äärmiselt solvav", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Faili nimi", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Faili suurus", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Fondi suurus", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Edasta", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Reede", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Sõbrad", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Alates liitumise hetkest", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Kutse saamisest", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Hakka kasutama uut jututuba", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Vestlusrühm", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Vestlusrühma kirjeldus", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Vestlusrühma kirjeldus on muutunud", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Vestlusrühm on avalik", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Vestlusrühmad", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Vestlusrühm {displayname} kasutajanimega", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Külalised ei ole lubatud", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Külalised võivad liituda", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} on võtnud tagasi {targetName} kutse", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Abiteave", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Peida muudetud sündmused", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Peida tundmatud sündmused", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Koduserver ei ole ühilduv", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Kui solvav see sisu on?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identiteet", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Eira", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Eiratud kasutajad", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Sul on võimalik eirata neid kasutajaid, kes sind segavad. Oma isiklikku eiramisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Eira kasutajanime", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Ma olen klõpsinud saadetud linki", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Vigane paroolifraas või taastevõti", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Kahjutu", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Vigane e-posti aadress", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Kutsu sõpru ja tuttavaid", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} liikmeks", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Kutsutud", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} kutsus kasutajaks {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Ainult kutsutud kasutajatele", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Kutse minu jaoks", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} kutsus sind kasutama Matrix'i-põhist suhtlusrakendust FluffyChat. \n1. Paigalda FluffyChat: https://fluffychat.im \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix'i kasutajakontoga\n3. Ava kutse link: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Kas järgnev seadmevõti on õige?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "kirjutab…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} liitus vestlusega", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Liitu jututoaga", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Krüptovõtmed on puhverdatud", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Krüptovõtmed on puudu", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} müksas kasutaja {targetName} välja", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} müksas kasutaja {targetName} välja ning seadis talle suhtluskeelu", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Müksa vestlusest välja", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Viimati nähtud: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Viimati nähtud IP-aadress", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Nähtud ammu aega tagasi", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Lahku", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Lahkus vestlusest", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Litsents", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Hele", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Lisa veel {count} osalejat", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Laadin andmeid… Palun oota.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Laadi veel…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Asukohateenused on seadmes väljalülitatud. Asukoha jagamiseks palun lülita nad sisse.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Puudub luba asukohateenuste kasutamiseks. Asukoha jagamiseks palun anna rakendusele vastavad õigused.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Logi sisse", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Logi sisse {homeserver} serverisse", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Logi sisse {brand} abil", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Logi välja", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Määra moderaatoriks", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Määra peakasutajaks", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Kontrolli, et see tunnus oleks õige", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Muudatused liikmeskonnas", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Märgi ära", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Sõnumid", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Sõnum eemaldatakse kõikidelt kasutajatelt", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderaator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Esmaspäev", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Veel 1 sündmus} other{Veel {count} sündmust}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Summuta vestlus", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Palun arvesta, et sa saad hetkel kasutada läbivat krüptimist vaid siis, kui koduserver kasutab Pantalaimon'it.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Uus vestlus", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Uus sõnum FluffyChat'i vahendusel", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Uus verifitseerimispäring!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Edasi", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Ei", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Puudub ühendus koduserveriga", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat ei toeta hetkel risttunnustamist. Palun võta ta kasutusele Element'i vahendusel.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Kirjeldus puudub", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Ühtegi emotsioonitegevust ei leidunud. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Sa võid krüptimise kasutusele võtta niipea, kui jututuba pole enam avalik.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Tundub, et sinu nutiseadmes pole Google teenuseid. Sinu privaatsuse mõttes on see kindlasti hea otsus! Kui sa soovid FluffyChat'is näha tõuketeavitusi, siis soovitame, et selle jaoks kasutad https://microg.org või https://unifiedpush.org liidestust.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} pole Matrix'i server, kas kasutame selle asemel {server2} serverit?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Palun võta krüptovõtmete võrgupõhine varundus kasutusele vestusrakenduse Element vahendusel.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Mitte midagi", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Sa pole veel lisanud võimalust salasõna taastamiseks.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Õigused puuduvad", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Avalikke jututubasid ei leidunud…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Jututubasid ei leidunud…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Pole veel ühtegi olekut leidnud.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Teavitused", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Teavitused on sellel kontol kasutusel", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "See funktsionaalsus ei ole veebiliideses toetatud", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} valitud", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} kasutajat kirjutavad…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Tuvastan asukohta…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Solvav", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Väljas", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "sobib", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Saadaval", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Krüptovõtmete veebipõhine varundus ei ole kasutusel", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Krüptovõtmete veebipõhine varundus on kasutusel", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Hopsti! Kahjuks tekkis tõuketeavituste seadistamisel viga.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Hopsti! Midagi läks nüüd viltu…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Sõnumite lugemiseks ava rakendus", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Ava kaamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Ava kaardirakendusega", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "Sinu e-posti aadress (kui soovid lisada)", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Kui soovid) Vestlusrühma nimi", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "või", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Osaleja", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Kaasatud kasutajate seadmed", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "paroolifraas või taastevõti", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Salasõna", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Salasõna on ununenud", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Salasõna on muudetud", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Salasõna taastamine", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Inimesed", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Vali pilt", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Klammerda", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Esita {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Palun vali", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Palun vali rakenduse PIN-kood", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Palun vali kasutajanimi", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Jätkamiseks palun klõpsi sulle saadetud e-kirjas leiduvat linki.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Rakenduse luku jaoks sisesta 4 numbrit või kui sa sellist võimalust ei soovi kasutada, siis jäta nad tühjaks.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Palun sisesta Matrix'i kasutajatunnus.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Palun sisesta oma turvavõti:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Palun sisesta oma salasõna", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Palun sisesta oma PIN-kood", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Palun sisesta oma kasutajanimi", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Palun järgi veebilehel olevaid juhiseid ja klõpsi nuppu Edasi.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privaatsus", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Avalikud vestlusrühmad", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Avalik võti", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Avalikud jututoad", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Avalik kogukond", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Tõukereeglid", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Põhjus", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Salvestan", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} muutis sündmust", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Muuda sõnumit", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registreeru", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Lükka tagasi", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} lükkas kutse tagasi", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Liitu uuesti", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Eemalda", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Eemalda kõik muud seadmed", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "{username} eemaldas sündmuse", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Eemalda seade", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Eemalda suhtluskeeld", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Eemalda sõnum", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Kustuta oma tunnuspilt", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Visualiseeri vormindatud sõnumite sisu", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Asenda jututoa senine versioon uuega", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Vasta", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Teata sõnumist", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Palu õigusi", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Palu õigust lugeda vanu sõnumeid", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Tühista kõik õigused", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Jututoa vesrioon on uuendatud", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Jututoa versioon", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Laupäev", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Salvestasin faili nimega {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Salvesta fail", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Salvesta fail sellesse kausta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Otsi", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Otsi vestlust", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Turvalisus", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Turvavõti", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Kas kaotasid turvavõtme?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Sõnumit nägi {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Sõnumit nägid {username} ja veel {count} kasutajat}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Sõnumit nägid {username} ja {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Saada", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Saada sõnum", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Saada tekstisõnumina", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Saada helifail", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Luba veateadete saatmist sentry.io vahendusel", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Saada fail", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Saada pilt", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Saada sõnumeid", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Saada fail muutmata kujul", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Saada kleeps", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Saada videofail", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} saatis faili", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} saatis helifaili", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} saatis pildi", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} saatis kleepsu", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} saatis video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} saatis teavet kõne kohta", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Teave sinu privaatsuse kohta: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessioon on verifitseeritud", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Seadista profiilipilt", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Määra põhinimeks", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Kohanda emotsioonitegevusi", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Seadista vestlusrühma kirjeldus", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Tee kutselink", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Seadista õigusi", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Määra olek", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Seadistused", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Jaga", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} jagas oma asukohta", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Jaga asukohta", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Näita salasõna", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Liitu", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Ühekordne sisselogimine", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Jäta vahele", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Heli, värin, LED-värvid", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Lähtekood", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Kogukond on avalik", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Kogukonna nimi", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} alustas kõnet", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Alusta oma esimest vestlust kohe nüüd 🙂\n- klõpsi nuppu „Uus vestlus“\n- skaneeri teise osapoole QR-koodi\n- ja lase vestlusel kulgeda", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Olek", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Kuidas sul täna läheb?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Saada", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Pühapäev", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sünkroniseerin andmeid… Palun oota.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Süsteem", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Verifitseerimiseks klõpsi seadme nime", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Pildi vaatamiseks klõpsi", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Menüü kuvamiseks puuduta", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Nad ei klapi omavahel", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Nad klapivad omavahel", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "See jututuba on arhiveeritud.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Neljapäev", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Muuda olekut lemmikuna", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Lülita summutamine sisse või välja", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Märgi loetuks / lugemata", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Liiga palju päringuid. Palun proovi hiljem uuesti!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Tõsta teisest seadmest", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Proovi uuesti saata", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Teisipäev", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Eemal", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} eemaldas ligipääsukeelu kasutajalt {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Eemalda seadmelt blokeering", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Tundmatu seade", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Tundmatu krüptoalgoritm", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Tundmatu sündmuse tüüp „{type}“", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Tundmatu sessioon, palun tee talle verifitseerimine", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Krüpti lahti oma vestluste varukoopia", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Lõpeta vestluse vaigistamine", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Eemalda klammerdus", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 lugemata vestlus} other{{unreadCount} lugemata vestlust}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 lugemata sõnum} other{{unreadEvents} lugemata sõnumit}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Kas kasutame AMOLED-tehnoloogiaga ühilduvaid värve?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} ja {count} muud kirjutavad…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} ja {username2} kirjutavad…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} kirjutab…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} lahkus vestlusest", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Kasutajanimi", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Kasutaja on verifitseerimata", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} saatis {type} sündmuse", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Kasutaja verifitseerimisolek on teadmata", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Kasutaja on verifitseeritud", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Verifitseeritud", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sessiooni verifitseerimine õnnestus!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verifitseeri", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifitseeri käsitsi", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Alusta verifitseerimist", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Sinu verifitseerimine õnnestus!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verifitseerin teist kasutajakontot", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifitseeri kasutajat", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videokõne", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Vestluse ajaloo nähtavus", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Nähtav kõikidele osalejatele", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Nähtav kõikidele", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Häälsõnum", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Ootan, et teine osapool nõustuks päringuga…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Ootan teise osapoole kinnitust, et tegemist on samade emojidega…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Ootan teise osapoole kinnitust, et tegemist on samade numbritega…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Taustapilt", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Hoiatus!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Läbiv krüptimine on parasjagu beetatestimise faasis! Kasuta seda omal vastutusel!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Kolmapäev", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Tere tulemast kasutama kõige vahvamat sõnumiklienti Matrix'i võrgus.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Me saatsime sulle e-kirja", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Erinevatele kasutajatele lubatud toimingud", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kes võivad selle vestlusrühmaga liituda", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Miks sa soovid sellest teatada?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Kas kustutame sinu vestluste varukoopia ja loome uue taastamiseks mõeldud krüptovõtme?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Nende e-posti aadresside abil saad taastada oma salasõna.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Kirjuta üks sõnum…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Jah", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Sina", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Sa oled kutsutud osalema selles vestluses", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Sa enam ei osale selles vestluses", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Sa ei saa endale kutset saata", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Sinule on selles vestluses seatud suhtluskeeld", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Sünkroniseerin sinu vestlusi…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Sinu oma kasutajanimi", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Sinu avalik võti", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Sinu ühendus on koduserveriga {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Suumi sisse", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Suumi välja", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Eemaldasime vestluse kogukonnast", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Lisasime vestluse kogukonda", - "@chatHasBeenAddedToThisSpace": {}, - "addToSpace": "Lisa kogukonda", - "@addToSpace": {}, - "scanQrCode": "Skaneeri QR-koodi", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Sisesta kutse link käsitsi...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Jaga oma kutselinki", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Lihtsalt skaneeri QR-koodi või kui te pole kõrvuti, siis jaga kutse linki.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Saada sõnum sisestusklahvi vajutusel", - "@sendOnEnter": {}, - "homeserver": "Koduserver", - "@homeserver": {}, - "serverRequiresEmail": "See koduserver eeldab registreerimisel kasutatava e-postiaadressi kinnitamist.", - "@serverRequiresEmail": {}, - "newUsernameDescription": "Sinu Matrix'i kasutajatunnus saab olema vormingus @kasutajanimi:koduserver", - "@newUsernameDescription": {}, - "newPasswordDescription": "Selleks, et saaksid vajadusel oma salasõna taastada, peaksid hiljem lisama oma kasutajakontole e-posti aadressi.", - "@newPasswordDescription": {}, - "enableMultiAccounts": "(KATSELINE) Pruugi selles seadmes mitut Matrix'i kasutajakontot", - "@enableMultiAccounts": {}, - "bundleName": "Köite nimi", - "@bundleName": {}, - "removeFromBundle": "Eemalda sellest köitest", - "@removeFromBundle": {}, - "addToBundle": "Lisa köitesse", - "@addToBundle": {}, - "editBundlesForAccount": "Muuda selle kasutajakonto köiteid", - "@editBundlesForAccount": {}, - "addAccount": "Lisa kasutajakonto", - "@addAccount": {}, - "oneClientLoggedOut": "Üks sinu klientrakendustest on Matrix'i võrgust välja loginud", - "@oneClientLoggedOut": {}, - "link": "Link", - "@link": {}, - "setupChatBackup": "Võta kasutusele vestluste varundus", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Panin krüptovõtme kirja", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Sinu vestluste varundus on seadistatud.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Et sinu sõnumid ei oleks võõrastele loetavad, me genereerisime taastamiseks mõeldud krüptovõtme.\nPalun hoia seda turvalises kohas, näiteks salasõnade halduris.", - "@setupChatBackupDescription": {}, - "yourUserId": "Sinu kasutajatunnus:", - "@yourUserId": {}, - "unverified": "Verifitseerimata", - "@unverified": {}, - "repeatPassword": "Korda salasõna", - "@repeatPassword": {}, - "pleaseEnterValidEmail": "Palun sisesta kehtiv e-posti aadress.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Salasõnad ei klapi omavahel!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "Palun vali pikkuseks vähemalt {min} tähemärki.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageInfo": "Sõnumi teave", - "@messageInfo": {}, - "time": "Kellaaeg", - "@time": {}, - "messageType": "Sõnumi tüüp", - "@messageType": {}, - "sender": "Saatja", - "@sender": {}, - "openGallery": "Ava galerii", - "@openGallery": {}, - "addToSpaceDescription": "Vali kogukond, kuhu soovid seda vestlust lisada.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Logi sisse ühe klõpsuga", - "@loginWithOneClick": {}, - "removeFromSpace": "Eemalda kogukonnast", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Järgnevaga eemaldad antud vestluse sellest kogukonnast. Vestlus on jätkuvalt leitav vaatest „Kõik vestlused“.", - "@removeFromSpaceDescription": {}, - "start": "Alusta", - "@start": {}, - "setupChatBackupNow": "Seadista oma vestluste varundus", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Salvesta turvavõti nüüd", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Kui soovid vestluste varundust kasutada, siis palun sisesta oma turvavõti, mille me varasemas sessioonis tegime. Turvavõti EI OLE sama kui salasõna.", - "@pleaseEnterSecurityKeyDescription": {}, - "commandHint_discardsession": "Loobu sessioonist", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_clearcache": "Tühjenda vahemälu", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_dm": "Alusta otsevestlust\nKrüptimise keelamiseks kasuta --no-encryption võtit", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_create": "Loo tühi vestlusrühm\nKrüptimise keelamiseks kasuta --no-encryption võtit", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "openVideoCamera": "Video salvestamiseks ava kaamera", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addDescription": "Lisa kirjeldus", - "@addDescription": {}, - "iUnderstand": "Ma mõistan", - "@iUnderstand": {}, - "replyHasBeenSent": "Vastus on saadetud", - "@replyHasBeenSent": {}, - "markAsRead": "Märgi loetuks", - "@markAsRead": {}, - "bubbleSize": "Jutumulli suurus", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "reportUser": "Teata kasutajast", - "@reportUser": {}, - "openChat": "Ava vestlus", - "@openChat": {}, - "editIntegrations": "Muuda vidinaid ja lõiminguid", - "@editIntegrations": {}, - "integrationsNotImplemented": "Vidinate ja lõimingute muutmine pole veel võimalik.", - "@integrationsNotImplemented": {}, - "matrixWidgets": "Matrix'i vidinad", - "@matrixWidgets": {}, - "dismiss": "Loobu", - "@dismiss": {}, - "reactedWith": "{sender} reageeris nii {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Emotikonid", - "@emojis": {}, - "placeCall": "Helista", - "@placeCall": {}, - "unsupportedAndroidVersion": "See Androidi versioon ei ole toetatud", - "@unsupportedAndroidVersion": {}, - "voiceCall": "Häälkõne", - "@voiceCall": {}, - "confirmEventUnpin": "Kas sa oled kindel, et tahad klammerdatud sündmuse eemaldada?", - "@confirmEventUnpin": {}, - "pinnedEventsError": "Viga klammerdatud sõnumite laadimisel", - "@pinnedEventsError": {}, - "pinMessage": "Klammerda sõnum jututuppa", - "@pinMessage": {}, - "videoCallsBetaWarning": "Palun arvesta, et videokõned on veel beetajärgus. Nad ei pruugi veel toimida kõikidel platvormidel korrektselt.", - "@videoCallsBetaWarning": {}, - "emailOrUsername": "E-posti aadress või kasutajanimi", - "@emailOrUsername": {}, - "experimentalVideoCalls": "Katselised videokõned", - "@experimentalVideoCalls": {}, - "unsupportedAndroidVersionLong": "See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OS'i kasutada.", - "@unsupportedAndroidVersionLong": {}, - "nextAccount": "Järgmine kasutajakonto", - "@nextAccount": {}, - "separateChatTypes": "Eraldi vestlused, jututoad ja kogukonnad", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "editWidgets": "Muuda vidinaid", - "@editWidgets": {}, - "errorAddingWidget": "Vidina lisamisel tekkis viga.", - "@errorAddingWidget": {}, - "widgetNameError": "Palun sisesta kuvatav nimi.", - "@widgetNameError": {}, - "addWidget": "Lisa vidin", - "@addWidget": {}, - "previousAccount": "Eelmine kasutajakonto", - "@previousAccount": {}, - "widgetUrlError": "See pole korrektne URL.", - "@widgetUrlError": {}, - "widgetName": "Nimi", - "@widgetName": {}, - "widgetCustom": "Kohandatud", - "@widgetCustom": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetEtherpad": "Märkmed ja tekstid", - "@widgetEtherpad": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "switchToAccount": "Pruugi kasutajakontot # {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "youAcceptedTheInvitation": "Sa võtsid kutse vastu", - "@youAcceptedTheInvitation": {}, - "youUnbannedUser": "Sa eemaldasid suhtluskeelu kasutajalt {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Sa oled tühistanud kutse kasutajale {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youBannedUser": "Sa seadsid suhtluskeelu kasutajale {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youJoinedTheChat": "Sa liitusid vestlusega", - "@youJoinedTheChat": {}, - "youKickedAndBanned": "Sa müksasid välja kasutaja {user} ning seadsid talle suhtluskeelu", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "showDirectChatsInSpaces": "Näita kogukonnasga seotud otsevestlusi", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyPrivacyWarning": "Palun arvesta, et sinu jutustuste lugejad näevad üksteist ning saavad üksteisega suhelda. Lood ise on loetavad vaid 24 tunni jooksul, kuid mitte miski ei taga, et nad kustutatakse kõikidest seadmetest ja serveritest.", - "@storyPrivacyWarning": {}, - "thisUserHasNotPostedAnythingYet": "See kasutaja pole ühtegi jutustust veel avaldanud", - "@thisUserHasNotPostedAnythingYet": {}, - "storyFrom": "Lugu {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Palun arvesta, et sinu jutustuste lugejad näevad üksteist ning saavad üksteisega suhelda.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Mis toimub?", - "@whatIsGoingOn": {}, - "youRejectedTheInvitation": "Sa lükkasid kutse tagasi", - "@youRejectedTheInvitation": {}, - "youKicked": "Sa müksasid välja kasutaja {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Sa saatsid kutse kasutajale {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "{user} saatis sulle kutse", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "addToStory": "Lisa jutustusele", - "@addToStory": {}, - "publish": "Avalda", - "@publish": {}, - "whoCanSeeMyStories": "Kes näeb minu jutustusi?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Loobu jutustuste tellimusest", - "@unsubscribeStories": {}, - "yourStory": "Sinu jutustused", - "@yourStory": {}, - "showSpaces": "Näita kogukondade loendit", - "@showSpaces": {}, - "noEmailWarning": "Palun sisesta korrektne e-posti aadress. Vastasel juhul ei saa te oma salasõna taastada. Kui te seda ei soovi, siis jätkamiseks klõpsige nuppu uuesti.", - "@noEmailWarning": {} -} diff --git a/assets/l10n/intl_eu.arb b/assets/l10n/intl_eu.arb deleted file mode 100644 index 4938aa5ff3..0000000000 --- a/assets/l10n/intl_eu.arb +++ /dev/null @@ -1,2850 +0,0 @@ -{ - "@@locale": "eu", - "@@last_modified": "2021-08-14 12:41:10.062383", - "about": "Honi buruz", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Ados", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username}-(e)k gonbidapena onartu du", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Kontua", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Kontuaren informazioa", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}(e)k puntuz puntuko zifraketa gaitu du", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Gehitu taldearen deskribapena", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administratzailea", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "ezizena", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Baduzu kontu bat?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName}-(e)k deia erantzun du", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Edonor batu daiteke", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Artxibatu", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Artxibatutako gelak", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Ba al dute batzeko baimenik erabiltzaile gonbidatuek?", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ziur al zaude?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Mesedez sar ezazu zure biltegiratze segururako pasaesaldia edo berreskuratze gakoa katxean gakoak gordetzeko.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Beste pertsona ziurtatzeko, mesedez, sartu zure biltegiratze segururako pasaesaldia edo berreskuratze gakoa.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Zure saioa egiaztatzeko, mesedez sar ezazu zure biltegiratze segururako pasaesaldia edo berreskuratze gakoa.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "{username}-(r)en egiaztatze eskaera onartu?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autentifikazioa", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Profileko irudia aldatua izan da", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Berriketa debekatu", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Debekatuta", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username}-(e)k {targetName} debekatu du", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Gailua blokeatu", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Gakoak ongi gorde dira", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Utzi", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username}-(e)k berriketako irudia aldatu du", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username}(e)k txataren deskribapena aldatu du: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username}-(e)k berriketaren izena '{chatname}'-(e)ra aldatu du", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username}-(e)k berriketaren baimenak aldatu ditu", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username}(e)k bere izena aldatu du. Aurrerantzean '{displayname}' izango da", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username}-(e)k gonbidatuen sarbide arauak aldatu ditu", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username}(e)k gonbidatuen arauak aldatu ditu: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username}-(e)k historiaren ikusgarritasuna aldatu du", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username}-(e)k historiaren ikusgarritasuna {rules}-(e)ra aldatu du", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username}-(e)k batze arauak aldatu ditu", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username}-(e)k batzeko arauak {joinRules}-(e)ra aldatu ditu", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username}-(e)k profileko irudia aldatu du", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username}-(e)k gelaren ezizena aldatu du", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username}-(e)k gonbidapen esteka aldatu du", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Aldaketen erregistroa", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Aldaketak gorde dira", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Aldatu zerbitzaria", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Aldatu itxura", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Taldearen izena aldatu", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Aldatu zerbitzaria", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Atzekaldea aldatu", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Enkriptatzea hondatu egin da", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Berriketa", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Berriketaren xehetasunak", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Aukera ezazu pasahitz sendo bat", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Aukera ezazu erabiltzaile izen bat", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Itxi", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Konparatu eta egiazta ezazu ondorengo emojiak beste gailukoaren berdinak direla:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Konparatu eta egiazta ezazu ondorengo zenbakiak beste gailukoaren berdinak direla:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Baieztatu", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Konektatu", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Konektatze saiakerak huts egin du", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontaktua taldera gonbidatua izan da", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Eduki ikustailea", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Arbelera kopiatua", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopiatu", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Ezin izan da mezua deszifratu: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Ezin izan da irudia ezarri", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Ezin izan da bistaratze-izena ezarri", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} partaide", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Sortu", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Sortu kontua orain", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}-(e)k berriketa sortu du", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Talde berria sortu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Sinadura gurutzatua desgaituta dago", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Zeharkako sinadura piztuta", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Unean aktibo", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Iluna", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}/{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}/{month}/{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "delete": "Ezabatu", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Ezabatu mezua", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Ukatu", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Gailua", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "Gailuak", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Baztertu irudia", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Pantaila-izena aldatu da", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Egin dohaintza", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Deskargatu fitxategia", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Moldatu ezizena", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Moldatu Jitsi zerbitzaria", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotea dagoeneko existitzen da!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Emotearen laburdura ez da baliogarria!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emote ezarpenak", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emote laburdurak", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Emote laburdura eta irudi bat aukeratu behar dituzu!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Hutsik dago", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Ezingo duzu zifraketa desgaitu. Ziur zaude?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "Zifraketa", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Zifraketa algoritmoa", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Zifraketa ez dago gaituta", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Puntuz puntuko zifraketaren ezarpenak", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName}(e)k deia amaitu du", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Idatzi talderako izena", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Idatzi erabiltzailea", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Idatzi zure zerbitzaria", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "Fitxategiaren izena", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Fitxategiaren tamaina", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Berbidali", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Ostirala", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "sartzeaz", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "gonbidapenaz", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Taldea", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Taldearen deskribapena", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Taldearen deskribapena moldatu da", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Taldea publikoa da", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "{displayname} duen taldea", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gonbidatuak debekatuta daude", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gonbidatuak sar daitezke", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username}(e)k {targetName}(r)en gonbidapena baliogabetu du", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Laguntza", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Zerbitzaria ez da bateragarria", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "IDa", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Nortasuna", - "@identity": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Pasahitza edo segurtasun gakoa ez da zuzena", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Gonbidatu kontaktua", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Gonbidatu kontaktua {groupName}(e)ra", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Gonbidatuta", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username}(e)k {targetName} gonbidatu du", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Gonbidatutako erabiltzaileak solik", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username}(e)k FluffyChatera gonbidatu zaitu.\n1. Instala ezazu FluffyChat: https://fluffychat.im\n2. Eman ezazu izena edo hasi ezazu saioa\n3. Ireki ezazu gonbidapen esteka: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Zuzena al da ondorengo gailuaren gakoa?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "idazten ari da…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} txatera sartu da", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Sartu gelara", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Gakoak cachean daude", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Gakoak falta dira", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}(e)k {targetName} kaleratu du", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username}(e)k {targetName} kaleratu eta debekua ezarri dio", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Kaleratu txatetik", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Azkenekoz aktibo: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Azkenekoz ikusitako IPa", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Duela denbora luze", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Irten", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Txatetik irten da", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Lizentzia", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Argia", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Kargatu {count} partehartzaile gehiago", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Kargatzen… Mesedez, itxaron.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Kargatu gehiago…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Hasi saioa", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Hasi saioa {homeserver}(e)n", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Amaitu saioa", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Bilakatu moderatzaile", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Bilakatu administratzaile", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Egiaztatu identifikazioa baliozkoa dela", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Mezua partehartzaile guztientzat ezabatuko da", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderatzailea", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Astelehena", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Mututu txata", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Mesedez, kontuan izan Pantalaimon behar duzula oraingoz puntuz puntuko zifraketarako.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Mezu berria FluffyChaten", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Egiaztaketa eskaera berria!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "no": "Ez", - "@no": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChatek une honetan ez du gaituta zeharkako-sinadura. Mesedez, gaitu ezazu Element-en ezarpenetan.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Ez da emoterik aurkitu. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Dirudienez ez daukazu Googleren zerbitzurik zure mugikorrean. Primerako erabakia zure pribatutasunerako! FluffyChaten jakinarazpenak jasotzeko https://microg.org/ edo https://unifiedpush.org/ erabiltzea gomendatzen dugu.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Mesedez, gaitu gakoen online babeskopia Elementen ezarpenetan.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Bat ere ez", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Baimenik ez", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Ez da gelarik aurkitu…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Ez dago weberako gaituta", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} aukeratuta", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "ok": "Ados", - "@ok": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Gakoen online babeskopia ez dago gaituta", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Gakoen online babeskopia gaituta dago", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Hara, zerbaitek huts egin du…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Ireki aplikazioa mezuak irakurtzeko", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Ireki kamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Hautazkoa) Taldearen izena", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Partehartzaileen gailuak", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "pasahitza edo berreskuratzeko gakoa", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Pasahitza", - "@password": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Aukeratu irudi bat", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Iltzatu", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Abiarazi {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Mesedez, aukeratu goitizen bat", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Mesedez, idatzi Matrix ID bat.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Mesedez, idatzi zure pasahitza", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Mesedez, idatzi zure erabiltzaile-izena", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Gela publikoak", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "Grabatzen", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username}(e)k gertaera bat izkutatu du", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Baztertu", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username}(e)k gonbidapena baztertu du", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Sartu berriro", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Kendu", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Kendu gainerako gailuak", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "{username}(e)k kendu du", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Kendu gailua", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Baimendu txatean", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Kendu mezua", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Kargatu mezu aberatseko edukia", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Erantzun", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Eskatu baimena", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Eskatu mezu zaharragoak irakurri ahal izatea", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Kendu baimen guztiak", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Gela eguneratu da", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Larunbata", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Bilatu txat bat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username}(e)k ikusi du", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndUser": "{username}(e)k eta {username2}(e)k ikusi dute", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Bidali", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Bidali mezua", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Bidali audioa", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Gaitu erroreen berri sentry.io bidez ematea", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Bidali fitxategia", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Bidali irudia", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Bidali jatorrizkoa", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Bidali bideoa", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username}(e)k fitxategia bidali du", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username}(e)k audioa bidali du", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username}(e)k irudia bidali du", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username}(e)k stickerra bidali du", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username}(e)k bideoa bidali du", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName}(e)k deiaren informazioa bidali du", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Zure pribatutasunari buruzko informazioa: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Saioa egiaztatu da", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Ezarri profileko irudia", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Ezarri taldeko deskribapena", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Ezarri gonbidapen esteka", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Ezarri egoera", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Ezarpenak", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Partekatu", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username}(e)k kokapena partekatu du", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Eman izena", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Saltatu", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Iturburu kodea", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName}(e)k deia hasi du", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Hasi zure lehen txata oraintxe bertan! 🙂\n- Ttap 'Txat berria'n\n- Eskaneatu lagun baten QR kodea\n- Dibertitu txateatzen", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Zer moduz zaude gaur?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Bidali", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Igandea", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Sakatu menua ikusteko", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Ez datoz bat", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Bat datoz", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Gela hau artxibatu da.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Osteguna", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Saia zaitez berriro bidaltzen", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Asteartea", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username}(e)k {targetName} baimendu du", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Desblokeatu gailua", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Gailu ezezaguna", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Zifraketa-algoritmo ezezaguna", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "'{type}' gertaera ezezaguna", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Saio ezezaguna; mesedez, egiaztatu", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Kendu mozala txatari", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Kendu iltzea", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "useAmoledTheme": "Erabili AMOLEDekin bateragarriak diren koloreak?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} eta beste {count} idazten ari dira…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} eta {username2} idazten ari dira…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} idazten ari da…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} txatetik irten da", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Erabiltzaile izena", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username}(e)k {type} gertaera bat bidali du", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Arrakastaz egiaztatu da saioa!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Egiaztatu", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Eskuz egiaztatu", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Abiarazi egiaztaketa", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Arrakastaz egiaztatu duzu!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Beste kontua egiaztatzen", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Egiaztatu erabiltzailea", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Bideo-deia", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Txat-historiaren ikusgarritasuna", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Partehartzaile guztientzat ikusgai", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Edonorentzat ikusgai", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Ahozko mezua", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Bikotearen zain eskaera onartu dezan…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Bikotearen zain emojia onartu dezan…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Bikotearen zain zenbakia onartu dezan…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Horma-irudia", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Puntuz puntuko zifraketa Beta fasean dago!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Asteazkena", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Ongi etorri Matrix sareko bat-bateko mezularitza programa moñoñoenera.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Nork duen baimena talde honetan sartzeko", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Idatzi mezua…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Bai", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Zeu", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Txat honetara gonbidatu zaituzte", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Ez duzu txat honetan parte hartzen honezkero", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Ezin duzu zure burua gonbidatu", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Txat honetan debekatu zaituzte", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Zure erabiltzaile propioa", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Talde publikoak", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Editatu gelako goitizenak", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "chats": "Txatak", - "@chats": { - "type": "text", - "placeholders": {} - }, - "emojis": "Emojiak", - "@emojis": {}, - "placeCall": "Egin deia", - "@placeCall": {}, - "voiceCall": "Ahozko deia", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Android bertsioarekin arazoa", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "Funtzio honek Android bertsio berriago bat behar du. Mesedez, egiaztatu eguneraketan dauden eta begiratu Lineage OS-ek zure gailuarentzat aukerarik eskaintzen duen.", - "@unsupportedAndroidVersionLong": {}, - "commandHint_ban": "Debekatu erabiltzailea gela honetan", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "Ezabatu cachea", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Sortu taldeko-gela huts bat\nErabili --no-encyption zifratzea desgaitzeko", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_op": "Zehaztu erabiltzaile honen botere-maila (lehenetsia: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Bidali formaturik gabeko testua", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Bidali erantzuna erreakzioa bailitzan", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Bidali testua", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "createNewSpace": "Gune berria", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Ezeztatu eta ez galdetu berriro", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Moldatu blokeatutako zerbitzariak", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Moldatu txat-baimenak", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Moldatu gelaren avatarra", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Zifratuta", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Idatzi helbide elektroniko bat", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Idatzi gunerako izena", - "@enterASpacepName": {}, - "homeserver": "Zerbitzaria", - "@homeserver": {}, - "errorObtainingLocation": "Errorea kokapena lortzerakoan: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Dena prest!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Izugarri iraingarria", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Joan gela berrira", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "friends": "Lagunak", - "@friends": { - "type": "text", - "placeholders": {} - }, - "groups": "Taldeak", - "@groups": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Izkutatu ezabatutakoak", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Izkutatu gertaera ezezagunak", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Niretzako gonbidapenak", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Helbide elektronikoa ez da baliogarria", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "shareYourInviteLink": "Partekatu gonbidapen esteka", - "@shareYourInviteLink": {}, - "noStatusesFound": "Ez da egoerarik aurkitu oraingoz.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Kontu honentzat gaitutako jakinarazpenak", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count} erabiltzaile idazten ari dira…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "notifications": "Jakinarazpenak", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "Zure gailuetako batek saioa itxi du", - "@oneClientLoggedOut": {}, - "addAccount": "Gehitu kontua", - "@addAccount": {}, - "editBundlesForAccount": "Moldatu kontu honetarako sortak", - "@editBundlesForAccount": {}, - "oopsPushError": "Hara! Zoritxarrez, errore bat gertatu da jakinarazpenak ezartzerakoan.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Mesedez, aukeratu", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Gorde fitxategia", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Single Sign on", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Soinua, dardara, LED kolorea", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{irakurri gabeko txat 1} other {{unreadCount} txat irakurri gabe}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{irakurri gabeko txat bat} other {{unreadEvents} mezu irakurri gabe}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "userNotVerified": "Erabiltzailea ez da egiaztatu", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Erabiltzailearen egiaztaketa egoera ezezaguna da", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Ulertzen dut", - "@iUnderstand": {}, - "videoCallsBetaWarning": "Mesedez, kontuan izan bideo deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.", - "@videoCallsBetaWarning": {}, - "toggleMuted": "Piztu / Itzali mututuak", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Gelditu", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Zure storya", - "@yourStory": {}, - "replyHasBeenSent": "Erantzuna bidali da", - "@replyHasBeenSent": {}, - "all": "Guztia", - "@all": { - "type": "text", - "placeholders": {} - }, - "loginWithOneClick": "Hasi saioa klik bakarrarekin", - "@loginWithOneClick": {}, - "next": "Hurrengoa", - "@next": { - "type": "text", - "placeholders": {} - }, - "storyFrom": "{date}ko storya:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Mesedez, kontuan izan jendeak bata bestea ikusi eta harremanetan jar daitekeela zure storyan.", - "@whoCanSeeMyStoriesDesc": {}, - "experimentalVideoCalls": "Bideo-dei esperimentalak", - "@experimentalVideoCalls": {}, - "emailOrUsername": "ePosta edo erabiltzaile-izena", - "@emailOrUsername": {}, - "enableMultiAccounts": "(BETA) Gaitu kontu bat baino gehiago gailu honetan", - "@enableMultiAccounts": {}, - "openVideoCamera": "Ireki kamera bideorako", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "removeFromBundle": "Kendu sorta honetatik", - "@removeFromBundle": {}, - "serverRequiresEmail": "Zerbitzari honek zure posta elektronikoa egiaztatu behar du izena eman dezazun.", - "@serverRequiresEmail": {}, - "or": "Edo", - "@or": { - "type": "text", - "placeholders": {} - }, - "link": "Esteka", - "@link": {}, - "privacy": "Pribatutasuna", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Izkutatu mezua", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Eman izena", - "@register": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Mesedez, jarrai itzazu webguneko argibideak eta sakatu Hurrengoa.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "reason": "Zergatia", - "@reason": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Salatu mezua", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "status": "Egoera", - "@status": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Zure txatak sinkronizatzen ari dira…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Zure gako publikoa", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Urrundu", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "messageType": "Mezu mota", - "@messageType": {}, - "time": "Ordua", - "@time": {}, - "dismiss": "Baztertu", - "@dismiss": {}, - "matrixWidgets": "Matrixen widgetak", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Oraindik ez da posible widget eta integrazioak moldatzea.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Moldatu widget eta integrazioak", - "@editIntegrations": {}, - "switchToAccount": "Aldatu {number} kontura", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "previousAccount": "Aurreko kontua", - "@previousAccount": {}, - "edit": "Moldatu", - "@edit": { - "type": "text", - "placeholders": {} - }, - "mention": "Aipamena", - "@mention": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Zertan zabiltza?", - "@whatIsGoingOn": {}, - "addDescription": "Gehitu deskribapena", - "@addDescription": {}, - "passwordsDoNotMatch": "Pasahitzak ez datoz bat!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Mesedez, idatzi baliozko ePosta helbide bat.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Berridatzi pasahitza", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Mesedez, aukeratu gutxienez {min} karaktere.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "addEmail": "Gehitu eposta", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Ziur zaude saioa amaitu nahi duzula?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopiatu arbelera", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ez ikusia egindako erabiltzaileak", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "security": "Segurtasuna", - "@security": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Gerturatu", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Abiarazi", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatikoki abiarazi sticker eta emote animatuak", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "sendOnEnter": "Bidali enter sakatuz", - "@sendOnEnter": {}, - "badServerVersionsException": "Zerbitzariak ondorengo ezaugarriak onartzen ditu:\n{serverVersions}\nBaina aplikazioak hauek baino ez: {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "botMessages": "Boten mezuak", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Ezin da {uri} URIa ireki", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Aldatu gailuaren izena", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Aldatu pasahitza", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Aldatu avatarra", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Zure erabiltzaile IDa:", - "@yourUserId": {}, - "chatBackup": "Txataren babeskopia", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Zure txaten babeskopiek segurtasun-gako batekin daude babestuta. Mesedez, ez ezazu gako hori galdu.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Txata gune honetara gehitu da", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Txata gune honetatik kendu da", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Konfiguratu txata", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Edukia zerbitzariko administrariei jakinarazi zaie", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Kideen aldaketak", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Gako publikoa", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Gune publikoa", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Ezarri goitizen nagusi bezala", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Ezarri neurrira egindako emoteak", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "appLock": "Aplikazioaren blokeoa", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Gehitu gunera", - "@addToSpace": {}, - "allChats": "Txat guztiak", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Gehitu lagun berria", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Zerbitzariak ondorengo aukerak ditu saioa hasteko:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "bubbleSize": "Puxiken tamaina", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "commandHint_dm": "Hasi txat zuzen bat\nErabili --no-encryption zifratzea desgaitu nahi baduzu", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_leave": "Utzi gela hau", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "blocked": "Blokeatuta", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "commandInvalid": "Komandoa ez da baliogarria", - "@commandInvalid": { - "type": "text" - }, - "commandHint_myroomnick": "Ezarri izengoiti bat gela honetarako", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "ignore": "Ezikusi", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "erabiltzaile izena dauka", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "pantaila-izena dauka", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Kokapen zerbitzuak ez daude gaituta. Mesedez, gaitu itzazu zure kokapena partekatu ahal izateko.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "directChats": "Txat zuzenak", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Gaitu zifraketa", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ezikusi erabiltzailea", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Estekan sakatu dut", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Oraindik ez duzu pasahitza berreskuratzeko modurik gehitu.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "typeInInviteLinkManually": "Eskuz idatzi gonbidapen esteka…", - "@typeInInviteLinkManually": {}, - "online": "Linean", - "@online": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Push arauak", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Mesedez, idatzi lau zenbaki edo utzi hutsik aplikazioa babestu nahi ez baduzu.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Ordezkatu gela bertsio berriago batekin", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "search": "Bilatu", - "@search": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Sakatu gailu batean egiaztatzeko", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Helbide hauekin pasahitza berreskuratu dezakezu.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Zergatik salatu nahi duzu?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "videoWithSize": "Bideoa ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "removeFromSpaceDescription": "Honek txata uneko gunetik kenduko du. Ikusgai egoten jarraituko du \"Txat guztiak\" atalean.", - "@removeFromSpaceDescription": {}, - "openGallery": "Ireki galeria", - "@openGallery": {}, - "storyPrivacyWarning": "Mesedez, kontuan izan jendeak bata bestea ikus dezakeela eta bata bestearekin harremanetan jar daitekeela. Zure storya 24 orduz egongo da ikusgai baina ezin da ziurtatu gailu eta zerbitzari guztietatik ezabatuko denik denbora pasatakoan.", - "@storyPrivacyWarning": {}, - "pinMessage": "Iltzatu gelan", - "@pinMessage": {}, - "reactedWith": "{sender}(e)k {reaction}(r)ekin erreakzionatu du", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "confirmEventUnpin": "Ziur zaude gertaerari iltzea kendu nahi diozula?", - "@confirmEventUnpin": {}, - "moreEvents": "{count,plural, =1{gertaera 1 gehiago} other {{count} gertaera gehiago}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "nextAccount": "Hurrengo kontua", - "@nextAccount": {}, - "markAsRead": "Markatu irakurrita gisa", - "@markAsRead": {}, - "iWroteDownTheKey": "Idatzi dut gakoa", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Txaten babeskopiak ezarri dira.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Mezuak babestearren, sagurtasun gako bat sortu dugu zuretzat.\nMesedez, gorde ezazu toki seguru batean, pasahitz-kudeatzaile batean adibidez.", - "@setupChatBackupDescription": {}, - "clearArchive": "Ezabatu artxiboa", - "@clearArchive": {}, - "clearText": "Ezabatu testua", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "commandHint_html": "Bidali testua HTML formatuan", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Gonbidatu erabiltzailea gela honetara", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Sartu gela horretara", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Kendu erabiltzaile hori gela honetatik", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_me": "Deskriba zaitez", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Ezarri irudi bat gela honetarako (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_unban": "Baimendu erabiltzailea gela honetan", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandMissing": "{command} ez da komandoa.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandHint_discardsession": "Baztertu saioa", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "setupChatBackup": "Ezarri txaten babeskopiak", - "@setupChatBackup": {}, - "deactivateAccountWarning": "Honek zure kontua desaktibatuko du. Ezin da desegin! Ziur zaude?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Lehenetsitako botere-maila", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Ezabatu kontua", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Gailuaren IDa", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Zifraketa segurua da soilik gailu guztiak egiaztatu badira.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "discover": "Deskubritu", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Diskubritu taldeak", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emote sortak gelarako", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Gaitu txat babeskopiak sarbidea inoiz gal ez dezazun.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Gaitu emote sorta txat guztietarako", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Letraren tamaina", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Zenbaterainoko iraingarria da eduki hau?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Molestatzen zaituzten erabiltzaileak ez ikusi ditzakezu. Ez dituzu beraien mezurik jasoko edota gonbidapenik, ezikusitako pertsonen zerrendatik.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Ez da iraingarria", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Kokapen baimena ukatu da. Mesedez, eman ezazu zure kokapena partekatzeko.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "messages": "Mezuak", - "@messages": { - "type": "text", - "placeholders": {} - }, - "newChat": "Txat berria", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Ez dago konexiorik zerbitzariarekin", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Ez dago deskribapenik", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Zifraketa aktiba dezakezu soilik gela publikoa ez bada.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} ez da matrix zerbitzari bat, {server2} erabili nahi duzu haren ordez?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "createNewChatExplaination": "QR kodea eskaneatu edota elkarren ondoan ez bazaudete, partekatu gonbidapen esteka.", - "@createNewChatExplaination": {}, - "scanQrCode": "Eskaneatu QR kodea", - "@scanQrCode": {}, - "newPasswordDescription": "Pasahitza berreskuratu ahal izateko, posta elektroniko bat gehitu beharko zenuke zure kontuan.", - "@newPasswordDescription": {}, - "newUsernameDescription": "Zure erabiltzaile IDak honako formatua izango du: @erabiltzailea:zerbitzaria", - "@newUsernameDescription": {}, - "noPublicRoomsFound": "Ez da gela publikorik aurkitu…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Kokapena lortzen…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Iraingarria", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Lineaz kanpo", - "@offline": { - "type": "text", - "placeholders": {} - }, - "addToBundle": "Gehitu sortara", - "@addToBundle": {}, - "bundleName": "Sortaren izena", - "@bundleName": {}, - "openInMaps": "Ireki mapen aplikazioan", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "participant": "Partehartzailea", - "@participant": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Ahaztu zait pasahitza", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Pasahitza aldatu da", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Pasahitzaren berreskurapena", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Jendea", - "@people": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Mesedez, aukeratu kode bat", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Mesedez, sakatu epostako estekan eta ondoren jarraitu.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Mesedez, idatzi zure babes-gakoa:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Mesedez, idatzi zure zenbakia", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Kendu zure avatarra", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Gelaren bertsioa", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Fitxategia {filename} izenarekin gorde da", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFileToFolder": "Gorde fitxategia hemen", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Segurtasun gakoa", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Galdu al duzu segurtasun gakoa?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{{username}(e)k eta beste {count}(e)k ikusi dute}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "sendAsText": "Bidali testu bezala", - "@sendAsText": { - "type": "text" - }, - "sendMessages": "Bidali mezuak", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Bidali stickerra", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Ezarri baimen maila", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Partekatu kokapena", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Erakutsi pasahitza", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Gunea publikoa da", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Gunearen izena", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sinkronizatzen… Mesedez, itxaron.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Sakatu irudia ikusteko", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Piztu / Itzali gogokoa", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Markatu irakurrita / irakurri gabe gisa", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Eskaera gehiegi. Mesedez, saia zaitez geroago!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Beste gailu batetik transferitu", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Ez dago eskuragai", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Desblokeatu txataren babeskopia", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Erabiltzailea egiaztatu da", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "Egiaztatu gabe", - "@unverified": {}, - "verified": "Egiaztatuta", - "@verified": { - "type": "text", - "placeholders": {} - }, - "warning": "Kontuz!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "ePosta bat bidali dizugu", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Nork egin dezakeen zer", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Ezabatu txataren babeskopia segurtasun-gako berria sortzeko?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "{homeserver}(e)ra konektatuko zara", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "messageInfo": "Mezuaren xehetasunak", - "@messageInfo": {}, - "sender": "Igorlea", - "@sender": {}, - "removeFromSpace": "Kendu gunetik", - "@removeFromSpace": {}, - "addToSpaceDescription": "Aukeratu gune bat txat hau gehitzeko.", - "@addToSpaceDescription": {}, - "start": "Hasi", - "@start": {}, - "setupChatBackupNow": "Ezarri txaten babeskopia orain", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Txaten babeskopiak desblokeatzeko, mesedez, idatzi aurreko saioan sortutako segurtasun-gakoa. Segurtasun-gakoa EZ da zure pasahitza.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Gorde segurtasun-gakoa orain", - "@saveTheSecurityKeyNow": {}, - "addToStory": "Gehitu storyra", - "@addToStory": {}, - "publish": "Argitaratu", - "@publish": {}, - "whoCanSeeMyStories": "Nork ikus ditzazke nire storyak?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Storyak jasotzeari utzi", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Erabiltzaile honek oraindik ez du ezer argitaratu bere storyetan", - "@thisUserHasNotPostedAnythingYet": {}, - "reportUser": "Salatu erabiltzailea", - "@reportUser": {}, - "openChat": "Ireki txata", - "@openChat": {}, - "pinnedEventsError": "Errorea iltzatutako mezua kargatzerakoan", - "@pinnedEventsError": {}, - "addWidget": "Gehitu widgeta", - "@addWidget": {}, - "showSpaces": "Erakutsi guneen zerrenda", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Erakutsi zerikusia duten Mezu Zuzenak Taldeetan", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "editWidgets": "Editatu widgetak", - "@editWidgets": {}, - "widgetVideo": "Bideoa", - "@widgetVideo": {}, - "widgetEtherpad": "Testu-oharra", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Neurrira egindakoa", - "@widgetCustom": {}, - "widgetName": "Izena", - "@widgetName": {}, - "youJoinedTheChat": "Txatera sartu zara", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Gonbidapena onartu duzu", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "{user}(r)i debekua ezarri diozu", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "{user}(r)i luzatutako gonbidapena baliogabetu duzu", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "{user}(e)k gonbidatu zaitu", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "{user} gonbidatu duzu", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "{user} kanporatu duzu", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "{user} kanporatu eta debekua ezarri diozu", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "{user}(r)i debekua kendu diozu", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youRejectedTheInvitation": "Gonbidapena baztertu duzu", - "@youRejectedTheInvitation": {}, - "separateChatTypes": "Bereizi Mezu Zuzenak, Taldeak eta Guneak", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "widgetUrlError": "Ez da baliozko URL bat.", - "@widgetUrlError": {}, - "widgetNameError": "Mesedez, ezarri/zehaztu izen publiko bat.", - "@widgetNameError": {}, - "errorAddingWidget": "Errorea widgeta gehitzerakoan.", - "@errorAddingWidget": {} -} diff --git a/assets/l10n/intl_fa.arb b/assets/l10n/intl_fa.arb deleted file mode 100644 index b2eb103403..0000000000 --- a/assets/l10n/intl_fa.arb +++ /dev/null @@ -1,122 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:10.061080", - "pleaseChooseAtLeastChars": "لطفاً حداقل {min} تا نماد‌ انتخاب بده.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "repeatPassword": "رمز عبور را تکرار بده", - "@repeatPassword": {}, - "about": "درباره", - "@about": { - "type": "text", - "placeholders": {} - }, - "passwordsDoNotMatch": "این رمز‌های عبور مطابقه ندارند!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "لطفاً یک آدرس ایمیل معتبر وارد کن.", - "@pleaseEnterValidEmail": {}, - "accept": "بپذیر", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} دعوت را پذیرفت", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "حساب", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "اطلاعات حساب", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "به اسپاش اضافه کن", - "@addToSpace": {}, - "appLock": "قفل برنامه", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "all": "همه", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "همه اتاق‌ها", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "addEmail": "ایمیل اضافه کن", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "توضیحات گروه اضافه کن", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "دوست جدید اضافه کن", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "قبلاً حساب دارید؟", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} زنگ زدن را جواب کرد", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "بایگانی", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "اتاق بایگانی شده", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "مطمئن هستید؟", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خروج شوید؟", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "مکث", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "نمایش", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_fi.arb b/assets/l10n/intl_fi.arb deleted file mode 100644 index 8cca2bae80..0000000000 --- a/assets/l10n/intl_fi.arb +++ /dev/null @@ -1,2845 +0,0 @@ -{ - "passwordsDoNotMatch": "Salasanat eivät täsmää!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Syötä kelvollinen sähköpostiosoite.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Salasana uudelleen", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Käytä vähintään {min} merkkiä.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "about": "Tietoa FluffyChatista", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Hyväksy", - "@accept": { - "type": "text", - "placeholders": {} - }, - "account": "Tili", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Tilitiedot", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} hyväksyi kutsun", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "activatedEndToEndEncryption": "{username} otti käyttöön päästä-päähän salauksen", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "archive": "Arkisto", - "@archive": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Voidaksesi allekirjoittaa toisen henkilön, syötä turvavaraston salalause tai palautusavain.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Lisää sähköpostiosoite", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Lisää ryhmän kuvaus", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Lisää uusi ystävä", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Lisää Spaceen", - "@addToSpace": {}, - "admin": "Ylläpitäjä", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Kaikki", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Kaikki keskustelut", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Onko sinulla jo tunnus?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} vastasi puheluun", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Kuka tahansa voi liittyä", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Sovelluksen lukitus", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arkistoitu huone", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Sallitaanko vieraiden liittyminen", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Haluatko varmasti kirjautua ulos?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Oletko varma?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Toista animoidut tarrat ja emojit automaattisesti", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Profiilikuva vaihdettu", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Syötä turvavaraston salalause tai palautusavain varmistaaksesi istuntosi.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Hyväksytäänkö tämä varmennuspyyntö käyttäjältä {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Keskeytä", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Toista", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Tunnistaminen", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Lähetä painamalla rivinvaihtonäppäintä", - "@sendOnEnter": {}, - "badServerVersionsException": "Kotipalvelin tukee Matrix Spec versio(it)a:\n{serverVersions}, mutta tämä sovellus tukee vain versio(it)a {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerLoginTypesException": "Tämä kotipalvelin tukee sisäänkirjautumistapoja: \n{serverVersions},\nmutta tämä sovellus tukee vain -tapoja: \n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Anna porttikielto keskusteluun", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Porttikiellossa", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} antoi porttikiellon käyttäjälle {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Estä laite", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Estetty", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bottien lähettämät viestit", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cancel": "Peruuta", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Vaihda laitteen nimeä", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} muutti keskustelun kuvaa", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatNameTo": "{username} asetti keskustelun nimeksi: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheDisplaynameTo": "{username} asetti näyttönimekseen: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} muutti vieraspääsyn sääntöjä", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} asetti vieraspääsyn säännö(i)ksi: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} muutti historian näkyvyyttä", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} asetti historian näkymissäännöksi: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} muutti liittymissääntöjä", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} asetti liittymissäännöiksi: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} vaihtoi profiilikuvaansa", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} muutti kutsulinkkiä", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Muutosloki", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Vaihda salasana", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Muutokset on tallennettu", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Avaimet ovat välimuistissa", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "changedTheRoomAliases": "{username} muutti huoneen aliaksia", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "cantOpenUri": "URI-osoitetta {uri} ei voida avata", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changedTheChatDescriptionTo": "{username} asetti keskustelun kuvaukseksi: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatPermissions": "{username} muutti keskustelun oikeuksia", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeTheme": "Vaihda tyyliäsi", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Käyttäjätunnuksesi:", - "@yourUserId": {}, - "setupChatBackup": "Aseta keskustelun varmuuskopiointi", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Kirjoitin avaimen paperille", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Keskustelujesi varmuuskopiointi on asetettu.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "Keskustelun varmuuskopiointi", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Keskustelujesi varmuskopio on suojattu turva-avaimella. Varmistathan ettet hävitä sitä.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Keskustelun tiedot", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Keskustelu on lisätty tähän Spaceen", - "@chatHasBeenAddedToThisSpace": {}, - "chats": "Keskustelut", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Valitse vahva salasana", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "clearText": "Tyhjennä teksti", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Sulje", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_html": "Lähetä HTML-muotoiltua tekstiä", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_ban": "Anna syötetylle käyttäjälle porttikielto tähän huoneeseen", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_invite": "Kutsu syötetty käyttäjä tähän huoneeseen", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_leave": "Poistu tästä huoneesta", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_myroomavatar": "Aseta profiilikuvasi tähän huoneeseen (syöttämällä mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Aseta näyttönimesi vain tässä huoneessa", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Aseta käyttäjän voimataso (oletus: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Lähetä muotoilematonta tekstiä", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Lähetä vastaus reaktiona", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "create": "Luo", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Luo tunnus nyt", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} loi keskustelun", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Luo uusi ryhmä", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Uusi Space", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Aktiivinen nyt", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Tämä poistaa tunnuksesi käytöstä. Tätä ei voi kumota! Oletko varma?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Oikeuksien oletustaso", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Poista", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Poista tunnus", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Poista viesti", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Kieltäydy", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Laite", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Laite-ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Laitteet", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Salaus on turvallinen vain kaikkien laitteiden ollessa varmennettuja.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Suorat keskustelut", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Hylkää kuva", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Löydä", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Löydä ryhmiä", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Näyttönimi on vaihdettu", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Lahjoita", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Peruuta äläkä kysy uudelleen", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Lataa tiedosto", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Muokkaa", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Muokkaa estettyjä palvelimia", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Muokkaa keskustelun oikeuksia", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Muokkaa näyttönimeä", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Muokkaa Jitsi-instanssia", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Muokkaa huoneen aliaksia", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Muokkaa huoneen profiilikuvaa", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emote on jo olemassa!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Epäkelpo emote-lyhytkoodi", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Huoneen emote-paketit", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emote-asetukset", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emote-lyhytkoodi", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Emote-lyhytkoodi ja kuva on valittava!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Tyhjä keskustelu", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Et voi poistaa salausta myöhemmin. Oletko varma?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Salausalgoritmi", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Salaus ei ole käytössä", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Päästä-päähän-salauksen asetukset", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} päätti puhelun", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAUsername": "Syötä käyttäjätunnus", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Syötä sähköposti-osoite", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Syötä huoneen nimi", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Kotipalvelin", - "@homeserver": {}, - "enterYourHomeserver": "Syötä kotipalvelimesi", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Virhe paikannuksessa: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Kaikki on valmista!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Erittäin loukkaavaa", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Tiedostonimi", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Tiedostokoko", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Alkaen liittymisestä", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Alkaen kutsumisesta", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Mene uuteen huoneeseen", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Ryhmä", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Ryhmän kuvaus", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Ryhmän kuvaus muutettu", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Ryhmä on julkinen", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Ryhmät", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Ryhmä seuralaisina {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Vieraat on kielletty", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Vieraat voivat liittyä", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} on perunnut käyttäjän {targetName} kutsun", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Apua", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Piilota poistetut tapahtumat", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Piilota tuntemattomat tapahtumat", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Kotipalvelin ei ole yhteensopiva", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Kuinka loukkaavaa tämä sisältö on?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identiteetti", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Jätä huomioitta", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Huomiotta jätetyt käyttäjät", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Voit jättää sinulle häiriöksi olevat käyttäjät huomioitta. Et pysty vastaanottamaan viestejä tai huonekutsuja henkilökohtaisella huomioimatta jättämislistallasi olevilta käyttäjiltä.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Jätä käyttäjätunnus huomioitta", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Epäkelpo sähköposti-osoite", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Kutsu yhteystieto", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "invited": "Kutsuttu", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} kutsui käyttäjän {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Vain kutsutut käyttäjät", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Kutsu minua varten", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} kutsui sinutFluffyChattiin. \n1. Asenna FluffyChat osoitteesta: https://fluffychat.im \n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "keysMissing": "Avaimet puuttuvat", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} potki käyttäjän {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} potki ja antoi porttikiellon käyttäjälle {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Potki keskustelusta", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Aktiivinen viimeksi: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Viimeksi nähty IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Nähty kauan sitten", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Poistu", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Poistui keskustelusta", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Lisenssi", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Vaalea", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadingPleaseWait": "Ladataan... Hetkinen.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Lataa vielä {count} osallistujaa", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadMore": "Lataa lisää…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Sijaintipalvelut ovat poissa käytöstä. Otathan ne käyttöön jakaaksesi sijaintisi.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "SIjaintioikeus on estetty. Myönnäthän sen jakaaksesi sijaintisi.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Kirjaudu sisään", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Kirjaudu sisään palvelimelle {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWithOneClick": "Kirjaudu sisään yhdellä klikkauksella", - "@loginWithOneClick": {}, - "logout": "Kirjaudu ulos", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Tee valvojaksi", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Tee ylläpitäjäksi", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Varmista tunnisteen kelvollisuus", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "mention": "Mainitse", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Viestit", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Viesti poistetaan kaikilta osallistujilta", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Valvoja", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "maanantaina", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, other{{count} tapahtumaa lisää}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Vaienna keskustelu", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "newChat": "Uusi keskustelu", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Uusi viesti FluffyChätissä", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Uusi varmennuspyyntö!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Seuraava", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Ei", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Ei yhteyttä palvelimeen", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Ei kuvausta", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Voit ottaa salauksen käyttöön vasta kun huone ei ole julkisesti liityttävissä.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} ei ole Matrix-palvelin, käytetäänkö {server2} sen sijaan?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "createNewChatExplaination": "Skannaa QR-koodi tai jaa kutsulinkkisi jos ette ole vierekkäin.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Jaa kutsulinkkisi", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Kirjoita kutsulinkki käsin...", - "@typeInInviteLinkManually": {}, - "scanQrCode": "Skannaa QR-koodi", - "@scanQrCode": {}, - "none": "Ei yhtään", - "@none": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "Voidaksesi palauttaa salasanasi myöhemmin, lisääthän tunnuksellesi myöhemmin sähköposti-osoitteen.", - "@newPasswordDescription": {}, - "newUsernameDescription": "Käyttäjätunnuksellasi tulee olemaan muoto @käyttäjätunnus:palvelinnimi", - "@newUsernameDescription": {}, - "noPasswordRecoveryDescription": "Et ole vielä lisännyt tapaa salasanasi palauttamiseksi.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Huoneita ei löytynyt…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Tiloja ei löytynyt vielä.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Ilmoitukset", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Ei tuettu verkkoversiossa", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} valittu", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} käyttäjää kirjoittavat…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Paikannetaan sijantia…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Loukkaava", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Poissa verkosta", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Linjoilla", - "@online": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kopioitu leikepöydälle", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopioi", - "@copy": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Vaihda taustakuva", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Vaihda profiilikuvasi", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Ristiinvarmennus on käytössä", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "chat": "Keskustelu", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Valitse käyttäjätunnus", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Tyhjennä arkisto", - "@clearArchive": {}, - "forward": "Edelleenlähetä", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friends": "Ystävät", - "@friends": { - "type": "text", - "placeholders": {} - }, - "commandHint_join": "Liity syötettyyn huoneeseen", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_me": "Kuvaile itseäsi", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "compareEmojiMatch": "Vertaile ja varmista emojien olevan samat molemmilla laitteilla:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Vahvista", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Yhteysyritys epäonnistui", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Sisältää käyttäjätunnuksen", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Näyttönimen asettaminen ei onnistunut", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} osallistujaa", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "crossSigningDisabled": "Ristiinvarmennus ei ole käytössä", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Vaihda kotipalvelinta", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Vaihda ryhmän nimeä", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Vaihda palvelinta", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Salaus on korruptoitunut", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "setupChatBackupDescription": "Suojellaksemme viestejäsi olemme luoneet sinulle turva-avaimen.\nPidäthän tätä turvallisessa paikassa, kuten salasanamanagerissasi.", - "@setupChatBackupDescription": {}, - "chatHasBeenRemovedFromThisSpace": "Keskustelu on poistettu tästä Spacesta", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "commandHint_kick": "Poista syötetty käyttäjä huoneesta", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_unban": "Poista syötetyn käyttäjän porttikielto tästä huoneesta", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandMissing": "{command} ei ole komento.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandHint_send": "Lähetä tekstiä", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandInvalid": "Epäkelvollinen komento", - "@commandInvalid": { - "type": "text" - }, - "compareNumbersMatch": "Vertaile ja varmista numeroiden olevan samat molemmilla laitteilla:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Määritä keskustelu", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "connect": "Yhdistä", - "@connect": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Yhteystieto on kutsuttu ryhmään", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Sisältää näyttönimen", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Sisältö on ilmoitettu palvelimen ylläpitäjille", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopioi leikepöydälle", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Viestin salausta ei voitu purkaa: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Profiilikuvan asetus ei onnistunut", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Salattu", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Salaus", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Syötä Spacen nimi", - "@enterASpacepName": {}, - "inoffensive": "Loukkaamatonta", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Kutsu yhteystieto ryhmään {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "isDeviceKeyCorrect": "Onko seuraava laiteavain oikea?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "kirjoittaa…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Sisällön katselin", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Ota emote-paketti käyttöön kaikkialla", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tumma", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Ottaa keskustelun varmuuskopioinnin käyttöön, jottet koskaan menetä pääsyä keskusteluihisi.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Ota salaus käyttöön", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Fonttikoko", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "friday": "perjantaina", - "@friday": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Olen klikannut linkkiä", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Virheellinen salasana tai palautusavain", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} liittyi keskusteluun", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "keysCached": "Avaimet ovat välimuistissa", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat ei toistaiseksi tue ristiinvarmennuksen käyttöönottoa. Otathan sen käyttöön Elementistä.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Otathan verkkoavainvarmuuskopion käyttöön Elementistä.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Tämän tunnuksen ilmoitukset ovat käytössä", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Liity huoneeseen", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Jäsenmuutoksia", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Tiedäthän tarvitsevasi toistaiseksi Pantalaimonin käyttääksesi päästä-päähän-salausta.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Emoteja ei löytynyt. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Julkisia huoneita ei löytynyt…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Vaikuttaa siltä, ettei puhelimessasi ole Google-palveluita. Se on hyvä päätös yksityisyytesi kannalta! Vastaanottaaksesi push-notifikaatioita FluffyChätissä suosittelemme https://microg.org/ tai https://unifiedpush.org/ käyttämistä.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Ei lupaa", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "enableMultiAccounts": "(BETA) Ota käyttöön tuki usealle tilille tällä laitteella", - "@enableMultiAccounts": {}, - "onlineKeyBackupDisabled": "Verkkoavainvarmuuskopio on pois käytöstä", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Verkkkoavainvarmuuskopio on käytössä", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Hups! Valitettavasti push-ilmoituksia käyttöönotettaessa tapahtui virhe.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Hups, jotakin meni pieleen…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Avaa sovellus lukeaksesi viestit", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Avaa kamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "Yksi tunnuksistasi on kirjattu ulos", - "@oneClientLoggedOut": {}, - "addAccount": "Lisää tili", - "@addAccount": {}, - "editBundlesForAccount": "Muokkaa tämän tilin kääröjä", - "@editBundlesForAccount": {}, - "addToBundle": "Lisää kääreeseen", - "@addToBundle": {}, - "removeFromBundle": "Poista tästä kääreestä", - "@removeFromBundle": {}, - "bundleName": "Kääreen nimi", - "@bundleName": {}, - "openInMaps": "Avaa kartoissa", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "or": "Tai", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Osallistuja", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Osallistuvat käyttäjän laitteet", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "password": "Salasana", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Salasana on vaihdettu", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Salasanan palautus", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Ihmiset", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Valitse kuva", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Kiinnitä", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Toista {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Valitse", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Valitse pääsykoodi", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Valitse käyttäjätunnus", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Klikkaa linkkiä sähköpostissa ja sitten jatka.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Syötä 4 numeroa tai jätä tyhjäksi poistaaksesi sovelluksen lukituksen.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Syötä PIN-koodisi", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Syötä käyttäjätunnuksesi", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Seuraa ohjeita verkkosivulla ja paina seuraava.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Yksityisyys", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Julkiset ryhmät", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Julkinen avain", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "recording": "Tallenne", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} poisti tapahtuman", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Poista viesti", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Rekisteröidy", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Hylkää", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} hylkäsi kutsun", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Liity uudelleen", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Poista", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Poista kaikki muut laitteet", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Poistanut {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Poista laite", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Poista porttikielto keskusteluun", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Poista viesti", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Kadonnut turva-avain?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{Nähnyt {username} ja {count} muuta}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "securityKey": "Turva-avain", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Nähnyt {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendAMessage": "Lähetä viesti", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndUser": "Nähnyt {username} ja {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Lähetä", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Lähetä tekstinä", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Lähetä ääniviesti", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Salli bugiraporttien lähettäminen sentry.io -palvelun kautta", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Lähetä tiedosto", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Lähetä kuva", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Lähetä viestejä", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Lähetä alkuperäinen", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Istunto on varmennettu", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Aseta profiilikuva", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Aseta pääalias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Aseta mukautetut emotet", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Aseta ryhmän kuvaus", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Aseta kutsulinkki", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Aseta oikeustasot", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Aseta tila", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Asetukset", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Jaa", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} jakoi sijaintinsa", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "singlesignon": "Kertakirjautuminen", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Ohita", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Ääni, värinä, LEDin väri", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Lähdekoodi", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Space on julkinen", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Spacen nimi", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "status": "Tila", - "@status": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synkronoidaan... Hetkinen.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Järjestelmä", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Napauta laitetta varmistaaksesi", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Napauta näyttääksesi kuvan", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Ne eivät täsmää", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Ne täsmäävät", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Tämä huone on arkistoitu.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "torstaina", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Mykistetty-kytkin", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Liikaa pyyntöjä. Yritä myöhemmin uudelleen!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Merkitse lukemattomaksi/luetuksi", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Siirrä toiselta laitteelta", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Yritä uudelleenlähettämistä", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} poisti käyttäjän {targetName} porttikiellon", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Poista laitteen esto", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Tuntematon laite", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Tuntematon salausalgoritmi", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Tuntematon tapahtuma '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 lukematon viesti} other{{unreadEvents} lukematonta viestiä}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Käytetäänkö AMOLED-yhteensopivia värejä?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} ja {count} muuta kirjoittavat…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} ja {username2} kirjoittavat…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} kirjoittaa…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} poistui keskustelusta", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "timeOfDay": "{hours24}.{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "userSentUnknownEvent": "{username} lähetti {type}-tapahtuman", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userVerified": "Käyttäjä on varmistettu", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "Varmistamaton", - "@unverified": {}, - "verified": "Varmistettu", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Aloita varmennus", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Varmensit onnistuneesti!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Varmistetaan toista tunnusta", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Keskusteluhistorian näkyvyys", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Näkyy kaikille osallistujille", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Näkyy kaikille", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Ääniviesti", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Odotetaan kumppanin varmistavan pyynnön…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Odotetaan kumppanin hyväksyvän emojit…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Odotetaan kumppanin hyväksyvän numerot…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Taustakuva", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Varoitus!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Päästä-päähän salaus on toistaiseksi Beta-vaiheessa! Käytä omalla vastuullasi!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "keskiviikkona", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Lähetimme sinulle sähköpostia", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Tervetuloa Matrix-verkon söpöimpään pikaviestimeen.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Kuka voi suorittaa minkä toimenpiteen", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kenen on sallittua liittyä ryhmään", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Miksi haluat ilmoittaa tämän?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Pyyhi keskusteluvarmuuskopio luodaksesi uuden turva-avaimen?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Näillä osoitteilla voit palauttaa salasanasi.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Sinut on kutsuttu tähän keskusteluun", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Et enää osallistu tähän keskusteluun", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Et voi kutsua itseäsi", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Sinulle on annettu porttikielto tähän keskusteluun", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Keskustelujasi synkronoidaan…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Sinut yhdistetään palvelimeen {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomOut": "Loitonna", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "removeFromSpace": "Poista Spacesta", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Tämä poistaa keskustelun nykyisestä Spacesta. Se tulee yhä näkymään kategoriassa \"Kaikki keskustelut\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Valitse Space, jonne tämä keskustelu lisätään.", - "@addToSpaceDescription": {}, - "start": "Aloita", - "@start": {}, - "setupChatBackupNow": "Määritä keskusteluvarmuuskopiosi nyt", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Avataksesi keskusteluvarmuuskopiosi, syötä turva-avain, joka luotiin edellisessä istunnossa. Turva-avaimesi EI OLE salasanasi.", - "@pleaseEnterSecurityKeyDescription": {}, - "serverRequiresEmail": "Tämän palvelimen täytyy tarkistaa sähköposti-osoitteesi rekisteröitymistä varten.", - "@serverRequiresEmail": {}, - "unknownSessionVerify": "Tuntematon istunto, varmennathan sen", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Istunto varmennettu onnistuneesti!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Huoneen versio", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "sentCallInformations": "{senderName} lähetti puhelutiedot", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "unavailable": "Ei saatavilla", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Syötä turva-avaimesi:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Hae keskustelua", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "verify": "Varmista", - "@verify": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Vapaaehtoinen) ryhmän nimi", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "salalause tai palautusavain", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Syötä salasanasi", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Huone on päivitetty", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "lauantaina", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "Hae", - "@search": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} lähetti tiedoston", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} lähetti ääniviestin", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "link": "Linkki", - "@link": {}, - "passwordForgotten": "Salasana unohtunut", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Syötä Matrix-ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Poista profiilikuvasi", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Renderöi rikas-viestisisältö", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Vastaa", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Ilmoita viesti", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Pyydä lupaa", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Pyydä vanhempien viestien lukemista", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Tallenna tiedosto", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "security": "Turvallisuus", - "@security": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Lähetä tarra", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "signUp": "Rekisteröidy", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Julkiset huoneet", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Julkinen Space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Push-säännöt", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Syy", - "@reason": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Korvaa huone uudemmalla versiolla", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Mitätöi kaikki oikeudet", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Tallennettu nimellä {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFileToFolder": "Tallenna tiedosto tähän kansioon", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Lähetä video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAPicture": "{username} lähetti kuvan", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} lähetti tarran", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} lähetti videon", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentryInfo": "Tietoa yksityisyydestäsi: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Jaa sijainti", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Näytä salasana", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Aloita ensimmäinen juttelusi juuri nyt! 🙂\n- Paina 'Uusi keskustelu'\n- Skannaa ystävän QR-koodi\n- Pidä hauskaa jutustellen", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Millainen on vointisi?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "sunday": "sunnuntaina", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 lukematon keskustelu} other{{unreadCount} lukematonta keskustelua}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "videoCall": "Videopuhelu", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "sender": "Lähettäjä", - "@sender": {}, - "startedACall": "{senderName} aloitti puhelun", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "submit": "Lähetä", - "@submit": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Napauta näyttääksesi valikon", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Suosikki-kytkin", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "tuesday": "tiistaina", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Avaa keskustelun varmuuskopion lukitus", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Poista keskustelun mykistys", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Poista kiinnitys", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "time": "Aika", - "@time": {}, - "messageType": "Viestin tyyppi", - "@messageType": {}, - "username": "Käyttäjätunnus", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Käyttäjä ei ole varmennettu", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Käyttäjän varmistus on tuntemattomassa tilassa", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Varmista manuaalisesti", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Varmista käyttäjä", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Kirjoita viesti…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Kyllä", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Sinä", - "@you": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Oma käyttäjätunnuksesi", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Julkinen avaimesi", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Lähennä", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "messageInfo": "Viestin tiedot", - "@messageInfo": {}, - "openGallery": "Avaa galleria", - "@openGallery": {}, - "saveTheSecurityKeyNow": "Tallenna turva-avain nyt", - "@saveTheSecurityKeyNow": {}, - "commandHint_clearcache": "Tyhjennä välimuisti", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Luo tyhjä ryhmäkeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "Aloita yksityiskeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "yourStory": "Sinun tarinasi", - "@yourStory": {}, - "replyHasBeenSent": "Vastaus on lähetetty", - "@replyHasBeenSent": {}, - "storyFrom": "Tarina ajalta {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "commandHint_discardsession": "Hylkää istunto", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "openVideoCamera": "Avaa kamera videokuvausta varten", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "whoCanSeeMyStoriesDesc": "Huomaathan, että ihmiset voivat nähdä ja olla yhteydessä toisiinsa tarinassasi.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Lisää tarinaan", - "@addToStory": {}, - "publish": "Julkaise", - "@publish": {}, - "whoCanSeeMyStories": "Kuka voi nähdä tarinani?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Poista tarinoiden tilaus", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Tämä käyttäjä ei ole vielä julkaissut mitään tarinassaan", - "@thisUserHasNotPostedAnythingYet": {}, - "iUnderstand": "Ymmärrän", - "@iUnderstand": {}, - "storyPrivacyWarning": "Huomaathan ihmisten pystyvän näkemään ja olemaan yhteydessä toisiinsa tarinassasi. Tarinasi tulevat olemaan näkyvissä 24 tuntia, mutta niiden poistamisesta kaikilta laitteilta ja palvelimilta ei ole takeita.", - "@storyPrivacyWarning": {}, - "whatIsGoingOn": "Mitä on meneillään?", - "@whatIsGoingOn": {}, - "addDescription": "Lisää kuvaus", - "@addDescription": {}, - "markAsRead": "Merkitse luetuksi", - "@markAsRead": {}, - "dismiss": "Hylkää", - "@dismiss": {}, - "bubbleSize": "Kuplan koko", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "emojis": "Hymiöt", - "@emojis": {}, - "unsupportedAndroidVersionLong": "Tämä ominaisuus vaatii uudemman Android-version. Tarkista päivitykset tai LineageOS-tuki.", - "@unsupportedAndroidVersionLong": {}, - "unsupportedAndroidVersion": "Ei tuettu Android-versio", - "@unsupportedAndroidVersion": {}, - "reportUser": "Ilmianna käyttäjä", - "@reportUser": {}, - "voiceCall": "Äänipuhelu", - "@voiceCall": {}, - "videoCallsBetaWarning": "Huomaathan videopuheluiden ovan beta-asteella. Ne eivät ehkä toimi odotetusti tai toimi ollenkaan kaikilla alustoilla.", - "@videoCallsBetaWarning": {}, - "placeCall": "Soita", - "@placeCall": {}, - "matrixWidgets": "Matrix-pienoisohjelmat", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Pienoisohjelmien ja integraatioiden muokkaus ei vielä ole mahdollista.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Muokkaa pienoisohjelmia ja integraatioita", - "@editIntegrations": {}, - "reactedWith": "{sender} reagoi {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "openChat": "Avaa Keskustelu", - "@openChat": {}, - "pinMessage": "Kiinnitä huoneeseen", - "@pinMessage": {}, - "pinnedEventsError": "Virhe ladattaessa kiinnitettyjä viestejä", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Haluatko varmasti irrottaa tapahtuman pysyvästi?", - "@confirmEventUnpin": {}, - "editWidgets": "Muokkaa pienoissovelluksia", - "@editWidgets": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Mukautettu", - "@widgetCustom": {}, - "widgetName": "Nimi", - "@widgetName": {}, - "widgetUrlError": "Epäkelvollinen URL.", - "@widgetUrlError": {}, - "errorAddingWidget": "Virhe lisättäessä pienoissovellusta.", - "@errorAddingWidget": {}, - "nextAccount": "Seuraava tili", - "@nextAccount": {}, - "switchToAccount": "Siirry tilille {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "experimentalVideoCalls": "Kokeelliset videopuhelut", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Sähköposti-osoite tai käyttäjätunnus", - "@emailOrUsername": {}, - "previousAccount": "Edellinen tili", - "@previousAccount": {}, - "widgetEtherpad": "Tekstimuotoinen muistiinpano", - "@widgetEtherpad": {}, - "widgetNameError": "Syötä näyttönimi.", - "@widgetNameError": {}, - "addWidget": "Lisää pienoissovellus", - "@addWidget": {}, - "showSpaces": "Näytä Space-luettelo", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Näytä Spaceihin kuuluvat suorat keskustelut niissä", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youRejectedTheInvitation": "Kieltäydyit kutsusta", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "Liityit keskusteluun", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Hyväksyit kutsun", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "Annoit porttikiellon käyttäjälle {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Olet perunut kutsun käyttäjälle {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "{user} kutsui sinut", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Poistit käyttäjän {user} keskustelusta", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Kutsuit käyttäjän {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Poistit ja annoit porttikiellon käyttäjälle {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Poistit käyttäjän {user} porttikiellon", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "separateChatTypes": "Erota suorat keskustelut, ryhmät ja Spacet", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "noEmailWarning": "Syötä oikea sähköposti-osoite. Muutoin et voi palauttaa salasanaasi. Jollet halua, paina näppäintä uudelleen jatkaaksesi.", - "@noEmailWarning": {} -} diff --git a/assets/l10n/intl_fr.arb b/assets/l10n/intl_fr.arb deleted file mode 100644 index f9b8fbb749..0000000000 --- a/assets/l10n/intl_fr.arb +++ /dev/null @@ -1,2860 +0,0 @@ -{ - "@@locale": "fr", - "@@last_modified": "2021-08-14 12:41:10.051787", - "about": "À propos", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Accepter", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} a accepté l'invitation", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Compte", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informations sur le compte", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} a activé le chiffrement de bout en bout", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Ajouter un courriel", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Ajouter une description au groupe", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Ajouter un·e nouvel·le ami·e", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Ajouter à l'espace", - "@addToSpace": {}, - "admin": "Administrateur", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "adresse", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Tout", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Toutes les discussions", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Vous avez déjà un compte ?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} a répondu à l'appel", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Tout le monde peut rejoindre", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Verrouillage de l’application", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archiver", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Salon archivé", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Les invités peuvent-i·e·ls rejoindre", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Êtes-vous sûr·e ?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Voulez-vous vraiment vous déconnecter ?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Veuillez saisir la phrase de passe de votre trousseau sécurisé ou votre clé de récupération pour mettre vos clés en cache.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Pour pouvoir faire signer l'autre personne, veuillez entrer la phrase de passe de votre trousseau sécurisé ou votre clé de récupération.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Veuillez saisir la phrase de passe de votre trousseau sécurisé ou votre clé de récupération pour vérifier votre session.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Accepter cette demande de vérification de la part de {username} ?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Lire", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authentification", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Lire automatiquement les autocollants et les émojis animés", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "L'image de profil a été changée", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Le serveur d'accueil prend en charge les types de connexion :\n{serverVersions}\nMais cette application ne prend en charge que :\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Le serveur d'accueil prend en charge les versions des spécifications :\n{serverVersions}\nMais cette application ne prend en charge que {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Bannir de la discussion", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Banni", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} a banni {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloquer l'appareil", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bloqué", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Messages de bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Clés mises en cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Annuler", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Impossible d'ouvrir l'URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Modifier le nom de l'appareil", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} a changé l'image de la discussion", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} a changé la description de la discussion en : '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} a renommé la discussion en : '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} a changé les permissions de la discussion", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} a changé son nom en : '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} a changé les règles d'accès à la discussion pour les invités", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} a changé les règles d'accès à la discussion pour les invités en : {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} a changé la visibilité de l'historique de la discussion", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} a changé la visibilité de l'historique de la discussion en : {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} a changé les règles d'accès à la discussion", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} a changé les règles d'accès à la discussion en : {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} a changé son avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} a changé les adresses du salon", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} a changé le lien d'invitation", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Journal des modifications", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Changer de mot de passe", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Les changements ont été sauvegardés", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Changer le serveur d'accueil", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Changez votre style", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Changer le nom du groupe", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Changer de serveur", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Changer l'image de fond", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Changer votre avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Le chiffrement a été corrompu", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Discussion", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Sauvegarde des discussions", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "La sauvegarde de votre discussion est sécurisée par une clé de sécurité. Veillez à ne pas la perdre.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Détails de la discussion", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "La discussion a été ajoutée à cet espace", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "La discussion a été retirée de cet espace", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "Discussions", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Choisissez un mot de passe fort", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Choisissez un nom d'utilisateur·ice", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Effacer les archives", - "@clearArchive": {}, - "clearText": "Effacer le texte", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Fermer", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Bannir l'utilisateur/trice donné(e) de ce salon", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Envoyer du texte au format HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Inviter l'utilisateur/trice donné(e) dans ce salon", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Rejoindre le salon donné", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Supprime l'utilisateur/trice donné(e) de ce salon", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Quitter ce salon", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Décrivez-vous", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Définir votre image pour ce salon (par mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Définir votre nom d'affichage pour ce salon", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Définir le niveau de puissance de l'utilisateur/trice donné(e) (par défaut : 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Envoyer du texte non formaté", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Envoyer une réponse en tant que réaction", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Envoyer du texte", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Débannir l'utilisateur/trice donné(e) de ce salon", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Commande invalide", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} n'est pas une commande.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Comparez les emojis suivants avec ceux de l'autre appareil et assurez-vous qu'ils correspondent :", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Comparez les chiffres suivants avec ceux de l'autre appareil et assurez-vous qu'ils correspondent :", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configurer la discussion", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirmer", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Se connecter", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Tentative de connexion echouée", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Le contact a été invité au groupe", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Contient un nom d'affichage", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contient un nom d'utilisateur·ice", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Le contenu a été signalé aux administrateurs du serveur", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visionneuse de contenu", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copié dans le presse-papier", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copier", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copier dans le presse-papiers", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Impossible de déchiffrer le message : {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Impossible de changer d'image de profil", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Impossible de changer de nom d'affichage", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participant(s)", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Créer", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Créer un compte", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} a créé la discussion", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Créer un nouveau groupe", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nouvel espace", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "La signature croisée est désactivée", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "La signature croisée est activée", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Actif en ce moment", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Sombre", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Cette opération va désactiver votre compte. Une fois cette action effectuée, aucun retour en arrière n'est possible ! Êtes-vous sûr·e ?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Niveau d'autorisation par défaut", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Supprimer", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Supprimer le compte", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Supprimer le message", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Refuser", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Appareil", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Identifiant de l'appareil", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Appareils", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Le chiffrement n'est sécurisé que lorsque tous les appareils ont été vérifiés.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Discussions directes", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Abandonner l'image", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Découvrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Découvrez des groupes", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Renommage effectué", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Faire un don", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Annuler et ne plus me redemander", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Télécharger le fichier", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Modifier", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Modifier les serveurs bloqués", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Modifier les permissions de la discussion", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Changer de nom d'affichage", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Changer d'instance Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Modifier les adresses du salon", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Modifier l'avatar du salon", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Cette émoticône existe déjà !", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Raccourci d'émoticône invalide !", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Packs d'émoticônes pour le salon", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Paramètre des émoticônes", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Raccourci de l'émoticône", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Vous devez sélectionner un raccourci d'émoticône et une image !", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Discussion vide", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Activez la sauvegarde des discussions pour ne jamais perdre l'accès à celles-ci.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Activer globalement le pack d'émoticônes", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Activer le chiffrement", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Vous ne pourrez plus désactiver le chiffrement. Êtes-vous sûr(e) ?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Chiffré", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Chiffrement", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algorithme de chiffrement", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Le chiffrement n'est pas activé", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Paramètres du chiffrement de bout en bout", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} a mis fin à l'appel", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Entrez un nom de groupe", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Saisissez une adresse de courriel", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Entrer un nom d'espace", - "@enterASpacepName": {}, - "enterAUsername": "Entrez un nom d'utilisateur·ice", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Renseignez votre serveur d'accueil", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Erreur lors de l'obtention de la localisation : {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Tout est prêt !", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extrêmement offensant", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nom du ficher", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Taille du fichier", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Taille de la police", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Transférer", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Vendredi", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Ami·e·s", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "À partir de l'entrée dans le salon", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "À partir de l'invitation", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Aller dans le nouveau salon", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Groupe", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Description du groupe", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "La description du groupe a été modifiée", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Le groupe est public", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Groupes", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Groupe avec {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Les invités ne peuvent pas rejoindre", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Les invités peuvent rejoindre", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} a annulé l'invitation de {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Aide", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Cacher les évènements supprimés", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Cacher les évènements inconnus", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Le serveur d'accueil n'est pas compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "À quel point ce contenu est-il offensant ?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "Identifiant", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identité", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorer", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Utilisateur·ices ignoré·es", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Vous pouvez ignorer les utilisateur·ices qui vous dérangent en les mettant dans votre liste à ignorer personnelle. Vous ne recevrez plus de messages ou d'invitations à participer à un salon de discussion de la part des utilisateur·ices figurant sur cette liste.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorer l'utilisateur·ice", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "J'ai cliqué sur le lien", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Phrase de passe ou clé de récupération incorrecte", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Non offensant", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Courriel invalide", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Inviter un contact", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Inviter un contact dans {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Invité·e", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} a invité {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Uniquement les utilisateur·ices invité·es", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Inviter pour moi", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} vous a invité·e sur FluffyChat. \n1. Installez FluffyChat : https://fluffychat.im \n2. Inscrivez-vous ou connectez-vous \n3. Ouvrez le lien d'invitation : {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "La clé de l'appareil ci-dessous est-elle correcte ?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "est en train d'écrire…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} a rejoint la discussion", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Rejoindre le salon", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Les clés sont mises en cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Les clés sont manquantes", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} a expulsé {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} a expulsé et banni {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Expulser de la discussion", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Vu·e pour la dernière fois : {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Dernière adresse IP utilisée", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Vu pour la dernière fois il y a longtemps", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Partir", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "A quitté la discussion", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licence", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Clair", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Charger {count} participant·es de plus", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Chargement… Veuillez patienter.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Charger plus…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Les services de localisation sont désactivés. Il est nécessaire de les activer avant de pouvoir partager votre localisation.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "L'application n'a pas la permission d'accéder à votre localisation. Merci de l'accorder afin de pouvoir partager votre localisation.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Se connecter", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Se connecter à {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Se connecter avec {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Se déconnecter", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Promouvoir comme modérateur·rice", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Promouvoir comme administrateur·ice", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Vérifiez que l'identifiant est valide", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Changements de membres", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Mentionner", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Messages", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Le message sera supprimé pour tous les participants", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Modérateur·rice", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Lundi", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 évènement en plus} other{{count} évènements en plus}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Mettre la discussion en sourdine", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Pour l'instant, vous avez besoin de Pantalaimon pour utiliser le chiffrement de bout en bout.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nouvelle discussion", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nouveau message dans FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nouvelle demande de vérification !", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Suivant", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Non", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Aucune connexion au serveur", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat ne prend pas encore en charge l'activation de la signature croisée. Veuillez l'activer depuis Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Pas de description", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Aucune émoticône trouvée. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Vous pouvez activer le chiffrement seulement quand le salon n'est plus accessible au public.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Il semble que vous n'ayez aucun service Google sur votre téléphone. C'est une bonne décision pour votre vie privée ! Pour recevoir des notifications dans FluffyChat, nous vous recommandons d'utiliser https://microg.org/ ou https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} n'est pas un serveur Matrix, souhaitez-vous utiliser {server2} à la place ?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Veuillez plutôt activer la sauvegarde des clés en ligne à partir d'Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Aucun", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Vous n'avez pas encore ajouté de moyen pour récupérer votre mot de passe.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Aucune permission", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Aucun salon public n'a été trouvé…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Aucun salon trouvé…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Aucun statut n'a été trouvé jusqu'à présent.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notifications", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notifications activées pour ce compte", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Non supporté par l'application web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} sélectionné(s)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} utilisateur·ices écrivent…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Obtention de la localisation…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Offensant", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Hors ligne", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Valider", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "En ligne", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "La sauvegarde des clés en ligne est désactivée", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "La sauvegarde en ligne des clés est activée", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oups ! Une erreur s'est malheureusement produite lors du réglage des notifications.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oups, un problème est survenu…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Ouvrez l'application pour lire le message", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Ouvrir l'appareil photo", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Ouvrir dans maps", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Facultatif) Votre adresse électronique", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optionnel) Nom du groupe", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Ou", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Participant(e)", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Appareils participants", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "Phrase de passe ou clé de récupération", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Mot de passe", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Mot de passe oublié", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Le mot de passe a été modifié", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Récupération du mot de passe", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Personnes", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Choisir une image", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Épingler", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Lire {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Veuillez choisir", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Veuillez choisir un code d’accès", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Choisissez un nom d'utilisateur·ice", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Veuillez cliquer sur le lien contenu dans le courriel puis continuez.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Veuillez saisir 4 chiffres ou laisser vide pour désactiver le verrouillage de l’application.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Renseignez un identifiant Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Veuillez saisir votre clé de sécurité :", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Renseignez votre mot de passe", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Veuillez saisir votre code PIN", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Renseignez votre nom d'utilisateur·ice", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Veuillez suivre les instructions sur le site et appuyer sur Suivant.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Vie privée", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Groupes publics", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Clé publique", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Salons publics", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Espace public", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Règles de notifications", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Motif", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Enregistrement", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} a supprimé un évènement", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Supprimer un message", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "S'inscrire", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Refuser", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} a refusé l'invitation", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Rejoindre de nouveau", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Supprimer", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Supprimer tous les autres appareils", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Supprimé par {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Supprimer l'appareil", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Débannissement de la discussion", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Supprimer le message", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Supprimer votre avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Afficher les contenus riches des messages", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Remplacer le salon par une nouvelle version", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Répondre", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Signaler un message", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Demander la permission", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Demander à lire les anciens messages", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Révoquer toutes les permissions", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Le salon a été mis à niveau", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Version du salon", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Samedi", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Enregistrement du fichier sous {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Enregistrer le fichier", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Enregistrer le fichier dans ce dossier", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Rechercher", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Rechercher une discussion", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Sécurité", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Clé de sécurité", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Clé de sécurité perdue ?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Vu par {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Vu par {username} et {count} autres}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Vu par {username} et {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Envoyer", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Envoyer un message", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Envoyer un texte", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Envoyer un fichier audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Autoriser l'envoi de rapports d'anomalies via sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Envoyer un fichier", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Envoyer une image", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Envoyer des messages", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Envoyer le fichier original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Envoyer un autocollant", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Envoyer une vidéo", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} a envoyé un fichier", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} a envoyé un fichier audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} a envoyé une image", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} a envoyé un autocollant", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} a envoyé une vidéo", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} a envoyé des informations sur l'appel", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informations relatives à votre vie privée : https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "La session est vérifiée", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Définir une image de profil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Définir comme adresse principale", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Définir des émoticônes personnalisées", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Définir une description du groupe", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Créer un lien d'invitation", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Définir le niveau de permissions", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Définir le statut", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Paramètres", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Partager", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} a partagé sa position", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Partager la localisation", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Afficher le mot de passe", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "S'inscrire", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Authentification unique", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Ignorer", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Son, vibration, couleur diode", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Code source", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "L'espace est public", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nom de l'espace", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} a démarré un appel", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Commencez votre première discussion maintenant ! 🙂\n- Appuyez sur « Nouvelle discussion »\n- Scannez le code QR d’un·e ami·e\n- Bonne discussion", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Statut", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Comment allez-vous aujourd'hui ?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Soumettre", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Dimanche", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchronisation... Veuillez patienter.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Système", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Appuyez sur un appareil pour le vérifier", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Appuyez pour afficher l'image", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Appuyez pour afficher le menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Elles ne correspondent pas", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Elles correspondent", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ce salon a été archivé.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Jeudi", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Activer/désactiver en favori", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Activer/désactiver la sourdine", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Marquer comme lu / non lu", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Trop de requêtes. Veuillez réessayer plus tard !", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transfert à partir d'un autre appareil", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Retenter l'envoi", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Mardi", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Indisponible", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} a annulé le bannissement de {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Retirer le blocage sur l'appareil", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Appareil inconnu", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Algorithme de chiffrement inconnu", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Événement de type inconnu : '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Session inconnue, veuillez vérifier", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Déverrouiller la sauvegarde de la discussion", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Retirer la sourdine de la discussion", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Désépingler", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 discussion non lue} other{{unreadCount} discussions non lues}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 message non lu} other{{unreadEvents} messages non lus}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Utiliser des couleurs compatibles AMOLED ?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} et {count} autres sont en train d'écrire…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} et {username2} sont en train d'écrire…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} est en train d'écrire…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} a quitté la discussion", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nom d'utilisateur·ice", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "L'utilisateur/trice n'est pas vérifié(e)", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} a envoyé un évènement de type {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "L'utilisateur/trice a un statut de vérification inconnu", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "L'utilisateur/trice est vérifié(e)", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Vérifié", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Session vérifiée avec succès !", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Vérifier", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Vérifier manuellement", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Commencer la vérification", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "La vérification a été effectuée avec succès !", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Vérification de l'autre compte", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Vérifier l'utilisateur·ice", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Appel vidéo", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilité de l'historique de la discussion", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible pour tous les participant·es", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visible pour tout le monde", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Message vocal", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "En attente de l'acceptation de la demande par le partenaire…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "En attente de l'acceptation de l'émoji par le partenaire…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "En attente de l'acceptation des nombres par le partenaire…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Image de fond", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Attention !", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Le chiffrement de bout en bout est actuellement en bêta ! Utilisez cette fonctionnalité à vos propres risques !", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Mercredi", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bienvenue dans la messagerie instantanée la plus mignonne du réseau Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Nous vous avons envoyé un courriel", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Qui peut faire quelle action", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Qui est autorisé·e à rejoindre ce groupe", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Pourquoi voulez-vous le signaler ?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Effacer la sauvegarde de votre discussion pour créer une nouvelle clé de sécurité ?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Grâce à ces adresses, vous pouvez récupérer votre mot de passe si vous en avez besoin.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Écrivez un message…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Oui", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Vous", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Vous êtes invité·e à cette discussion", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Vous ne participez plus à cette discussion", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Vous ne pouvez pas vous inviter vous-même", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Vous avez été banni·e de cette discussion", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "La synchronisation de vos discussions est en cours…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Votre propre nom d'utilisateur·ice", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Votre clé publique", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Vous serez connecté·e à {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Zoomer", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Dézoomer", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "Scanner un code QR", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Entrer le lien d'invitation manuellement...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Partager votre lien d'invitation", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Scannez le code QR ou partagez votre lien d'invitation si vous n'êtes pas au même endroit.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Envoyer avec Entrée", - "@sendOnEnter": {}, - "homeserver": "Serveur d'accueil", - "@homeserver": {}, - "serverRequiresEmail": "Ce serveur doit valider votre adresse électronique pour l'inscription.", - "@serverRequiresEmail": {}, - "newUsernameDescription": "Votre identifiant utilisateur aura alors le format @username:servername", - "@newUsernameDescription": {}, - "newPasswordDescription": "Afin de pouvoir récupérer votre mot de passe, vous devez ajouter ultérieurement une adresse électronique à votre compte.", - "@newPasswordDescription": {}, - "enableMultiAccounts": "(BETA) Activer les comptes multiples sur cet appareil", - "@enableMultiAccounts": {}, - "bundleName": "Nom du groupe", - "@bundleName": {}, - "removeFromBundle": "Retirer de ce groupe", - "@removeFromBundle": {}, - "addToBundle": "Ajouter au groupe", - "@addToBundle": {}, - "editBundlesForAccount": "Modifier les groupes pour ce compte", - "@editBundlesForAccount": {}, - "addAccount": "Ajouter un compte", - "@addAccount": {}, - "oneClientLoggedOut": "Un de vos clients a été déconnecté", - "@oneClientLoggedOut": {}, - "link": "Lien", - "@link": {}, - "setupChatBackup": "Configurer la sauvegarde de la discussion", - "@setupChatBackup": {}, - "iWroteDownTheKey": "J'ai écrit la clé", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Votre sauvegarde de la discussion a été mise en place.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Pour protéger vos messages, nous avons généré une clé de sécurité pour vous.\nVeuillez la garder dans un endroit sûr, par exemple un gestionnaire de mots de passe.", - "@setupChatBackupDescription": {}, - "yourUserId": "Votre identifiant utilisateur :", - "@yourUserId": {}, - "unverified": "Non vérifié", - "@unverified": {}, - "passwordsDoNotMatch": "Les mots de passe ne correspondent pas !", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Veuillez saisir une adresse électronique valide.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Répétez le mot de passe", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Veuillez choisir au moins {min} caractères.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageType": "Type de message", - "@messageType": {}, - "openGallery": "Ouvrir dans la Galerie", - "@openGallery": {}, - "time": "Heure", - "@time": {}, - "sender": "Expéditeur/trice", - "@sender": {}, - "messageInfo": "Informations sur le message", - "@messageInfo": {}, - "removeFromSpace": "Supprimer de l’espace", - "@removeFromSpace": {}, - "addToSpaceDescription": "Sélectionnez un espace pour y ajouter cette discussion.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Se connecter en un clic", - "@loginWithOneClick": {}, - "removeFromSpaceDescription": "Cela supprime cette discussion de l’espace actuel. Elle sera alors toujours visible sous « Toutes les discussions ».", - "@removeFromSpaceDescription": {}, - "start": "Commencer", - "@start": {}, - "setupChatBackupNow": "Configurez votre sauvegarde de discussion maintenant", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Enregistrer la clé de sécurité maintenant", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Pour déverrouiller votre sauvegarde de discussion, veuillez entrer votre clé de sécurité qui a été générée lors d'une session précédente. Votre clé de sécurité n'est PAS votre mot de passe.", - "@pleaseEnterSecurityKeyDescription": {}, - "commandHint_create": "Créer un groupe de discussion vide\nUtilisez --no-encryption pour désactiver le chiffrement", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Abandonner la session", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_clearcache": "Vider le cache", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_dm": "Commencer une discussion directe\nUtilisez --no-encryption pour désactiver le chiffrement", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "openVideoCamera": "Ouvrir la caméra pour une vidéo", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "Ajouter à la story", - "@addToStory": {}, - "whoCanSeeMyStories": "Qui peut voir mes stories ?", - "@whoCanSeeMyStories": {}, - "publish": "Publier", - "@publish": {}, - "unsubscribeStories": "Se désinscrire des stories", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Cet(te) utilisateur(trice) n'a encore rien posté dans sa story", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Votre story", - "@yourStory": {}, - "replyHasBeenSent": "La réponse a été envoyée", - "@replyHasBeenSent": {}, - "storyFrom": "Story du {date} : \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "videoWithSize": "Vidéo ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "whoCanSeeMyStoriesDesc": "Veuillez noter que les personnes peuvent se voir et se contacter dans votre story.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Que se passe-t-il ?", - "@whatIsGoingOn": {}, - "addDescription": "Ajouter une description", - "@addDescription": {}, - "bubbleSize": "Taille de la bulle", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Je comprends", - "@iUnderstand": {}, - "storyPrivacyWarning": "Veuillez noter que les personnes peuvent se voir et se contacter dans votre story. Vos stories seront visibles pendant 24 heures, mais il n'y a aucune garantie qu'elles seront supprimées de tous les appareils et de tous les serveurs.", - "@storyPrivacyWarning": {}, - "dismiss": "Rejeter", - "@dismiss": {}, - "markAsRead": "Marquer comme lu", - "@markAsRead": {}, - "reportUser": "Signaler l'utilisateur/trice", - "@reportUser": {}, - "openChat": "Ouvrir la discussion", - "@openChat": {}, - "matrixWidgets": "Widgets Matrix", - "@matrixWidgets": {}, - "integrationsNotImplemented": "La modification des widgets et des intégrations n'est pas encore possible.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Modifier les widgets et les intégrations", - "@editIntegrations": {}, - "reactedWith": "{sender} a réagi avec {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Émojis", - "@emojis": {}, - "placeCall": "Passer un appel", - "@placeCall": {}, - "voiceCall": "Appel vocal", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Version d'Android non prise en charge", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "Cette fonctionnalité nécessite une nouvelle version d'Android. Veuillez vérifier les mises à jour ou la prise en charge de Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "pinMessage": "Épingler au salon", - "@pinMessage": {}, - "pinnedEventsError": "Erreur lors du chargement des messages épinglés", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Voulez-vous vraiment désépingler définitivement l'événement ?", - "@confirmEventUnpin": {}, - "videoCallsBetaWarning": "Veuillez noter que les appels vidéo sont actuellement en version bêta. Ils peuvent ne pas fonctionner comme prévu ou ne oas fonctionner du tout sur toutes les plateformes.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Appels vidéo expérimentaux", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Courriel ou identifiant", - "@emailOrUsername": {}, - "switchToAccount": "Passer au compte {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Compte suivant", - "@nextAccount": {}, - "previousAccount": "Compte précédent", - "@previousAccount": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Personnalisé", - "@widgetCustom": {}, - "widgetUrlError": "Ceci n'est pas un lien valide.", - "@widgetUrlError": {}, - "widgetNameError": "Veuillez fournir un nom d'affichage.", - "@widgetNameError": {}, - "errorAddingWidget": "Erreur lors de l'ajout du widget.", - "@errorAddingWidget": {}, - "editWidgets": "Modifier les widgets", - "@editWidgets": {}, - "widgetEtherpad": "Note textuelle", - "@widgetEtherpad": {}, - "addWidget": "Ajouter un widget", - "@addWidget": {}, - "widgetName": "Nom", - "@widgetName": {}, - "widgetVideo": "Vidéo", - "@widgetVideo": {}, - "youRejectedTheInvitation": "Vous avez rejeté l'invitation", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "Vous avez rejoint la discussion", - "@youJoinedTheChat": {}, - "youHaveWithdrawnTheInvitationFor": "Vous avez retiré l'invitation pour {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "showDirectChatsInSpaces": "Afficher les discussions directes associées dans les espaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youAcceptedTheInvitation": "Vous avez accepté l'invitation", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "Vous avez banni {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "Vous avez été invité par {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Vous avez invité {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Vous avez dégagé {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Vous avez dégagé et banni {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Vous avez débanni {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "separateChatTypes": "Séparer les discussions directes, les groupes et les espaces", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_ga.arb b/assets/l10n/intl_ga.arb deleted file mode 100644 index e6871e8d58..0000000000 --- a/assets/l10n/intl_ga.arb +++ /dev/null @@ -1,2635 +0,0 @@ -{ - "zoomOut": "Zúmáil amach", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Zúmáil isteach", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Beidh tú ceangailte le {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "you": "Tú", - "@you": { - "type": "text", - "placeholders": {} - }, - "yes": "Tá", - "@yes": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Dé Céadaoin", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "warning": "Rabhadh!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Cúlbhrat", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "verify": "Deimhnigh", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verified": "Deimhnithe", - "@verified": { - "type": "text", - "placeholders": {} - }, - "username": "Ainm úsáideora", - "@username": { - "type": "text", - "placeholders": {} - }, - "unpin": "Bain biorán", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Níl ar fáil", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Dé Máirt", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "thursday": "Déardaoin", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Córas", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "sunday": "Dé Domhnaigh", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "submit": "Cuir isteach", - "@submit": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Conas atá tú inniu?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "status": "Staid", - "@status": { - "type": "text", - "placeholders": {} - }, - "skip": "Léim", - "@skip": { - "type": "text", - "placeholders": {} - }, - "share": "Roinn", - "@share": { - "type": "text", - "placeholders": {} - }, - "settings": "Socruithe", - "@settings": { - "type": "text", - "placeholders": {} - }, - "send": "Seol", - "@send": { - "type": "text", - "placeholders": {} - }, - "security": "Slándáil", - "@security": { - "type": "text", - "placeholders": {} - }, - "search": "Cuardaigh", - "@search": { - "type": "text", - "placeholders": {} - }, - "saturday": "Dé Sathairn", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "reply": "Freagair", - "@reply": { - "type": "text", - "placeholders": {} - }, - "remove": "Bain", - "@remove": { - "type": "text", - "placeholders": {} - }, - "rejoin": "Téigh ar ais isteach", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "reject": "Diúltaigh", - "@reject": { - "type": "text", - "placeholders": {} - }, - "register": "Cláraigh", - "@register": { - "type": "text", - "placeholders": {} - }, - "recording": "Ag Taifeadadh", - "@recording": { - "type": "text", - "placeholders": {} - }, - "reason": "Fáth", - "@reason": { - "type": "text", - "placeholders": {} - }, - "privacy": "Príobháideacht", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "pin": "Biorán", - "@pin": { - "type": "text", - "placeholders": {} - }, - "people": "Daoine", - "@people": { - "type": "text", - "placeholders": {} - }, - "password": "Pasfhocal", - "@password": { - "type": "text", - "placeholders": {} - }, - "participant": "Rannpháirtí", - "@participant": { - "type": "text", - "placeholders": {} - }, - "directChats": "Comhráite Díreacha", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID gléis", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Scrios an teachtaireacht", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Scrios an cuntas", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Tá cros-shíniú tosaithe", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Cros-síniú casta as", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Spás nua", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} rannpháirtithe", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "or": "Nó", - "@or": { - "type": "text", - "placeholders": {} - }, - "online": "Ar líne", - "@online": { - "type": "text", - "placeholders": {} - }, - "ok": "togha", - "@ok": { - "type": "text", - "placeholders": {} - }, - "offline": "As líne", - "@offline": { - "type": "text", - "placeholders": {} - }, - "offensive": "Maslach", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "notifications": "Fógraí", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "none": "Aon cheann", - "@none": { - "type": "text", - "placeholders": {} - }, - "no": "Níl", - "@no": { - "type": "text", - "placeholders": {} - }, - "next": "Ar Aghaidh", - "@next": { - "type": "text", - "placeholders": {} - }, - "monday": "Dé Luain", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moderator": "Modhnóir", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "messages": "Teachtaireachtaí", - "@messages": { - "type": "text", - "placeholders": {} - }, - "mention": "Luaigh", - "@mention": { - "type": "text", - "placeholders": {} - }, - "logout": "Logáil amach", - "@logout": { - "type": "text", - "placeholders": {} - }, - "login": "Logáil isteach", - "@login": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Solas", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "license": "Ceadúnas", - "@license": { - "type": "text", - "placeholders": {} - }, - "leave": "Fág", - "@leave": { - "type": "text", - "placeholders": {} - }, - "invited": "Le cuireadh", - "@invited": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Neamhurchóideach", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "ignore": "Tabhair neamhaird ar", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "identity": "Aitheantas", - "@identity": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "help": "Cabhair", - "@help": { - "type": "text", - "placeholders": {} - }, - "groups": "Grúpaí", - "@groups": { - "type": "text", - "placeholders": {} - }, - "group": "Grúpa", - "@group": { - "type": "text", - "placeholders": {} - }, - "friends": "Cairde", - "@friends": { - "type": "text", - "placeholders": {} - }, - "friday": "Dé hAoine", - "@friday": { - "type": "text", - "placeholders": {} - }, - "forward": "Seol ar aghaidh", - "@forward": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Freastalaí baile", - "@homeserver": {}, - "encryption": "Criptiúchán", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Criptithe", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "edit": "Cuir in eagar", - "@edit": { - "type": "text", - "placeholders": {} - }, - "donate": "Bronn", - "@donate": { - "type": "text", - "placeholders": {} - }, - "discover": "Tar ar", - "@discover": { - "type": "text", - "placeholders": {} - }, - "devices": "Gléasanna", - "@devices": { - "type": "text", - "placeholders": {} - }, - "device": "Gléas", - "@device": { - "type": "text", - "placeholders": {} - }, - "deny": "Diúltaigh", - "@deny": { - "type": "text", - "placeholders": {} - }, - "delete": "Scrios", - "@delete": { - "type": "text", - "placeholders": {} - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "contentViewer": "Amharcóir ábhair", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Coinníonn sé ainm úsáideora", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Cumraigh comhrá", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "commandInvalid": "Ordú neamhbhailí", - "@commandInvalid": { - "type": "text" - }, - "commandHint_send": "Seol téacs", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_me": "Déan cur síos ort féin", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "clearText": "Glan an téacs", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Glan an cartlann", - "@clearArchive": {}, - "chatDetails": "Sonraí comhrá", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Cúltaca comhrá", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Athraigh cúlbhrat", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "D'athraigh {username} abhatár an chomhrá", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeDeviceName": "Athraigh ainm an ghléis", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Ní féidir an URI {uri} a oscailt", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "cancel": "Cealaigh", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Eochracha i dtaisce", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Teachtaireachtaí bota", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bactha", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "Bac Gléas", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "Chuir {username} cosc ar {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "banned": "Coiscthe", - "@banned": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Toirmisc ón gcomhrá", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Seol ar iontráil", - "@sendOnEnter": {}, - "avatarHasBeenChanged": "D'athraigh abhatár", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "authentication": "Fíordheimhniú", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Seomra cartlainne", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "archive": "Cartlann", - "@archive": { - "type": "text", - "placeholders": {} - }, - "appLock": "Bac aip", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "Is féidir le aon duine dul isteach", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "D'fhreagair {senderName} an glao", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "alreadyHaveAnAccount": "An bhfuil cuntas agat cheana féin?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "allChats": "Gach comhrá", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "all": "Gach", - "@all": { - "type": "text", - "placeholders": {} - }, - "alias": "ailias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "admin": "Riarthóir", - "@admin": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Cuir go spás", - "@addToSpace": {}, - "addNewFriend": "Cuir cara nua", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Cuir tuairisc grúpa", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Cuir ríomhphoist", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "Thosaigh {username} an criptiú ó dheireadh go deireadh", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "accountInformation": "Faisnéis cuntais", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "account": "Cuntas", - "@account": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "Ghlac {username} leis an cuireadh", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "accept": "Glac", - "@accept": { - "type": "text", - "placeholders": {} - }, - "about": "Faoi", - "@about": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Seinn", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Cuir ar sos", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Glac leis an iarratas fíoraithe seo ó {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "askSSSSCache": "Cuir isteach do phasfrása stóir sábháilte nó d'eochair téarnaimh chun na heochracha a thaisceadh le do thoil.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "An bhfuil tú cinnte gur mhaith leat logáil amach?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "An bhfuil tú cinnte?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "An bhfuil cead ag aoi-úsáideoirí a bheith páirteach", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "Thug {username} cuireadh do {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "hideRedactedEvents": "Folaigh imeachtaí athdhéanta", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Is féidir le haíonna páirt a ghlacadh", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "guestsAreForbidden": "Tá cosc ar aíonna", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grúpa le {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "groupIsPublic": "Tá an grúpa poiblí", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "D'athraigh cur síos an ghrúpa", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Ón gcuireadh", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Cuir isteach do fhreastalaí baile", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Cuir isteach ainm úsáideora", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Socruithe criptithe ó dheireadh go deireadh", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Gearrchód emote neamhbhailí!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Tá iomaite ann cheana féin!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Cuir in eagar abhatár an tseomra", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Cuir ailiasanna an tseomra in eagar", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Cuir ásc Jitsi in eagar", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Cuir ceadanna an chomhrá in eagar", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Cuir freastalaí blocáilte in eagar", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Leibhéal ceada réamhshocraithe", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "unblockDevice": "Díbhlocáil Gléas", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Tugadh cuireadh don theagmháil a thar isteach sa grúpa", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Déan comparáid idir na huimhreacha seo a leanas agus déan cinnte go bhfuil na huimhreacha seo a leanas ag teacht le huimhreacha an ghléis eile:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Déan comparáid agus déan cinnte go bhfuil an emoji seo a leanas comhoiriúnach le emoji an ghléis eile:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "commandMissing": "Ní ordú é {command}.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandHint_react": "Seol freagra mar fhreagairt", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_op": "Socraigh leibhéal cumhachta an úsáideora áirithe (réamhshocrú: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_myroomnick": "Socraigh d'ainm taispeána don seomra seo", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_myroomavatar": "Cuir do phictiúr don seomra seo (le mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_kick": "Bain an t-úsáideoir áirithe den seomra seo", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_join": "Téigh isteach sa seomra áirithe", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_ban": "Cuir cosc ar an úsáideoir áirithe ón seomra seo", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_invite": "Cuir cosc ar an úsáideoir áirithe ón seomra seo", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "chooseAStrongPassword": "Roghnaigh pasfhocal láidir", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Baineadh comhrá as an spás seo", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Cuireadh comhrá leis an spás seo", - "@chatHasBeenAddedToThisSpace": {}, - "chatBackupDescription": "Tá do chúltaca comhrá daingnithe le heochair slándála. Déan cinnte nach gcaillfidh tú é.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Truaillíodh an criptiú", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Athraigh ainm an ghrúpa", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Sábháladh athruithe", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changedTheRoomInvitationLink": "D'athraigh {username} nasc an chuiridh", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "D'athraigh {username} ailiasanna an tseomra", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheProfileAvatar": "D'athraigh {username} a n-abhatár", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "D'athraigh {username} na rialacha ceangail go: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheJoinRules": "D'athraigh {username} na rialacha ceangail", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "D'athraigh {username} infheictheacht na staire go: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "D'athraigh {username} infheictheacht na staire", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "D'athraigh {username} a n-ainm taispeána go: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheChatPermissions": "D'athraigh {username} na ceadanna comhrá", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatNameTo": "D'athraigh {username} an t-ainm comhrá go: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatDescriptionTo": "D'athraigh {username} an cur síos comhrá go: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "autoplayImages": "Seinn greamáin agus straoiseog beoite go huathoibríoch", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "createdTheChat": "Rinne {username} an comhrá", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Déan grúpa nua", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Déan cuntas anois", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Cóipeáil ar an ghearrthaisce", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Cóipeáilte ar an ghearrthaisce", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Coinníonn sé ainm taispeána", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Theip ar iarracht an naisc", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "commandHint_plain": "Seol téacs neamhfhoirmithe", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_leave": "Fág an seomra seo", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_html": "Seol téacs HTML-formáidithe", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "chooseAUsername": "Roghnaigh ainm úsáideora", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Athraigh do abhatár", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Athraigh an freastalaí", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Athraigh do stíl", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Athraigh an freastalaí baile", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Glórphost", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Físghlao", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Fíoraigh Úsáideoir", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Tosaigh Fíorú", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Fíoraigh de láimh", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Neamhciúnaigh comhrá", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Folaigh imeachtaí anaithnide", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Gléas anaithnid", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Marcáil Léite/Neamhléite", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Scoránaigh mar ciúnaithe", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Scoránaigh mar ceann is fearr leat", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Tá siad céanna", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Ainm an spáis", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Cód foinseach", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "signUp": "Cláraigh Cuntas", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Taispeáin pasfhocal", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Roinn suíomh", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Cuir stádas", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Seol físeán", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Seol greamán", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Seol an bunchóip", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Seol teachtaireachtaí", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Seol íomhá", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Seol comhad", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Seol fuaim", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Eochair slándála", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Sábháil comhad", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Leagan seomra", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Iarr cead", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Tuairiscigh teachtaireacht", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Bain teachtaireacht", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeDevice": "Bain gléas", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Bain teachtaireacht amach", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Rialacha na bhfógraí", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Spás poiblí", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Seomraí Poiblí", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Eochair Phoiblí", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grúpaí Poiblí", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Roghnaigh le do thoil", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "play": "Seinn {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "passwordRecovery": "Aisfháil pasfhocail", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Pasfhocal dearmadta", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Oscail ceamara", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "ag Aimsiú an suíomh…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} roghnaithe", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "noPermission": "Gan cead", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Gan cuntas", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "newChat": "Comhrá nua", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Ciúnaigh comhrá", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Athruithe ball", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Lódáil níos mó…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Téigh isteach sa seomra", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "isTyping": "ag clóscríobh…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Tabhair cuireadh do theagmháil", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Ríomhphost neamhbhailí", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Tabhair neamhaird ar ainm úsáideora", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Úsáideoirí a dtugann tú neamhaird orthu", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Cur síos ar an ngrúpa", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Ó tar isteach", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Méid cló", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algartam criptithe", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Tosaigh criptiú", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Cuir ainm taispeána in eagar", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Tar ar ghrúpaí", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Scrios pictiúr", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Gníomhach faoi láthair", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "changelog": "Loga na n-athruithe", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Méid an chomhaid", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fileName": "Ainm an chomhaid", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Gach rud réidh!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Comhrá folamh", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Gearrchód straoiseoige", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Socruithe straoiseoige", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Íoslódáil comhad", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Athraigh an pasfhocal", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Dorcha", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "create": "Cruthaigh", - "@create": { - "type": "text", - "placeholders": {} - }, - "copy": "Cóipeáil", - "@copy": { - "type": "text", - "placeholders": {} - }, - "connect": "Ceangail", - "@connect": { - "type": "text", - "placeholders": {} - }, - "confirm": "Deimhnigh", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "close": "Dún", - "@close": { - "type": "text", - "placeholders": {} - }, - "chats": "Comhráite", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chat": "Comhrá", - "@chat": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "Scan cód QR", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Clóscríobh an nasc cuiridh de láimh...", - "@typeInInviteLinkManually": {}, - "createNewChatExplaination": "Ní gá duit ach an cód QR a scanadh nó do nasc cuiridh a roinnt mura bhfuil sibh in aice lena chéile.", - "@createNewChatExplaination": {}, - "inviteText": "Thug {username} cuireadh duit chuig FluffyChat.\n1. Suiteáil FluffyChat: https://fluffychat.im\n2. Cláraigh nó sínigh isteach\n3. Oscail an nasc cuiridh: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "shareYourInviteLink": "Roinn do nasc cuiridh", - "@shareYourInviteLink": {}, - "noMatrixServer": "Níl {server1} freastalaí Matrix. Úsáid {server2} ina áit sin?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noGoogleServicesWarning": "Dealraíonn sé nach bhfuil aon seirbhísí google agat ar do ghuthán. Sin cinneadh maith le do phríobháideacht! Chun fógraí brú a fháil i FluffyChat molaimid https://microg.org/ nó https://unifiedpush.org/ a úsáid.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Ní féidir leat criptiú a ghníomhachtú ach a luaithe nach bhfuil an seomra inrochtana go poiblí a thuilleadh.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Níor aimsíodh aon straoiseoga. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Níl Tras-Síniú ar fáil i Fluffychat ag an am seo. Cumasaigh é in Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Gan aon nasc leis an bhfreastalaí", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Iarratas fíoraithe nua!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Teachtaireacht nua i FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Bí ar an eolas go dteastaíonn Pantalaimon uait chun criptiú ó cheann go ceann a úsáid anois.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 imeacht níos mó} other{{count} níos mó imeachtaí}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "messageWillBeRemovedWarning": "Bainfear an teachtaireacht do na rannpháirtithe go léir", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Cinntigh go bhfuil an t-aitheantóir bailí", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Ceap modhnóir", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Ceap riarachán", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Sínigh isteach le {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logInTo": "Logáil isteach chuig {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "locationPermissionDeniedNotice": "Diúltaíodh cead suímh. Deonaigh dóibh le do thoil go mbeidh tú in ann do shuíomh a roinnt.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Tá seirbhísí suímh díchumasaithe. Cuir ar a gcumas le do thoil a bheith in ann do shuíomh a roinnt.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "loadingPleaseWait": "Ag lódáil… Fan, le do thoil.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Lódáil {count} níos mó rannpháirtithe", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "leftTheChat": "Fágadh an comhrá", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Le feiceáil i bhfad ó shin", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "lastSeenIp": "IP le feiceáil go deireanach", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Gníomhach deireanach: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "kickFromChat": "Caith é amach as an comhrá", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "kicked": "Chaith {username} {targetName} amach", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "Chaith {username} amach agus chuir cosc ar {targetName} freisin", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "keysMissing": "Tá na heochracha ar iarraidh", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Cuirtear eochracha i dtaisce", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "Tháinig {username} isteach sa chomhrá", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "isDeviceKeyCorrect": "An bhfuil an eochair gléis seo a leanas ceart?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "invitedUsersOnly": "Úsáideoirí le cuireadh amháin", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Tabhair cuireadh do theagmháil chuig {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "incorrectPassphraseOrKey": "Pasfhrása nó eochair téarnaimh mícheart", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Chliceáil mé ar an nasc", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Cé chomh maslach atá an t-ábhar seo?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Fíor-maslach", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Níl an freastalaí baile comhoiriúnach", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "Tharraing {username} an cuireadh do {targetName} siar", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "goToTheNewRoom": "Téigh go dtí an seomra nua", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Earráid maidir le suíomh a fháil: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "enterASpacepName": "Cuir isteach ainm spáis", - "@enterASpacepName": {}, - "enterAnEmailAddress": "Cuir isteach seoladh ríomhphoist", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Iontráil ainm grúpa", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "Chuir {senderName} deireadh leis an nglao", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "encryptionNotEnabled": "Ní chumasaítear criptiú", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Ní bheidh in ann an criptiú a dhíchumasú níos mó. An bhfuil tú cinnte?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Cumasaigh pacáiste straoiseoige go huilíoch", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Cumasaigh an cúltaca comhrá chun do chuid comhráite a chailleadh riamh.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Caithfidh tú gearrchód straoiseoige agus íomhá a roghnú!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Pacáistí straoiseoige don seomra", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cealaigh agus ná fiafraigh arís", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Athraíodh an t-ainm taispeána", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Níl an criptiú slán ach amháin nuair a fhíoraítear gach gléas.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "deactivateAccountWarning": "Díghníomhachtaeoidh sé seo do chuntas úsáideora. Ní féidir é seo a chealú! An bhfuil tú cinnte?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Níorbh fhéidir an t-ainm taispeána a shocrú", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Níorbh fhéidir abhatár a shocrú", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Níorbh fhéidir teachtaireacht a dhíchriptiú: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "contentHasBeenReported": "Tuairiscíodh an t-ábhar do lucht riaracháin an fhreastalaí", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "commandHint_unban": "Cuir deireadh an cosc den úsáideoir áirithe ón seomra seo", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "changedTheGuestAccessRulesTo": "D'athraigh {username} na rialacha maidir le rochtain aoi chuig: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheGuestAccessRules": "D'athraigh {username} na rialacha rochtana aoi", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "badServerVersionsException": "Tá na leaganacha sonraíochta seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerLoginTypesException": "Tá na cineálacha logála isteach seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "askSSSSVerify": "Cuir isteach do phasfrása stóir sábháilte nó d'eochair téarnaimh chun do sheisiún a fhíorú le do thoil.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Chun a bheith in ann an duine eile a shíniú, cuir isteach do phasfhrása stóir sábháilte nó d'eochair téarnaimh.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "D'eochair phoiblí", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "D'ainm úsáideora féin", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Tá do chuid comhráite á sioncronú…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Cuireadh cosc ort ón gcomhrá seo", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Ní féidir leat cuireadh a thabhairt duit féin", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Níl tú ag glacadh páirte sa chomhrá seo a thuilleadh", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Tugtar cuireadh duit chuig an gcomhrá seo", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Scríobh teachtaireacht…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Leis na seoltaí seo is féidir leat do phasfhocal a athshlánú.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Glan do cúltaca comhrá a chruthú eochair slándála nua?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Cén fáth ar mhaith leat é seo a thuairisciú?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Cé a bhfuil cead aige/aici dul isteach sa ghrúpa seo", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Cé atá in ann an gníomh a dhéanamh", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Fáilte chuig an teachtaire meandarach is gleoite sa líonra Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "D'fhíoraigh tú go rathúil!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Fíoraíodh an seisiún go rathúil!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Níl an t-úsáideoir fíoraithe", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Tá an t-úsáideoir fíoraithe", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userLeftTheChat": "D'fhág {username} an comhrá", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userAndUserAreTyping": "Tá {username} agus {username2} ag clóscríobh…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userAndOthersAreTyping": "tá {username} agus {count} daoine eile ag clóscríobh…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "useAmoledTheme": "Úsáid dathanna comhoiriúnacha le AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "unreadMessages": "{unreadEvents, plural, =1{1 teachtaireacht neamhléite} other{{unreadCount} teachtaireachtaí neamhléite}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "unreadChats": "{unreadCount, plural, =1{1 comhrá neamhléite} other{{unreadCount} comhráite neamhléite}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unknownSessionVerify": "Seisiún anaithnid, fíoraigh é le do thoil", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Algartam criptithe anaithnid", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "Chuir {username} deireadh an cosc {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "tryToSendAgain": "Déan iarracht a sheoladh arís", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Aistriú ó ghléas eile", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "An iomarca iarratas. Bain triail eile as níos déanaí!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Tá an seomra seo curtha i gcartlann.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Níl siad céanna", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tapáil chun an roghchlár a thaispeáint", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "Roinn {username} an suíomh", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "setPermissionsLevel": "Socraigh leibhéal ceadanna", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Socraigh nasc cuiridh", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Socraigh cur síos ar an ngrúpa", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Socraigh straoiseoga saincheaptha", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Socraigh mar phríomh-ailias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Socraigh pictiúr próifíle", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Tá an seisiún fíoraithe", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "Eolas faoi do phríobháideacht: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sentCallInformations": "Sheol {senderName} faisnéis maidir le glaonna", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentAVideo": "Sheol {username} físeán", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "Sheol {username} greamán", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "Sheol {username} pictiúr", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndUser": "Le feiceáil ag {username} agus {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Le feiceáil ag {username} agus {count} daoine eile}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "saveFileToFolder": "Sábháil comhad chuig an bhfillteán seo", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Sábháladh comhad mar {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "revokeAllPermissions": "Cúlghair gach cead", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Iarraidh teachtaireachtaí níos sine a léamh", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Cuir leagan seomra níos nuaí in ionad an tseomra", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Taispeáin ábhar teachtaireachta saibhir", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Bain d'abhatár", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Cuir deireadh an cosc ón gcomhrá", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Bainte de ag {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeAllOtherDevices": "Bain gach gléas eile", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "Dhiúltaigh {username} don chuireadh", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactedAnEvent": "Rinne {username} cinsire imeacht", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "pleaseFollowInstructionsOnWeb": "Lean na treoracha ar an suíomh gréasáin agus tapáil \"ar aghaidh\".", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Cuir isteach d'ainm úsáideora le do thoil", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Cuir isteach d'uimhir PIN le do thoil", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Iontráil do phasfhocal le do thoil", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Iontráil d'eochair slándála le do thoil:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Iontráil ID Matrix le do thoil.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Iontráil 4 dhigit le do thoil nó fág folamh chun glas aipe a dhíchumasú.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Cliceáil ar an nasc sa ríomhphost agus ansin lean ar aghaidh.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Roghnaigh ainm úsáideora le do thoil", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Roghnaigh paschód le do thoil", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Roghnaigh íomhá", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Athraíodh an pasfhocal", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "pasfhrása nó eochair téarnaimh", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Gléasanna úsáideora rannpháirteacha", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optional) Ainm an ghrúpa", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "serverRequiresEmail": "Ní mór don fhreastalaí seo do sheoladh ríomhphoist a bhailíochtú le haghaidh clárúcháin.", - "@serverRequiresEmail": {}, - "openInMaps": "Oscail i léarscáileanna", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Oscail an aip chun teachtaireachtaí a léamh", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Úps, chuaigh rud éigin mícheart …", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Hoips! Ar an drochuair, tharla earráid nuair a bhí na fógraí brú á mbunú.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Tá Cúltaca Eochair Ar Líne cumasaithe", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Tá Cúltaca Eochair Ar Líne díchumasaithe", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "Tá {count} úsáideoirí ag clóscríobh…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "notSupportedInWeb": "Gan tacaíocht i ngréasán", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Fógraí cumasaithe don chuntas seo", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Níl aon stádas le fáil go dtí seo.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Níor aimsíodh aon seomraí…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Níor aimsíodh aon seomraí poiblí…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Níor chuir tú bealach leis do phasfhocal a aisghabháil fós.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "newUsernameDescription": "Ansin beidh an fhormáid @ainmúsáideora:ainmfreastalaí ag d'aitheantas úsáideora", - "@newUsernameDescription": {}, - "newPasswordDescription": "D'fhonn a bheith in ann do phasfhocal a ghnóthú, ba cheart duit seoladh ríomhphoist a chur le do chuntas ina dhiaidh sin.", - "@newPasswordDescription": {}, - "noMegolmBootstrap": "Cas air cúltaca eochair ar líne ó laistigh de Element ina ionad.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Tabhair cuireadh dom", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Is féidir leat neamhaird a dhéanamh d'úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann aon teachtaireachtaí nó cuireadh seomra a fháil ó na húsáideoirí ar do liosta neamhaird phearsanta.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Sheolamar ríomhphost chugat", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Tá criptiú ó dheireadh go deireadh i mBéite faoi láthair! Úsáid ar do phriacal féin!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Ag fanacht le comhpháirtí glacadh leis na huimhreacha …", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Ag fanacht le comhpháirtí glacadh leis na straoiseoga…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Ag fanacht le comhpháirtí glacadh leis an iarratas…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Infheicthe do gach duine", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Infheicthe do na rannpháirtithe go léir", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Infheictheacht stair na comhrá", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Ag fíorú cuntas eile", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Tá stádas fíoraithe anaithnid ag an úsáideoir", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "Sheol {username} imeacht {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userIsTyping": "Tá {username} ag clóscríobh…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "unlockChatBackup": "Díghlasáil cúltaca comhrá", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Imeacht anaithnid '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "tapToShowImage": "Tapáil chun íomhá a thaispeáint", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tapáil ar ghléas le fíorú", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Ag sioncrónú... Fan, le do thoil.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Tosaigh do chéad chomhrá anois! 🙂\n- Tapáil ar an gcnaipe teachtaireachta\n- Cuir isteach ainm úsáideora cara\n- Bíodh spraoi agat ag comhrá", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "startedACall": "Thosaigh {senderName} glao", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "spaceIsPublic": "Tá an spás poiblí", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Fuaim, tonnchrith LED-dath", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Sínigh Aonair ar", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "sentAnAudio": "Sheol {username} fuaim", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAFile": "Sheol {username} comhad", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendBugReports": "Ceadaigh tuairiscí fabhtanna a sheoladh le sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Seol mar théacs", - "@sendAsText": { - "type": "text" - }, - "sendAMessage": "Seol teachtaireacht", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Le feiceáil ag {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "securityKeyLost": "Ar chaill tú d'eochair slándála?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Cuardaigh comhrá", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Uasghrádaíodh an seomra", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "addAccount": "Breisigh cuntas", - "@addAccount": {}, - "enableMultiAccounts": "(BÉITE) Cumasaigh cuntais iomadúla ar an gléas seo", - "@enableMultiAccounts": {}, - "commandHint_create": "Cruthaigh comhrá grúpa folamh\nÚsáid --no-encryption chun criptiúchán a dhíchumasú", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "link": "Nasc", - "@link": {}, - "iWroteDownTheKey": "Scríobh mé an eochair", - "@iWroteDownTheKey": {}, - "commandHint_clearcache": "Glan an taisce", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "videoCallsBetaWarning": "Tabhair faoi deara go bhfuil físglaonna i béite. B'fhéidir nach bhfeidhmíonn siad ar gach ardán chomh atá súil aige ná ar bith.", - "@videoCallsBetaWarning": {}, - "emailOrUsername": "Ríomhphost nó ainm úsáideora", - "@emailOrUsername": {}, - "passwordsDoNotMatch": "Níl na pasfhocail chéanna!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Iontráil ríomhphost bailí le do thoil.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Scríobh an pasfhocal arís", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Roghnaigh {min} carachtar ar a laghad.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "setupChatBackup": "Bunaigh cúltaca comhrá", - "@setupChatBackup": {}, - "bubbleSize": "Méid na mbolgán cainte", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "D'aitheantas úsáideora:", - "@yourUserId": {}, - "yourChatBackupHasBeenSetUp": "Bunaíodh do chúltaca comhrá.", - "@yourChatBackupHasBeenSetUp": {}, - "openVideoCamera": "Oscail físcheamara", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_gl.arb b/assets/l10n/intl_gl.arb deleted file mode 100644 index 83c11d9bae..0000000000 --- a/assets/l10n/intl_gl.arb +++ /dev/null @@ -1,2864 +0,0 @@ -{ - "@@locale": "gl", - "@@last_modified": "2021-08-14 12:41:10.040321", - "about": "Acerca de", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Aceptar", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} aceptou o convite", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Conta", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Información da conta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} activou o cifrado extremo-a-extremo", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Engadir email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Engade a descrición do grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Engadir nova amizade", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Todos", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Tódolos chats", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Xa tes unha conta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} respondeu á chamada", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Calquera pode unirse", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Bloqueo da app", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arquivo", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Sala arquivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Permitir o acceso de convidadas", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Tes a certeza?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Tes a certeza de querer saír?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Escribe a frase de paso de seguridade ou chave de recuperación para almacenar as chaves.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Para poder asinar a outra persoa, escribe a túa frase de paso ou chave de recuperación.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Escribe frase de paso de almacenaxe segura ou chave de recuperación para verificar a túa sesión.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Aceptar a solicitude de verificación de {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Deter", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Reproducir", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticación", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Reproducir automáticamente adhesivos e emotes", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "O avatar cambiou", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "O servidor soporta as seguintes formas de conexión:\n{serverVersions}\nPero esta app só soporta:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "O servidor soporta as seguintes características:\n{serverVersions}\nPero esta app só soporta {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Vetar na conversa", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Vetada", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} vetou a {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloquear dispositivo", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bloqueado", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Mensaxes de Bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Chaves almacenadas", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancelar", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Non se pode abrir o URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Cambiar nome do dispositivo", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} cambiou o avatar do chat", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} mudou a descrición da conversa a: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} mudou o nome da conversa a: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} mudou os permisos da conversa", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} cambiou o nome público a: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} mudou as regras de acceso para convidadas", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} mudou as regras de acceso para convidadas a: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} mudou a visibilidade do historial", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} mudou a visibilidade do historial a: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} mudou as regras de acceso", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} mudou as regras de acceso a: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} mudou o avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} mudou os alias da sala", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} mudou a ligazón de convite", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Rexistro de cambios", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Mudar contrasinal", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Gardáronse os cambios", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Mudar de servidor de inicio", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Cambiar o estilo", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Mudar o nome do grupo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Mudar de servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Mudar fondo do chat", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Cambia o avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "O cifrado está corrompido", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Copia de apoio do chat", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "A copia de apoio do chat está protexida cunha chave de seguridade. Pon coidado e non a perdas.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detalles do chat", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Chats", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Escolle un contrasinal forte", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Escolle un nome de usuaria", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Baleirar arquivo", - "@clearArchive": {}, - "clearText": "Eliminar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Pechar", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Vetar a usuaria indicada desta sala", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Enviar texto con formato HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Convidar á usuaria a esta sala", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Unirte á sala indicada", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Eliminar a usuaria indicada desta sala", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Saír desta sala", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Conta algo sobre ti", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Establece a túa imaxe para esta sala (por mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Establece o teu nome público para esta sala", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Establecer o nivel de responsabilidade da usuaria (por defecto: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Enviar texto sen formato", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Enviar resposta como reacción", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Enviar texto", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Retirar veto á usuaria para esta sala", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Comando non válido", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} non é un comando.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Comparar e asegurarse de que estas emoticonas concordan no outro dispositivo:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Compara e asegúrate de que os seguintes números concordan cos do outro dispositivo:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configurar chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirmar", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Conectar", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Fallou o intento de conexión", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "O contacto foi convidado ao grupo", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Contén nome público", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contén nome de usuaria", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "O contido foi denunciado á administración do servidor", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visor de contido", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copiado ao portapapeis", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copiar", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copiar ao portapapeis", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Non se descifrou a mensaxe: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Non se estableceu o avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Non se estableceu o nome público", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participantes", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Crear", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Crear unha conta", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} creou a conversa", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Crear novo grupo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Novo espazo", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Sinatura-Cruzada desactivada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Sinatura-Cruzada activada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Actualmente activo", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Escuro", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Esto desactivará a conta. Esto non ten volta atrás. Estás segura?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Nivel de permisos por omisión", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Eliminar", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Eliminar conta", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Eliminar mensaxe", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Denegar", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Dispositivo", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID do dispositivo", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Dispositivos", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "O cifrado só será seguro cando tódolos dispositivos estén verificados.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Chats Directos", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Desbotar imaxe", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Descubrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Descubrir grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "O nome público mudou", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Doar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar e non volver a preguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Descargar ficheiro", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Editar", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Editar servidores bloqueados", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Editar permisos do chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Editar nome público", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Editar instancia Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Editar alias da sala", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Editar avatar da sala", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Xa existe ese emote!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Atallo do emote non é válido!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Paquetes de Emotes para a sala", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Axustes de Emote", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Atallo de Emote", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Escribe un atallo e asocialle unha imaxe!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Chat baleiro", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Activa a copia de apoio dos chats para non perder o acceso ás conversas.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Activar paquete emote globalmente", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Activar cifrado", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Non poderás desactivar o cifrado posteriormente, tes certeza?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Cifrado", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Cifrado", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritmo do cifrado", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "O cifrado non está activado", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Axustes do cifrado extremo-a-extremo", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} rematou a chamada", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Escribe un nome para o grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Escribe un enderezo de email", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Escribe o nome para o espazo", - "@enterASpacepName": {}, - "enterAUsername": "Escribe un nome de usuaria", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Escribe o teu servidor de inicio", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Erro ao obter a localización: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Todo preparado!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremadamente ofensivo", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nome do ficheiro", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Tamaño do ficheiro", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Tamaño da letra", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Reenviar", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Venres", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amizades", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Desde que se una", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Desde o convite", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Ir á nova sala", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupo", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Descrición do grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Cambiouse a descrición do grupo", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "O grupo é público", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupos", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupo con {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Non se permiten convidadas", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Permítense convidadas", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} retirou o convite para {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Axuda", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Agochar eventos editados", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Agochar eventos descoñecidos", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Servidor de inicio non compatible", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "É moi ofensivo este contido?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identidade", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorar", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Usuarias ignoradas", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Podes ignorar usuarias molestas. Non recibirás ningunha mensaxe nin convites a salas da túa lista personal de usuarias ignoradas.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorar nome de usuaria", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Premín na ligazón", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frase de paso ou chave de recuperación incorrecta", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Inofensivo", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Email non válido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Convidar contacto", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Convidar contacto a {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Convidado", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} convidou a {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Só usuarias convidadas", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Convite para min", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} convidoute a FluffyChat.\n1. instala FluffyChat: https://fluffychat.im \n2. Rexístrate ou conéctate\n3. Abre a ligazón do convite: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "¿É correcta esta chave do dispositivo?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "está escribindo…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} uníuse ao chat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Entrar na sala", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Chaves almacenadas", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Faltan as chaves", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} expulsou a {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} expulsou e vetou a {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Expulsar da conversa", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Última actividade: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Última IP vista", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Hai moito que non aparece", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Saír", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Deixar a conversa", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licenza", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Claro", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Cargar {count} participantes máis", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Cargando... Agarda.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Cargar máis…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Os servizos de localización están desactivados. Actívaos para poder compartir a localización.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Permiso de localización denegado. Concede este permiso para poder compartir a localización.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Acceder", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Entrar en {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Conecta con {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Saír", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Converter en moderadora", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Converter en administradora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Asegúrate de que o identificador é válido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Cambios de participantes", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Mención", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Mensaxes", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Vai ser eliminada a mensaxe para todas as participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderadora", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Luns", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Un evento máis} other{{count} eventos máis}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Acalar chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Ten en conta que polo de agora precisas Pantalaimon para o cifrado extremo-a-extremo.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Novo chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nova mensaxe en FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nova solicitude de verificación!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Seguinte", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Non", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Sen conexión co servidor", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Polo momento FluffyChat non soporta a activación da Sinatura-Cruzada. Actívaa desde Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sen descrición", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Non hai emotes. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Só podes activar o cifrado tan pronto como a sala non sexa públicamente accesible.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Semella que non tes os servizos de google no teu dispositivo. Ben feito! a túa privacidade agradécecho! Para recibir notificacións push en FluffyChat recomendamos usar https://microg.org/ ou https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} non é un servidor matrix, usar {server2} no seu lugar?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "No seu lugar activa a copia de apoio en liña desde Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ningún", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Aínda non engaiches ningún xeito de recuperar o contrasinal.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Sen permiso", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Non se atoparon salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Non se atoparon salas…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Aínda non atopamos mensaxes.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notificacións", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notificacións activadas para a conta", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Non soportado na web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seleccionados", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} usuarias están escribindo…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Obtendo a localización…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Ofensivo", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Desconectada", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "En liña", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Copia de apoio En liña das Chaves desactivada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Copia de Apoio en liña das Chaves activada", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Vaites! Desgraciadamente algo fallou ao configurar as notificacións push.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Ooooi, algo fallou…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Abrir a app e ler mensaxes", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Abrir cámara", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Abrir en mapas", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Optativo) O teu enderezo de email", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optativo) Nome do grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Ou", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Participante", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositivos das usuarias participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "frase de paso ou chave de recuperación", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Contrasinal", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Contrasinal esquecido", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Cambiouse o contrasinal", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Recuperación do contrasinal", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Persoas", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Elixe unha imaxe", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Fixar", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Reproducir {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Por favor elixe", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Escolle un código de acceso", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Escolle un nome de usuaria", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Preme na ligazón do email e segue as instrucións.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Escribe 4 díxitos ou deíxao baleiro para non activar o bloqueo.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Escribe un ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Escribe a túa chave de seguridade:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Escribe o teu contrasinal", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Escribe o teu pin", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Escribe o teu nome de usuaria", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Segue as instruccións do sitio web e toca en seguinte.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacidade", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grupos públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chave pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Salas públicas", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Espazo público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Regras de envío", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Razón", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Gravando", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} editou un evento", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Eliminar mensaxe", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Crear conta", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Rexeitar", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} rexeitou o convite", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Volta a unirte", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Eliminar", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Quitar todos os outros dispositivos", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Eliminado por {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Quitar dispositivo", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Retirar veto no chat", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Eliminar mensaxe", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Elimina o avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Mostrar contido enriquecido da mensaxe", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Substituír sala pola nova versión", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Responder", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Denunciar mensaxe", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Solicitar permiso", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Solicitar ler mensaxes antigas", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revogar tódolos permisos", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "A sala foi actualizada", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versión da sala", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Ficheiro gardado como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Gardar ficheiro", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Gardar ficheiro neste cartafol", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Buscar", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Buscar un chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Seguridade", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Chave de seguridade", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Perdeches a chave de seguridade?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Visto por {username} e {count} outras}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto por {username} e {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Enviar", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Enviar unha mensaxe", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Enviar como texto", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Enviar audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Permitir o envío de informes de fallos con sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Enviar ficheiro", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Enviar imaxe", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Enviar mensaxes", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Enviar orixinal", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Enviar adhesivo", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Enviar vídeo", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} enviou un ficheiro", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} enviou un audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} enviou unha imaxe", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} enviou un adhesivo", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} enviou un vídeo", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} enviou información da chamada", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Información sobre privacidade: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesión verificada", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Establecer foto do perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Establecer como alias principal", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Establecer emotes personalizados", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Establecer descrición do grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Establecer ligazón do convite", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Establecer nivel de permisos", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Establecer estado", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Axustes", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Compartir", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} compartiu a súa localización", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Compartir localización", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Amosar contrasinal", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Rexistro", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Conexión Unificada SSO", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Saltar", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Son, vibración, cor LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Código fonte", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "O Espazo é público", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nome do Espazo", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} iniciou unha chamada", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Inicia unha conversa! 🙂\n- Toca en 'Novo chat'\n- Escanea o QR dunha amizade\n- Desfruta da conversa", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Estado", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "¿Que tal estás hoxe?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Enviar", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Domingo", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sincronizando... Agarda.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Toca nun dispositivo para verificalo", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Toca para mostrar a imaxe", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toca para mostrar menú", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Non concordan", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Concordan", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "A sala foi arquivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Xoves", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Marcar Favorito", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Cambia Noificacións", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Marcar como Lido/Non lido", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Demasiadas solicitudes. Inténtao máis tarde!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transferir desde outro dispositivo", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Inténtao outra vez", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Martes", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Non dispoñible", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} retirou o veto a {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Desbloquear dispositivo", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Dispositivo descoñecido", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Algoritmo de cifrado descoñecido", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Evento descoñecido '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Sesión descoñecida, por favor verifícaa", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Desbloquear copia do chat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Reactivar notificacións", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Desafixar", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 chat non lido} other{{unreadCount} chats non lidos}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 mensaxe non lida} other{{unreadEvents} mensaxes non lidas}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "¿Usar cores compatibles con AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} e {count} máis están escribindo…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} e {username2} están escribindo…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} está escribindo…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} deixou a conversa", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nome de usuaria", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Usuaria non verificada", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} enviou un evento {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "A usuaria ten un estado de verificación descoñecido", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Usuaria verificada", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Verificado", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sesión verificada correctamente!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verificar", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verificar manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Comezar verificación", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Verificaches correctamente!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verificando a outra conta", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verificar usuaria", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Chamada de vídeo", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilidade do historial da conversa", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible para todas as participantes", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visible para todas", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Mensaxe de voz", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Agardando a que a outra parte acepte a solicitude…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Agardando a que a outra parte acepte as emoticonas…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Agardando a que a outra parte acepte os números…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Fondo da conversa", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Aviso!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "O cifrado extremo-a-extremo está en Beta! Úsao baixo a túa responsabilidade!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Mércores", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Benvida á mensaxería instantánea más cuquiña da rede Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Enviamosche un email", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Quen pode realizar determinada acción", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Quen se pode unir a este grupo", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Por que queres denunciar esto?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Eliminar a copia de apoio do chat e crear unha nova chave de seguridade?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Con estos enderezos podes recuperar o contrasinal.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Escribe unha mensaxe…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Si", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Ti", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Estás convidada a este chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Xa non participas desta conversa", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Non podes autoconvidarte", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Foches vetada nesta conversa", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Estanse sincronizando os teus chats…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "O teu nome de usuaria", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "A túa chave pública", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Vas acceder a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Aumentar zoom", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Diminuir zoom", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Eliminouse o chat deste espazo", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "O chat foi engadido a este espazo", - "@chatHasBeenAddedToThisSpace": {}, - "addToSpace": "Engadir ao espazo", - "@addToSpace": {}, - "scanQrCode": "Escanear código QR", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Escribe manualmente a ligazón do convite...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Comparte a túa ligazón de convite", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Simplemente escanea o código QR ou comparte a ligazón do convite se non estades preto.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Enter para enviar", - "@sendOnEnter": {}, - "homeserver": "Servidor de inicio", - "@homeserver": {}, - "serverRequiresEmail": "O servidor precisa validar o teu enderezo de email para rexistrarte.", - "@serverRequiresEmail": {}, - "newUsernameDescription": "O ID da túa conta vai ter o formato @usuaria:nomedoservidor", - "@newUsernameDescription": {}, - "newPasswordDescription": "Para poder recuperar o teu contrasinal debes engadir máis tarde un enderezo de email á túa conta.", - "@newPasswordDescription": {}, - "enableMultiAccounts": "(BETA) Activar varias contas neste dispositivo", - "@enableMultiAccounts": {}, - "addAccount": "Engadir conta", - "@addAccount": {}, - "oneClientLoggedOut": "Un dos teus clientes foi desconectado", - "@oneClientLoggedOut": {}, - "link": "Ligazón", - "@link": {}, - "setupChatBackup": "Configurar copia de apoio", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Escribo eu a chave", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Configurouse a copia de apoio do chat.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Para protexer as túas mensaxes creamos unha chave de seguridade para ti.\nGárdaa nun lugar seguro, como nun xestor de contrasinais.", - "@setupChatBackupDescription": {}, - "unverified": "Sen verificar", - "@unverified": {}, - "yourUserId": "O teu ID:", - "@yourUserId": {}, - "pleaseEnterValidEmail": "Escribe un enderezo de email válido.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Os contrasinais non concordan!", - "@passwordsDoNotMatch": {}, - "repeatPassword": "Repite o contrasinal", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Escribe polo menos {min} caracteres.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageInfo": "Info da mensaxe", - "@messageInfo": {}, - "time": "Hora", - "@time": {}, - "sender": "Remitente", - "@sender": {}, - "openGallery": "Galería pública", - "@openGallery": {}, - "removeFromSpaceDescription": "Vas retirar este chat do espazo actual, mais será visible baixo \"Tódolos chats\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Elixe un espazo ao que engadir este chat.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Conéctate cun click", - "@loginWithOneClick": {}, - "messageType": "Tipo de mensaxe", - "@messageType": {}, - "removeFromSpace": "Retirar do espazo", - "@removeFromSpace": {}, - "start": "Comezar", - "@start": {}, - "setupChatBackupNow": "Configura a copia de apoio do chat", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Para desbloquear a copia do chat, escribe a túa chave de seguridade creada nunha sesión anterior. A chave de seguridade NON é o teu contrasinal.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Garda agora a chave de seguridade", - "@saveTheSecurityKeyNow": {}, - "commandHint_discardsession": "Descartar sesión", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar o cifrado", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_clearcache": "Baleirar caché", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_dm": "Iniciar un chat directo\nUsa --no-encryption para desactivar o cifrado", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "openVideoCamera": "Abrir a cámara para un vídeo", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "yourStory": "A túa Historia", - "@yourStory": {}, - "replyHasBeenSent": "Enviouse a resposta", - "@replyHasBeenSent": {}, - "videoWithSize": "Vídeo ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "Historia do {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Ten en conta que as usuarias poden verse e contactar unhas coas outras na túa historia.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Engadir a historia", - "@addToStory": {}, - "publish": "Publicar", - "@publish": {}, - "whoCanSeeMyStories": "Quen pode ver as miñas historias?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Retirar subscrición das historias", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "A usuaria non publicou aínda ningunha historia", - "@thisUserHasNotPostedAnythingYet": {}, - "bubbleSize": "Tamaño da burbulla", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Que acontece?", - "@whatIsGoingOn": {}, - "addDescription": "Engadir descrición", - "@addDescription": {}, - "storyPrivacyWarning": "Ten en conta que outras persoas poden verse en contactar entre elas na túa historia. As historias son visibles durante 24 horas pero non hai garantía de que sexan eliminadas en tódolos dispositivos e servidores.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Comprendo", - "@iUnderstand": {}, - "dismiss": "Desbotar", - "@dismiss": {}, - "markAsRead": "Marcar como lido", - "@markAsRead": {}, - "reportUser": "Denunciar usuaria", - "@reportUser": {}, - "openChat": "Abrir Chat", - "@openChat": {}, - "voiceCall": "Chamada de voz", - "@voiceCall": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Chamar", - "@placeCall": {}, - "unsupportedAndroidVersionLong": "Esta característica require unha vesión máis recente de Android. Mira se hai actualizacións ou soporte de LineageOS.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "Ten en conta que as chamadas de vídeo están en fase beta. Poderían non funcionar correctamente ou non funcionar nalgunhas plataformas.", - "@videoCallsBetaWarning": {}, - "unsupportedAndroidVersion": "Version de Android non soportada", - "@unsupportedAndroidVersion": {}, - "matrixWidgets": "Widgets de Matrix", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Por agora non se poden editar os widgets e integracións.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Editar widgets e integracións", - "@editIntegrations": {}, - "reactedWith": "{sender} reaccionou con {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "pinMessage": "Fixar na sala", - "@pinMessage": {}, - "pinnedEventsError": "Erro ao cargar mensaxes fixadas", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Tes a certeza de querer desafixar o evento?", - "@confirmEventUnpin": {}, - "experimentalVideoCalls": "Chamadas de vídeo en probas", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Email ou nome de usuaria", - "@emailOrUsername": {}, - "switchToAccount": "Cambiar á conta {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "previousAccount": "Conta anterior", - "@previousAccount": {}, - "nextAccount": "Conta seguinte", - "@nextAccount": {}, - "bundleName": "Nome do feixe", - "@bundleName": {}, - "widgetVideo": "Vídeo", - "@widgetVideo": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Personalizado", - "@widgetCustom": {}, - "widgetName": "Nome", - "@widgetName": {}, - "widgetUrlError": "Non é un URL válido.", - "@widgetUrlError": {}, - "widgetNameError": "Escribe un nome público.", - "@widgetNameError": {}, - "addWidget": "Engadir widget", - "@addWidget": {}, - "widgetEtherpad": "Nota de texto", - "@widgetEtherpad": {}, - "errorAddingWidget": "Erro ao engadir o widget.", - "@errorAddingWidget": {}, - "editWidgets": "Editar widgets", - "@editWidgets": {}, - "editBundlesForAccount": "Editar os feixes desta conta", - "@editBundlesForAccount": {}, - "addToBundle": "Engadir ao feixe", - "@addToBundle": {}, - "removeFromBundle": "Eliminar deste feixe", - "@removeFromBundle": {}, - "separateChatTypes": "Separar Conversas directas, Grupos e Espazos", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Mostrar os Chats Directos nos Espazos", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youRejectedTheInvitation": "Rexeitaches o convite", - "@youRejectedTheInvitation": {}, - "youBannedUser": "Vetaches a {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "{user} convidoute", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youJoinedTheChat": "Unícheste á conversa", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Aceptaches o convite", - "@youAcceptedTheInvitation": {}, - "youHaveWithdrawnTheInvitationFor": "Retiraches o convite para {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Convidaches a {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Expulsaches a {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Expulsaches e vetaches a {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Retiraches o veto a {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "Mostrar lista de espazos", - "@showSpaces": {}, - "noEmailWarning": "Escribe un enderezo de email válido. Doutro xeito non poderás restablecer o contrasinal. Se non queres, toca outra vez no botón para continuar.", - "@noEmailWarning": {} -} diff --git a/assets/l10n/intl_he.arb b/assets/l10n/intl_he.arb deleted file mode 100644 index 9b24d928c4..0000000000 --- a/assets/l10n/intl_he.arb +++ /dev/null @@ -1,1701 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:10.036931", - "about": "אודות", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "קבל", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} קיבל את ההזמנה", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "חשבון", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "פרטי חשבון", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} הפעיל הצפנה מקצה לקצה", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "הוספת תיאור קבוצה", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "מנהל", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "כינוי", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "כבר יש לך חשבון?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} ענה לשיחה", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "כל אחד יכול להצטרף", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "ארכיון", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "חדר בארכיון", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "האם משתמשים אורחים מורשים להצטרף", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "האם אתה בטוח?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "אנא הזן את ביטוי הסיסמה המאובטח שלך או מפתח שחזור כדי לשמור את המפתחות במטמון.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "כדי שתוכל לחתום על משתמש אחר , הזן את הסיסמה שלך או את מפתח השחזור.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "אנא הזן את משפט הסיסמה המאובטח שלך או מפתח השחזור כדי לאמת את ההפעלה שלך.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "לקבל בקשת אימות זו מ- {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "אימות", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "changePassword": "שנה סיסמא", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "appLock": "נעילת אפליקציה", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "cancel": "ביטול", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAtLeastChars": "אנא כתוב לפחות {min} תווים", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "addEmail": "הוסף מייל", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "all": "הכל", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "כל הצ'אטים", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "banned": "חסום", - "@banned": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "האווטאר השתנה", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "שלח וכנס", - "@sendOnEnter": {}, - "badServerLoginTypesException": "שרת הבית תומך בסוגי הכניסה:\n{serverVersions}\nאבל אפליקציה זו תומכת רק ב:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} שינה את כללי הגישה לאורחים ל: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} שינה את כללי ההצטרפות", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeWallpaper": "שנה טפט", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changedTheChatNameTo": "{username} שינה את שם הצ'אט ל: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheRoomInvitationLink": "{username} שינה את קישור ההזמנה", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "passwordsDoNotMatch": "הסיסמאות לא תואמות!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "אנא כתוב כתובת אימייל תקינה.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "כתוב שוב את הסיסמה", - "@repeatPassword": {}, - "addNewFriend": "הוסף חבר חדש", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "האם אתה בטוח שברצונך לצאת?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "changelog": "יומן שינויים", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "chat": "צ׳אט", - "@chat": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "השהה", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "הפעל", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "הפעל אוטומטית מדבקות ואמוטים מונפשים", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "badServerVersionsException": "שרת הבית תומך בגרסאות:\n{serverVersions}\nאבל האפליקציה הזו תומכת רק ב-{supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "חסום מצ'אט", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} חסם את {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "חסום מכשיר", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "חסום", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "הודעות בוט", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "מפתחות מאוחסנים במטמון", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "לא ניתן לפתוח את ה-URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "שנה את שם המכשיר", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} שינה את האווטאר של הצ'אט", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} שינה את תיאור הצ'אט ל: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatPermissions": "{username} שינה את הרשאות הצ'אט", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} שינה את שם התצוגה שלו ל: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} שינה את כללי הגישה לאורחים", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibility": "{username} שינה את נראות ההיסטוריה", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} שינה את נראות ההיסטוריה ל: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRulesTo": "{username} שינה את כללי ההצטרפות ל: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} שינה את האווטאר שלו", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} שינה את כינוי החדר", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changesHaveBeenSaved": "השינויים נשמרו", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "שנה את שרת הבית", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "שנה את הסגנון שלך", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "שנה את שם הקבוצה", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "שנה את השרת", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "שינוי האווטאר שלך", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "ההצפנה נפגמה", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "מזהה המשתמש שלך:", - "@yourUserId": {}, - "iWroteDownTheKey": "רשמתי את המפתח", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "גיבוי הצ'אט שלך הוגדר.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "גיבוי צ'אט", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "הגדר גיבוי צ'אט", - "@setupChatBackup": {}, - "commandHint_ban": "חסום את המשתמש הנתון מהחדר הזה", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "נקה מטמון", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "צור צ'אט קבוצתי ריק\nהשתמש ב--no-encryption כדי להשבית את ההצפנה", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "התעלם מהסשן", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "התחל צ'אט ישיר\nהשתמש ב--no-encryption כדי להשבית את ההצפנה", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_html": "שלח טקסט בתבנית HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "הזמן את המשתמש הנתון לחדר זה", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "הצטרף לחדר הנתון", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "הסר את המשתמש הנתון מהחדר הזה", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "עזוב את החדר הזה", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "תאר את עצמך", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "setupChatBackupDescription": "כדי להגן על ההודעות שלך, יצרנו מפתח אבטחה עבורך.\nאנא שמור אותו במקום בטוח, כגון מנהל סיסמאות.", - "@setupChatBackupDescription": {}, - "chatDetails": "פרטי צ'אט", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "גיבוי הצ'אט שלך מאובטח באמצעות מפתח אבטחה. אנא וודא שאתה לא מאבד אותו.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "צ'אט נוסף למרחב הזה", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "הצ'אט הוסר מהמרחב הזה", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "צ'אטים", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "בחר סיסמה חזקה", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "בחר שם משתמש", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "נקה ארכיון", - "@clearArchive": {}, - "clearText": "נקה טקסט", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "סגור", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomavatar": "הגדר את התמונה שלך לחדר זה (על ידי mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "הגדר את שם התצוגה שלך עבור חדר זה", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "addToSpace": "הוסף לספייס", - "@addToSpace": {}, - "commandHint_unban": "בטל את החסימה של המשתמש הנתון מהחדר הזה", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "countParticipants": "{count} משתתפים", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "צור", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "צור חשבון עכשיו", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} יצר את הצ'אט", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "crossSigningEnabled": "חתימה צולבת על", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "פעיל כעת", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "כהה", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "defaultPermissionLevel": "רמת הרשאת ברירת מחדל", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "מחק חשבון", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "מחק הודעה", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "דחה", - "@deny": { - "type": "text", - "placeholders": {} - }, - "deviceId": "מזהה מכשיר", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "התקנים", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "ההצפנה מאובטחת רק כאשר כל המכשירים אומתו.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "צ'אטים ישירים", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "התעלם מתמונה", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "לגלות", - "@discover": { - "type": "text", - "placeholders": {} - }, - "donate": "תרם", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "הורד קובץ", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "ערוך", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "ערוך הרשאות צ'אט", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "ערוך את שם התצוגה", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "ערוך מופע Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "ערוך כינויים לחדר", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "אימוט כבר קיים!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "צ'אט ריק", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "אפשר את גיבוי הצ'אט כדי שלעולם לא תאבד גישה לצ'אטים שלך.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "encrypted": "מוצפן", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "אלגוריתם הצפנה", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "הגדרות הצפנה מקצה לקצה", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "הזן שם קבוצה", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "הזן כתובת דואר אלקטרוני", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "הזן שם חלל", - "@enterASpacepName": {}, - "enterYourHomeserver": "הזן את שרת הבית שלך", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "הכל מוכן!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "fileName": "שם קובץ", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "גודל הקובץ", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "גודל גופן", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "העבר", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "יום שישי", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "חברים", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "מהצטרפות", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "מההזמנה", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "עבור לחדר החדש", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "תיאור קבוצה", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "תיאור הקבוצה השתנה", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "הקבוצה ציבורית", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "קבוצה עם {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "אורחים אסורים", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "אורחים יכולים להצטרף", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "id": "מזהה", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "זהות", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "משתמשים שהתעלמו מהם", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "ביטוי סיסמה או מפתח שחזור שגויים", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "דואר אלקטרוני לא חוקי", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "הזמן איש קשר", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "invited": "הזמין", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} הזמין את {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "משתמשים מוזמנים בלבד", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "הזמנה בשבילי", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} הזמין אותך ל-FluffyChat.\n1. התקן את FluffyChat: https://fluffychat.im\n2. הירשם או היכנס\n3. פתח את קישור ההזמנה: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "האם מפתח המכשיר נכון?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "מקליד/ה…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} הצטרף לצ'אט", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "הצטרף לחדר", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "המפתחות נשמרים במטמון", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "המפתחות חסרים", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} בעט ב {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} בעט וחסם {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "בעיטה מהצ'אט", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "פעילות אחרונה: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "IP שנראה לאחרונה", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "נראה לפני זמן רב", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "עזב את הצ'אט", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "loadingPleaseWait": "טוען אנא המתן.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "טען עוד…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "שירותי המיקום מושבתים. אנא הפעל אותם כדי לשתף את המיקום שלך.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "copy": "העתק", - "@copy": { - "type": "text", - "placeholders": {} - }, - "commandHint_send": "שלח טקסט", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_op": "הגדרת רמת צריכת החשמל של המשתמש הנתון (ברירת מחדל: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "שלח טקסט לא מעוצב", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "שלח תשובה כתגובה", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "createNewGroup": "צור קבוצה חדשה", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "מכיל שם משתמש", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "חלל חדש", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "חתימה צולבת", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "בטל ואל תשאל שוב", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "אפשר הצפנה", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "הזמן איש קשר אל {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "פעולה זו תשבית את חשבון המשתמש שלך. אי אפשר לבטל את זה! האם אתה בטוח?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "device": "מכשיר", - "@device": { - "type": "text", - "placeholders": {} - }, - "group": "קבוצה", - "@group": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "הזן שם משתמש", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "גלה קבוצות", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "שם התצוגה השתנה", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "ערוך שרתים חסומים", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "עריכת אווטאר של חדר", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} סיים את השיחה", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "groups": "קבוצות", - "@groups": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "לא תוכל לבטל את ההצפנה יותר. האם אתה בטוח?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "הצפנה", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "שגיאה בהשגת מיקום: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "hasWithdrawnTheInvitationFor": "{username} ביטל את ההזמנה עבור {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "hideRedactedEvents": "הסתר אירועים מצונזרים", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "ההצפנה אינה מופעלת", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "פוגעני ביותר", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "הסתר אירועים לא ידועים", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "טען {count} משתתפים נוספים", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "homeserver": "שרת בית", - "@homeserver": {}, - "ignore": "התעלם", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "באפשרותך להתעלם ממשתמשים שמפריעים לך. לא תוכל לקבל הודעות או הזמנות לחדר מהמשתמשים ברשימת ההתעלם האישית שלך.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "התעלם משם משתמש", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "לחצתי על הקישור", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "leave": "לעזוב", - "@leave": { - "type": "text", - "placeholders": {} - }, - "license": "רשיון", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "בהיר", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "מציג התוכן", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "delete": "מחיקה", - "@delete": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "לֹא פּוֹגֵעַ", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "configureChat": "קביעת תצורה של צ'אט", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "לאשר", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "התחבר", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "ניסיון החיבור נכשל", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "איש הקשר הוזמן לקבוצה", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "מכיל שם תצוגה", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "התוכן דווח למנהלי השרת", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "הועתק ללוח הגזירים", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "commandInvalid": "הפקודה אינה חוקית", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} אינו פקודה.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "השווה וודא שהאימוג'י הבאים תואמים לאלו של המכשיר השני:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "השווה וודא שהמספרים הבאים תואמים לאלה של המכשיר השני:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "לא היתה אפשרות להגדיר אווטאר", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "לא היתה אפשרות להגדיר שם תצוגה", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "העתק ללוח", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "לא ניתן לפענח הודעה: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "help": "עזרה", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "שרת הבית אינו תואם", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "עד כמה התוכן הזה פוגעני?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "הרשאת המיקום נדחתה. אנא אפשר את היכולת לשתף את מיקומך.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "כניסה", - "@login": { - "type": "text", - "placeholders": {} - }, - "moderator": "מנחה", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "שים לב שאתה צריך Pantalaimon כדי להשתמש בהצפנה מקצה לקצה לעת עתה.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "צ'אט חדש", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "בקשת אימות חדשה!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "הבא", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "לא", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "אין חיבור לשרת", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat אינו תומך כרגע בהפעלת חתימה צולבת. אנא הפעל אותו מתוך Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "אתה יכול להפעיל הצפנה רק כשהחדר כבר לא נגיש לציבור.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "createNewChatExplaination": "פשוט סרקו את קוד ה-QR או שתפו את קישור ההזמנה שלכם אם אינכם אחד ליד השני.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "שתף את קישור ההזמנה שלך", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "הקלד את קישור ההזמנה באופן ידני...", - "@typeInInviteLinkManually": {}, - "noMegolmBootstrap": "הפעל במקום זאת גיבוי מפתח מקוון מתוך Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "לא נמצאו חדרים…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "לא נמצאו סטטוסים עד כה.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "התראות", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "לא נתמך בweb", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} נבחר", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} משתמשים מקלידים…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "משיג מיקום…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "גיבוי מפתח מקוון מושבת", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "גיבוי מפתח מקוון מופעל", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "אופס! למרבה הצער, אירעה שגיאה בעת הגדרת התראות.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "אופס, משהו השתבש…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "פתח את האפליקציה לקריאת הודעות", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "אחד מהמכשירים שלך התנתק", - "@oneClientLoggedOut": {}, - "addAccount": "הוסף חשבון", - "@addAccount": {}, - "editBundlesForAccount": "ערוך חבילות עבור חשבון זה", - "@editBundlesForAccount": {}, - "participant": "משתתף", - "@participant": { - "type": "text", - "placeholders": {} - }, - "password": "סיסמה", - "@password": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "אנא לחץ על הקישור במייל ולאחר מכן המשך.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "אנא הזן 4 ספרות או השאר ריק כדי להשבית את נעילת האפליקציה.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "loginWithOneClick": "היכנס בלחיצה אחת", - "@loginWithOneClick": {}, - "online": "מחובר/ת", - "@online": { - "type": "text", - "placeholders": {} - }, - "addToBundle": "הוסף לחבילה", - "@addToBundle": {}, - "optionalGroupName": "(אופציונלי) שם קבוצה", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "מכשירי משתמש משתתפים", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "ביטוי סיסמה או מפתח שחזור", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "שכחתי סיסמה", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "הסיסמה שונתה", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "שחזור סיסמה", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "אנשים", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "בחר תמונה", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "play": "הפעל {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "אנא בחר", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "אנא בחר קוד גישה", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "אנא בחר שם משתמש", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "אנא הזן Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "נא הזן את מפתח האבטחה שלך:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "נא הזן את הסיסמה שלך", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "אנא הזן את קוד הpin שלך", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pin": "קוד pin", - "@pin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "אנא הזן שם משתמש", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "הודעה חדשה ב-FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "monday": "יום שני", - "@monday": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "נראה שאין לך שירותי גוגל בטלפון שלך. זו החלטה טובה לפרטיות שלך! כדי לקבל התרעות ב- FluffyChat אנו ממליצים להשתמש https://microg.org/ או https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} אינו שרת מטריקס, השתמש ב-{server2} במקום זאת?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "none": "ללא", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "לא נמצאו חדרים ציבוריים…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "על מנת שתוכל לשחזר את הסיסמה שלך, עליך להוסיף מאוחר יותר כתובת אימייל לחשבון שלך.", - "@newPasswordDescription": {}, - "noPasswordRecoveryDescription": "עדיין לא הוספת דרך לשחזר את הסיסמה שלך.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "offensive": "פוגעני", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "newUsernameDescription": "מזהה המשתמש שלך יקבל את הפורמט @username:servername", - "@newUsernameDescription": {}, - "notificationsEnabledForThisAccount": "התראות הופעלו עבור חשבון זה", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "bundleName": "שם החבילה", - "@bundleName": {}, - "offline": "לא מקוון", - "@offline": { - "type": "text", - "placeholders": {} - }, - "openVideoCamera": "פתח את המצלמה לסרטון", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "removeFromBundle": "הסר מחבילה זו", - "@removeFromBundle": {}, - "enableMultiAccounts": "(בטא) אפשר ריבוי חשבונות במכשיר זה", - "@enableMultiAccounts": {}, - "openInMaps": "פתיחה במפות", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "link": "קישור", - "@link": {}, - "serverRequiresEmail": "שרת זה צריך לאמת את כתובת הדואר האלקטרוני שלך לרישום.", - "@serverRequiresEmail": {}, - "makeAModerator": "הפוך למנחה", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "logout": "יציאה", - "@logout": { - "type": "text", - "placeholders": {} - }, - "muteChat": "השתקת הצ'אט", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "noDescription": "אין תיאור", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "סרוק קוד QR", - "@scanQrCode": {}, - "noPermission": "אין הרשאה", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "or": "או", - "@or": { - "type": "text", - "placeholders": {} - }, - "logInTo": "היכנס אל {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "makeAnAdmin": "הפוך למנהל מערכת", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "ודא שהמזהה חוקי", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "שינויים בחבר", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "הזכיר", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "ההודעה תוסר עבור כל המשתתפים", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "messages": "הודעות", - "@messages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "פתח מצלמה", - "@openCamera": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_hr.arb b/assets/l10n/intl_hr.arb deleted file mode 100644 index c2ad64e840..0000000000 --- a/assets/l10n/intl_hr.arb +++ /dev/null @@ -1,2764 +0,0 @@ -{ - "@@locale": "hr", - "@@last_modified": "2021-08-14 12:41:10.025984", - "about": "Informacije", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Prihvati", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} je prihvatio/la poziv", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Račun", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Podaci računa", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} je aktivirao/la obostrano šifriranje", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Dodaj e-mail", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Dodaj opis grupe", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Dodaj novog prijatelja", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Administrator", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "pseudonim", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Svi", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Već imaš račun?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} je odgovorio/la na poziv", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Svatko se može pridružiti", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Zaključavanje programa", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arhiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arhivirana soba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Smiju li se gosti pridružiti", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Stvarno to želiš?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Stvarno se želiš odjaviti?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Upiši svoju sigurnosnu lozinku ili ključ za obnavljanje, kako bi se ključevi spremili u predmemoriju.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Za potpisivanje druge osobe, upiši svoju sigurnosnu lozinku ili ključ za oporavak.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Za potvrđivanje tvoje sesije, upiši svoju sigurnosnu lozinku ili ključ za obnavljanje.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Prihvatiti ovaj zahtjev za potvrđivanje od {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Zaustavi", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Pokreni", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentifikacija", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar promijenjen", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Domaći poslužitelj podržava vrste prijave:\n{serverVersions}\nMeđutim ovaj program podržava samo:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Domaći poslužitelj podržava verzije specifikacije:\n{serverVersions}\nMeđutim ovaj program podržava samo {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Isključi iz chata", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Isključen", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} je isključio/la {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blokiraj uređaj", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blokirano", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Poruke bota", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Međuspremljeni ključevi", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Odustani", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "URI adresa {uri} se ne može otvoriti", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Promijeni ime uređaja", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} je promijenio/la avatar chata", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} je promijenio/la opis razgovora u: „{description}”", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} je promijenio/la ime razgovora u: „{chatname}”", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} je promijenio/la dozvole chata", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} je promijenio/la ime u: „{displayname}”", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} je promijenio/la pravila pristupa za goste", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} je promijenio/la pravila pristupa za goste u: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} je promijenio/la vidljivost kronologije", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} je promijenio/la vidljivost kronologije u: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} je promijenio/la pravila pridruživanja", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} je promijenio/la pravila pridruživanja u: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} je promijenio/la svoj avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} je promijenio/la pseudonime soba", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} je promijenio/la poveznicu poziva", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Zapis promjena", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Promijeni lozinku", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Promjene nisu spremljene", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Promijeni domaćeg poslužitelja", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Promijeni tvoj stil", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Promijeni ime grupe", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Promijeni poslužitelja", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Promijeni sliku pozadine", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Promijeni svoj avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Šifriranje je oštećeno", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Sigurnosna kopija chata", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Sigurnosna kopija chata osigurana je sigurnosnim ključem. Pazi da ga ne izgubiš.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detalji chata", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Chatovi", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Odaberi snažnu lozinku", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Odaberi korisničko ime", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Isprazni arhiv", - "@clearArchive": {}, - "clearText": "Ukloni tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Zatvori", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Isključi korisnika iz ove sobe", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Pošalji HTML formatirani tekst", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Pozovi korisnika u ovu sobu", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Pridruži se zadanoj sobi", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Ukloni korisnika iz ove sobe", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Napusti ovu sobu", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Opiši se", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Postavi svoju sliku za ovu sobu", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Postavi svoje ime za ovu sobu", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Postavi razinu prava zadanog korisnika (standardno: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Pošalji neformatirani tekst", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Pošalji odgovor kao reakciju", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Pošalji tekst", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Ponovo uključi korisnika u ovu sobu", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Naredba nevaljana", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} nije naredba.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Usporedi i provjeri, poklapaju li se sljedeći emojiji s onima drugog uređaja:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Usporedi i provjeri, poklapaju li se sljedeći brojevi s onima drugog uređaja:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Konfiguriraj chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Potvrdi", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Spoji", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Neuspio pokušaj povezivanja", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt je pozvan u grupu", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Sadržava prikazano ime", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Sadrži korisničko ime", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Sadržaj je prijavljen administratorima poslužitelja", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Prikazivač sadržaja", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kopirano u međuspremnik", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopiraj", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopiraj u međuspremnik", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Neuspjelo dešifriranje poruke: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Neuspjelo postavljanje avatara", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Neuspjelo postavljanje prikaznog imena", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} sudionika", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Stvori", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Stvori račun sada", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} je stvorio/la chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Stvori novu grupu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Novi prostor", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Unakrsno potpisivanje isključeno", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Unakrsno potpisivanje uključeno", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Trenutačno aktivni", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tamna", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}. {month}.", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}. {month}. {year}.", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Ovo će nepovratno deaktivirati tvoj korisnički račun. Stvarno to želiš?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Standardna razina dozvole", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Izbriši", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Izbriši račun", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Izbriši poruku", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Odbij", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Uređaj", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID oznaka uređaja", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Uređaji", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Šifriranje je sigurno samo ako su svi uređaji potvrđeni.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Izravni chatovi", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Odbaci sliku", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Otkrij", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Otkrij grupe", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Prikazno ime je promijenjeno", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Doniraj", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Prekini i nemoj ponovo pitati", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Preuzmi datoteku", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Uredi", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Uredi blokirane poslužitelje", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Uredi dozvole za chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Uredi prikazano ime", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Uredi Jitsi primjerak", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Uredi pseudonime sobe", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Uredi avatar sobe", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotikon već postoji!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Neispravna kratica emotikona!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Paketi emotikona za sobu", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Postavke emotikona", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Kratica emotikona", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Moraš odabrati jednu kraticu emotikona i sliku!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Prazan chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Aktiviraj sigurnosnu kopiju chata kako nikada ne bi izgubio/la pristup tvojim chatovima.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Aktiviraj paket emotikona globalno", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Aktiviraj šifriranje", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Više nećeš moći deaktivirati šifriranje. Stvarno to želiš?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Šifrirano", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Šifriranje", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritam šifriranja", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Šifriranje nije aktivirano", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Postavke obostranog šifriranja", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} je završio/la poziv", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Upiši ime grupe", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Upiši e-adressu", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Upiši ime prostora", - "@enterASpacepName": {}, - "enterAUsername": "Upiši korisničko ime", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Upiši svoj domaći poslužitelj", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Sve je spremno!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Izrazito uvredljiv", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Ime datoteke", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Veličina datoteke", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Veličina fonta", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Proslijedi", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Petak", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Prijatelji", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Od pridruživanja", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Od poziva", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Idi u novu sobu", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupiraj", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Opis grupe", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Opis grupe promijenjen", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Grupa je javna", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupe", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupa s {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gosti su zabranjeni", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gosti se mogu pridružiti", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} je povukao/la poziv za {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Pomoć", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Sakrij promijenjene događaje", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Sakrij nepoznate događaje", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Domaći poslužitelj nije kompatibilan", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Koliko je ovaj sadržaj uvredljiv?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identitet", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Zanemari", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Zanemareni korisnici", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Možeš zanemariti korisnike koji te smetaju. Nećeš moći primati poruke niti pozive u sobe od korisnika koji se nalaze u tvom osobnom popisu zanemarivanja.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Zanemari korisničko ime", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Pritisnuo/la sam poveznicu", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Neispravna lozinka ili ključ za obnavljanje", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Neuvredljiv", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Neipsravna e-mail adresa", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Pozovi kontakt", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Pozovi kontakt u {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Pozvan/a", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} je pozvao/la {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Samo pozvani korisnici", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Poziv za mene", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} te je pozvao/la u FluffyChat. \n1. Instaliraj FluffyChat: https://fluffychat.im \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Je li sljedeći ključ uređaja ispravan?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "piše …", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} se pridružio/la chatu", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Pridruži se sobi", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Ključevi su spremljeni u predmemoriji", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Nedostaju ključevi", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} je izbacio/la {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} je izbacio/la i isključio/la {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Izbaci iz chata", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Zadnja aktivnost: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Zadnji viđeni IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Viđeno prije dugo vremena", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Napusti", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Napustio/la je chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licenca", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Svjetla", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Učitaj još {count} sudionika", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Učitava se … Pričekaj.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Učitaj još …", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Prijava", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Prijavi se na {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Prijavi se s {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Odjava", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Postavi kao voditelja", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Postavi kao administratora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Provjeri ispravnost identifikator", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Promjene člana", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Spominjanje", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Poruke", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Poruke će se ukloniti za sve sudionike", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Voditelj", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Ponedjeljak", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Još jedan događaj} other{Još {count} događaja}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Isključi zvuk chata", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Za trenutačno korištenje obostranog šifriranja trebaš Pantalaimon.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Novi chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nova poruka u FluffyChatu", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Novi zahtjev za potvrđivanje!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Dalje", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Ne", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Ne postoji veza s poslužiteljem", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat trenutačno ne podržava unakrsno potpisivanje. Aktiviraj potpisivanje u programu Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Bez opisa", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nema emotikona. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Šifriranje možeš aktivirati samo nakon što soba više nije javno dostupna.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Čini se da na mobitelu nemaš google usluge. To je dobra odluka za tvoju privatnost! Za automatsko primanje obavijesti u FluffyChatu preporučujemo koristiti https://microg.org/ or https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Umjesto toga uključi internetsko spremanje sigurnosnih kopija ključa u programu Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ništa", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Još nisi dodao/la način za obnavljanje lozinke.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Bez dozvole", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Nema javnih soba …", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nema soba …", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Do sada nema stanja.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Obavijesti", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Obavijesti su aktivirane za ovaj račun", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nije podržano u internetu", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} odabrano", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} korisnika pišu …", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "Uvredljiv", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Nepovezano s internetom", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "U redu", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Povezano s internetom", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Internetski ključ sigurnosnih kopija je deaktiviran", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Internetski ključ sigurnosnih kopija je aktiviran", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Ups! Nažalost se dogodila greška prilikom postavljanja automatskog primanja obavijesti.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Ups, dogodila se greška …", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Za čitanje poruka, otvori program", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Otvori kameru", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Opcionalno) Tvoja e-mail adresa", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcionalno) Ime grupe", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Ili", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Sudionik", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Sudjelujući korisnički uređaji", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "tajni izraz ili ključ za obnavljanje", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Lozinka", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Zaboravljena lozinka", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Lozinka je promijenjena", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Obnavljanje lozinke", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Ljudi", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Odaberi sliku", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Prikvači", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Sviraj {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Odaberi", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Odaberi lozinku", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Odaberi korisničko ime", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Pritisni poveznicu u e-poruci, zatim nastavi.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Upiši 4 znamenke ili ostavi prazno, za deaktiviranje zaključavanja programa.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Upiši Matrix-ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Upiši sigurnosni ključ:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Upiši svoju lozinku", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Upiši svoj pin", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Upiši svoje korisničko ime", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Slijedi upute na web-stranici i dodirni „Dalje”.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privatnost", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Javne grupe", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Javni ključ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Javne sobe", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Javni prostor", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Pravila slanja", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Razlog", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Snimanje", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} je preuredio/la događaj", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Ispravi poruku", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registracija", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Odbij", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} je odbio/la poziv", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Ponovo se pridruži", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Ukloni", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Ukloni sve druge uređaje", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Uklonjeno od {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Ukloni uređaj", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Ponovo uključi u chat", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Ukloni poruku", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Ukloni svoj avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Prikaži formatirani sadržaj poruke", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Zamijeni sobu s novom verzijom", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Odgovori", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Prijavi poruku", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Zatraži dozvolu", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Zahtjev za čitanje starijih poruka", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Opozovi sve dozvole", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Soba je nadograđena", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Verzija sobe", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Subota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Datoteka je spremljena kao {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Spremi datoteku", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Spremi datoteku u ovu mapu", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Traži", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Traži chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Sigurnost", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Sigurnosni ključ", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Izgubio/la si sigurnosni ključ?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Viđeno od {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Viđeno od {username} i još {count} korisnika}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Viđeno od {username} i {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Pošalji", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Pošalji poruku", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Pošalji kao tekst", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Pošalji audio datoteku", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Dozvoli slanje izvještaja o greškama pomoću sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Pošalji datoteku", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Pošalji sliku", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Šalji poruke", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Pošalji original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Pošalji naljepnicu", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Pošalji video datoteku", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} ja poslao/la datoteku", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} ja poslao/la audio datoteku", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} ja poslao/la sliku", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} je poslao/la naljepnicu", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} ja poslao/la video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} je poslao/la podatke poziva", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Podaci o tvojoj privatnosti: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesija je potvrđena", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Postavi sliku profila", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Postavi kao glavni pseudonim", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Postavi prilagođene emotikone", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Postavi opis grupe", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Pošalji poveznicu za pozivnicu", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Postavi razinu dozvola", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Postavi stanje", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Postavke", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Dijeli", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} je dijelio/la svoje mjesto", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "Pokaži lozinku", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Prijavi se", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Jednokratna prijava", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Preskoči", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Zvuk, vibracija LED-boja", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Izvorni kȏd", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Prostor je javan", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Ime prostora", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} ja započeo/la poziv", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Započni svoj prvi razgovor! 🙂\n- Dodirni gumb „Novi razgovor”\n- Skeniraj QR-kod prijatelja\n- Zabavi se u razgovoru", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Stanje", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Kako si danas?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Pošalji", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Nedjelja", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sinkronizira se … Pričekaj.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sustav", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Za potvrđivanje dodirni uređaj", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Dodirni za prikaz slike", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Dodirni za prikaz izbornika", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Ne poklapaju se", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Poklapaju se", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ova soba je arhivirana.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Četvrtak", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Uklj/Isklj favorite", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Uklj/Isklj isključene", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Označi kao pročitano/nepročitano", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Previše zahtjeva. Pokušaj ponovo kasnije!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Prenesi s jednog drugog uređaja", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Pokušaj ponovo poslati", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Utorak", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nedostupno", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} je ponovo uključio/la {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Deblokiraj uređaj", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Nepoznat uređaj", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Nepoznat algoritam šifriranja", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Nepoznat događaj „{type}”", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Nepoznata sesija. Potvrdi je", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Otključaj sigurnosnu kopiju chata", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Uključi zvuk chata", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Otkvači", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 nepročitan chat} other{{unreadCount} nepročitana chata}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 nepročitana poruka} other{{unreadEvents} nepročitane poruke}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Koristiti kompatibilne boje AMOLED-a?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} i još {count} korisnika pišu …", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} i {username2} pišu …", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} piše …", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} je napustio/la chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Korisničko ime", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Korisnik nije potvrđen", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} ja poslao/la {type} događaj", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Korisnik ima nepoznato stanje potvrđivanja", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Korisnik je potvrđen", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Potvrđeno", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Uspješno potvrđena sesija!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Potvrdi", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Potvrdi ručno", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Pokreni potvrđivanje", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Uspješno si potvrdio/la!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Potvrđivanje drugog računa", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Potvrdi korisnika", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Video poziv", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Vidljivost kronologije chata", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Vidljivo za sve sudionike", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Vidljivo za sve", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Glasovna poruka", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Čeka se na sugovornika da prihvati zahtjev …", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Čeka se na sugovornika da prihvati emoji …", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Čeka se na sugovornika da prihvati brojeve …", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Slika pozadine", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Upozorenje!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Obostrano šifriranje se trenutačno nalazi u beta stanju! Koriti na vlastitu odgovornost!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Srijeda", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Lijep pozdrav u najslađem programu za čavrljanje u mreži Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Poslali smo ti e-poruku", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Tko može izvršiti koju radnju", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Tko se smije pridružiti grupi", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Zašto želiš ovo prijaviti?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Izbrisati sigurnosnu kopiju chata za stvaranje novog sigurnosnog ključa?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Lozinku možeš obnoviti pomoću ovih adresa.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Napiši poruku …", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Da", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Ti", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Pozvan/a si u ovaj chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Više ne sudjeluješ u ovom chatu", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Sebe ne možeš pozvati", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Isključen/a si iz ovog chata", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Tvoji se chatovi sinkroniziraju …", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Tvoje korisničko ime", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Tvoj javni ključ", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Bit ćeš povezan/a s {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Uvećaj", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Umanji", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Dijeli lokaciju", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Lokacijske dozvole su odbijene. Za dijeljenje tvoje lokacije dozvoli ih.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Lokacijske usluge su deaktivirane. Za dijeljenje tvoje lokacije aktiviraj ih.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Dohvaćanje lokacije …", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Greška u dohvaćanju lokacije: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "openInMaps": "Otvori u kartama", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} nije matrix poslužitelj. Da li umjesto njega koristiti {server2}?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "autoplayImages": "Automatski pokreni animirane naljepnice i emotikone", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "allChats": "Svi chatovi", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Chat je uklonjen iz ovog prostora", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat je dodan u ovaj prostor", - "@chatHasBeenAddedToThisSpace": {}, - "addToSpace": "Dodaj u prostor", - "@addToSpace": {}, - "newUsernameDescription": "Tvoj će korisnički ID tada biti u obliku @korisničkoime:imeposlužitelja", - "@newUsernameDescription": {}, - "newPasswordDescription": "Za omogućavanje obnavljanja lozinke, svom računu kasnije dodaj e-mail adresu.", - "@newPasswordDescription": {}, - "createNewChatExplaination": "Jednostavno snimi QR kod ili dijeli poveznicu za pozivnicu ako niste jedan blizu drugog.", - "@createNewChatExplaination": {}, - "serverRequiresEmail": "Za registraciju ovaj poslužitelj mora potvrditi tvoju e-mail adresu.", - "@serverRequiresEmail": {}, - "scanQrCode": "Snimi QR kod", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Upiši poveznicu za pozivnicu …", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Dijeli svoju poveznicu za pozivnicu", - "@shareYourInviteLink": {}, - "homeserver": "Domaći poslužitelj", - "@homeserver": {}, - "sendOnEnter": "Pošalji pritiskom tipke enter", - "@sendOnEnter": {}, - "link": "Poveznica", - "@link": {}, - "enableMultiAccounts": "(BETA) Omogući korištenje više računa na ovom uređaju", - "@enableMultiAccounts": {}, - "bundleName": "Ime paketa", - "@bundleName": {}, - "removeFromBundle": "Ukloni iz ovog paketa", - "@removeFromBundle": {}, - "addToBundle": "Dodaj u paket", - "@addToBundle": {}, - "editBundlesForAccount": "Uredi pakete za ovaj račun", - "@editBundlesForAccount": {}, - "addAccount": "Dodaj račun", - "@addAccount": {}, - "oneClientLoggedOut": "Jedan od tvojih klijenata je odjavljen", - "@oneClientLoggedOut": {}, - "yourUserId": "Tvoj korisnički ID:", - "@yourUserId": {}, - "unverified": "Nepotvrđeno", - "@unverified": {}, - "setupChatBackup": "Postavi sigurnosnu kopiju chata", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Zapisao sam ključ", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Sigurnosna kopija tvog chata je postavljena.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Kako bismo zaštitili tvoje poruke, generirali smo sigurnosni ključ.\nČuvaj ga na sigurnom mjestu, poput upravljača lozinki.", - "@setupChatBackupDescription": {}, - "repeatPassword": "Ponovi lozinku", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Odaberi barem {min} znakova.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "pleaseEnterValidEmail": "Upiši valjanu e-mail adresu.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Lozinke se ne poklapaju!", - "@passwordsDoNotMatch": {}, - "messageInfo": "Informacija poruke", - "@messageInfo": {}, - "messageType": "Vrsta poruke", - "@messageType": {}, - "sender": "Pošiljatelj", - "@sender": {}, - "openGallery": "Otvori galeriju", - "@openGallery": {}, - "loginWithOneClick": "Prijavi se samo s jednim pritiskom", - "@loginWithOneClick": {}, - "time": "Vrijeme", - "@time": {}, - "removeFromSpace": "Ukloni iz prostora", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Ovime se ovaj chat uklanja iz trenutačnog prostora. I dalje će biti vidljiv pod \"Svi chatovi\".", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "Odaberi prostor za dodavanje ovog chata.", - "@addToSpaceDescription": {}, - "start": "Početak", - "@start": {}, - "setupChatBackupNow": "Sada postavit sigurnosnu kopiju chata", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Za otključavanje sigurnosne kopije chata, upši svoj sigurnosni ključ koji je generiran u prethodnoj sesiji. Tvoj sigurnosni ključ NIJE tvoja lozinka.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Sada spremi sigurnosni ključ", - "@saveTheSecurityKeyNow": {}, - "commandHint_clearcache": "Isprazni predmemoriju", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Stvori prazan grupni chat\nKoristi --no-encryption za deaktiviranje šifriranja", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Odbaci sesiju", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Započni izravni chat\nKoristi --no-encryption za deaktiviranje šifriranja", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "openVideoCamera": "Otvori kameru za video", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Razumijem", - "@iUnderstand": {}, - "storyPrivacyWarning": "Imaj na umu da ljudi mogu vidjeti i međusobno se kontaktirati u tvojoj priči. Tvoje priče će biti vidljive 24 sata, ali nema jamstva da će se izbrisati sa svih uređaja i poslužitelja.", - "@storyPrivacyWarning": {}, - "bubbleSize": "Veličina mjehurića", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "Priča od {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Imaj na umu da ljudi mogu vidjeti i međusobno se kontaktirati u tvojoj priči.", - "@whoCanSeeMyStoriesDesc": {}, - "addToStory": "Dodaj priči", - "@addToStory": {}, - "publish": "Objavi", - "@publish": {}, - "whoCanSeeMyStories": "Tko može vidjeti moje priče?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Otkaži pretplatu na priče", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Ovaj korisnik još nije objavio ništa u svojoj priči", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Tvoja priča", - "@yourStory": {}, - "replyHasBeenSent": "Odgovor je poslan", - "@replyHasBeenSent": {}, - "whatIsGoingOn": "Što se događa?", - "@whatIsGoingOn": {}, - "addDescription": "Dodaj opis", - "@addDescription": {}, - "markAsRead": "Označi kao pročitano", - "@markAsRead": {}, - "reportUser": "Prijavi korisnika", - "@reportUser": {}, - "openChat": "Otvori chat", - "@openChat": {}, - "dismiss": "Odbaci", - "@dismiss": {}, - "unsupportedAndroidVersion": "Nepodržana Android verzija", - "@unsupportedAndroidVersion": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Tekstna bilješka", - "@widgetEtherpad": {}, - "widgetCustom": "Prilagođeno", - "@widgetCustom": {}, - "widgetName": "Ime", - "@widgetName": {}, - "widgetUrlError": "Ovo nije valjan URL.", - "@widgetUrlError": {}, - "switchToAccount": "Prijeđi na račun {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Sljedeći račun", - "@nextAccount": {}, - "emailOrUsername": "E-mail ili korisničko ime", - "@emailOrUsername": {}, - "unsupportedAndroidVersionLong": "Ova funkcija zahtijeva noviju verziju Androida. Provjeri, postoje li nove verzije ili podrška za Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "previousAccount": "Prethodni račun", - "@previousAccount": {}, - "showSpaces": "Prikaži popis prostora", - "@showSpaces": {} -} diff --git a/assets/l10n/intl_hu.arb b/assets/l10n/intl_hu.arb deleted file mode 100644 index 1ef0a7dbda..0000000000 --- a/assets/l10n/intl_hu.arb +++ /dev/null @@ -1,2257 +0,0 @@ -{ - "@@locale": "hu", - "@@last_modified": "2021-08-14 12:41:10.016566", - "about": "Névjegy", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Elfogadás", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} elfogadta a meghívást", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Fiók", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Fiókinformációk", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktiválta a végpontok közötti titkosítást", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Csoportleírás hozzáadása", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "álnév", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Van már fiókod?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} megválaszolta a hívást", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Bárki csatlakozhat", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Archívum", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archivált szoba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Csatlakozhatnak-e vendégek", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Biztos vagy benne?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "A kulcsok gyorsítótárazásához meg kell adni a biztonságos tárolóhoz tartozó jelmondatot vagy a visszaállítási kulcsot.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "A másik fél igazolásához meg kell adni a biztonságos tároló jelmondatát vagy a visszaállítási kulcsot.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "A munkamenet hitelesítéséhez meg kell adni a biztonságos tároló jelmondatát vagy a visszaállítási kulcsot.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Elfogadod {username} hitelesítési kérelmét?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Hitelesítés", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "A profilkép megváltozott", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Kitiltás a csevegésből", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Kitiltva", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} kitiltotta: {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Eszköz blokkolása", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Kulcsok gyorsítótárazva", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Mégse", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Eszköznév módosítása", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} módosította a csevegési profilképét", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} módosította a csevegés leírását erre: „{description}”", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} módosította a csevegés nevét erre: „{chatname}”", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} módosította a csevegési engedélyeket", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} módosította a megjenelítési nevét erre: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} módosította a vendégek hozzáférési szabályait", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} módosította a vendégek hozzáférési szabályait, így: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} módosította az előzmények láthatóságát", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} módosította az előzmények láthatóságát, így: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} módosított a csatlakozási szabályokat", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} módosította a csatlakozási szabályokat, így: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} módosította a profilképét", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} módosította a szoba címeit", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} módosította a meghívó hivatkozást", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Változásnapló", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Jelszó módosítása", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "A változások mentve", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Matrix-kiszolgáló váltása", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Stílus módosítása", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Csoport nevének módosítása", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Kiszolgáló módosítása", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Háttér módosítása", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "A titkosítás megsérült", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Csevegés", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Csevegés részletei", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Válassz erős jelszót", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Válassz felhasználónevet", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Bezárás", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Hasonlítsd össze az emodzsikat a másik eszközön lévőkkel, és bizonyosodj meg róla, hogy egyeznek:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Hasonlítsd össze a számokat a másik eszközön lévőkkel, és bizonyosodj meg arról, hogy egyeznek:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Megerősítés", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Csatlakozás", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Csatlakozási kísérlet sikertelen", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Meghívtad az ismerősödet a csoportba", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Tartalommegjelenítő", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Vágólapra másolva", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Másolás", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nem sikerült visszafejteni a titkosított üzenetet: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Nem sikerült beállítani a profilképet", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nem sikerült beállítani a megjelenítési nevet", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} résztvevő", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Létrehozás", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Új fiók létrehozása", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} létrehozta a csevegést", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Új csoport létrehozása", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Eszközök közti aláírás kikapcsolva", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Eszközök közti aláírás bekapcsolva", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Jelenleg aktív", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Sötét", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}. {day}.", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}. {month}. {day}.", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Ez deaktiválja a felhasználói fiókodat. Ez nem vonható vissza! Biztos vagy benne?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "delete": "Törlés", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Fiók törlése", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Üzenet törlése", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Elutasítás", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Eszköz", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "Eszközök", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Kép elvetése", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Megjelenítési név megváltozott", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Adományozás", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Fájl letöltése", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Megjelenítési név módosítása", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Jitsi példány módosítása", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "A hangulatjel már létezik!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Érvénytelen hangulatjel rövid kód!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Hangulatjel-csomagok a szobához", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Hangulatjel-beállítások", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Rövid kód a hangulatjelhez", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "A hangulatjelhez egy képet és egy rövid kódot kell választani!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Üres csevegés", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Hangulatjel-csomag engedélyezése globálisan", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Többé nem fogod tudni kikapcsolni a titkosítást. Biztos vagy benne?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "Titkosítás", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Titkosítási algoritmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Titkosítás nincs engedélyezve", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Végpontok közötti titkosítás beállításai", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} befejezte a hívást", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Adj meg egy csoportnevet", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Adj meg egy felhasználónevet", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Add meg a Matrix-kiszolgálód", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "Fájlnév", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Fájlméret", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Továbbítás", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Péntek", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Csatlakozás óta", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Meghívás óta", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Csoport", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Csoport leírása", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "A csoport leírása megváltozott", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "A csoport nyilvános", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Csoport vele: {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Nem lehetnek vendégek", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Csatlakozhatnak vendégek", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} visszavonta {targetName} meghívását", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Súgó", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Visszavont események elrejtése", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Ismeretlen események elrejtése", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Ez a Matrix-kiszolgáló nem kompatibilis", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Azonosító", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Figyelmen kívül hagyott felhasználók", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Figyelmen kívül hagyhatja azon felhasználókat, akik zavarják. Nem fog üzeneteket vagy szobameghívókat kapni a személyes listáján szereplő felhasználóktól.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Felhasználó figyelmen kívül hagyása", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Hibás jelmondat vagy visszaállítási kulcs", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Ismerős meghívása", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Ismerős meghívása a(z) {groupName} csoportba", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Meghívott", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} meghívta: {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Csak meghívottak", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} meghívott a FluffyChat alkalmazásba. \n1. Telepítsd a FluffyChat appot: https://fluffychat.im \n2. Regisztrálj, vagy jelentkezz be. \n3. Nyisd meg a meghívó hivatkozást: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Helyes-e a következő eszközkulcs?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "gépel…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} csatlakozott a csevegéshez", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Csatlakozás a szobához", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Kulcsok gyorsítótárazva", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "A kulcsok hiányoznak", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} kirúgta: {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} kirúgta és kitiltotta: {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Kirúgás a csevegésből", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Utoljára aktív: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Utoljára látott IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Már régen látta", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Csevegés elhagyása", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Elhagyta a csevegést", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licenc", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Világos", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "További {count} résztvevő betöltése", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Betöltés… Kérlek, várj.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Továbbiak betöltése…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Bejelentkezés", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Bejelentkezés a(z) {homeserver} Matrix-kiszolgálóra", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Kijelentkezés", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Kinevezés moderátorrá", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Kinevezés adminná", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Bizonyosodj meg az azonosító helyességéről", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "mention": "Megemlítés", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Az üzenet minden résztvevő számára törlődni fog", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderátor", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Hétfő", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Csevegés némítása", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Jelenleg a Pantalaimon szükséges a végpontok közötti titkosítás használatához.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Új üzenet a FluffyChat alkalmazásban", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Új hitelesítési kérelem!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "no": "Nem", - "@no": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "A FluffyChat jelenleg nem támogatja az eszközök közti aláírás bekapcsolását. Engedélyezd az Elementben.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nincsenek hangulatjelek. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Úgy tűnik, hogy nincsenek Google szolgáltatások a telefonodon. Ez adatvédelmi szempontból jó döntés! Ahhoz, hogy push értesítéseket fogadhass a FluffyChat alkalmazásban, a microG használatát javasoljuk: https://microg.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "A FluffyChat jelenleg nem támogatja az online kulcsmentést. Engedélyezd az Elementben.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Nincs", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Nincsenek engedélyek", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nem találhatók szobák…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nem támogatott a webes verzióban", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} kiválasztva", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online kulcsmentés letiltva", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online kulcsmentés engedélyezve", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Hoppá, valami baj történt…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Alkalmazás megnyitása az üzenetek elolvasásához", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Kamera megnyitása", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "Csoportnév (nem kötelező)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Résztvevő felhasználók eszközei", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "Jelmondat vagy visszaállítási kulcs", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Jelszó", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "A jelszó módosítva", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Kép választása", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Rögzítés", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "{fileName} lejátszása", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Válassz egy felhasználónevet", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Írj be egy Matrix-azonosítót.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Add meg a jelszavad", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Add meg a felhasználónevedet", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "privacy": "Adatvédelem", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Nyilvános szobák", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "Felvétel", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} visszavont egy eseményt", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Elutasítás", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} elutasította a meghívást", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Újracsatlakozás", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Eltávolítás", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Minden más eszköz eltávolítása", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "{username} törölte", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Eszköz eltávolítása", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Kitiltás feloldása", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Üzenet eltávolítása", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Formázott üzenetek megjelenítése", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Válasz", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Jogosultság igénylése", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Hozzáférés kérése a korábbi üzenetekhez", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Minden jogosultság megvonása", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "A szoba frissítve lett", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Szombat", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Csevegés keresése", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username} látta", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{{username} és {count} másik résztvevő látta}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username} és {username2} látta", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Küldés", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Üzenet küldése", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Hangüzenet küldése", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Hibajelentések engedélyezése a sentry.io használatával", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Fájl küldése", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Kép küldése", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Eredeti küldése", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Videó küldése", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} fájlt küldött", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} hangüzenetet küldött", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} képet küldött", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} matricát küldött", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} videót küldött", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} hívásinformációt küldött", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Adatvédelmi információk: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Munkamenet hitelesítve", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Profilkép beállítása", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Csoportleírás beállítása", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Meghívó hivatkozás beállítása", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Állapot beállítása", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Beállítások", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Megosztás", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} megosztotta a pozícióját", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Regisztráció", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Kihagyás", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Forráskód", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} hívást indított", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Kezdj el csevegni :-)", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Hogy vagy?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Beküldés", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Vasárnap", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Rendszer", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Koppintás a menü megjelenítéséhez", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Nem egyeznek", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Egyeznek", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ez a szoba archiválva lett.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Csütörtök", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Újraküldés megpróbálása", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Kedd", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nem érhető el", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} feloldotta {targetName} kitiltását", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Eszköz blokkolásának megszüntetése", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Ismeretlen eszköz", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Ismeretlen titkosítási algoritmus", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Ismeretlen esemény: „{type}”", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Ismeretlen munkamenet, kérlek hitelesítsd", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Csevegés némításának megszüntetése", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Rögzítés megszüntetése", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} olvasatlan csevegés}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} olvasatlan üzenet}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED kompatibilis színek használata?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} és {count} másik résztvevő gépel…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} és {username2} gépel…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} gépel…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} elhagyta a csevegést", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Felhasználónév", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} {type} eseményt küldött", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Sikeresen hitelesítetted a munkamenetet!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Hitelesítés", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Kézi hitelesítés", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Hitelesítés megkezdése", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Sikeres hitelesítés!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Másik fiók hitelesítése", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Felhasználó hitelesítése", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videóhívás", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Csevegési előzmény láthatósága", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Minden résztvevő számára látható", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Bárki számára látható", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Hangüzenet", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Várakozás partnerre, amíg elfogadja a kérést…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Várakozás partnerre, hogy elfogadja a hangulatjeleket…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Várakozás a partnerre, hogy elfogadja a számokat…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Háttér", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Figyelmeztetés!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "A végpontok közötti titkosítás egyelőre béta! Csak saját felelősségre!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Szerda", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Üdvözöl a legcukibb Matrix üzenetküldő alkalmazás.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Ki csatlakozhat a csoporthoz", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Írj egy üzenetet…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Igen", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Te", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Meghívtak ebbe a csevegésbe", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Nem veszel részt ebben a csevegésben", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Nem tudod meghívni magadat", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Kitiltottak ebből a csevegésből", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "A saját felhasználóneved", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Ezzekkel a címekkel vissza tudod állítani a jelszavad, ha szükséges", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Küldtünk neked egy emailt", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Jelszó visszaállítás", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Még nem adtál meg semmilyen módot a jelszavad visszaállítására", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Meghívás nekem", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Rákattintottam a linkre", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Adj meg egy email címet", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Titkosított", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "edit": "Szerkeszt", - "@edit": { - "type": "text", - "placeholders": {} - }, - "directChats": "Közvetlen beszélgetés", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Eszköz ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot üzenetek", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "repeatPassword": "Jelszó megismétlése", - "@repeatPassword": {}, - "addEmail": "E-mail-cím hozzáadása", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Új barát hozzáadása", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "all": "Összes", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Összes csevegés", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Animált matricák és hangulatjelek automatikus lejátszása", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "sendOnEnter": "Küldés Enterrel", - "@sendOnEnter": {}, - "cantOpenUri": "Nem sikerült az URI megnyitása: {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeYourAvatar": "Profilkép módosítása", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Saját Matrix címed:", - "@yourUserId": {}, - "addToSpace": "Hozzáadás térhez", - "@addToSpace": {}, - "areYouSureYouWantToLogout": "Biztos, hogy kijelentkezel?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Lejátszás", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "A Matrix-kiszolgáló a következő bejelentkezéseket támogatja:\n{serverVersions}\nDe ez az alkalmazást csak ezeket támogatja:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "blocked": "Blokkolva", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "passwordsDoNotMatch": "A jelszavak nem egyeznek.", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "Válasszon legalább {min} karaktert.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "pleaseEnterValidEmail": "Adjon meg egy érvényes e-mail-címet.", - "@pleaseEnterValidEmail": {}, - "appLock": "Alkalmazászár", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Szüneteltetés", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomnick": "Az ebben a szobában megjelenített beceneved megváltoztatása", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_plain": "Formázatlan szöveg küldése", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "Szöveg küldése", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "contentHasBeenReported": "A tartalom jelentve lett a szerver üzemeltetőinek", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomavatar": "Az ebben a szobában megjelenített profilképed megváltoztatása (mxc URI-t kell megadni)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "copyToClipboard": "Vágólapra másolás", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Beszélgetés engedélyek szerkesztése", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Szoba címeinek szerkesztése", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Szoba profilképének szerkesztése", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Engedélyezd a beszélgetések mentését, hogy soha ne veszítsd el a beszélgetéseidhez való hozzáférést.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Titkosítás bekapcsolása", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Add meg a tér nevét", - "@enterASpacepName": {}, - "extremeOffensive": "Extrém sértő", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Betűméret", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Minden kész!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "groups": "Csoportok", - "@groups": { - "type": "text", - "placeholders": {} - }, - "friends": "Ismerősök", - "@friends": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Mennyire sértő ez a tartalom?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Nem sértő", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "A helymeghatározás nincs engedélyezve az alkalmazásnak. Kérlek engedélyezd, hogy meg tudd osztani a helyzeted.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "newChat": "Új beszélgetés", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "QR kód beolvasása", - "@scanQrCode": {}, - "newUsernameDescription": "A Matrix címed valahogy így fog kinézni: @felhasználó:szerver", - "@newUsernameDescription": {}, - "noPublicRoomsFound": "Nem találhatók nyilvános szobák…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "typeInInviteLinkManually": "Meghívási link beírása...", - "@typeInInviteLinkManually": {}, - "notificationsEnabledForThisAccount": "Értesítések bekapcsolása ebben a fiókban", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "offensive": "Sértő", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oops! Sajnos hiba történt a push értesítések beállításakor.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "loginWithOneClick": "Bejelentkezés egy kattintással", - "@loginWithOneClick": {}, - "discoverGroups": "Csoportok felfedezése", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "A beszélgetés el lett távolítva ebből a térből", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearText": "Szöveg törlése", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "commandHint_create": "Egy üres csoport létrehozása\nA --no-encryption kapcsolóval titkosítatlan szoba hozható létre", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_invite": "Felhasználó meghívása ebbe a szobába", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "locationDisabledNotice": "A helymeghatározás ki van kapcsolva. Kérlek, kapcsold be, hogy meg tudd osztani a helyzeted.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Matrix szerver", - "@homeserver": {}, - "chatBackup": "Beszélgetések mentése", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "ignore": "Figyelmen kívül hagyás", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "next": "Következő", - "@next": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "Beszélgetések mentésének beállítása", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Leírtam a kulcsot", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "A beszélgetések mentése be lett állítva.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Az üzeneteid védelme érdekében generáltunk neked egy biztonsági kulcsot.\nKérlek, tárold egy biztonságos helyen, mint például egy jelszókezelő.", - "@setupChatBackupDescription": {}, - "chatBackupDescription": "A beszélgetések mentése egy biztonsági kulccsal van védve. Bizonyosodj meg róla, hogy nem fogod elveszíteni.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Tartalmazza a megjelenített becenevet", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Tartalmazza a felhasználónevet", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Új szoba megnyitása", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Érvénytelen email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Nem elérhető a szerver", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Nincs leírás", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Csak akkor kapcsolható be a titkosítás, ha a szoba nem nyilvánosan hozzáférhető.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "bubbleSize": "Buborék méret", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "A beszélgetés hozzá lett adva ehhez a térhez", - "@chatHasBeenAddedToThisSpace": {}, - "chats": "Beszélgetések", - "@chats": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Archívum törlése", - "@clearArchive": {}, - "commandHint_ban": "Felhasználó kitiltása ebből a szobából", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "Gyorsítótár törlése", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "Munkamenet elvetése", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Közvetlen beszélgetés indítása\nA --no-encryption kapcsolóval titkosítatlan beszélgetés lesz létrehozva", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_html": "HTML formázott üzenet küldése", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_join": "Csatlakozás a megadott szobához", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "A megadott felhasználó kirúgása a szobából", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Ennek a szobának az elhagyása", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandInvalid": "Érvénytelen parancs", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} nem egy parancs.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "configureChat": "Beszélgetés beállítása", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Új tér", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Alapértelmezett hozzáférési szint", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "A titkosítás csak akkor biztonságos, ha az összes eszköz ellenőrizve lett.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "discover": "Felfedezés", - "@discover": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Hiba a tartózkodási hely lekérése közben: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "memberChanges": "Tagság változások", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "messages": "Üzenetek", - "@messages": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} nem egy Matrix szerver, használjam a {server2} szervert inkább?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "createNewChatExplaination": "Egyszerűen szkenneld be a QR kódot, vagy oszdd meg a meghívási linket, ha a szkennelés nem lehetséges.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Meghívási link küldése", - "@shareYourInviteLink": {}, - "notifications": "Értesítések", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count} felhasználó gépel…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Tartózkodási hely lekérése…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "openVideoCamera": "Kamera megnyitása videóhoz", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_hy.arb b/assets/l10n/intl_hy.arb deleted file mode 100644 index c3ecf58685..0000000000 --- a/assets/l10n/intl_hy.arb +++ /dev/null @@ -1,1551 +0,0 @@ -{ - "@@locale": "hy", - "@@last_modified": "2021-08-14 12:41:10.006533", - "about": "Հավելվածի մասին", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Ընդունել", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username}-ը ընդունել է հրավերը", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Հաշիվ", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Տեղեկություններ հաշվի մասին", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}-ը ակտիվացրել է end to end կոդավորումը", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Ավելացնել խմբի նկարագրություն", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Համակարգող", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "կեղծանուն", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Արդեն հաշի՞վ ունեք", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "Յուրաքանչյուրը կարող է միանալ", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Արխիվ", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Արխիվացված սենյակ", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Արդյո՞ք հյուր օգտատերերին թույլատրվում է միանալ", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Համոզվա՞ծ եք", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "delete": "", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "", - "@identity": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "keysCached": "", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "ok": "", - "@ok": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "", - "@password": { - "type": "text", - "placeholders": {} - }, - "pickImage": "", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "play": "", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndUser": "", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sessionVerified": "", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "useAmoledTheme": "", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - } -} \ No newline at end of file diff --git a/assets/l10n/intl_id.arb b/assets/l10n/intl_id.arb deleted file mode 100644 index 6c9ac2fab8..0000000000 --- a/assets/l10n/intl_id.arb +++ /dev/null @@ -1,2886 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:10.002360", - "setAsCanonicalAlias": "Atur sebagai alias utama", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versi ruangan", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grup-grup Publik", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "people": "Orang-orang", - "@people": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Pergi ke ruangan yang baru", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "chats": "Chat", - "@chats": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "Blokir Perangkat", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar diubah", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentikasi", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Apakah kamu yakin ingin keluar?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Apakah kamu yakin?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "archive": "Arsip", - "@archive": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "Siapa saja dapat bergabung", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} menjawab panggilan", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "alreadyHaveAnAccount": "Sudah memiliki akun?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Tambahkan deskripsi grup", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informasi akun", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "account": "Akun", - "@account": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} menerima undangannya", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "accept": "Terima", - "@accept": { - "type": "text", - "placeholders": {} - }, - "about": "Tentang", - "@about": { - "type": "text", - "placeholders": {} - }, - "isTyping": "sedang mengetik…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "isDeviceKeyCorrect": "Apakah kunci perangkat berikut ini benar?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} mengundang kamu ke FluffyChat. \n1. Instal FluffyChat: https://fluffychat.im \n2. Daftar atau masuk \n3. Buka tautan undangan: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "inviteForMe": "Undangan untuk saya", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "invitedUsersOnly": "Pengguna yang diundang saja", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} mengundang {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invited": "Diundang", - "@invited": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Undang kontak ke {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "inviteContact": "Undang kontak", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frasa sandi atau kunci pemulihan yang salah", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Saya sudah klik tautannya", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Abaikan nama pengguna", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Kamu bisa mengabaikan pengguna yang mengganggu. Kamu tidak akan dapat menerima pesan atau undangan ruang apa pun dari pengguna di daftar abaian pribadimu.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Pengguna yang diabaikan", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "identity": "Identitas", - "@identity": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver tidak kompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Sembunyikan peristiwa tidak dikenal", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Sembunyikan peristiwa yang dihapus", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "help": "Bantuan", - "@help": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} telah mencabut undangan untuk {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "guestsCanJoin": "Tamu bisa bergabung", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "guestsAreForbidden": "Tamu dilarang", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grup dengan {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "groupIsPublic": "Grup bersifat publik", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Deskripsi grup diubah", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Deskripsi grup", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "group": "Grup", - "@group": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Dari undangan", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Dari bergabung", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "friday": "Jumat", - "@friday": { - "type": "text", - "placeholders": {} - }, - "forward": "Teruskan", - "@forward": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Ukuran file", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nama file", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Semua siap!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Masukkan homeserver-mu", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Masukkan nama pengguna", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Masukkan alamat email", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Masukkan nama grup", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} mengakhiri panggilan", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "encryption": "Enkripsi", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Terenkripsi", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Kamu tidak akan bisa menonaktifkan enkripsi. Apakah kamu yakin?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Aktifkan paket emote secara global", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Chat kosong", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Kamu harus memilih shortcode emote dan gambar!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Shortcode emote", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Pengaturan Emote", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Paket emote untuk ruangan", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Shortcode emote tidak valid!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emote sudah ada!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Edit alias ruangan", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Edit instansi Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Edit nama tampilan", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "edit": "Edit", - "@edit": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Unduh berkas", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Nama tampilan telah diubah", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Buang gambar", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "directChats": "Chat Langsung", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Enkripsi hanya aman jika semua perangkat telah diverifikasi.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "devices": "Perangkat", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID Perangkat", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "device": "Perangkat", - "@device": { - "type": "text", - "placeholders": {} - }, - "deny": "Tolak", - "@deny": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Hapus pesan", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Hapus akun", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "delete": "Hapus", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deactivateAccountWarning": "Ini akan menonaktifkan akun penggunamu. Ini tidak bisa dibatalkan! Apakah kamu yakin?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateAndTimeOfDay": "{timeOfDay}, {date}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "currentlyActive": "Aktif", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Tanda tangan silang dinyalakan", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Tanda tangan silang dimatikan", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "Buat grup baru", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} membuat chat ini", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createAccountNow": "Buat akun sekarang", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "create": "Buat", - "@create": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} anggota", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "couldNotSetDisplayname": "Tidak dapat mengubah nama tampilan", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Tidak dapat mengubah avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Tidak dapat mendekripsikan pesan: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "copyToClipboard": "Salin ke papan klip", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Salin", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Disalin ke papan klip", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Tampilan konten", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Cadangan chat", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Enkripsi telah rusak", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Ubah avatarmu", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Ubah wallpaper", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Ubah server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Ubah nama grup", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Ubah homeserver", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Ubah kata sandi", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changelog": "Changelog", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changedTheRoomInvitationLink": "{username} mengubah tautan undangan", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} mengubah alias ruangan", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheProfileAvatar": "{username} mengubah avatarnya", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} mengubah aturan bergabung ke: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheJoinRules": "{username} mengubah aturan bergabung", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} mengubah visibilitas sejarah ke: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} mengubah visibilitas sejarah", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} mengubah aturan akses tamu ke: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheGuestAccessRules": "{username} mengubah aturan akses tamu", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} mengubah nama tampilan ke: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheChatPermissions": "{username} mengubah izin chat", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatNameTo": "{username} mengubah nama chat ke: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatDescriptionTo": "{username} mengubah deskripsi chat ke: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatAvatar": "{username} mengubah avatar chat", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeDeviceName": "Ganti nama perangkat", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Tidak bisa membuka URI ini {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "cancel": "Batal", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Kunci dicache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Pesan bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "blocked": "Diblokir", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} mencekal {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "banned": "Dicekal", - "@banned": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Cekal dari chat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Homeserver ini mendukung versi Spec ini:\n{serverVersions}\nTetapi aplikasi ini hanya mendukung {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "Kirim dengan enter", - "@sendOnEnter": {}, - "badServerLoginTypesException": "Homeserver ini mendukung tipe masuk ini:\n{serverVersions}\nTetapi aplikasi ini mendukung:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "autoplayImages": "Mainkan stiker beranimasi dan emote secara otomatis", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "audioPlayerPlay": "Main", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Jeda", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Terima permintaan verifikasi dari {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "askSSSSVerify": "Mohon masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu untuk memverifikasi sesimu.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Untuk dapat menandatangani orang lain, silakan masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Mohon masukkan frasa sandi atau kunci pemulihan penyimpanan aman Anda untuk men-cache kunci.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Apakah pengguna tamu diizinkan untuk bergabung", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Ruangan yang Diarsipkan", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "appLock": "Kunci aplikasi", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "allChats": "Semua obrolan", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "all": "Semua", - "@all": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Tambah ke space", - "@addToSpace": {}, - "addNewFriend": "Tambah teman baru", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Tambah email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Pengaturan enkripsi ujung-ke-ujung", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Enkripsi tidak diaktifkan", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritma enkripsi", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Berisi nama pengguna", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Berisi nama tampilan", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontak telah diundang ke grup", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Upaya koneksi gagal", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "connect": "Hubungkan", - "@connect": { - "type": "text", - "placeholders": {} - }, - "confirm": "Konfirmasi", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Bandingkan dan pastikan angka cocok di perangkat lainnya:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Bandingkan dan pastikan emoji cocok di perangkat lainnya:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "close": "Tutup", - "@close": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Bersihkan arsip", - "@clearArchive": {}, - "chooseAUsername": "Pilih username", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Pilih kata sandi yang kuat", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detail chat", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Pesan lamamu diamankan dengan sebuah kunci pemulihan. Pastikan kamu tidak menghilangkannya.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} mengaktifkan enkripsi ujung ke ujung", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "loadingPleaseWait": "Memuat… Mohon tunggu.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Muat {count} anggota", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "license": "Lisensi", - "@license": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Keluar dari chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "leave": "Tinggalkan", - "@leave": { - "type": "text", - "placeholders": {} - }, - "lastSeenIp": "IP terakhir dilihat", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Terakhir aktif: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "kickFromChat": "Keluarkan dari chat", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "kickedAndBanned": "{username} mengeluarkan dan mencekal {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kicked": "{username} mengeluarkan {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "keysMissing": "Tidak ada kunci", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Kunci telah dicache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Gabung ruangan", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} telah bergabung di chat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "loadMore": "Muat lebih banyak…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Tidak menemukan ruangan publik…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Tidak ada izin", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Kamu belum menambahkan cara untuk memulihkan kata sandimu.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "none": "Tidak Ada", - "@none": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Mohon menyalakan cadangan kunci online di Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Sepertinya kamu tidak memiliki layanan Google di ponselmu. Keputusan yang baik untuk privasimu! Untuk menerima pemberitahuan push di FluffyChat, sebaiknya kamu menggunakan https://microg.org/ atau https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Kamu hanya bisa mengaktifkan enkripsi setelah ruangan tidak lagi dapat diakses secara publik.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Tidak ada emote yang ditemukan. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "next": "Lanjut", - "@next": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Permintaan verifikasi baru!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Pesan baru di FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newChat": "Chat baru", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Perlu diketahui bahwa kamu memerlukan Pantalaimon untuk menggunakan enkripsi ujung-ke-ujung untuk saat ini.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Bisukan chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "monday": "Senin", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Pesan akan dihapus untuk semua anggota", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "mention": "Sebutkan", - "@mention": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Perubahan anggota", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Pastikan pengenalnya valid", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Jadikan admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Jadikan moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "logout": "Keluar", - "@logout": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Masuk ke {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "login": "Masuk", - "@login": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Tidak ada ruangan yang ditemukan…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Perkecil", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Perbesar", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Kamu akan dihubungkan ke {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "verified": "Terverifikasi", - "@verified": { - "type": "text", - "placeholders": {} - }, - "userLeftTheChat": "{username} keluar dari chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "unavailable": "Tidak tersedia", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transfer dari perangkat lain", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Ketuk perangkat untuk memverifikasi", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Tampilkan kata sandi", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Kunci keamanan hilang?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Kunci keamanan", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Hapus avatarmu", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "register": "Daftar", - "@register": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Aturan push", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Mohon ikuti petunjuk di situs web dan tekan lanjut.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Mohon masukkan kunci keamananmu:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Mohon pilih", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Ups! Sayangnya, terjadi kesalahan saat mengatur pemberitahuan push.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Cadangan Kunci Online dinyalakan", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Cadangan Kunci Online dimatikan", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} terpilih", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "notSupportedInWeb": "Tidak didukung di web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notifikasi diaktifkan untuk akun ini", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notifikasi", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Tidak ada status yang ditemukan sejauh ini.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Kunci publikmu", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Nama penggunamu sendiri", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Chatmu sedang disinkronasikan…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Kamu telah dicekal dari chat ini", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Kamu tidak bisa mengundang kamu sendiri", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Kamu tidak berpartisipasi lagi di chat ini", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Kamu diundang ke chat ini", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "you": "Kamu", - "@you": { - "type": "text", - "placeholders": {} - }, - "yes": "Ya", - "@yes": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Tulis pesan…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Dengan alamat ini kamu bisa memulihkan kata sandimu.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Hapus cadangan chat untuk membuat kunci pemulihan baru?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Kenapa kamu ingin melaporkannya?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Siapa yang dapat bergabung ke grup ini", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Siapa yang dapat melakukan tindakan apa", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Kami mengirim kamu sebuah email", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Selamat datang ke perpesanan instan yang paling lucu di jaringan Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Rabu", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Enkripsi ujung-ke-ujung saat ini masih dalam beta! Gunakan dengan risikomu sendiri!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "warning": "Peringatan!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Latar belakang", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Menunggu pengguna untuk menerima angka…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Menunggu pengguna untuk menerima emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Menunggu pengguna untuk menerima permintaan…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Pesan suara", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Terlihat untuk semua orang", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Terlihat untuk semua anggota", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilitas sejarah chat", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Panggilan video", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifikasi Pengguna", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Memverifikasi akun lain", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Kamu berhasil memverifikasi!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Mulai Verifikasi", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifikasi Secara Manual", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verify": "Verifikasi", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Berhasil memverifikasi sesi!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Pengguna terverifikasi", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Pengguna memiliki status verifikasi yang tidak dikenal", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} mengirim peristiwa {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userNotVerified": "Pengguna tidak diverifikasi", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "username": "Nama Pengguna", - "@username": { - "type": "text", - "placeholders": {} - }, - "userIsTyping": "{username} sedang mengetik…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userAndUserAreTyping": "{username} dan {username2} sedang mengetik…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userAndOthersAreTyping": "{username} dan {count} lainnya sedang mengetik…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "useAmoledTheme": "Gunakan warna yang kompatibel dengan AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "unreadMessages": "{unreadEvents, plural, =1{1 pesan belum dibaca} other{{unreadEvents} pesan belum dibaca}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "unreadChats": "{unreadCount, plural, =1{1 chat belum dibaca} other{{unreadCount} chat belum dibaca}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unpin": "Lepaskan pin", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Bunyikan chat", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Buka cadangan chat", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unknownSessionVerify": "Sesi tidak dikenal, mohon verifikasi", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Peristiwa tidak dikenal '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownEncryptionAlgorithm": "Algoritma enkripsi tidak dikenal", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Perangkat tidak dikenal", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unblockDevice": "Hilangkan Pemblokiran Perangkat", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} menghilangkan cekalan {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "tuesday": "Selasa", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Coba kirim lagi", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Terlalu banyak permintaan. Coba lagi nanti!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Tandai Baca/Belum Dibaca", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Beralih Bisuan", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Beralih Favorit", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}.{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "thursday": "Kamis", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ruangan ini telah diarsipkan.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Cocok", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Tidak Cocok", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Ketuk untuk menampilkan menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Ketuk untuk menampilkan gambar", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistem", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Menyinkronkan... Mohon tunggu.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "sunday": "Minggu", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "submit": "Kirim", - "@submit": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Apa kabar hari ini?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Mulai chat pertamamu sekarang juga! 🙂\n- Ketuk 'Chat baru'\n- Pindai kode QR temanmu\n- Selamat bersenang-senang chattingan", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} memulai panggilan", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "spaceName": "Nama space", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Space publik", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Kode sumber", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Suara, getaran warna LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "skip": "Lewat", - "@skip": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Login Masuk Tunggal", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "signUp": "Daftar", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Bagikan lokasi", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} membagikan lokasinya", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "share": "Bagikan", - "@share": { - "type": "text", - "placeholders": {} - }, - "settings": "Pengaturan", - "@settings": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Tetapkan status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Tetapkan level izin", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Tetapkan tautan undangan", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Tetapkan deskripsi grup", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Tetapkan emote kustom", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Tetapkan gambar profil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesi telah diverifikasi", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "Informasi tentang privasimu: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sentCallInformations": "{senderName} mengirim informasi panggilan", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentAVideo": "{username} mengirim video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} mengirim stiker", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} mengirim gambar", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} mengirim suara", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAFile": "{username} mengirim file", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndUser": "Dilihat oleh {username} dan {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Dilihat oleh {username} dan {count} lainnya}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUser": "Dilihat oleh {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "security": "Keamanan", - "@security": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Cari chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "search": "Cari", - "@search": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Simpan file ke folder ini", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Hilangkan semua izin", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Minta membaca pesan lama", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Minta izin", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Laporkan pesan", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "reply": "Balas", - "@reply": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Menggantikan ruangan dengan versi baru", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Render konten pesan kaya", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Hapus pesan", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Hilangkan cekalan dari chat", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "remove": "Hapus", - "@remove": { - "type": "text", - "placeholders": {} - }, - "rejoin": "Gabung kembali", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} menolak undangannya", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Tolak", - "@reject": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Hapus pesan", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} menghapus sebuah peristiwa", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "pleaseEnterYourPassword": "Mohon masukkan kata sandimu", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Mohon masukkan ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Mohon klik tautan di email dan lanjut.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Mohon pilih nama pengguna", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Mohon pilih kode sandi", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "play": "Mainkan {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pin": "Pin", - "@pin": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Pemulihan kata sandi", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Kata sandi telah diubah", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Lupa kata sandi", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "password": "Kata sandi", - "@password": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "frasa sandi atau kunci pemulihan", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Perangkat pengguna yang disertai", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "participant": "Peserta", - "@participant": { - "type": "text", - "placeholders": {} - }, - "or": "Atau", - "@or": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opsional) Nama grup", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "serverRequiresEmail": "Server ini harus memvalidasi alamat email kamu untuk registrasi.", - "@serverRequiresEmail": {}, - "openInMaps": "Buka di peta", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "enableMultiAccounts": "(BETA) Aktifkan multi-akun di perangkat ini", - "@enableMultiAccounts": {}, - "bundleName": "Nama bundel", - "@bundleName": {}, - "removeFromBundle": "Hilangkan dari bundel ini", - "@removeFromBundle": {}, - "addToBundle": "Tambah ke bundel", - "@addToBundle": {}, - "editBundlesForAccount": "Edit bundel untuk akun ini", - "@editBundlesForAccount": {}, - "addAccount": "Tambah akun", - "@addAccount": {}, - "oneClientLoggedOut": "Salah satu klienmu telah keluar", - "@oneClientLoggedOut": {}, - "openCamera": "Buka kamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Buka aplikasi untuk membaca pesan", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Ups, ada yang salah…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "offensive": "Menyinggung", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Mendapatkan lokasi…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count} pengguna sedang mengetik…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "newUsernameDescription": "ID penggunamu akan memiliki format @namapengguna:namaserver", - "@newUsernameDescription": {}, - "newPasswordDescription": "Untuk bisa memulihkan kata sandi, kamu nanti harus menambahkan alamat email ke akunmu.", - "@newPasswordDescription": {}, - "scanQrCode": "Pindai kode QR", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Masukkan tautan undangan secara manual...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Bagikan tautan undanganmu", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Cukup pindai kode QR atau bagikan tautan undanganmu jika kamu tidak bersebelahan.", - "@createNewChatExplaination": {}, - "noMatrixServer": "{server1} itu bukan server Matrix, gunakan {server2} saja?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noDescription": "Tidak ada deskripsi", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat saat ini tidak mendukung penandatanganan silang. Mohon aktifkan di Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "no": "Tidak", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Tidak ada koneksi ke server", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 peristiwa lebih} other{{count} peristiwa lebih}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "messages": "Pesan", - "@messages": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Masuk dengan {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "locationDisabledNotice": "Layanan lokasi dinonaktifkan. Mohon diaktifkan untuk bisa membagikan lokasimu.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Izin lokasi ditolak. Mohon memberikan izin untuk bisa membagikan lokasimu.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Terang", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Terlihat beberapa waktu yang lalu", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Email tidak valid", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Tidak menyinggung", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "ignore": "Abaikan", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Seberapa menyinggungnya konten ini?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "groups": "Grup", - "@groups": { - "type": "text", - "placeholders": {} - }, - "friends": "Teman", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Ukuran font", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Gagal mendapat lokasi: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "homeserver": "Homeserver", - "@homeserver": {}, - "enterASpacepName": "Masukkan nama space", - "@enterASpacepName": {}, - "enableEncryption": "Aktifkan enkripsi", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Aktifkan cadangan chat untuk tidak kehilangan akses chatmu.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Edit avatar ruangan", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Edit izin chat", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Edit server yang diblokir", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Batalkan dan jangan tanya lagi", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "donate": "Beri Donasi", - "@donate": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Temukan grup", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "Temukan", - "@discover": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Level izin default", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Gelap", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Space baru", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Konten telah dilaporkan ke admin server", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Konfigurasikan chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "commandMissing": "{command} bukan sebuah perintah.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandInvalid": "Perintah tidak valid", - "@commandInvalid": { - "type": "text" - }, - "commandHint_unban": "Hilangkan cekalan untuk pengguna yang dicantumkan dari ruangan ini", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandHint_send": "Kirim teks", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_react": "Kirim balasan sebagai reaksi", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_plain": "Kirim teks yang tidak diformat", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_op": "Tetapkan tingkat kekuatan pengguna yang dicantum (default: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_myroomnick": "Tetapkan nama tampilanmu untuk ruangan ini", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_myroomavatar": "Tetapkan gambarmu untuk ruangan ini (oleh uri-mxc)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_me": "Jelaskan dirimu", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_leave": "Tinggalkan ruangan ini", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_kick": "Keluarkan pengguna yang dicantum dari ruangan ini", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_join": "Gabung ke ruangan yang dicantum", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_invite": "Undang pengguna yang dicantum ke ruangan ini", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_html": "Kirim teks yang diformat dengan HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_ban": "Cekal pengguna yang dicantumkan dari ruangan ini", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "clearText": "Bersihkan teks", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Chat telah dikeluarkan dari space ini", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat telah ditambahkan ke space ini", - "@chatHasBeenAddedToThisSpace": {}, - "changeTheme": "Ubah tema", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Perubahan telah disimpan", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Sangat menyinggung", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Kirim video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Kirim stiker", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Kirim yang asli", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Kirim pesan", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Kirim gambar", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Kirim file", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Izinkan mengirim laporan bug dengan sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Kirim suara", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Kirim sebagai teks", - "@sendAsText": { - "type": "text" - }, - "sendAMessage": "Kirim pesan", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "send": "Kirim", - "@send": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Simpan file", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "File disimpan sebagai {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "roomHasBeenUpgraded": "Ruangan telah ditingkatkan", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sabtu", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "removeDevice": "Hapus perangkat", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Dihapus oleh {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeAllOtherDevices": "Hapus semua perangkat lain", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "recording": "Merekam", - "@recording": { - "type": "text", - "placeholders": {} - }, - "reason": "Alasan", - "@reason": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Space publik", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Ruangan Publik", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Kunci Publik", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privasi", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Mohon masukkan nama penggunamu", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Mohon masukkan 4 digit atau tinggalkan kosong untuk menonaktifkan kunci aplikasi.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Masukkan pin", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Pilih gambar", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "link": "Tautan", - "@link": {}, - "setupChatBackup": "Siapkan cadangan pesan", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Saya telah menuliskan kuncinya", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Cadangan pesanmu telah disiapkan.", - "@yourChatBackupHasBeenSetUp": {}, - "yourUserId": "ID penggunamu:", - "@yourUserId": {}, - "setupChatBackupDescription": "Untuk melindungi pesanmu, kami telah membuat kunci pemulihan untukmu.\nSilakan simpan kuncinya di tempat yang aman, seperti manajer kata sandi.", - "@setupChatBackupDescription": {}, - "unverified": "Tidak terverifikasi", - "@unverified": {}, - "pleaseEnterValidEmail": "Mohon masukkan alamat email yang valid.", - "@pleaseEnterValidEmail": {}, - "pleaseChooseAtLeastChars": "Mohon pilih minimal {min} karakter.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "repeatPassword": "Ulangi kata sandi", - "@repeatPassword": {}, - "passwordsDoNotMatch": "Kata sandi tidak cocok!", - "@passwordsDoNotMatch": {}, - "messageInfo": "Informasi pesan", - "@messageInfo": {}, - "time": "Waktu", - "@time": {}, - "messageType": "Tipe Pesan", - "@messageType": {}, - "sender": "Pengirim", - "@sender": {}, - "openGallery": "Buka galeri", - "@openGallery": {}, - "addToSpaceDescription": "Pilih sebuah space untuk menambahkan chat ke spacenya.", - "@addToSpaceDescription": {}, - "start": "Mulai", - "@start": {}, - "setupChatBackupNow": "Mulai menyiapkan cadangan chatmu", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Simpan kunci keamanannya", - "@saveTheSecurityKeyNow": {}, - "loginWithOneClick": "Masuk dengan satu klik", - "@loginWithOneClick": {}, - "removeFromSpaceDescription": "Ini akan menghilangkan chat ini dari space saat ini. Ini juga masih ada di \"Semua chat\".", - "@removeFromSpaceDescription": {}, - "removeFromSpace": "Hilangkan dari space", - "@removeFromSpace": {}, - "pleaseEnterSecurityKeyDescription": "Untuk mengakses cadangan chatmu, mohon masukkan kunci keamanan kamu yang telah dibuat di sesi sebelumnya. Kunci keamananmu BUKAN kata sandimu.", - "@pleaseEnterSecurityKeyDescription": {}, - "commandHint_clearcache": "Bersihkan cache", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "Buang sesi", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Memulai sebuah chat langsung\nGunakan --no-encryption untuk menonaktifkan enkripsi", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_create": "Buat sebuah chat grup kosong\nGunakan --no-encryption untuk menonaktifkan enkripsi", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "thisUserHasNotPostedAnythingYet": "Pengguna ini belum memposting apa pun di cerita mereka", - "@thisUserHasNotPostedAnythingYet": {}, - "openVideoCamera": "Buka kamera untuk merekam video", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "Tambahkan ke cerita", - "@addToStory": {}, - "publish": "Publikasi", - "@publish": {}, - "whoCanSeeMyStories": "Siapa saja yang dapat melihat cerita saya?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Batalkan langganan cerita", - "@unsubscribeStories": {}, - "yourStory": "Ceritamu", - "@yourStory": {}, - "replyHasBeenSent": "Balasan telah dikirim", - "@replyHasBeenSent": {}, - "storyFrom": "Cerita dari {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "bubbleSize": "Ukuran gelembung", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whoCanSeeMyStoriesDesc": "Diingat bahwa orang-orang dapat melihat dan kontak sesama di ceritamu.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Apa yang sedang terjadi?", - "@whatIsGoingOn": {}, - "addDescription": "Tambahkan deskripsi", - "@addDescription": {}, - "iUnderstand": "Saya mengerti", - "@iUnderstand": {}, - "storyPrivacyWarning": "Diingat bahwa orang-orang dapat melihat dan kontak satu bersama di ceritamu. Ceritamu akan terlihat selama 24 jam tetapi tidak ada jaminan bahwa itu akan dihapus oleh semua perangkat dan server.", - "@storyPrivacyWarning": {}, - "dismiss": "Abaikan", - "@dismiss": {}, - "markAsRead": "Tandai sebagai dibaca", - "@markAsRead": {}, - "reportUser": "Laporkan pengguna", - "@reportUser": {}, - "openChat": "Buka Chat", - "@openChat": {}, - "integrationsNotImplemented": "Mengedit widget dan integrasi belum dapat dilakukan.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Edit widget dan integrasi", - "@editIntegrations": {}, - "matrixWidgets": "Widget Matrix", - "@matrixWidgets": {}, - "reactedWith": "{sender} bereaksi dengan {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Emoji", - "@emojis": {}, - "pinMessage": "Sematkan ke ruangan", - "@pinMessage": {}, - "pinnedEventsError": "Terjadi kesalahan memuat pesan-pesan yang disematkan", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Apakah kamu yakin untuk melepaskan pin peristiwa ini secara permanen?", - "@confirmEventUnpin": {}, - "unsupportedAndroidVersionLong": "Fitur ini memerlukan versi Android yang baru. Mohon periksa untuk pembaruan atau dukungan LineageOS.", - "@unsupportedAndroidVersionLong": {}, - "unsupportedAndroidVersion": "Versi Android tidak didukung", - "@unsupportedAndroidVersion": {}, - "placeCall": "Lakukan panggilan", - "@placeCall": {}, - "voiceCall": "Panggilan suara", - "@voiceCall": {}, - "videoCallsBetaWarning": "Dicatat bahwa panggilan video sedang dalam beta. Fitur ini mungkin tidak berkerja dengan benar atau tidak berkerja sama sekali pada semua platform.", - "@videoCallsBetaWarning": {}, - "emailOrUsername": "Email atau nama pengguna", - "@emailOrUsername": {}, - "experimentalVideoCalls": "Panggilan video eksperimental", - "@experimentalVideoCalls": {}, - "previousAccount": "Akun sebelumnya", - "@previousAccount": {}, - "switchToAccount": "Ganti ke akun {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Akun berikutnya", - "@nextAccount": {}, - "widgetEtherpad": "Catatan teks", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Kustom", - "@widgetCustom": {}, - "errorAddingWidget": "Terjadi kesalahan menambahkan widget.", - "@errorAddingWidget": {}, - "widgetName": "Nama", - "@widgetName": {}, - "addWidget": "Tambahkan widget", - "@addWidget": {}, - "editWidgets": "Edit widget", - "@editWidgets": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetUrlError": "Ini bukan URL yang valid.", - "@widgetUrlError": {}, - "widgetNameError": "Mohon sediakan sebuah nama tampilan.", - "@widgetNameError": {}, - "separateChatTypes": "Pisahkan Pesan Langsung, Grup, dan Space", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Tampilkan Pesan Langsung yang berkait di Space", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youInvitedBy": "Kamu telah diundang oleh {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Kamu mengundang {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Kamu mengeluarkan {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Kamu mengeluarkan dan mencekal {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youRejectedTheInvitation": "Kamu menolak undangannya", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "Kamu bergabung ke obrolan", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Kamu menerima undangannya", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "Kamu mencekal {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Kamu telah membatalkan undangan untuk {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Kamu membatalkan cekalan {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "Tampilkan daftar space", - "@showSpaces": {}, - "noEmailWarning": "Mohon tambahkan sebuah alamat email. Atau kamu tidak akan dapat mengatur ulang kata sandimu. Jika kamu tidak ingin, ketuk lagi untuk melanjitkan.", - "@noEmailWarning": {}, - "pleaseEnterRecoveryKeyDescription": "Untuk mengakses pesan lamamu, mohon masukkan kunci pemulihanmu yang telah dibuat di sesi sebelumnya. Kunci pemulihanmu BUKAN kata sandimu.", - "@pleaseEnterRecoveryKeyDescription": {}, - "saveTheRecoveryKeyNow": "Simpan kunci pemulihan sekarang", - "@saveTheRecoveryKeyNow": {}, - "users": "Pengguna", - "@users": {}, - "storeInSecureStorageDescription": "Simpan kunci pemulihan di penyimpanan aman perangkat ini.", - "@storeInSecureStorageDescription": {}, - "saveKeyManuallyDescription": "Simpan kunci ini secara manual dengan memicu dialog pembagian atau papan klip sistem.", - "@saveKeyManuallyDescription": {}, - "recoveryKey": "Kunci pemulihan", - "@recoveryKey": {}, - "stories": "Cerita", - "@stories": {}, - "storeInAppleKeyChain": "Simpan di Apple KeyChain", - "@storeInAppleKeyChain": {}, - "pleaseEnterRecoveryKey": "Mohon masukkan kunci pemulihanmu:", - "@pleaseEnterRecoveryKey": {}, - "unlockOldMessages": "Akses pesan lama", - "@unlockOldMessages": {}, - "recoveryKeyLost": "Kunci pemulihan hilang?", - "@recoveryKeyLost": {}, - "storeInAndroidKeystore": "Simpan di Android KeyStore", - "@storeInAndroidKeystore": {}, - "enableAutoBackups": "Aktifkan cadangan otomatis", - "@enableAutoBackups": {}, - "storeSecurlyOnThisDevice": "Simpan secara aman di perangkat ini", - "@storeSecurlyOnThisDevice": {} -} diff --git a/assets/l10n/intl_it.arb b/assets/l10n/intl_it.arb deleted file mode 100644 index 9bfc520075..0000000000 --- a/assets/l10n/intl_it.arb +++ /dev/null @@ -1,2471 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.992206", - "about": "Informazioni", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Accetta", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} ha accettato l'invito", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Account", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informazioni account", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ha abilitato la crittografia end to end", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Aggiungi e-mail", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Aggiungi una descrizione al gruppo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Aggiungi un nuovo amico", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Amministratore", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Tutto", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Hai già un account?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} ha risposto alla chiamata", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Tutti possono partecipare", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Blocco dell'app", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archivia", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Stanza archiviata", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Gli utenti ospiti possono partecipare", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Sei sicuro/a?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Sei sicuro/a di voler uscire?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Per favore inserisci la tua frase segrata o chiave di recuparo per mettere in cache le chiavi.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Per far accedere l'altra persona, per favore inserisci la tua frase segreta o chiave di recupero.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Per favore inserisci la tua frase segreta o chiave di recupero per verificare la sessione.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Accettare questa richiesta di verifica da {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pausa", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Riproduci", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticazione", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar cambiato", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "L'homeserver supporta i tipi di accesso:\n{serverVersions}\nMa questa applicazione supporta solo:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "L'homeserver supporta le versioni Spec:\n{serverVersions}\nMa questa applicazione supporta solo {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Bandisci dalla chat", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Bandito", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} ha bandito {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blocca dispositivo", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bloccato", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Messaggi bot", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Chiavi in cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancella", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Cambia nome dispositivo", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ha cambiato l'avatar della discussione", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} ha cambiato la descrizione della chat in: «{description}»", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} ha cambiato il nome della discussione in: «{chatname}»", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} ha cambiato i permessi della chat", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} ha cambiato nome in: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} ha cambiato le regole di accesso per ospiti", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} ha cambiato le regole di accesso per ospiti con: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} ha cambiato la visibilità della cronologia", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} ha cambiato la visibilità della cronologia in: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} ha cambiato le regole per unirsi", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} ha cambiato le regole per unirsi in: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} ha cambiato il loro avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} ha cambiato il nome delle stanze", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} ha cambiato il link di invito", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Registro cambiamenti", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Cambia la password", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "I cambiamenti sono stati salvati", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Cambia il server principale", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Cambia il tuo stile", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Cambia il nome del gruppo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Cambia server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Cambia sfondo", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "La crittografia è corrotta", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Backup delle discussioni", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Il backup della discussione è protetto da una chiave di sicurezza. Assicurati di non perderla.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Dettagli chat", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Discussioni", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Scegli una password complessa", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Scegli un username", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearText": "Cancella il testo", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Chiudi", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Confronta e assicurati che le seguenti emoji corrispondano a quelle dell'altro dispositivo:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Confronta e assicurati che le seguenti emoji corrispondano a quelle dell'altro dispositivo:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configura la discussione", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Conferma", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Connetti", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Tentativo di connessione fallito", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Il contatto è stato invitato nel gruppo", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Contiene nome visibile", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contiene nome utente", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Il contenuto è stato segnalato agli amministratori del server", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visualizzatore contenuti", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copiato negli Appunti", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copia", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copia negli appunti", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Impossibile decriptare messaggio: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Impossibile impostare avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Impossibile impostare nome", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} partecipanti", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Crea", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Crea ora un account", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} ha creato la chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Crea un nuovo gruppo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Firma incrociata disabilitata", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Firma incrociata abilitata", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Attualmente attivo", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Scuro", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Disabiliterà il tuo account. Non puoi tornare indietro! Sei sicuro/a?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Livello di autorizzazione predefinito", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Cancella", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Elimina l'account", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Elimina il messaggio", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Declina", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Dispositivo", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID del dispositivo", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Dispositivi", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "La crittografia è sicura solo quando tutti i dispositivi sono stati verificati.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Discussioni dirette", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Rimuovi l'immagine", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Scopri", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Scopri gruppi", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Il nominativo è stato cambiato", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Dona", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Scarica il file", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Modifica", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Modifica i server bloccati", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Modifica le autorizzazioni discussione", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Modifica il nominativo", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Cambia l'istanza Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Modifica l'avatar della stanza", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "L'emote già esiste!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Shortcode emote invalido!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Pacchetti emotes della stanza", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Impostazioni emote", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Scorciatoia emote", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Devi scegliere una scorciatoia emote e aggiungere un immagine!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Discussione vuota", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Abilita i pacchetti emotes globalmente", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Abilita la crittografia", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Non potrai disabilitare la crittografia in futuro. Sei sicuro?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Crittografato", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Crittografia", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritmo crittografia", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Crittografia non abilitata", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Impostazioni crittografia dall'inizio alla fine", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} è entrato in chiamata", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Inserisci un nome del gruppo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Inserisci un indirizzo e-mail", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Inserisci un username", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Inserisci il tuo server principale", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Tutto pronto!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Estremamente offensivo", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nome del file", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Dimensione del file", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Dimensione carattere", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Inoltra", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "venerdì", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amici", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Dall'adesione", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Dall'invito", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Vai nella nuova stanza", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Gruppo", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Descrizione del gruppo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descrizione del gruppo modificata", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Il gruppo è pubblico", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Gruppi", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Gruppo con {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gli ospiti sono vietati", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gli ospiti possono partecipare", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} ha ritirato l'invito per {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Aiuto", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Nascondi gli eventi eliminati", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Nascondi gli eventi sconosciuti", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Il server principale non è compatibile", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Quanto è offensivo questo contenuto?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identità", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignora", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Utenti ignorati", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Puoi ignorare gli utenti che ti stanno disturbando. Non sarai in grado di ricevere messaggi o inviti a stanze virtuali dagli utenti nel tuo elenco personale da ignorare.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignora il nome utente", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Ho cliccato sul collegamento", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frase segrata o chiave di ripristino errate", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Inoffensivo", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Invita contatto", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Invita un contatto a {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Invitato/a", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} ha invitato {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Solo per gli utenti invitati", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Invita per me", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} ti ha invitato/a a FluffyChat.\n1. Installa FluffyChat: https://fluffychat.im\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "La chiave del dispositivo seguente è corretta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "sta scrivendo…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} si è unito/a alla chat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Unisciti alla stanza", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Le chiave sono memorizzate nella cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Mancano le chiavi", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} ha espulso {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} ha espulso e bandito {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Espulsa dalla discussione", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Ultima attività: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "IP ultimo visto", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto/a molto tempo fa", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Lascia", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Ha lasciato la chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licenza", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Chiaro", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Carica altri {count} partecipanti", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Caricamento… Attendere prego.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Carica di più…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Accedi", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Accedi a {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Esci", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Promuovi come moderatore", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Promuovi come amministratore", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Assicurati che l'identificatore sia valido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Cambiamenti di membri", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Menzione", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Messaggi", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Il messaggio verrà rimosso per tutti i partecipanti", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderatore", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "lunedì", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural =1{1 altro evento} other{{count} altri eventi}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Silenzia discussione", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Tieni presente che per ora hai bisogno di Pantalaimon per utilizzare la crittografia dall'inizio alla fine.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nuova discussione", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nuovo messaggio in FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nuova richiesta di verifica!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Avanti", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "No", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Nessuna connessione al server", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat attualmente non supporta l'abilitazione della firma incrociata. Abilitala dall'interno di Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Nessuna descrizione", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nessun emote trovato. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Puoi attivare la crittografia solo quando la stanza non è più accessibile pubblicamente.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Sembra che tu non abbia servizi Google sul tuo telefono. Questa è una buona decisione per la tua riservatezza! Per ricevere notifiche push in FluffyChat consigliamo di utilizzare https://microg.org/ o https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Fluffychat attualmente non supporta l'attivazione del backup delle chiavi in linea. Abilitalo da Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Nessuno", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Non hai ancora aggiunto un modo per recuperare la tua password.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Nessuna autorizzazione", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Nessuna stanza pubblica trovata……", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nessuna stanza trovata…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Nessuno stato trovato finora.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notifiche", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notifiche abilitate per questo account", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Non supportato nel Web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selezionato/i", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} utenti stanno scrivendo…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "Offensivo", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Fuori linea", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "In linea", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Il backup delle chiavi in linea è disabilitato", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Il backup delle chiavi in linea è abilitato", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Ops, qualcosa è andato storto…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Apri l'app per leggere i messaggi", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Apri fotocamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opzionale) Nome del gruppo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participant": "Partecipante", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositivi partecipanti", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "frase segreta o chiave di recupero", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Password", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Password dimenticata", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "La password è stata cambiata", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Recupero della password", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Persone", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Scegli un'immagine", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Fissa", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Riproduci {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAPasscode": "Si prega di scegliere un codice di accesso", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Si prega di scegliere un nome utente", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Clicca sul collegamenti nell'e-mail e poi procedi.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Inserisci 4 cifre o lascia vuoto per disabilitare il blocco dell'app.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Inserisci un identificatore Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Inserisci la tua chiave di sicurezza:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Inserisci la tua password", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Inserisci il tuo nome utente", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Segui le istruzioni sul sito web e tocca Avanti.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacy", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Gruppi pubblici", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chiave pubblica", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Stanze pubbliche", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Regole notifiche", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Motivo", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Registrazione", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} ha eliminato un evento", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Elimina un messaggio", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "reject": "Rifiuta", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} ha rifiutato l'invito", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Riunisciti", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Rimuovi", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Rimuovi tutti gli altri dispositivi", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Rimosso da {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Rimuovi il dispositivo", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Rimuovi il ban dalla chat", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Rimuovi il messaggio", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Mostra i contenuti ricchi dei messaggi", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Sostituisci la stanza con la versione più recente", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Rispondi", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Segnala il messaggio", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Richiedi l'autorizzazione", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Richiedi di leggere i messaggi più vecchi", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revoca tutte le autorizzazioni", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "La stanza è stata aggiornata", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versione della stanza", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "sabato", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "Cerca", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Cerca una discussione", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Sicurezza", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Chiave di sicurezza", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Chiave di sicurezza persa?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Visto da {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Visto da {username} e {count} altri}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto da {username} e {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Invia", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Invia un messaggio", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Invia un file audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Consenti l'invio di segnalazioni di errore con sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Invia un file", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Invia un'immagine", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Invia messaggi", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Invia l'originale", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Invia un video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} ha inviato un file", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} ha inviato un file audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} ha inviato un'immagine", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} ha inviato un adesivo", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} ha inviato un video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} ha inviato informazioni sulla chiamata", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informazioni sulla privacy: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "La sessione è verificata", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Imposta un'immagine di profilo", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Imposta emoticon personalizzate", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Imposta una descrizione del gruppo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Imposta il collegamento di invito", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Imposta il livello di autorizzazione", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Imposta lo stato", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Impostazioni", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Condividi", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} ha condiviso la sua posizione", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "Mostra la password", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Iscriviti", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Ignora", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Suono, vibrazione, colore diodo", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Codice sorgente", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} ha iniziato una chiamata", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Inizia subito la tua prima discussione! 🙂\n- Tocca «+»\n- Inserisci il nome utente di un amico\n- Divertiti a chiacchierare", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Stato", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Come stai oggi?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Invia", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "domenica", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tocca un dispositivo per verificarlo", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tocca per mostrare il menù", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Non corrispondono", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Corrispondono", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Questa stanza è stata archiviata.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "giovedì", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Attiva/disattiva preferito", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Attiva/disattiva il silenziatore", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Segna come letto / non letto", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Troppe richieste. Per favore riprova più tardi!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Trasferimento da un altro dispositivo", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Prova a inviare di nuovo", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "martedì", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Non disponibile", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} ha rimosso il bando di {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Sblocca il dispositivo", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Dispositivo sconosciuto", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Algoritmo di crittografia sconosciuto", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Evento sconosciuto «{tipo}»", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Sessione sconosciuta, verifica", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Sblocca il backup della discussione", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Riattiva l'audio della discussione", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Rimuovi", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} discussioni non lette}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} messaggi non letti}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Usare i colori compatibili con AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} e {count} altri stanno scrivendo…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} e {username2} stanno scrivendo…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} sta scrivendo…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} ha lasciato la chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nome utente", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "L'utente non è verificato", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} ha inviato un evento {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "L'utente ha uno stato di verifica sconosciuto", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "L'utente è verificato", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Verificato", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sessione verificata con successo!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verifica", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifica manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Avvia la verifica", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Hai verificato con successo!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verifica dell'altro account", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifica l'utente", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videochiamata", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilità della cronologia della discussione", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visibile a tutti i partecipanti", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visibile a tutti", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Messaggio vocale", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "In attesa che il partner accetti la richiesta…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "In attesa che il partner accetti l'emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "In attesa che il partner accetti i numeri…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Immagine di sfondo", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Attenzione!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "La crittografia dall'inizio alla fine è attualmente in beta! Utilizzala a proprio rischio!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "mercoledì", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Benvenuto/a nella messaggistica istantanea più carina della rete Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Ti abbiamo inviato un'e-mail", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Chi può eseguire quale azione", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Chi è autorizzato a unirsi a questo gruppo", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Perché vuoi segnalarlo?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Cancellare il backup della discussione per creare una nuova chiave di sicurezza?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Con questi indirizzi puoi recuperare la tua password se necessario.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Scrivi un messaggio…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Sì", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Tu", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Sei invitato/a a questa chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Non stai più partecipando a questa chat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Non puoi invitare te stesso", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Sei stato/a bandito/a da questa chat", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Il tuo nome utente", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "La tua chiave pubblica", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Verrai connesso/a a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Ingrandisci", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Rimpicciolisci", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Accesso singolo", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Imposta come alias principale", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Rimuovi il tuo avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "register": "Registrati", - "@register": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Per favore inserisci il tuo PIN", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Si prega di scegliere", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "or": "O", - "@or": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Facoltativo) Il tuo indirizzo e-mail", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Ops! Purtroppo si è verificato un errore durante l'impostazione delle notifiche push.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Accedi con {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "invalidEmail": "E-mail non valida", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Modifica gli alias della stanza", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Cancella archivio", - "@clearArchive": {}, - "changeYourAvatar": "Cambia il tuo avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "allChats": "Tutte le chat", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Aggiungi a uno spazio", - "@addToSpace": {}, - "passwordsDoNotMatch": "Le password non corrispondono!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Inserire un indirizzo email valido.", - "@pleaseEnterValidEmail": {}, - "yourUserId": "Il tuo ID utente:", - "@yourUserId": {}, - "commandHint_leave": "Lascia questa stanza", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_ban": "Banna l'utente specificato da questa stanza.", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "sendSticker": "Invia sticker", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "commandHint_html": "Invia testo formattato in HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_plain": "Invia testo non formattato", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "Invia testo", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "locationDisabledNotice": "I servizi di localizzazione sono disabilitati. Per favore abilitali per poter condividere la tua posizione.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Salva file", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Abilita il backup delle chat per non perdere mai l'accesso alle tue chat.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "serverRequiresEmail": "Questo server ha bisogno di validare la tua email per la registrazione.", - "@serverRequiresEmail": {}, - "saveFileToFolder": "Salva file in questa cartella", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Apri in maps", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "Scansiona codice QR", - "@scanQrCode": {}, - "addAccount": "Aggiungi account", - "@addAccount": {}, - "unverified": "Non verificato", - "@unverified": {}, - "pleaseChooseAtLeastChars": "Per favore scegli almeno {min} caratteri.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "sendAsText": "Invia come testo", - "@sendAsText": { - "type": "text" - }, - "repeatPassword": "Ripeti password", - "@repeatPassword": {}, - "autoplayImages": "Riproduci automaticamente sticker animati ed emoticon", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "cantOpenUri": "Impossibile aprire l'URI", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "commandInvalid": "Comando non valido", - "@commandInvalid": { - "type": "text" - }, - "link": "Link", - "@link": {}, - "shareLocation": "Condividi posizione", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "Imposta backup delle chat", - "@setupChatBackup": {}, - "yourChatBackupHasBeenSetUp": "Il tuo backup delle chat è stato configurato.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Per proteggere i tuoi messaggi, abbiamo generato una chiave di sicurezza. \nConservala in un luogo sicuro, come ad esempio un software di gestione password.", - "@setupChatBackupDescription": {}, - "iWroteDownTheKey": "Ho trascritto la chiave", - "@iWroteDownTheKey": {} -} diff --git a/assets/l10n/intl_ja.arb b/assets/l10n/intl_ja.arb deleted file mode 100644 index dbb345de84..0000000000 --- a/assets/l10n/intl_ja.arb +++ /dev/null @@ -1,2381 +0,0 @@ -{ - "@@locale": "ja", - "@@last_modified": "2021-08-14 12:41:09.978060", - "about": "このアプリについて", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "承諾する", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username}が招待を承諾しました", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "アカウント", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "アカウント情報", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}がエンドツーエンド暗号化を有効にしました", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Eメールを追加", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "グループの説明を追加する", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "友達を追加", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "管理者", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "エイリアス", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "すべて", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "アカウントをすでにお持ちですか?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName}は通話に出ました", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "誰でも参加できる", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "アプリのロック", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "アーカイブ", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "アーカイブされた部屋", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "ゲストユーザーの参加を許可する", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "これでよろしいですか?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "ログアウトしてよろしいですか?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "鍵をキャッシュするためにはパスフレーズやリカバリーキーを入力してください。", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "他の人を署名するためにはパスフレーズやリカバリーキーを入力してください。", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "セッションを検証するためにはパスフレーズやリカバリーキーを入力してください。", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "{username}の検証リクエストを承認しますか?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "一時停止", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "再生", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "認証", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "アバターが変更されました", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "ホームサーバーでサポートされているログインタイプ:\n{serverVersions}\nアプリでは{supportedVersions}しかサポートされていません", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "ホームサーバーでサポートされているバージョン:\n{serverVersions}\nアプリでは{supportedVersions}しかサポートされていません", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "チャットからBANする", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "BANされています", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username}が{targetName}をBANしました", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "デバイスをブロックする", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "ブロックしました", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "ボットメッセージ", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "鍵をキャッシュしました", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "キャンセル", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "デバイス名を変更", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username}がチャットアバターを変更しました", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username}がチャットの説明を「{description}」に変更しました", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username}がチャットの名前を「{chatname}」に変更しました", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username}がチャットの権限を変更しました", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username}が表示名を「{displayname}」に変更しました", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username}がゲストのアクセスルールを変更しました", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username}がゲストのアクセスルールを{rules}に変更しました", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username}が履歴の表示設定を変更しました", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username}が履歴の表示設定を{rules}に変更しました", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username}が参加ルールを変更しました", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username}が参加ルールを{joinRules}に変更しました", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username}がアバターを変更しました", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username}が部屋のエイリアスを変更しました", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username}が招待リンクを変更しました", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "変更履歴", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "パスワードを変更", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "変更が保存されました", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "ホームサーバーの変更", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "スタイルを変更する", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "グループの名前を変更する", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "サーバーを変更する", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "壁紙を変更する", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "暗号が破損しています", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "チャット", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "チャットのバックアップ", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "チャットのバックアップは秘密鍵によって保存されます。失くさないように気をつけてください。", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "チャットの詳細", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "チャット", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "強いパスワードを選択してください", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "ユーザー名を選択してください", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "アーカイブを消去", - "@clearArchive": {}, - "clearText": "テキストを消す", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "閉じる", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "表示されている絵文字が他のデバイスで表示されているものと一致するか確認してください:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "表示されている数字が他のデバイスで表示されているものと一致するか確認してください:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "チャットの設定", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "確認", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "接続", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "接続が失敗しました", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "連絡先に登録された人が招待されました", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "表示名を含んでいます", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "ユーザー名を含んでいます", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "サーバー管理者に通報されました", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "コンテンツビューアー", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "クリップボードにコピーされました", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "コピー", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "クリップボードにコピー", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "メッセージを解読できませんでした: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "アバターをセットできませんでした", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "表示名をセットできませんでした", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count}名の参加者", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "作成", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "アカウントを作成する", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}がチャットを作成しました", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "グループを作成する", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "相互署名OFF", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "相互署名ON", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "現在アクティブです", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "ダーク", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}/{month}/{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "あなたのアカウントを無効化します。この操作は元に戻せません!よろしいですか?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "デフォルトの権限レベル", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "削除", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "アカウントの削除", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "メッセージの削除", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "拒否", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "デバイス", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "デバイスID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "デバイス", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "安全に暗号化を使うためには全てのデバイスを認証する必要があります。", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "ダイレクトチャット", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "画像を無視する", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "発見する", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "グループを発見", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "表示名が変更されました", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "寄付する", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "ファイルのダウンロード", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "編集", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "ブロックしたサーバーを編集", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "チャット権限の変更", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "表示名を編集", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Jitsiインスタンスを編集する", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "ルームエイリアスを編集", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "部屋のアバターを編集する", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emoteはすでに存在します!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "不正なEmoteショートコード!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "部屋のEmoteパック", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emote設定", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emoteショートコード", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Emoteショートコードと画像を選択してください!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "空のチャット", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "emoteをグローバルに有効にする", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "暗号化を有効にする", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "一度暗号化を有効にするともとに戻せません。よろしいですか?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "暗号化", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "暗号化", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "暗号化アルゴリズム", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "暗号化されていません", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "エンドツーエンド暗号化設定", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName}は通話を切断しました", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "グループ名を入力してください", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "メールアドレスを入力してください", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "ユーザー名を入力してください", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "ホームサーバーを入力してください", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "すべての準備は完了しました!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "とても攻撃的", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "ファイル名", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "ファイルサイズ", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "フォントサイズ", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "進む", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "金曜日", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "友達", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "参加時点から閲覧可能", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "招待時点から閲覧可能", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "新規ルームへ", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "グループ", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "グループの説明", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "グループの説明が変更されました", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "グループは公開されています", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "グループ", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "{displayname}とグループを作成する", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "ゲストは許可されていません", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "ゲストが許可されています", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{targetName}の招待を{username}が取り下げました", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "ヘルプ", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "編集済みイベントを非表示にする", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "不明なイベントを非表示にする", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "このホームサーバーは互換性がありません", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "どのくらい攻撃的でしたか?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "アイデンティティ", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "無視する", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "無視されたユーザー", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "ユーザーは無視することができます。無視したユーザーからのメッセージやルームの招待は受け取れません。", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "ユーザー名を無視する", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "リンクをクリックしました", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "パスフレーズかリカバリーキーが間違っています", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "非攻撃的", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "無効なメールアドレス", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "連絡先から招待する", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "連絡先から{groupName}に招待する", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "招待されました", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username}が{targetName}を招待しました", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "招待されたユーザーのみ", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "自分への招待", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username}がFluffyChatにあなたを招待しました. \n1. FluffyChatをインストールしてください: https://fluffychat.im \n2. 新しくアカウントを作成するかサインインしてください\n3. 招待リンクを開いてください: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "このデバイスキーは正しいですか?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "が入力しています…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username}がチャットに参加しました", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "部屋に参加", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "鍵はキャッシュされたいます", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "鍵がありません", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}は{targetName}をキックしました", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username}は{targetName}をキックしBANしました", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "チャットからキックする", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "最終アクティブ: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "最終IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "ずいぶん前", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "退室する", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "退室しました", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "ライセンス", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "ライト", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "あと{count}名参加者を読み込む", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "読み込み中…お待ちください。", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "更に読み込む…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "ログイン", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "{homeserver}にログインする", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "ログアウト", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "モデレータにする", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "管理者にする", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "識別子が正しいか確認してください", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "メンバーの変更", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "メンション", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "メッセージ", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "メッセージはすべての参加者から消去されます", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "モデレータ", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "月曜日", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{もう1つのイベント} other{{count}個のイベント}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "チャットのミュート", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "現時点では、エンドツーエンドの暗号化を使用するにはPantalaimonが必要であることに注意してください。", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "新規チャット", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "FluffyChatに新しいメッセージがあります", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "認証リクエスト!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "次へ", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "いいえ", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "サーバーに接続できません", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChatは現在相互署名機能をサポートしていません。Elementから有効化してください。", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "説明がありません", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Emoteは見つかりませんでした😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "ルームを非公開にした後暗号化を有効にできます。", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "あなたのスマホにはグーグルサービスがないようですね。プライバシーを保護するための良い選択です!Push通知を受け取るにはmicroGを使うことを推奨しています: https://microg.org/", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "鍵のオンラインバックアップはElementから有効化にしてください。", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "なし", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "パスワードを回復する方法をまだ追加していません。", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "権限がありません", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "公開ルームが見つかりませんでした…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "部屋は見つかりませんでした…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "ステータスが見つかりませんでした。", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "通知", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "このアカウントでは通知が有効です", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "ウェブではサポートされていません", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number}選択されています", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count}人が入力中…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "攻撃的", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "オフライン", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "オンライン", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "オンライン鍵バックアップは使用されていません", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "オンライン鍵バックアップは使用されています", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "おっと、何かがうまくいきませんでした…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "アプリを開いてメッセージを確認してください", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "カメラを開く", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(オプション) メールアドレス", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(任意)グループ名", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participant": "参加者", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "ユーザーの使用しているデバイス", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "パスフレーズかリカバリーキー", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "パスワード", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "パスワードを忘れた", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "パスワードが変更されました", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "パスワードリカバリー", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "人々", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "画像を選択してください", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "ピン", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "{fileName}を再生する", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAPasscode": "パスコードを選んでください", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "ユーザー名を選択してください", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "メールのリンクから進めてください。", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "アプリのロック用に4桁の数字を入力してください。空欄の場合は無効になります。", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "マトリックスIDを入力してください。", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "セキュリティーキーを入力してください:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "パスワードを入力してください", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "PINを入力してください", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "ユーザー名を入力してください", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "ウェブサイトにあるやり方を見てから次をタップしてください。", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "プライバシー", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "公開グループ", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "公開鍵", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "公開された部屋", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "ルールを追加する", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "理由", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "録音中", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username}がイベントを編集しました", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "メッセージを書く", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "reject": "拒否", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username}は招待を拒否しました", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "再参加", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "消去", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "他のデバイスをすべて削除", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "{username}によって削除されました", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "デバイスの削除", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "追放を取り消し", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "メッセージを削除", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "リッチメッセージをレンダリングする", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "部屋を新しいバージョンに変更する", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "返信", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "メッセージを通報", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "権限を要求する", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "過去のメッセージを読む権限を要求する", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "すべての権限を取り消す", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "部屋はアップグレードされました", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "ルームバージョン", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "土曜日", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "検索", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "チャットを検索する", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "セキュリティ", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "セキュリティキー", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "セキュリティキーを紛失しましたか?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username}が既読", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{{username}と他{count}名が既読}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username}と{username2}が既読", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "送信", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "メッセージを送信", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "音声の送信", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "バグレポートをsentry.ioへ送信することを許可する", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "ファイルを送信", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "画像の送信", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "メッセージを送る", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "オリジナルの送信", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "動画を送信", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username}はファイルを送信しました", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username}は音声を送信しました", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username}は画像を送信しました", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username}はステッカーを送信しました", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username}は動画を送信しました", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName}は通話情報を送信しました", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "プライバシーについての情報: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "セッションは確認済みです", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "プロフィール画像を設定する", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "メインエイリアスに設定", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "カスタムエモートの設定", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "グループの説明を設定する", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "招待リンクを設定する", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "権限レベルをセット", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "ステータスの設定", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "設定", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "共有", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username}は現在地を共有しました", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "パスワードを表示", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "サインアップ", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "スキップ", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "音、振動、カラーLED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "ソースコード", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName}は通話を開始しました", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "初めてのチャットを開始しましょう!🙂\n・+をタップして\n・友達のユーザー名を入力してください\n・楽しんでください", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "ステータス", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "お元気ですか?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "送信", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "日曜日", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "システム", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "デバイス上でタップして認証", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "メニューを表示するにはタップしてください", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "違います", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "一致しています", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "この部屋はアーカイブされています。", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "木曜日", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "お気に入り切り替え", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "ミュート切り替え", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "既読/未読にマーク", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "リクエストが多すぎます。また後で試してみてください!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "違うデバイスから移行する", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "送信し直してみる", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "火曜日", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "不在", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username}が{targetName}のBANを解除しました", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "デバイスをブロック解除する", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "未知デバイス", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "未知の暗号化アルゴリズム", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "未知のイベント'{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "不明なセッションです。再確認してください。", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "チャットのバックアップを解錠する", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "チャットをミュート解除する", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "ピンを外す", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount}の未読メッセージ}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents}件の未読メッセージ}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "有機EL(AMOLED)対応の色にしますか?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username}と他{count}名が入力しています…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username}と{username2}が入力しています…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username}が入力しています…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username}は退室しました", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "ユーザー名", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "ユーザーは認証されていません", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username}は{type}イベントを送信しました", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "ユーザーは不明な認証状態です", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "ユーザーは認証されました", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "検証済み", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "セッションの確認ができました!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "確認", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "手動で確認", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "確認を始める", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "確認が完了しました!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "他のアカウントを確認中", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "ユーザーの認証", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "音声通話", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "チャット履歴の表示", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "すべての参加者が閲覧可能", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "すべての人が閲覧可能", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "ボイスメッセージ", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "パートナーのリクエスト承諾待ちです...", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "パートナーの絵文字承諾待ちです...", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "パートナーの数字承諾待ちです…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "壁紙", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "警告!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "エンドツーエンド暗号化は現在ベータ版です!これは自分自身の責任で行ってください!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "水曜日", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Matrixネットワークで一番かわいいチャットアプリへようこそ。", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "あなたにメールを送信しました", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "誰がどの操作を実行できるか", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "誰がこのチャットに入れますか", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "なぜこれを通報したいのですか?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "新しい秘密鍵を作るためにチャットのバックアップを消去しますか?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "これらのアドレスを使用すると、パスワードを回復することができます。", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "メッセージを入力してください…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "はい", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "あなた", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "チャットに招待されています", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "あなたはもうこのチャットの参加者ではありません", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "自分自身を招待することはできません", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "チャットからBANされてしまいました", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "あなたのユーザー名", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "あなたの公開鍵", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "{homeserver}に接続します", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "拡大", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "縮小", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "allChats": "すべて会話", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterValidEmail": "正しいメールアドレスを入力してください。", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "パスワードが一致しません!", - "@passwordsDoNotMatch": {}, - "addToSpace": "スペースに追加", - "@addToSpace": {}, - "bubbleSize": "ふきだしの大きさ", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "URIが開けません {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "repeatPassword": "パスワードを繰り返そ", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "少なくとも{min}文字を選択してください。", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "autoplayImages": "GIFを自動的に再生する", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "yourUserId": "あなたのユーザーID:", - "@yourUserId": {}, - "setupChatBackup": "チャットバックアップを設定する", - "@setupChatBackup": {}, - "yourChatBackupHasBeenSetUp": "チャットバックアップを設定ました。", - "@yourChatBackupHasBeenSetUp": {}, - "chatHasBeenRemovedFromThisSpace": "チャットはこのスペースに削除されました", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Enterで送信", - "@sendOnEnter": {}, - "changeYourAvatar": "アバタるを変化しする", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "iWroteDownTheKey": "私は鍵を書きました", - "@iWroteDownTheKey": {}, - "chatHasBeenAddedToThisSpace": "このスペースにチャットが追加されました", - "@chatHasBeenAddedToThisSpace": {}, - "commandHint_ban": "このユーザーを禁止する", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "キャッシュをクリアする", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "addToStory": "ストーリーに追加", - "@addToStory": {} -} diff --git a/assets/l10n/intl_ko.arb b/assets/l10n/intl_ko.arb deleted file mode 100644 index fa1d47e7a9..0000000000 --- a/assets/l10n/intl_ko.arb +++ /dev/null @@ -1,2765 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.975135", - "about": "소개", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "수락", - "@accept": { - "type": "text", - "placeholders": {} - }, - "allChats": "모든 채팅", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "URI {uri}를 열 수 없습니다", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "chats": "채팅", - "@chats": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "이 룸에서 주어진 유저 밴하기", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "HTML 형식의 문자 보내기", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "주어진 유저 이 룸에 초대하기", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_leave": "이 룸 나가기", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "자신을 소개하세요", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_plain": "형식이 지정되지 않은 문자 보내기", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "문자 보내기", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "주어진 유저 이 룸에서 밴 해제하기", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "loadMore": "더 불러오기…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "{count}명의 참가자 더 표시", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "lightTheme": "라이트", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "license": "라이선스", - "@license": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "올바르지 않은 이메일", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "help": "도움", - "@help": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "게스트가 들어올 수 있음", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "groups": "그룹", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "그룸 공개됨", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "그룹 설명 바뀜", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "그룹 설명", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "group": "그룹", - "@group": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "새로운 방 가기", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "초대받은 후부터", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "들어온 후부터", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "friends": "친구", - "@friends": { - "type": "text", - "placeholders": {} - }, - "friday": "금요일", - "@friday": { - "type": "text", - "placeholders": {} - }, - "forward": "전달", - "@forward": { - "type": "text", - "placeholders": {} - }, - "fontSize": "폰트 크기", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fileSize": "파일 크기", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fileName": "파일 이름", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "매우 공격적임", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "모든 것이 준비됐어요!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "당신의 홈서버를 입력하세요", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "homeserver": "홈서버", - "@homeserver": {}, - "enterAUsername": "유저 이름 입력", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "스페이스 이름 입력", - "@enterASpacepName": {}, - "enterAnEmailAddress": "이메일 주소 입력", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "그룹 이름 입력", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} 이 통화를 종료했습니다", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "end2endEncryptionSettings": "종단간 암호화 설정`", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "암호화가 비활성화됨", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "암호화 알고리즘", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryption": "암호화", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encrypted": "암호화됨", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "당신은 다시 암호화를 비활성화할 수 없습니다. 확실한가요?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "암호화 켜기", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "이모트 팩 항상 사용하기", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "채팅을 잃지 않으려면 채팅 백업을 켜세요.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "빈 채팅", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "이모트 단축키와 이미지를 골라야 합니다!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "이모트 단축키", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "이모트 설정", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "방을 위한 이모트 팩", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "올바르지 않은 이모트 단축키!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "이모트가 이미 존재합니다!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "방 아바타 수정", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "방 별명 수정", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Jitsi 인스턴스 수정", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "표시 이름 수정", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "채팅 권한 수정", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "edit": "수정", - "@edit": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "파일 다운로드", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "취소하고 다시 묻지 않기", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "donate": "후원", - "@donate": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "표시 이름이 변경되었습니다", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "그룹 발견", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "discover": "발견", - "@discover": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "암호화는 모든 기기들이 확인되었을 때만 안전합니다.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "devices": "기기", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceId": "기기 ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "device": "기기", - "@device": { - "type": "text", - "placeholders": {} - }, - "deny": "거부", - "@deny": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "메시지 삭제", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "계정 삭제", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "delete": "삭제", - "@delete": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "기본 권한 레벨", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "deactivateAccountWarning": "이것은 당신의 계정을 비활성화할 것입니다. 이것은 되돌릴 수 없습니다! 확실한가요?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "현재 활동 중", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "새로운 스페이스", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "새로운 그룹", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}이 채팅을 생성함", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createAccountNow": "지금 계정 생성하기", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "create": "생성", - "@create": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} 참여자", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "couldNotSetDisplayname": "표시 이름 설정할 수 없음`", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "아바타 설정할 수 없음", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "메시지 복호화할 수 없음: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "copyToClipboard": "클립보드에 복사", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "복사", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "클립보드에 복사됨", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "콘텐츠가 서버 운영자에게 신고되었습니다", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "유저 이름 포함", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "표시 이름 포함", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "연락처가 그룹에 초대되었습니다", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "연결 시도 실패", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "connect": "연결", - "@connect": { - "type": "text", - "placeholders": {} - }, - "confirm": "확인", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "configureChat": "채팅 설정", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "다른 기기에서도 아래의 숫자가 일치하는지 비교하세요:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "다른 기기에서도 아래의 이모지가 일치하는지 비교하세요:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "commandMissing": "{command} 는 명령어가 아닙니다.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandInvalid": "잘못된 명령어", - "@commandInvalid": { - "type": "text" - }, - "commandHint_react": "답장 반응으로 보내기", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_op": "주어진 유저의 권한 레벨 설정 (기본:50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_myroomnick": "이 방의 표시 이름 설정하기", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_myroomavatar": "이 방의 사진 설정하기 (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_kick": "주어진 유저 방에서 삭제하기", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_join": "주어진 방 들어가기", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "close": "닫기", - "@close": { - "type": "text", - "placeholders": {} - }, - "clearText": "문자 지우기", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "저장 지우기", - "@clearArchive": {}, - "chooseAUsername": "닉네임 고르기", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "안전한 비밀번호를 설정하세요", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "이 스페이스에서 채팅이 삭제되었습니다", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "이 스페이스에 채팅이 추가되었습니다", - "@chatHasBeenAddedToThisSpace": {}, - "chatDetails": "채팅 정보", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "당신의 채팅 백업은 보안 키로 암호화됩니다. 이 키를 잃어버리지 마세요.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "채팅 백업", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chat": "채팅", - "@chat": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "암호화가 손상되었습니다", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "아바타 바꾸기", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "배경 바꾸기", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "서버 바꾸기", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "그룹의 이름 바꾸기", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "스타일 바꾸기", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "홈서버 바꾸기", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "변경들이 저장되었습니다", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changePassword": "비밀번호 바꾸기", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changelog": "변경 기록", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changedTheRoomInvitationLink": "{username}이 초대 링크 바꿈", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username}이 방 별명을 바꿈", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheProfileAvatar": "{username}이 자신의 아바타를 바꿈", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username}이 참가 규칙을 {joinRules} 로 바꿈", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheJoinRules": "{username}이 참가 규칙을 바꿈", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username}이 대화 기록 설정을 {rules} 로 바꿈", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username}이 대화 기록 설정을 변경함", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username}이 게스트 접근 규칙을 {rules} 로 변경함", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheGuestAccessRules": "{username}이 게스트 접근 규칙을 변경함", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username}이 닉네임을 '{displayname}' 으로 바꿈", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheChatPermissions": "{username}이 채팅 권한을 바꿈", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatNameTo": "{username}이 채팅 이름을 '{chatname}' 으로 바꿈", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatDescriptionTo": "{username}이 채팅 설명을 '{description}' 으로 변경함", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatAvatar": "{username}이 채팅 아바타 바꿈", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeDeviceName": "기기 이름 바꾸기", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "cancel": "취소", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "키 캐시됨", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "botMessages": "봇 메시지", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "blocked": "차단됨", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "기기 차단", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username}이 {targetName} 밴함", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "banned": "밴됨", - "@banned": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "채팅에서 밴", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "이 홈서버가 지원하는 Spec 버전:\n{serverVersions}\n하지만 이 앱은 {supportedVersions}만 지원합니다", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "엔터로 보내기", - "@sendOnEnter": {}, - "badServerLoginTypesException": "홈서버가 지원하는 로그인 유형:\n{serverVersions}\n하지만 이 앱에서 지원하는 것은:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "avatarHasBeenChanged": "아바타 바뀜", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "자동으로 움직이는 스티커와 이모트 재생", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "authentication": "인증", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "재생", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "일시정지", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "{username}의 인증 요청을 수락할까요?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "askSSSSVerify": "당신의 세션을 인증하기 위해 저장 비밀번호나 복구 키를 입력해주세요.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "다른 사람을 서명하기 위해서, 저장 비밀번호나 복구 키를 입력해주세요.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "키를 캐시하기 위해 저장 비밀번호나 복구 키를 입력해주세요.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "로그아웃하고 싶은 것이 확실한가요?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "확실한가요?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "게스트 유저가 참가 여부", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "저장된 방", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "archive": "저장", - "@archive": { - "type": "text", - "placeholders": {} - }, - "appLock": "앱 잠금", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "누구나 들어올 수 있음", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} 가 전화에 응답했습니다", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "alreadyHaveAnAccount": "이미 계정이 있나요?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "alias": "별명", - "@alias": { - "type": "text", - "placeholders": {} - }, - "admin": "관리자", - "@admin": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "스페이스에 추가", - "@addToSpace": {}, - "addNewFriend": "새 친구 추가", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "그룹 소개 추가", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addEmail": "이메일 추가", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}가 종단간 암호화를 활성화함", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "accountInformation": "계정 정보", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "account": "계정", - "@account": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username}가 초대를 수락함", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "ignore": "무시", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "identity": "신원", - "@identity": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "이 콘텐츠가 얼마나 모욕적인가요?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "홈서버가 호환되지 않음", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "알 수 없는 이벤트 숨기기", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "지워진 이벤트 숨기기", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username}이 {targetName}에 대한 초대를 철회함", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "guestsAreForbidden": "게스트는 금지되어 있습니다", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "groupWith": "{displayname} 과의 그룹", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "errorObtainingLocation": "위치 얻는 중 오류: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "editBlockedServers": "차단된 서버 수정", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "directChats": "다이렉트 채팅", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "darkTheme": "다크", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "콘텐츠 뷰어", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "당신은 이 채팅에 초대되었습니다", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "yes": "확인", - "@yes": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "메시지 작성…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "이 주소로 당신의 비밀번호를 복구할 수 있습니다.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "새로운 보안 키를 생성하기 위해 채팅 백업을 초기화할까요?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "왜 이것을 신고하려고 하나요?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "누가 이 그룹에 들어오도록 허용할지", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "누가 어떤 행동을 할 수 있는지", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "우리가 당신에게 이메일을 보냈습니다", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Matrix 네트워크에서 가장 귀여운 인스턴트 메신저에 오신 걸 환영해요.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "wednesday": "수요일", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "종단간 암호화는 현재 베타입니다! 주의하여 사용하십시오!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "warning": "경고!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "배경", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "상대가 숫자를 수락하길 기다리는 중…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "상대가 이모지를 수락하길 기다리는 중…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "상대가 요청을 수락하길 기다리는 중…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "음성 메시지", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "모두에게 보임", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "모든 참가자에게 보임", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "videoCall": "영상 통화", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "유저 확인", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "다른 계정 확인 중", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "성공적으로 확인했어요!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "확인 시작", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "직접 확인", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verify": "확인", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "세션을 성공적으로 확인했어요!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verified": "확인됨", - "@verified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "유저가 확인됨", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "유저가 확인되지 않음", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "username": "유저 이름", - "@username": { - "type": "text", - "placeholders": {} - }, - "userLeftTheChat": "{username}이 채팅을 나감", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userIsTyping": "{username}이 입력 중…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userAndUserAreTyping": "{username}과 {username2}가 입력 중…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userAndOthersAreTyping": "{username}과 {count}명이 입력 중…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "unpin": "고정 해제", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "채팅 백업 잠금 해제", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "알 수 없는 암호화 알고리즘", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unblockDevice": "기기 차단 해제", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "tuesday": "화요일", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "공개 그룹", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "pin": "고정", - "@pin": { - "type": "text", - "placeholders": {} - }, - "pickImage": "이미지 고르기", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "비밀번호 복구", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "비밀번호 까먹음", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "password": "비밀번호", - "@password": { - "type": "text", - "placeholders": {} - }, - "participant": "참여자", - "@participant": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(선택) 그룹 이름", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "지도에서 열기", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "addAccount": "계정 추가", - "@addAccount": {}, - "openCamera": "카메라 열기", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "앱을 열어서 메시지를 읽으세요", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "앗, 무언가가 잘못되었습니다…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "앗! 안타깝게도, 푸시 알림을 설정하는 중 오류가 발생했습니다.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "online": "온라인", - "@online": { - "type": "text", - "placeholders": {} - }, - "ok": "확인", - "@ok": { - "type": "text", - "placeholders": {} - }, - "offline": "오프라인", - "@offline": { - "type": "text", - "placeholders": {} - }, - "offensive": "모욕적임", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "위치 얻는 중…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count}명이 입력 중…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "numberSelected": "{number} 선택됨", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "notSupportedInWeb": "웹에서 지원되지 않음", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "이 계정에서 알림이 활성화되었습니다", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notifications": "알림", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "noPermission": "권한 없음", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "QR 코드 스캔", - "@scanQrCode": {}, - "typeInInviteLinkManually": "초대 링크 직접 입력...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "당신의 초대 링크 공유", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "서로 가깝지 않다면 초대 링크를 공유하거나 QR 코드를 스캔하세요.", - "@createNewChatExplaination": {}, - "noMatrixServer": "{server1}은 matrix 서버가 아닙니다, {server2}를 대신 사용할까요?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "next": "다음", - "@next": { - "type": "text", - "placeholders": {} - }, - "loginWith": "{brand} 로 로그인", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logInTo": "{homeserver} 에 로그인", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "login": "로그인", - "@login": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "위치 권한이 거부되었습니다. 위치를 공유하기 위해서 허용해주세요.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "위치 서비스가 비활성화되었습니다. 위치를 공유하려면 활성화시켜주세요.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "no": "아니요", - "@no": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "새로운 확인 요청!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "FluffyChat에서 새로운 메시지", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newChat": "새로운 채팅", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "muteChat": "채팅 음소거", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "monday": "월요일", - "@monday": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "모든 참여자에게서 메시지가 지워집니다", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "messages": "메시지", - "@messages": { - "type": "text", - "placeholders": {} - }, - "mention": "멘션", - "@mention": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "관리자로 만들기", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "logout": "로그아웃", - "@logout": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1개 이상 이벤트} other{{count} 이벤트}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1개의 읽지 않은 메시지} other{{unreadEvents} 개}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "unreadChats": "{unreadCount, plural, =1{읽지 않은 채팅 1} other{{unreadCount} 개}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "timeOfDay": "{hours24}시 {minutes}분", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "renderRichContent": "풍부한 메시지 콘텐츠 렌더링", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "unavailable": "사용할 수 없음", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat은 현재 교차 서명을 활성화하는 것을 지원하지 않습니다. Element에서 활성화해주세요.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "식별자가 유효한지 확인하세요", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "운영자 만들기", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "사진 삭제", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "교차 서명 켜짐", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "교차 서명 꺼짐", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "all": "모두", - "@all": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "축소", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "확대", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "{homeserver} 에 연결됩니다", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "yourPublicKey": "당신의 공개 키", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "당신의 유저 이름", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "당신의 채팅이 동기화되는 중…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "당신은 이 채팅에서 밴되었습니다", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "자신을 초대할 수 없습니다", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "당신은 더 이상 이 채팅에 참여하지 않습니다", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "you": "당신", - "@you": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "대화 기록 설정", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "사용자가 알 수 없는 확인 상태를 가짐", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username}이 {type} 이벤트 보냄", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "useAmoledTheme": "AMOLED 호환 색을 사용할까요?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "음소거 해제", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unknownSessionVerify": "알 수 없는 세션, 확인해주세요", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "알 수 없는 이벤트 '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownDevice": "알 수 없는 기기", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username}이 {targetName} 밴 해제함", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "tryToSendAgain": "다시 보내도록 시도", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "다른 기기에서 가져오기", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "너무 많은 요청. 잠시 후에 다시 시도해주세요!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "메시지 안/읽음 으로 표시", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "음소거 토글", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "즐겨찾기 토글", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "thursday": "목요일", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "이 방은 보관되었습니다.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "일치합니다", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "일치하지 않습니다", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "탭하여 메뉴 표시", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "탭하여 이미지 표시", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "확인할 기기를 탭하세요", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "시스템", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "동기화 중... 기다려주세요.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "sunday": "일요일", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "submit": "제출", - "@submit": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "오늘은 어떤 기분인가요?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "status": "상태", - "@status": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "당신의 처음 채팅을 바로 시작하세요! 🙂\n- '새로운 채팅' 버튼을 누르고\n- 친구의 유저 이름 입력\n- 채팅을 즐기세요", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} 가 통화 시작함", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "spaceName": "스페이스 이름", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "스페이스가 공개됨", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "단일 계정 로그인(SSO)", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{{username}과 이외 {count}명이 읽음}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "pushRules": "푸시 규칙", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Matrix ID를 입력해주세요.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "참여한 사용자 기기", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "lastSeenIp": "마지막 활동 IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "마지막 활동: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "ignoredUsers": "무시된 사용자", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "4자리 숫자를 입력하거나 앱 잠금을 사용하지 않도록 하려면 비워두세요.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "비밀번호를 골라주세요", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "선택해주세요", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "play": "{fileName} 재생", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "people": "사람들", - "@people": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "비밀번호가 변경됨", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "비밀번호나 복구 키", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "or": "이나", - "@or": { - "type": "text", - "placeholders": {} - }, - "serverRequiresEmail": "이 서버는 가입을 위해 당신의 이메일을 확인해야 합니다.", - "@serverRequiresEmail": {}, - "enableMultiAccounts": "(베타) 이 기기에서 다중 계정 활성화", - "@enableMultiAccounts": {}, - "bundleName": "번들 이름", - "@bundleName": {}, - "removeFromBundle": "이 번들에서 삭제", - "@removeFromBundle": {}, - "addToBundle": "번들에 추가", - "@addToBundle": {}, - "editBundlesForAccount": "이 계정의 번들 수정", - "@editBundlesForAccount": {}, - "oneClientLoggedOut": "당신의 클라이언트 중 하나가 로그아웃 됨", - "@oneClientLoggedOut": {}, - "onlineKeyBackupEnabled": "온라인 키 백업이 활성화됨", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "온라인 키 백업이 비활성화됨", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "아무 상태도 발견되지 않음.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "아무 방도 발견되지 않았어요…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "아무 공개 방도 발견되지 않았어요…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "당신은 비밀번호를 복구할 방법을 추가하지 않았습니다.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "newUsernameDescription": "당신의 사용자 ID는 @사용자 이름:서버 이름 의 형식을 가질 것입니다", - "@newUsernameDescription": {}, - "newPasswordDescription": "비밀번호를 복구하기 위해서는, 당신의 계정에 이메일 주소를 추가해야합니다.", - "@newPasswordDescription": {}, - "none": "없음", - "@none": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "온라인 키 백업을 Element에서 켜주세요.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "이 휴대폰에 Google 서비스가 없는 것 같습니다. 프라이버시를 위해 좋은 결정이죠! FluffyChat에서 푸시 알림을 받으려면 https://microg.org/ 이나 https://unifiedpush.org/ 을 사용하는 것을 권장합니다.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "당신은 방이 공개적으로 접근 가능하지 않을 때만 암호화를 켤 수 있습니다.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "이모트 발견되지 않음. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noDescription": "설명 없음", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "서버에 연결 없음", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "지금 종단간 암호화를 사용하기 위해서는 Pantalaimon이 필요하다는 것을 알아주세요.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "관리자", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "참가자 변경", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "loadingPleaseWait": "로딩 중... 기다려 주세요.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "채팅을 나갔습니다", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "leave": "나가기", - "@leave": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "오래 전 접속", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "소스 코드", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "소리, 진동 LED-색", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "skip": "스킵", - "@skip": { - "type": "text", - "placeholders": {} - }, - "signUp": "가입", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "showPassword": "비밀번호 보이기", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "위치 보내기", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username}이 위치 공유함", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "share": "공유", - "@share": { - "type": "text", - "placeholders": {} - }, - "settings": "설정", - "@settings": { - "type": "text", - "placeholders": {} - }, - "setStatus": "상태 설정", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "권한 레벨 설정", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "초대 링크 설정", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "그룹 설명 설정", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "맞춤 이모트 설정", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "주 별명으로 설정", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "프로필 사진 설정", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "세션이 확인됨", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "당신의 프라이버시에 대한 정보: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sentCallInformations": "{senderName} 이 통화 정보 보냄", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentAVideo": "{username}이 영상 보냄", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendOriginal": "원본 보내기", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "메시지 보내기", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendImage": "이미지 보내기", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "파일 보내기", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "sentry.io로 버그 제보 허용", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "오디오 보내기", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "텍스트로 보내기", - "@sendAsText": { - "type": "text" - }, - "sendAMessage": "메시지 보내기", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "send": "보내기", - "@send": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndUser": "{username}, {username2}가 읽음", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "seenByUser": "{username}이 읽음", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "securityKeyLost": "보안 키를 잃어버렸나요?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "보안 키", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "security": "보안", - "@security": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "채팅 검색", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "search": "검색", - "@search": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "파일 이 폴더에 저장", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "saveFile": "파일 저장", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "파일 {filename} 으로 저장함", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saturday": "토요일", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "방 버전", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "방이 업그레이드되었습니다", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "모든 권한 취소", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "오래된 메시지 읽도록 요청", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "권한 요청", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "reason": "이유", - "@reason": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "공개 스페이스", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "공개 방", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicKey": "공개 키", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "privacy": "프라이버시", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "웹사이트의 가이드를 따르고 다음 버튼을 눌러주세요.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "유저 이름을 입력해주세요", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "PIN을 입력해주세요", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "비밀번호를 입력해주세요", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "보안 키를 입력해주세요:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "키가 없음", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "keysCached": "키가 캐시됨", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "방 들어가기", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username}이 채팅에 참가함", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "isTyping": "가 입력 중…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "isDeviceKeyCorrect": "아래 기기 키가 맞습니까?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username}이 당신을 FluffyChat에 초대했습니다.\n1. FluffyChat 설치: https://fluffychat.im\n2. 가입하거나 로그인\n3. 초대 링크 열기: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "inviteForMe": "나를 위해 초대", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "invitedUsersOnly": "초대한 사용자만", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username}이 {targetName}을 초대함", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invited": "초대됨", - "@invited": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "연락처 {groupName} 에 초대", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "inviteContact": "연락처 초대", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "모욕적이지 않음", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "올바르지 않은 복구 키나 비밀번호", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "링크를 클릭했어요", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "유저 이름 무시", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "당신을 방해하는 사용자들을 무시할 수 있습니다. 당신의 개인 무시 리스트에 있는 사용자들에게서 메시지나 방 초대를 수신할 수 없습니다.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "sentASticker": "{username}이 스티커 보냄", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username}이 사진 보냄", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username}이 오디오 보냄", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAFile": "{username}이 파일 보냄", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendVideo": "영상 보내기", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "스티커 보내기", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "메시지 신고", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "reply": "답장", - "@reply": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "방 새로운 버전으로 대체하기", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "아바타 지우기", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "메시지 지우기", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "채팅에서 밴 해제", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeDevice": "기기 삭제", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "removedBy": "{username}에 의해 지워짐", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeAllOtherDevices": "모든 다른 기기에서 지우기", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "remove": "지우기", - "@remove": { - "type": "text", - "placeholders": {} - }, - "rejoin": "다시 가입", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username}이 초대를 거절함", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "거절", - "@reject": { - "type": "text", - "placeholders": {} - }, - "register": "가입", - "@register": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "메시지 지우기", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username}이 이벤트를 지움", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "recording": "녹음", - "@recording": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "이메일의 링크를 클릭하고 진행해주세요.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "유저 이름을 골라주세요", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "kickFromChat": "채팅에서 추방", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "kickedAndBanned": "{username}이 {targetName}을 추방하고 밴함", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kicked": "{username}이 {targetName}을 추방함", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "link": "링크", - "@link": {}, - "yourUserId": "당신의 유저 ID:", - "@yourUserId": {}, - "unverified": "확인되지 않음", - "@unverified": {}, - "setupChatBackup": "채팅 백업 설정", - "@setupChatBackup": {}, - "yourChatBackupHasBeenSetUp": "당신의 채팅 백업이 설정되었습니다.", - "@yourChatBackupHasBeenSetUp": {}, - "iWroteDownTheKey": "키를 적었습니다", - "@iWroteDownTheKey": {}, - "setupChatBackupDescription": "당신의 메시지를 보호하기 위해서, 보안 키를 생성했습니다.\n비밀번호 관리자와 같이 안전한 곳에 저장해주세요.", - "@setupChatBackupDescription": {}, - "time": "시간", - "@time": {}, - "messageType": "메시지 유형", - "@messageType": {}, - "openGallery": "갤러리 열기", - "@openGallery": {}, - "sender": "발신자", - "@sender": {}, - "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "최소 {min}자를 선택하세요.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageInfo": "메시지 정보", - "@messageInfo": {}, - "pleaseEnterValidEmail": "유효한 이메일 주소를 입력해주세요.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "비밀번호 다시 입력", - "@repeatPassword": {}, - "loginWithOneClick": "클릭 한 번으로 로그인", - "@loginWithOneClick": {}, - "start": "시작", - "@start": {}, - "setupChatBackupNow": "당신의 채팅 백업을 지금 설정하세요", - "@setupChatBackupNow": {}, - "removeFromSpace": "스페이스에서 삭제", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "이것은 현재 채팅을 현재 스페이스로부터 지웁니다. 여전히 '모든 채팅'에서 접근할 수 있습니다.", - "@removeFromSpaceDescription": {}, - "addToSpaceDescription": "이 채팅을 추가할 스페이스를 선택하세요.", - "@addToSpaceDescription": {}, - "pleaseEnterSecurityKeyDescription": "채팅 백업을 잠금 해제하려면, 이전 세션에서 생성된 보안 키를 입력해주세요. 보안 키는 비밀번호가 아닙니다.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "보안 키를 지금 저장", - "@saveTheSecurityKeyNow": {}, - "commandHint_discardsession": "세션 삭제", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "다이렉트 채팅 시작\t\n--no-encryption을 사용해 암호화 비활성화", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_clearcache": "캐시 지우기", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "빈 그룹 채팅을 생성\t\n--no-encryption을 사용해 암호화를 비활성화", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "openVideoCamera": "영상용 카메라 열기", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "스토리에 추가", - "@addToStory": {}, - "publish": "공개", - "@publish": {}, - "yourStory": "내 스토리", - "@yourStory": {}, - "replyHasBeenSent": "답장을 보냈습니다", - "@replyHasBeenSent": {}, - "videoWithSize": "영상 ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "{date}의 스토리:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "스토리에서 사람들이 서로를 보고 연락할 수 있다는 점에 유의하십시오.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "무슨 일이 일어나고 있나요?", - "@whatIsGoingOn": {}, - "addDescription": "설명 추가", - "@addDescription": {}, - "whoCanSeeMyStories": "누가 내 스토리를 볼 수 있나요?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "스토리 구독 해제", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "이 유저는 스토리에 아무것도 올리지 않았습니다", - "@thisUserHasNotPostedAnythingYet": {}, - "bubbleSize": "버블 크기", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "dismiss": "닫기", - "@dismiss": {}, - "matrixWidgets": "Matrix 위젯", - "@matrixWidgets": {}, - "integrationsNotImplemented": "아직 위젯과 통합을 편집하는 것은 가능하지 않습니다.", - "@integrationsNotImplemented": {}, - "editIntegrations": "위젯과 통합 편집", - "@editIntegrations": {}, - "markAsRead": "읽음으로 표시하기", - "@markAsRead": {}, - "reportUser": "사용자 신고", - "@reportUser": {}, - "openChat": "채팅 열기", - "@openChat": {}, - "storyPrivacyWarning": "사람들이 서로를 보고 연락할 수 있다는 점에 유의해주세요. 스토리는 24시간 동안 보이지만 모든 기기와 서버에서 삭제된다는 보장은 없습니다.", - "@storyPrivacyWarning": {}, - "iUnderstand": "동의합니다", - "@iUnderstand": {}, - "reactedWith": "{sender}가 {reaction}로 반응함", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "confirmEventUnpin": "이벤트를 영구적으로 고정 해제할 것이 확실한가요?", - "@confirmEventUnpin": {}, - "pinMessage": "방에 고정", - "@pinMessage": {}, - "pinnedEventsError": "고정된 메시지 불러오는 중 오류", - "@pinnedEventsError": {}, - "emojis": "이모지", - "@emojis": {}, - "voiceCall": "음성 통화", - "@voiceCall": {}, - "placeCall": "전화 걸기", - "@placeCall": {}, - "experimentalVideoCalls": "실험적인 영상 통화", - "@experimentalVideoCalls": {}, - "unsupportedAndroidVersion": "지원되지 않는 안드로이드 버전", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "이 기능은 새로운 안드로이드 버전을 요구합니다. Lineage OS 지원이나 업데이트를 확인해주세요.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "영상 통화는 베타임을 확인해주세요. 의도한 대로 작동하지 않거나 모든 플랫폼에서 작동하지 않을 수 있습니다.", - "@videoCallsBetaWarning": {}, - "emailOrUsername": "이메일이나 유저 이름", - "@emailOrUsername": {} -} diff --git a/assets/l10n/intl_lt.arb b/assets/l10n/intl_lt.arb deleted file mode 100644 index 683b95c2e7..0000000000 --- a/assets/l10n/intl_lt.arb +++ /dev/null @@ -1,2843 +0,0 @@ -{ - "commandHint_leave": "Palikti pokalbių kambarį", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "confirm": "Patvirtinti", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "cancel": "Atšaukti", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Pakeitimai išsaugoti", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Tavo vartotojo ID:", - "@yourUserId": {}, - "edit": "Redaguoti", - "@edit": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Atsisiųsti failą", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Failo dydis", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "friends": "Draugai", - "@friends": { - "type": "text", - "placeholders": {} - }, - "friday": "Penktadienis", - "@friday": { - "type": "text", - "placeholders": {} - }, - "about": "Apie", - "@about": { - "type": "text", - "placeholders": {} - }, - "all": "Visi", - "@all": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "donate": "Paaukoti", - "@donate": { - "type": "text", - "placeholders": {} - }, - "fileName": "Failo vardas", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Pasikeisti slaptažodį", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "close": "Uždaryti", - "@close": { - "type": "text", - "placeholders": {} - }, - "archive": "Archyvas", - "@archive": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Groti", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "monday": "Pirmadienis", - "@monday": { - "type": "text", - "placeholders": {} - }, - "skip": "Praleisti", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sunday": "Sekmadienis", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Antradienis", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Pridėti naują draugą", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Pauzė", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "share": "Dalintis", - "@share": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Rodyti slaptažodį", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "time": "Laikas", - "@time": {}, - "settings": "Nustatytmai", - "@settings": { - "type": "text", - "placeholders": {} - }, - "thursday": "Ketvirtadienis", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "sender": "Siuntėjas", - "@sender": {}, - "yes": "Taip", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Tu", - "@you": { - "type": "text", - "placeholders": {} - }, - "logout": "Atsijungti", - "@logout": { - "type": "text", - "placeholders": {} - }, - "messages": "Žinutės", - "@messages": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "Nuskanuokite QR kodą", - "@scanQrCode": {}, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "addAccount": "pridėti vartotoją", - "@addAccount": {}, - "or": "Arba", - "@or": { - "type": "text", - "placeholders": {} - }, - "password": "Slaptažodis", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Slaptažodis pakeistas", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Įveskite savo slaptažodį", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Įveskite savo vartotojo vardą", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "reply": "Atsakyti", - "@reply": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "Blokuoti įrenginį", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blokuotas", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Pasirink saugų slaptažodį", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "Sukurti naują grupę", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Ištrinti žinutę", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Atmesti", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Įrenginys", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Įrenginio ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Įrenginiai", - "@devices": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Namų serveris", - "@homeserver": {}, - "enterYourHomeserver": "Įveskite namų serverį", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Viskas paruošta!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Šrifto dydis", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Prisijungimas nepavyko", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Išvalyti archyvą", - "@clearArchive": {}, - "create": "Sukurti", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Sukurti vartotoją dabar", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "connect": "Prisijungti", - "@connect": { - "type": "text", - "placeholders": {} - }, - "people": "Žmonės", - "@people": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Žinutė bus pašalinta visiem dalyviams", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderatorius", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Nutildyti pokalbį", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "newChat": "Naujas pokalbis", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "shareYourInviteLink": "Pasidalinkite pakvietimo nuoroda", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Rankiniu būdu įveskite pakvietimo nuorodą", - "@typeInInviteLinkManually": {}, - "createNewChatExplaination": "Nuskanuokite QR kodą arba pasdalinkite pakvietimo nuoroda.", - "@createNewChatExplaination": {}, - "none": "Nė vienas", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Nėra leidimo", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Nerasta viešų kambarių", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nerasta kambarių", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Pranešimai", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Pranešimai aktyvuoti šitai paskyrai", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Gaunama vieta…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Agresyvus", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Neprisijungta", - "@offline": { - "type": "text", - "placeholders": {} - }, - "online": "Prisijungta", - "@online": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oi, deja nustatant tiesioginius pranešimus įvyko klaida", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oi, kažkas negerai…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Atidarykite programėlę, kad perskaityti žinutes", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "link": "Nuoroda", - "@link": {}, - "participant": "Dalyvis", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dalyvaujančio vartotojo įrenginiai", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "Slapta frazė arba atkūrimo raktas", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Slaptažodis užmirštas", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Slaptažodžio atstatymas", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Pasirinkite paveiksliuką", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Prisegti", - "@pin": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Prašome pasirinkti", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Pasirinkite slaptą frazę", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Pasirinkite vartotojo vardą", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Paspauskite nuorodą e-pašte ir tęskite toliau.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Įveskite 4 simbolius arba palikite tuščia, kad išjungtumėte programėlės užraktą", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Įveskite Matrrix ID", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Įveskite savo apsaugos raktą", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Įveskite savo PIN kodą", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Sekite instrukcijas naršyklėje ir spauskite Sekantis", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privatumas", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Viešos grupės", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Viešas raktas", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Vieši kambariai", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "reason": "Priežastis", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Įrašymas", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Redaguoti žinutę", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registruotis", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Atmesti", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejoin": "Vėl prisijungti", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Pašalinti", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Pašalinti visus kitus įrenginius", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removeDevice": "Pašalinti įrenginį", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Pašalinti žinutę", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Pašalinti savo avatarą", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Pakeisti kambarį naujesne versija", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Prašyti leidimo", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Prašyti skaityti senesnes žinutes", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Atšaukti visus leidimus", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Kambarys buvo atnaujintas", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Kambario versija", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Šeštdienis", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Išsaugokite failą į šitą aplanką", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Ieškoti", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Ieškoti pokalbių", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "accept": "Sutinku", - "@accept": { - "type": "text", - "placeholders": {} - }, - "passwordsDoNotMatch": "Slaptažodžiai nesutampa!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Prašome įrašyti galiojantį e-paštą.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Pakartrokite slaptažodį", - "@repeatPassword": {}, - "accountInformation": "Paskyros informacija", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Pridėkite e-paštą", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Pridėkite grupės aprašymą", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administratorius", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "slapyvardis", - "@alias": { - "type": "text", - "placeholders": {} - }, - "allChats": "Visi pokalbiai", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Ar jau turite vartotojo paskyrą?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "Bet kas gali prisijungti", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ar esate tikras?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Ar esate tikras kad norite išsiregistruoti?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "changelog": "Pakeitimų žurnalas", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Pakeisti namų serverį", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Pakeisti savo stilių", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Pakeisti grupės vardą", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Pakeisti serverį", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Pakeisti ekrano užsklandą", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Pakeisti savo avatarą", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "chat": "Pokalbis", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Pokalbio detalės", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Pokalbiai", - "@chats": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Užblokuoti vartotoją šitame kambatyje", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "Išvalyti laikiną talpyklą", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "Atmesti sesiją", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_html": "Siųsti tekstą HTML formtu", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Pakviesti vartotoją į šitą kambarį", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Prisijungti prie nurodyto kambario", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Pašalinti vartotoja iš šito kambario", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_myroomnick": "Nustatykite savo vardą šitam kambariui", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_plain": "Siųsti neformatuotą tekstą", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "Siųsti tekstą", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Atblokuoti vartotoją iš šito kambario", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Neteisinga komanda", - "@commandInvalid": { - "type": "text" - }, - "configureChat": "Nustatyti pokalbį", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Turinio peržiūra", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Nukopijuota į iškarpinę", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopijuoti", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Koipjuoti į iškarpinę", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Nepavyko nustatyti avataro", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nepavyko nustatti vardo", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Šiuo metu aktyvus", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tamsi", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "delete": "Panaikinti", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Panaikinti paskyra", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Šifravimas saugus kai visi įrenginiai buvo patikrinti.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Tiesioginiai pokalbiai", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Užšifruotas", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Šifravimo algoritmas", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Šifravimas aktyvuotas", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "End-to-end šifravimo nustatymai", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Įveskite grupės vardą", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Įveskite e-paštą", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Įveskite vartotojo vardą", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Itin įžeidžiantis", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "forward": "Toliau", - "@forward": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Nuo prisijungimo", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Nuo pakvietimo", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Eiti į naują kambarį", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupė", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Grupės aprašymas", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Grupės aprašymas pakeistas", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Grupė yra vieša", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupės", - "@groups": { - "type": "text", - "placeholders": {} - }, - "guestsAreForbidden": "Svečiams draudžiama", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Svečiai gali prisijungti", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "help": "Pagalba", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Slėpti redaguotus įvykius", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Slėpti nežinomus įvykius", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "identity": "Tapatybė", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignoruoti", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignoruoti vartotojai", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "leave": "Palikti", - "@leave": { - "type": "text", - "placeholders": {} - }, - "loginWithOneClick": "Prisijungti vienu paspaudimu", - "@loginWithOneClick": {}, - "makeAModerator": "Padaryti moderatoriumi", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Padaryti admin'u", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Įsitikinkite, kad indentifikatorius galiojantis", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Nario pasikeitimai", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Paminėti", - "@mention": { - "type": "text", - "placeholders": {} - }, - "encryption": "Šifravimas", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Aktyvuoti šifravimą", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Redaguoti blokuotus serverius", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Redaguoti pokalbio leidimus", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "login": "Prisijungti", - "@login": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autentifikavimas", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avataras pakeistas", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Išsiųsti paspaudus Enter", - "@sendOnEnter": {}, - "banFromChat": "Uždrausti pokalbyje", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Uždraustas", - "@banned": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Raktai pakeisti", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Pakeisti įrenginio vardą", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "Nustatyti pokalbio atsarginę kopiją", - "@setupChatBackup": {}, - "yourChatBackupHasBeenSetUp": "Jūsų pokalbio atsarginė kopija buvo nustatyta.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "Pokalbio atsargine kopija", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "commandHint_me": "Apibūdinkite save", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "discardPicture": "Atmesti paveiksliuką", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Rasti", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Rasti grupes", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Vardas buvo pakeistas", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Atmesti ir daugiau neklausti", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Redaguoti vardą", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Redaguoti kambario slapyvardžius", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Redaguoti kambario avatarą", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Namų serveris nesuderinamas", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Kiek įžeižiantis šis turinys?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignoruoti vartotoją", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Aš paspaudžiau nuorodą", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Neteisinga slapta frazė arba atkūrimo raktas", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Neįžeidžiantis", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Neteisingas e-paštas", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Pakviesti kontaktą", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "invited": "Pakviestas", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUsersOnly": "Tik pakviesti vartotojai", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "isTyping": "rašoma…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Prisijungti prie kambario", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "kickFromChat": "Išmesti iš pokalbio", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastSeenIp": "Paskutinis žinomas IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Seniai matytas", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Paliko poaklbį", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licencija", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Šviesi", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadingPleaseWait": "Kraunasi... Paršome palaukti", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Rodyti daugiau…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nauja žinutė FluffyChat'e", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nauja patvirtinimo užklausa", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Toliau", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Ne", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Nėra ryšio su serveriu", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Nėra aprašymo", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Nustatyti grupės aprašymą", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Nustatyti pakvietimo nuorodą", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Vienkartinis prisijungimas", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Garsas, vibracijos LED spalvos", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Programinis kodas", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Erdvė yra vieša", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Erdvės pavadinimas", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "status": "Būsena", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Kaip sekasi šiandiena?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Pateikti", - "@submit": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sinchronizuojama... Palaukite.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Bakstelėkite, kad būtų rodomas paveiksliukas", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Bakstelėkite, kad būtų rodomas meniu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Perkėlimas iš kito įrenginio", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "unknownSessionVerify": "Nežinoma sesija, prašome patvirtinti", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "verify": "Patvirtinti", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Patvirtinti rankiniu būdu", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Pradėti patvirtinimą", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Jūs sėkmingai patvirtintas!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Tikrinama kita paskyra", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Pokalbių istorijos matomumas", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Matoma visiems dalyviams", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Laukiama, kol dalyvis priims užklausą…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Rašyti žinutę…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Esate pakviesti į šį pokalbį", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Jūs nebedalyvaujate šiame pokalbyje", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Jūs negalite pakviesti savęs", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Jums buvo uždrausta dalyvauti šiame pokalbyje", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "messageInfo": "Žinutės informacija", - "@messageInfo": {}, - "removeFromSpace": "Pašalinti iš erdvės", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Tai pašalins šį pokalbį iš dabartinės erdvės. Tada jis vis tiek bus matomas skiltyje „Visi pokalbiai“.", - "@removeFromSpaceDescription": {}, - "showSpaces": "Rodyti erdvių sąrašą", - "@showSpaces": {}, - "publicSpace": "Vieša erdvė", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Apsaugos raktas", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "security": "Apsauga", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Pamiršote apsugos raktą?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Siųsti kaip tekstą", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Siųsti garso įrašą", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Siųsti paveiksliuką", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Sųsti bylą", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Siųsti žinutes", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Siųsti originalą", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Siųsti video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesija patvirtinta", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "separateChatTypes": "Atskirti tiesioginius pokalbius, grupes ir erdves", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Nustatyti vartotojo profilio paveiksliuką", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Nustatyti kaip pagrindinį slapyvardį", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Nustatyti leidimų lygį", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Nustatyti būseną", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Dalintis vieta", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Rodyti susijusius tiesioginius pokalbius erdvėse", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registruotis", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Bakstelėkite įrenginį, kad patvirtintumėte", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Nepasiekiamas", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unblockDevice": "Atblokuoti įrenginį", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Nežinomas šifravimo algoritmas", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Įjungti pokalbio garsą", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Atsegti", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "useAmoledTheme": "Naudoti su AMOLED suderinamas spalvas?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "username": "Vartotojo vardas", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Vartotojas nepatvirtintas", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Vartotojas patvirtintas", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "Nepatvirtinta", - "@unverified": {}, - "verified": "Patvirtinta", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sesija sėkmingai patvirtinta!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Patvirtinti vartotoją", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Vaizdo skambutis", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Jūsų pokalbiai sinchronizuojami…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Jūsų vartotojo vardas", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Jūsų viešasis raktas", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Priartinti", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Nutolinti", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "addToSpaceDescription": "Pasirinkite erdvę, kad prie jos pridėtumėte šį pokalbį.", - "@addToSpaceDescription": {}, - "start": "Pradžia", - "@start": {}, - "setupChatBackupNow": "Nustatykite atsarginę pokalbio kopiją", - "@setupChatBackupNow": {}, - "account": "Paskyra", - "@account": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Pridėti į erdvę", - "@addToSpace": {}, - "appLock": "Programos užraktas", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archyvuotas kambarys", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Ar svečiams leidžiama prisijungti", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot žinutės", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "bubbleSize": "Burbulo dydis", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Šifravimas buvo sugadintas", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "iWroteDownTheKey": "Užrašiau raktą", - "@iWroteDownTheKey": {}, - "chatHasBeenAddedToThisSpace": "Pokalbis buvo pridėtas prie šios erdvės", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Pokalbis pašalintas iš šios erdvės", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearText": "Išvalyti tekstą", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Palyginkite ir įsitikinkite, kad šie emoji atitinka kito įrenginio emoji:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Palyginkite ir įsitikinkite, kad šie skaičiai sutampa su kito įrenginio skaičiais:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontaktas buvo pakviestas į grupę", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Apie turinį pranešta serverio administratoriams", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nauja erdvė", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "deactivateAccountWarning": "Tai išjungs jūsų vartotojo paskyrą. Atšaukti negalima! Ar jūs tuo tikri?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Numatytasis teisių lygis", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Šifravimo nebegalėsite išjungti. Ar jūs tuo tikri?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Įveskite erdvės vardą", - "@enterASpacepName": {}, - "send": "Siųsti", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Siųsti žinutę", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Pažymėti kaip skaitytą/neskaitytą", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Per daug užklausų. Pabandykite dar kartą vėliau!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Laukiama, kol dalyvis priims emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Laukiama, kol dalyvis priims skaičius…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Užsklanda", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Įspėjimas!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Trečiadienis", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Išsiuntėme jums el. laišką", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Kas gali atlikti kokį veiksmą", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kam leidžiama prisijungti prie šios grupės", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Kodėl norite apie tai pranešti?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Išvalyti atsarginę pokalbio kopiją, kad sukurtumėte naują saugos raktą?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Naudodami šiuos adresus galite atkurti savo slaptažodį.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "messageType": "Žinutės tipas", - "@messageType": {}, - "openGallery": "Atvira galerija", - "@openGallery": {}, - "chooseAUsername": "Pasirinkite vartotojo vardą", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Nežinomas įrenginys", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Balso žinutė", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Matoma visiems", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Pabandykite išsiųsti dar kartą", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Vietos nustatymas atmestas. Suteikite galimybę rodyti jūsų vietą.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Atminkite, kad norint naudoti end-to-end šifravimą, reikalingas Pantalaimon.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Šifravimą galite suaktyvinti tik tada, kai kambarys nebebus viešai pasiekiamas.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Šiuo metu Fluffychat nepalaiko Cross-signing pasirašymo. Aktyvuokite jį Element'e.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nerasta emotes. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Vietoje to įjunkite internetinio rakto atsarginę kopiją Element'e", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Atrodo, kad jūsų telefone nėra Google Services. Tai geras sprendimas jūsų privatumui! Norėdami gauti tiesioginius pranešimus FluffyChat, rekomenduojame naudoti https://microg.org/ arba https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "Kad galėtumėte atkurti slaptažodį, vėliau prie paskyros turėtumėte pridėti el. pašto adresą.", - "@newPasswordDescription": {}, - "noPasswordRecoveryDescription": "Dar nepridėjote slaptažodžio atkūrimo būdo.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Kol kas nerasta jokių būsenų.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nepalaikoma internete", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "Pasirinktas {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "onlineKeyBackupDisabled": "Rakto atsarginis kopijavimas išjungtas", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "Vienas iš jūsų klientų atsijungė", - "@oneClientLoggedOut": {}, - "onlineKeyBackupEnabled": "Rakto atsarginis kopijavimas įjungtas", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Atidarykite kamerą", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openVideoCamera": "Atidarykite kamerą vaizdo įrašui", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "editBundlesForAccount": "Redaguoti šios paskyros paketus", - "@editBundlesForAccount": {}, - "serverRequiresEmail": "Šis serveris turi patvirtinti jūsų el. pašto adresą registracijai.", - "@serverRequiresEmail": {}, - "optionalGroupName": "(Pasirenkama) Grupės pavadinimas", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "addToBundle": "Pridėti prie paketų", - "@addToBundle": {}, - "removeFromBundle": "Pašalinkite iš šio paketo", - "@removeFromBundle": {}, - "bundleName": "Paketo vardas", - "@bundleName": {}, - "play": "Groti {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "redactedAnEvent": "{username} redagavo įvykį", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejectedTheInvitation": "{username} atmetė kvietimą", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removedBy": "Pašalino vartotojas {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "unbanFromChat": "Pašalinti draudimą pokalbyje", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Pateikite pranešimų turinį", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Pranešti apie žinutę", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Failas išsaugotas kaip {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Išsaugoti failą", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Jau matė {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendBugReports": "Leisti siųsti pranešimus apie klaidas naudojant sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Siųsti lipduką", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} atsiuntė failą", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} atsiuntė garso įrašą", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} atsiuntė lipduką", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sharedTheLocation": "{username} pasidalino savo vietą", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "startedACall": "{senderName} pradėjo skambutį", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Pradėkite savo pirmąjį pokalbį dabar! 🙂 - Paspauskite „Naujas pokalbis“ - Nuskaitykite draugo QR kodą - Smagaus pokalbio", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Jie nesutampa", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Jie sutampa", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} panaikino draudimą {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unknownEvent": "Nežinomas įvykis '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unlockChatBackup": "Atrakinkite pokalbio atsarginę kopiją", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} ir dar {count} kiti rašo…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} ir {username2} rašo…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} rašo…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userUnknownVerification": "Vartotojo būsena nežinoma", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} išsiuntė {type} įvykį", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "youWillBeConnectedTo": "Būsite prisijungę prie {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "saveTheSecurityKeyNow": "Išsaugokite saugos raktą dabar", - "@saveTheSecurityKeyNow": {}, - "addToStory": "Pridėti prie istorijos", - "@addToStory": {}, - "pleaseEnterSecurityKeyDescription": "Norėdami atrakinti atsarginę pokalbio kopiją, įveskite saugos raktą, kuris buvo sugeneruotas ankstesnės sesijos metu. Jūsų saugos raktas NĖRA jūsų slaptažodis.", - "@pleaseEnterSecurityKeyDescription": {}, - "publish": "Paskelbti", - "@publish": {}, - "whoCanSeeMyStories": "Kas gali matyti mano istorijas?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Atsisakyti istorijų prenumeratos", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Šis vartotojas dar nieko nepaskelbė savo istorijoje", - "@thisUserHasNotPostedAnythingYet": {}, - "storyPrivacyWarning": "Atminkite, kad žmonės gali matyti vienas kitą ir susisiekti tarpusavyje jūsų istorijoje. Jūsų istorijos bus matomos 24 valandas, tačiau nėra garantijos, kad jos bus ištrintos iš visų įrenginių ir serverių.", - "@storyPrivacyWarning": {}, - "openChat": "Atviras pokalbis", - "@openChat": {}, - "reportUser": "Pranešti apie vartotoją", - "@reportUser": {}, - "dismiss": "Atsisakyti", - "@dismiss": {}, - "reactedWith": "{sender} suregavo su {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "unsupportedAndroidVersion": "Nepalaikoma Android versija", - "@unsupportedAndroidVersion": {}, - "emailOrUsername": "El. paštas arba vartotojo vardas", - "@emailOrUsername": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetNameError": "Pateikite rodomą vardą", - "@widgetNameError": {}, - "pleaseChooseAtLeastChars": "Pasirinkite bent {min} simbolius.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "acceptedTheInvitation": "{username} priėmė kvietimą", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "activatedEndToEndEncryption": "{username} suaktyvino end to end šifravimą", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "answeredTheCall": "{senderName} atsiliepė į skambutį", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "askVerificationRequest": "Priimti šią patvirtinimo užklausą iš {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "badServerLoginTypesException": "Namų serveris palaiko prisijungimo tipus: {serverVersions} Tačiau ši programa palaiko tik: {supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Namų serveris palaiko spec. versijas: {serverVersions} Tačiau ši programa palaiko tik {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "bannedUser": "{username} užblokavo {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "changedTheHistoryVisibility": "{username} pakeitė istorijos prieinamumą", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} pakeitė istorijos prieinamumą į: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "chatBackupDescription": "Jūsų pokalbio atsarginė kopija apsaugota saugos raktu. Prašome įsitikinti, kad jo neprarasite.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "commandHint_create": "Sukurkite tuščią grupės pokalbį. Norėdami išjungti šifravimą, naudokite no encryption", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "Pradėkite tiesioginį pokalbį. Norėdami išjungti šifravimą, naudokite no encryption", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_myroomavatar": "Nustatyti savo nuotrauką šiam kambariui (mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_op": "Nustatykite naudotojo galios lygį (numatytasis: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_react": "Siųsti atsakymą kaip reakciją", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandMissing": "{command} nėra komanda.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "containsDisplayName": "Yra vardas", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Yra vartotojo vardas", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nepavyko iššifruoti pranešimo: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "countParticipants": "{count} dalyviai", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "createdTheChat": "{username} sukūrė pokalbį", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "crossSigningDisabled": "Cross-signing išjungtas", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Redaguoti Jitsi pavyzdį", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Tuščias pokalbis", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emote jau egzistuoja!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Neteisingas emote trumpasis kodas!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emote paketai kambariui", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emote nustatymai", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emote trumpasis kodas", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Turite pasirinkti emote trumpąjį kodą ir paveiksliuką!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Įgalinti emote paketą visur", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} baigė skambutį", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "errorObtainingLocation": "Klaida nustatant vietą: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "groupWith": "Grupė su {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "hasWithdrawnTheInvitationFor": "{username} atšaukė {targetName} kvietimą", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "inviteForMe": "Pakvietimas man", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "isDeviceKeyCorrect": "Ar teisingas šis įrenginio raktas?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Pakviesti kontaktą į {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invitedUser": "{username} pakvietė {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "inviteText": "{username} pakvietė jus į FluffyChat. 1. Instaliuokite FluffyChat: https://fluffychat.im 2. Prisiregistruokite arba prisijunkite 3. Paspauskite pakvietimo nuorodą: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "joinedTheChat": "{username} prisijungė prie pokalbio", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "keysCached": "Raktai išsaugoti", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Raktai nerasti", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} išmetė {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} išmetė ir uždraudė {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "lastActiveAgo": "Paskutinis aktyvumas: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "loadCountMoreParticipants": "Įkelti dar {count} dalyvius", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "logInTo": "Prisijunkite prie {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "newUsernameDescription": "Jūsų vartotojo ID bus formatu @username:servername", - "@newUsernameDescription": {}, - "seenByUserAndUser": "Jau matė {username} ir {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "thisRoomHasBeenArchived": "Šis kambarys buvo suarchyvuotas.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Perjungti mėgstamiausią", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Perjungti nutildytą", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "End-to-end šifravimas šiuo metu yra Beta versijos! Naudokite savo rizika!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Sveiki atvykę į šauniausią momentinių pranešimų programą Matrix tinkle.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Nepavyksta atidaryti URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changedTheChatAvatar": "{username} pakeitė pokalbio avatarą", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} pakeitė pokalbio aprašymą į: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} pakeitė pokalbio pavadinimą į: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} pakeitė pokalbių leidimus", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} pakeitė rodomą vardą į: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} pakeitė svečio prieigos taisykles", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} pakeitė svečio prieigos taisykles į: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} pakeitė prisijungimo taisykles", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} pakeitė prisijungimo taisykles į: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} pakeitė savo avatarą", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} changed the room aliases", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} pakeitė pakvietimo nuorodą", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "enableChatBackup": "Įgalinkite atsarginę pokalbių kopiją, kad niekada neprarastumėte prieigos prie pokalbių.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Tavo istorija", - "@yourStory": {}, - "replyHasBeenSent": "Atsakymas išsiųstas", - "@replyHasBeenSent": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "Istorija nuo {date}: {body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Atminkite, kad žmonės gali matyti vienas kitą ir susisiekti tarpusavyje jūsų istorijoje.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Kas vyksta?", - "@whatIsGoingOn": {}, - "addDescription": "Pridėti aprašymą", - "@addDescription": {}, - "iUnderstand": "Aš suprantu", - "@iUnderstand": {}, - "pinMessage": "Prisijungti prie kambario", - "@pinMessage": {}, - "pinnedEventsError": "Įkeliant prisegtus pranešimus įvyko klaida", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Ar tikrai visam laikui atjungsite įvykį?", - "@confirmEventUnpin": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Skambinkite", - "@placeCall": {}, - "voiceCall": "Balso skambutis", - "@voiceCall": {}, - "unsupportedAndroidVersionLong": "Šiai funkcijai reikalinga naujesnė Android versija. Patikrinkite, ar nėra naujinimų arba Lineage OS palaikymo.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "Atminkite, kad vaizdo skambučiai šiuo metu yra beta versijos. Jie gali neveikti taip kaip tikėtasi, arba iš viso neveikti visose platformose.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Eksperimentiniai vaizdo skambučiai", - "@experimentalVideoCalls": {}, - "switchToAccount": "Persijungti į paskyrą {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Kita paskyra", - "@nextAccount": {}, - "previousAccount": "Ankstesnė paskyra", - "@previousAccount": {}, - "widgetEtherpad": "Teksto pastaba", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetName": "Vardas", - "@widgetName": {}, - "widgetUrlError": "Netinkamas URL.", - "@widgetUrlError": {}, - "youRejectedTheInvitation": "Jūs atmetėte kvietimą", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "Jūs prisijungėte prie pokalbio", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Jūs priėmėte kvietimą", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "Jūs užblokavote {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Jūs atšaukėte kvietimą {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "Jus pakvietė {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Jūs pašalinote {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Pakvietėte {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Jūs pašalinote ir užblokavote {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Jūs atšaukėte {user} draudimą", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "crossSigningEnabled": "Cross-signing įjungtas", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "locationDisabledNotice": "Vietos nustatymo paslaugos išjungtos. Aktyvuokite jas, kad galėtų rodyti jūsų vietą.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} nėra Matrix serveris, ar naudoti {server2}?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "numUsersTyping": "{count} vartotojai rašo…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "enableMultiAccounts": "(BETA) Įgalinkite kelias paskyras šiame įrenginyje", - "@enableMultiAccounts": {}, - "openInMaps": "Atidaryti žemėlapiuose", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "sentAPicture": "{username} atsiuntė nuotrauką", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} atsiuntė video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} išsiuntė skambučio informaciją", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informacija apie jūsų privatumą: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Nustatykite pasirinktinius emotes", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "userLeftTheChat": "{username} paliko pokalbį", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "markAsRead": "Žymėti kaip skaitytą", - "@markAsRead": {}, - "moreEvents": "{count,plural, =1{1 more event} other{{count} more events}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "pushRules": "Taisyklės", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{Jau matė {username} ir {count} others}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} neperskaityti pokalbiai}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} neperskaitytos žinutės}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "matrixWidgets": "Matrix programėlės", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Redaguoti programėles ir integracijas kol kas negalima.", - "@integrationsNotImplemented": {}, - "editWidgets": "Redaguoti programėles", - "@editWidgets": {}, - "addWidget": "Pridėti programėlę", - "@addWidget": {}, - "widgetCustom": "Custom", - "@widgetCustom": {}, - "errorAddingWidget": "Pridedant programėlę įvyko klaida.", - "@errorAddingWidget": {}, - "askSSSSSign": "Kad galėtumėte priregistruoti kitą asmenį, įveskite slaptą frazę arba atkūrimo raktą.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Įveskite slaptą frazę arba atkūrimo raktą, kad patvirtintumėte sesiją.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatiškai leiskite animuotus lipdukus ir emotes", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "setupChatBackupDescription": "Siekdami apsaugoti jūsų pranešimus, sukūrėme jums saugos raktą. Laikykite tai saugioje vietoje, pvz. slaptažodžių tvarkyklėje.", - "@setupChatBackupDescription": {}, - "ignoreListDescription": "Galite ignoruoti vartotojus, kurie jums trukdo. Negalėsite gauti jokių pranešimų ar kvietimų į kambarį iš vartotojų, įtrauktų į asmeninį ignoruojamųjų sąrašą.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "editIntegrations": "Redaguoti programėles ir integracijas", - "@editIntegrations": {} -} diff --git a/assets/l10n/intl_nb.arb b/assets/l10n/intl_nb.arb deleted file mode 100644 index 0033a08a3f..0000000000 --- a/assets/l10n/intl_nb.arb +++ /dev/null @@ -1,2211 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.967351", - "about": "Om", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Godta", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} godtok invitasjonen", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Konto", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Kontoinfo", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} skrudde på ende-til-ende -kryptering", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Legg til gruppebeskrivelse", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administrator", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Alle", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Har du allerede en konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} besvarte anropet", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Hvem som helst kan delta", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Programlås", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arkiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arkivert rom", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Skal gjester tillates å ta del", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Er du sikker?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Er du sikker på at du vil logge ut?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel for å hurtiglagre nøklene.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "For å kunne signere den andre personen, skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel for å bekrefte økten din.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Godta denne bekreftelsesforespørselen fra {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Spill av", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Identitetsbekreftelse", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar endret", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Bannlys fra sludring", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Bannlyst", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} bannlyste {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blokker enhet", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot-meldinger", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Nøkler hurtiglagret", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Avbryt", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Endre enhetsnavn", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} endret sludreavatar", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} endret sludrebeskrivelse til: «{description}»", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} endret sludringsnavn til: «{chatname}»", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} endret sludretilgangene", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} endret visningsnavn til: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} endret gjestetilgangsreglene", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} endret gjestetilgangsregler til: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} endret historikksynlighet", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} endret historikksynlighet til: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} endret tilgangsreglene", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} endret tilgangsreglene til: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} endret avataren sin", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} endret rom-aliasene", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} endret invitasjonslenken", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Endringslogg", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Endre passord", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Endringer lagret", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Endre hjemmetjener", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Endre din stil", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Endre gruppens navn", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Endre tjeneren", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Endre bakgrunnsbilde", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Krypteringen er skadet", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Sludring", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Sludringssikkerhetskopi", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Din sludringssikkerhetskopi er sikret med en sikkerhetsnøkkel. Ikke mist den.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Sludringsdetaljer", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Velg et sterkt passord", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Velg et brukernavn", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearText": "Tøm tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Lukk", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Sammenlign og forsikre at følgende smilefjes samsvarer med de på den andre enheten:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Sammenlign og forsikre at følgende tall samsvarer med de på den andre enheten:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Sett opp sludring", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Bekreft", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Koble til", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Kunne ikke koble til", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt invitert til gruppen", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Inneholder visningsnavn", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Inneholder brukernavn", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Innholdet har blitt rapportert til tjeneradministratorene", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Innholdsviser", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kopiert til utklippstavle", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopier", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopier til utklippstavle", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Kunne ikke dekryptere melding: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Kunne ikke sette avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kunne ikke sette visningsnavn", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} deltagere", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Opprett", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Opprett konto nå", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} opprettet sludringen", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Opprett ny gruppe", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Videreformidling av tillit på", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Videreformidling av tillit på", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Aktiv nå", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Mørk", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{timeOfDay}, {date}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day} {month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day} {month} {year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Dette vil skru av din brukerkonto for godt, og kan ikke angres! Er du sikker?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Forvalgt tilgangsnivå", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Slett", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Slett konto", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Slett melding", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Nekt", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Enhet", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Enhets-ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Enheter", - "@devices": { - "type": "text", - "placeholders": {} - }, - "directChats": "Direktesludringer", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Forkast bilde", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Oppdag", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Oppdag grupper", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Visningsnavn endret", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Doner", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Last ned fil", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Rediger", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Rediger blokkerte tjenere", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Rediger sludringstilganger", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Rediger visningsnavn", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Skriv inn Jitsi-instans", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Rediger romavatar", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Smilefjeset finnes allerede!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Ugyldig smilefjes-kode!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Smilefjespakker for rommet", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Smilefjes-innstillinger", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Smilefjes-kode", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Du må velge en smilefjes-kode og et bilde!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Tom sludring", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Skru på smilefjespakke for hele programmet", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Skru på kryptering", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Du vil ikke kunne skru av kryptering lenger. Er du sikker?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Kryptert", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Kryptering", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Krypteringsalgoritme", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Kryptering er ikke påskrudd", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Ende-til-ende -krypteringsinnstillinger", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} avsluttet samtalen", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Skriv inn et gruppenavn", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Skriv inn en e-postadresse", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Skriv inn et brukernavn", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Skriv inn din hjemmetjener", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Alt er klart!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Veldig", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Filnavn", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Filstørrelse", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Skriftstørrelse", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Videre", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Fredag", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Fra å ta del", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Fra invitasjonen", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Gruppe", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Gruppebeskrivelse", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Gruppebeskrivelse endret", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Gruppen er offentlig", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupper", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Gruppe med {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gjester forbudt", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gjester kan ta del", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} har trukket tilbake invitasjonen til {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Hjelp", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Skjul tilbaketrukne hendelser", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Skjul ukjente hendelser", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Hjemmetjener ukompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Hvor støtende er innholdet?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identitet", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorer", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignorerte brukere", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Du kan ignorere brukere som forstyrrer deg. Du vil ikke lenger kunne motta meldinger eller rominvitasjoner fra brukere på din personlige ignoreringsliste.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorer brukernavn", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Jeg har klikket på lenken", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Feilaktig passord eller gjenopprettingsnøkkel", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Harmløst", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Inviter kontakt", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Inviter kontakt til {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Invitert", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} inviterte {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Kun inviterte brukere", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Invitasjon for meg", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} har invitert deg til FluffyChat. \n1. Installer FluffyChat: https://fluffychat.im \n2. Registrer deg eller logg inn \n3. Åpne invitasjonslenken: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Er følgende enhetsnøkkel riktig?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "skriver…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username}ble med i samtalen", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Ta del i rom", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Nøkler hurtiglagret", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Nøkler mangler", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} kastet ut {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} kastet ut og bannlyste {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Kast ut av sludringen", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Sist aktiv: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Sist kjente IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Sett for lenge siden", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Forlat", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Forlat sludringen", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Lisens", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Lys", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Last inn {count} deltagere til", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Laster inn… Vent.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Last inn mer…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Logg inn", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Logg inn på {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Logg ut", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Gjør til moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Gjør til admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Forsikre deg om at identifikatoren er gyldig", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Medlemsendringer", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Nevn", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Meldinger", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Meldingen vil bli fjernet for alle deltagere", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Mandag", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Forstum sludring", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Merk at du trenger Pantalaimon for å bruke ende-til-ende -kryptering inntil videre.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Ny sludring", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Ny melding i FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Ny bekreftelsesforespørsel!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Neste", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Nei", - "@no": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Skru på videreformidling av tillit fra Element istedenfor.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Ingen beskrivelse", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Fant ingen smilefjes. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Bruk https://microg.org/ for å få Google-tjenester (uten at det går ut over personvernet) for å få push-merknader i FluffyChat:", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Skru på nettbasert sikkerhetskopiering av nøkler fra Element istedenfor.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ingen", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Du har ikke lagt til en måte å gjenopprette passordet ditt på.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Ingen tilgang", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Fant ingen rom …", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Ingen statuser så langt.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Merknader", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Merknader påslått for denne kontoen", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Ikke støttet på vev-versjonen", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} valgt", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} brukere skriver …", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "Støtende", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Frakoblet", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Pålogget", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Nettbasert sikkerhetskopiering av nøkler avskrudd", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Nettbasert sikkerhetskopiering av nøkler på", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oida, noe gikk galt …", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Åpne programmet for å lese meldinger", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Åpne kamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "Gruppenavn (valgfritt)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participant": "Deltager", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Deltagende brukerenheter", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "Passord eller gjenopprettingsnøkkel", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Passord", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Passord glemt", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Passord endret", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Passordgjenoppretting", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Velg bilde", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Fest", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Spill av {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Velg et brukernavn", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Klikk på lenken i e-posten og fortsett.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Skriv inn en Matrix-ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Skriv inn din sikkerhetsnøkkel:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Skriv inn passordet ditt", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Skriv inn brukernavnet ditt", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Følg instruksen på nettsiden og trykk på «Neste».", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Personvern", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Offentlig nøkkel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Offentlige rom", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Dyttingsregler", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Grunn", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Opptak", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} har trukket tilbake en hendelse", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Avslå", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} avslo invitasjonen", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Ta del igjen", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Fjern", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Fjern alle andre enheter", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Fjernet av {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Fjern enhet", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Opphev bannlysning", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Fjern melding", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Tegn rikt meldingsinnhold", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Erstatt rom med nyere versjon", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Svar", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Rapporter melding", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Forespør tilgang", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Forespørsel om å lese eldre meldinger", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Trekk tilbake alle tilganger", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Rommet har blitt oppgradert", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Lørdag", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "Søk", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Søk etter en sludring", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Sikkerhet", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Sikkerhetsnøkkel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Mistet sikkerhetsnøkkelen?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Sett av {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Sett av {username} og {count} andre}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Sett av {username} og {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Send", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Send en melding", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Send lyd", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Tillat forsendelse av feilrapporter med sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Send fil", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Send bilde", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Send meldinger", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Send original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Send video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} sendte en fil", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} sendte lyd", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} sendte et bilde", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} sendte et klistremerke", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} sendte en video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} sendte anropsinfo", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Personvernsinfo: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Økt bekreftet", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Sett et profilbilde", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Sett tilpassede smilefjes", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Sett gruppebeskrivelse", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Sett invitasjonslenke", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Sett tilgangsnivå", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Angi status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Innstilinger", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Del", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} delte posisjonen", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Registrer deg", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Hopp over", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Lyd, LED-farge for vibrasjon", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Kildekode", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} startet en samtale", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Start din første sludring :-)", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Hvordan har du det i dag?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Send inn", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Søndag", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "System", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Trykk for å vise meny", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Samsvarer ikke", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Samsvarer", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Dette rommet har blitt arkivert.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Torsdag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "For mange forespørsler. Prøv igjen senere!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Overfør fra en annen enhet", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Prøv å sende igjen", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Tirsdag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Utilgjengelig", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} opphevet bannlysning av {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Opphev blokkering av enhet", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Ukjent enhet", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Ukjent krypteringsalgoritme", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Ukjent hendelse «{type}»", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Ukjent økt. Bekreft den", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Opphev forstumming av sludring", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Løsne", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} uleste sludringer}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} uleste meldinger}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Bruk AMOLED-kompatible farger?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} og {count} andre skriver…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} og {username2} skriver…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} skriver…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} har forlatt sludringen", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Brukernavn", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Ubekreftet bruker", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} sendte en {type}-hendelse", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Bruker har ukjent bekreftelsesstatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Bekreftet bruker", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Økt bekreftet!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Bekreft", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Bekreft manuelt", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Start bekreftelse", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Du har bekreftet!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Bekrefter annen konto", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Bekreft bruker", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videosamtale", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Sludrehistorikkens synlighet", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Synlig for alle deltagere", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Synlig for alle", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Lydmelding", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Venter på at samtalepartner skal godta tallene …", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Bakgrunnsbilde", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Advarsel!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Ende-til-ende -kryptering er i beta. Bruk på egen risiko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Onsdag", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Velkommen til det søteste lynmeldingsprogrammet i Matrix-nettverket.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Du har fått en e-post", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Hvem kan utføre hvilken handling", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Hvem tillates å ta del i denne gruppen", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Hvorfor ønsker du å rapportere dette?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Med disse adressene kan du gjenopprette passordet ditt hvis du trenger det.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Skriv en melding …", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Ja", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Deg", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Du er invitert til denne sludringen", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Du deltar ikke lenger i denne sludringen", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Du kan ikke invitere deg selv", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Du har blitt bannlyst fra denne sludringen", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Ditt eget brukernavn", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Din offentlige nøkkel", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Du vil bli tilknyttet {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "toggleUnread": "Marker som lest/ulest", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Veksle forstumming", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Veksle favorittmerking", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "noConnectionToTheServer": "Ingen tilkobling til tjeneren", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterValidEmail": "Skriv inn en gyldig e-postadresse.", - "@pleaseEnterValidEmail": {}, - "addEmail": "Legg til e-post", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAtLeastChars": "Vennligst velg minst {min} tegn.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "repeatPassword": "Gjenta passord", - "@repeatPassword": {}, - "passwordsDoNotMatch": "Passordet samsvarer ikke!", - "@passwordsDoNotMatch": {}, - "addNewFriend": "Legg til en ny venn", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Legg til space", - "@addToSpace": {}, - "allChats": "Alle samtaler", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatisk spill av animerte stickers og emojis", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "badServerLoginTypesException": "Denne hjemme serveren støtter følgende innloggings-typer:\n{serverVersions}\nMen denne applikasjonen støtter kun:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "Trykk på enter for å sende", - "@sendOnEnter": {}, - "badServerVersionsException": "Denne hjemme serveren støtter følgene Spec-versjoner:\n{serverVersions}\nMen denne applikasjonen støtter kun {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "blocked": "Blokkert", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Kan ikke åpne URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeYourAvatar": "Bytt profilbilde", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Din bruker ID:", - "@yourUserId": {} -} diff --git a/assets/l10n/intl_nl.arb b/assets/l10n/intl_nl.arb deleted file mode 100644 index ea5637b98b..0000000000 --- a/assets/l10n/intl_nl.arb +++ /dev/null @@ -1,2863 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.955292", - "about": "Over ons", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Accepteren", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} heeft de uitnodiging geaccepteerd", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Account", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Accountgegevens", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} heeft eind-tot-eindversleuteling geactiveerd", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Email toevoegen", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Voeg een groepsomschrijving toe", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Nieuwe vriend toevoegen", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Aan space toevoegen", - "@addToSpace": {}, - "admin": "Beheerder", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Alle", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Alle chats", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Heb je al een account?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} heeft de oproep beantwoord", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Iedereen kan deelnemen", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "App-vergrendeling", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Archief", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Gearchiveerde Kamer", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Mogen gasten deelnemen", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Weet je het zeker?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Weet je zeker dat je wilt uitloggen?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Voer je chatback-up veiligheidswachtwoord of veiligheidssleutel in om de sleutels in de cache te bewaren.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om de andere persoon te kunnen ondertekenen.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om je sessie te verifiëren.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Accepteer je dit verificatieverzoek van {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pause", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Afspelen", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Authenticatie", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automatisch geanimeerde stickers en emoticons afspelen", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar is gewijzigd", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "De homeserver ondersteunt de login types:\n{serverVersions}\nMaar deze app ondersteunt alleen:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "De homeserver ondersteunt de Spec-versies:\n{serverVersions}\nMaar deze app ondersteunt alleen {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Van chat verbannen", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Verbannen", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} verbant {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Apparaat blokkeren", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Geblokkeerd", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot-berichten", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Sleutels in cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Annuleren", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Kan de URI {uri} niet openen", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Apparaatnaam wijzigen", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} heeft de chatavatar gewijzigd", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} heeft de chatomschrijving gewijzigd in: {description}", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} heeft de chatnaam gewijzigd in: {chatname}", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} heeft de chatrechten gewijzigd", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username}'s naam is nu {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} heeft de toegangsregels voor gasten gewijzigd", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} heeft de gastenregels gewijzigd in: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} heeft de zichtbaarheid van de geschiedenis gewijzigd", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} heeft de zichtbaarheid van de geschiedenis gewijzigd in: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} heeft de deelnameregels gewijzigd", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} heeft de deelnameregels gewijzigd in: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username}'s avatar is gewijzigd", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} heeft de kameraliassen gewijzigd", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} heeft de uitnodigingslink gewijzigd", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Wijzigingslogboek", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Wachtwoord wijzigen", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Wijzigingen zijn opgeslagen", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Homeserver wijzigen", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Stijl veranderen", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Groepsnaam wijzigen", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Server wijzigen", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Achtergrond wijzigen", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Je avatar veranderen", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "De encryptie is beschadigd", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Chatback-up", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Je chatback-up is beveiligd met een veiligheidssleutel. Zorg ervoor dat je deze niet verliest.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Chatdetails", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat is toegevoegd aan deze space", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Chat is verwijderd uit deze space", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "Chats", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Kies een sterk wachtwoord", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Kies een inlognaam", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Archief wissen", - "@clearArchive": {}, - "clearText": "Tekst wissen", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Sluiten", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Persoon uit deze kamer verbannen", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Tekst met HTML-opmaak versturen", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Persoon in deze kamer uitnodigen", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Deelnemen aan de gegeven kamer", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Persoon uit deze kamer verwijderen", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Deze kamer verlaten", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Beschrijf jezelf", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Je avatar voor deze kamer instellen (met mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Je naam voor deze kamer instellen", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Machtsniveau van de persoon instellen (standaard: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Niet-opgemaakte tekst versturen", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Antwoord als reactie versturen", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Tekst versturen", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Persoon weer in deze kamer toestaan", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Opdracht ongeldig", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} is geen opdracht.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Vergelijk of de volgende emoji overeenkomen met die van het andere apparaat:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Vergelijk of de volgende nummers overeenkomen met die van het andere apparaat:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Chat configureren", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Bevestigen", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Verbinden", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Verbindingspoging is mislukt", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Contact is voor de groep uitgenodigd", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Bevat naam", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Bevat gebruikersnaam", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "De inhoud is gerapporteerd aan de serverbeheerders", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Contentvoorvertoning", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Gekopieerd naar klembord", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Bericht kopiëren", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopieer naar klembord", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Kan het bericht niet decoderen: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Kan avatar niet instellen", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kan naam niet instellen", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} personen", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Aanmaken", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Maak nu een account aan", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} heeft de chat gemaakt", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Nieuwe groep", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nieuwe space", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Kruislings ondertekenen uitgeschakeld", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Kruislings ondertekenen ingeschakeld", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Momenteel actief", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Donker", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Hierdoor wordt je account gedeactiveerd. Dit kan niet ongedaan gemaakt worden! Weet je het zeker?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Standaardmachtigingsniveau", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Verwijderen", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Account verwijderen", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Bericht verwijderen", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Weigeren", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Apparaat", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Apparaat-ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Apparaten", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "De versleuteling is pas veilig als alle apparaten zijn geverifieerd.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Directe chats", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Afbeelding verwijderen", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Ontdekken", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Groepen ontdekken", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "De naam is gewijzigd", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Doneer", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Annuleer en vraag niet opnieuw", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Bestand downloaden", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Wijzig", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Geblokkeerde servers wijzigen", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Chatrechten wijzigen", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Naam wijzigen", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Jitsi-server wijzigen", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Kameraliassen wijzigen", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Kameravatar wijzigen", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emoticon bestaat al!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Ongeldige emoticon korte code!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Emoticonpakketten voor de kamer", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emoticon-instellingen", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Emoticon korte code", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Je moet een emoticon korte code en afbeelding kiezen!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Lege chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Schakel de chatback-up in om nooit de toegang tot je chats te verliezen.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Emoticonpakket overal inschakelen", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Versleuteling inschakelen", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Je kunt de versleuteling hierna niet meer uitschakelen. Weet je het zeker?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Versleuteld", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Versleuteling", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Versleutelingsalgoritme", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Versleuteling is niet ingeschakeld", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Eind-tot-eindversleutelingsinstellingen", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} heeft het gesprek beëindigd", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Vul een groepsnaam in", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Voer een email in", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Vul een spacenaam in", - "@enterASpacepName": {}, - "enterAUsername": "Vul een inlognaam in", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Vul je homeserver in", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Locatie ophalen fout: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Alles klaar!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extreem beledigend", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Bestandsnaam", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Bestandsgrootte", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Lettergrootte", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Stuur door", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Vrijdag", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Vrienden", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Vanaf deelname", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Vanaf uitnodiging", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Ga naar de nieuwe kamer", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Groep", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Groepsomschrijving", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Groepsomschrijving gewijzigd", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Groep is openbaar", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Groepen", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Groep met {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gasten zijn verboden", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gasten kunnen deelnemen", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} heeft de uitnodiging voor {targetName} ingetrokken", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Help", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Bewerkte gebeurtenissen verbergen", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Onbekende gebeurtenissen verbergen", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver is niet compatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Hoe beledigend is deze inhoud?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identiteit", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Negeer", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Genegeerde personen", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Je kunt personen die je storen negeren. Je kunt geen berichten of kameruitnodigingen ontvangen van de personen op je negeerlijst.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Negeer persoon", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Ik heb op de link geklikt", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Onjuiste wachtwoordzin of herstelsleutel", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Niet beledigend", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Ongeldige email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Contact uitnodigen", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Contact voor {groupName} uitnodigen", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Uitgenodigd", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} heeft {targetName} uitgenodigd", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Alleen uitgenodigde personen", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Persoonlijke uitnodiging", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} heeft je uitgenodigd voor FluffyChat.\n1. Installeer FluffyChat: https://fluffychat.im\n2. Registreer of log in\n3. Open deze uitnodigingslink: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Is de volgende apparaatsleutel correct?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "is aan het typen…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} is toegetreden tot de chat", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Deelnemen", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Er zitten sleutels in de cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Er zitten geen sleutels in de cache", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} heeft {targetName} verwijderd", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} heeft {targetName} verwijderd en verbannen", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Uit chat verwijderen", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Laatst actief: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Laatst bekende IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Lang geleden gezien", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Chat verlaten", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Verliet de chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licentie", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Licht", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Laad nog {count} personen", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Bezig met laden… Even geduld.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Meer laden…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Locatievoorzieningen is uitgeschakeld. Zet dit eerst aan om je locatie te delen.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Locatievoorzieningen is geweigerd. Zet hem aan om locatie delen te gebruiken.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Inloggen", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Inloggen bij {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Inloggen met {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Uitloggen", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Maak moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Beheerder maken", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Zorg ervoor dat de identificatie geldig is", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Persoon wijzigingen", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Vermeld", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Berichten", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Bericht wordt verwijderd voor alle personen", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Maandag", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Nog 1 gebeurtenis} other{Nog {count} gebeurtenissen}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Meldingen uitschakelen", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Houd er rekening mee dat je voorlopig Pantalaimon nodig hebt om eind-tot-eindversleuteling te gebruiken.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nieuwe chat", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nieuw bericht in FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nieuw verificatieverzoek!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Volgende", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Nee", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Geen verbinding met de server", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat biedt momenteel geen ondersteuning voor het inschakelen van kruislings ondertekenen. Schakel het in vanuit Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Geen omschrijving", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Geen emoticons gevonden. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Je kunt de versleuteling pas activeren zodra de kamer niet meer openbaar toegankelijk is.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Het lijkt erop dat je geen Google-services op je telefoon hebt. Dat is een goede beslissing voor je privacy! Om pushmeldingen in FluffyChat te ontvangen raden we je https://microg.org/ of https://unifiedpush.org aan.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} is geen Matrix-server, wil je {server2} gebruiken?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Zet in plaats daarvan de online sleutelback-up aan vanuit Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Geen", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Je hebt nog geen manier toegevoegd om je wachtwoord te herstellen.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Geen toestemming", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Geen openbare kamers gevonden…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Geen kamers gevonden …", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Geen statussen gevonden tot nu toe.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notificaties", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Meldingen ingeschakeld voor dit account", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Niet ondersteund in web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} geselecteerd", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} personen typen…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Locatie ophalen…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Beledigend", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online sleutelback-up is uitgeschakeld", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online sleutelback-up is ingeschakeld", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oeps! Helaas is er een fout opgetreden bij het instellen van de pushmeldingen.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oeps, er ging iets mis…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Open app om de berichten te lezen", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Camera openen", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "In kaarten openen", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "Je e-mailadres (optioneel)", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "Groepsnaam (optioneel)", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Of", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Personen", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Deelnemende apparaten", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "wachtwoordzin of herstelsleutel", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Wachtwoord", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Wachtwoord vergeten", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Wachtwoord gewijzigd", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Wachtwoordherstel", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Personen", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Kies een afbeelding", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Pin", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Speel {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Kies", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Kies een toegangscode", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Kies een inlognaam", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Klik op de link in de email en ga dan verder.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Voer 4 cijfers in of laat leeg om app-vergrendeling uit te schakelen.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Voer een Matrix ID in.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Voer je veiligheidsssleutel in:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Voer je wachtwoord in", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Voer je pincode in", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Voer je inlognaam in", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Volg de instructies op de website en tik op volgende.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacy", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Publieke Groepen", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Publieke sleutel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Publieke Kamers", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Publieke space", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Meldingsinstellingen", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Reden", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Opnemen", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} heeft een event verwijderd", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Verwijder", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registeren", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Weigeren", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} heeft de uitnodiging afgewezen", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Opnieuw deelnemen", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Verwijder", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Verwijder alle andere apparaten", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Verwijderd door {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Verwijder apparaat", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Verbanning opheffen", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Verwijder bericht", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Je avatar verwijderen", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Uitgebreide berichtinhoud weergeven", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Kamerversie upgraden", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Antwoord", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Bericht rapporteren", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Vraag toestemming", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Vraag om oudere berichten te lezen", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Alle machtigingen intrekken", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Kamer is geüpgrade", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Kamerversie", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Zaterdag", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Bestand opgeslagen als {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Bestand opslaan", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Bestand opslaan in deze map", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Zoeken", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Zoek een chat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Beveiliging", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Veiligheidssleutel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Veiligheidssleutel verloren?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Gezien door {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Gezien door {username} en {count} anderen}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Gezien door {username} en {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Verstuur", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Stuur een bericht", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Als tekst versturen", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Audio versturen", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Bugrapporten met sentry.io versturen", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Bestand versturen", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Afbeelding versturen", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Berichten versturen", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Origineel versturen", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Sticker versturen", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Video versturen", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} heeft een bestand verzonden", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} heeft een audio verzonden", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} heeft een afbeelding verzonden", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} heeft een sticker verzonden", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} heeft een video verzonden", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} heeft oproepgegevens verzonden", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informatie over je privacy: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessie is geverifieerd", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Profielfoto instellen", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Instellen als hoofdalias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Aangepaste emoticons inschakelen", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Stel een groepsomschrijving in", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Uitnodigingslink instellen", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Machtigingsniveau instellen", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Status instellen", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Instellingen", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Delen", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} heeft deze locatie gedeeld", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Locatie delen", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Wachtwoord weergeven", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registreren", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Eenmalig Inloggen", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Overslaan", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Geluid, vibratie LED-kleur", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Broncode", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Space is openbaar", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Spacenaam", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} heeft een gesprek gestart", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Start nu je eerste chat! 🙂\n- Tik op Nieuwe chat\n- Scan de QR-code van een vriend\n- Veel plezier met chatten", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Hoe gaat het met je vandaag?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Verstuur", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Zondag", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchroniseren... Even geduld.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Systeem", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tik op een apparaat om te verifiëren", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tik om afbeelding weer te geven", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tik om menu weer te geven", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Ze komen niet overeen", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Ze komen overeen", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Deze kamer is gearchiveerd.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Donderdag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}.{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Favoriet in- of uitschakelen", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Meldingen in- of uitschakelen", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Markeer gelezen/ongelezen", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Te veel verzoeken. Probeer het later nog eens!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Overzetten vanaf een ander apparaat", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Probeer nogmaals te verzenden", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Dinsdag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Niet beschikbaar", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} heeft verbanning {targetName} ongedaan gemaakt", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Deblokkeer apparaat", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Onbekend apparaat", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Onbekend versleutelingsalgoritme", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Onbekend evenement '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Onbekende sessie, verifieer a.j.b.", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Chatback-up ontgrendelen", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Meldingen inschakelen", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Losmaken", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 ongelezen chat} other{{unreadCount} ongelezen chats}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 ongelezen bericht} other{{unreadEvents} ongelezen berichten}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED-compatibele kleuren gebruiken?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} en {count} anderen zijn aan het typen …", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} en {username2} zijn aan het typen …", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} is aan het typen …", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} is vertrokken uit de chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Gebruikersnaam", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Persoon is niet geverifieerd", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} heeft een {type} -gebeurtenis gestuurd", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Persoon heeft een onbekende verificatiestatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Persoon is geverifieerd", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Geverifieerd", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Succesvol geverifieerde sessie!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verifieer", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Handmatig verifiëren", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Verificatie starten", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Je bent succesvol geverifieerd!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Ander account verifiëren", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifieer Persoon", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videogesprek", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Chatgeschiedenis zichtbaarheid", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Zichtbaar voor alle personen", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Zichtbaar voor iedereen", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Spraakbericht versturen", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Wachten tot partner het verzoek accepteert …", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Wachten tot partner de emoji accepteert …", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Wachten tot partner de nummers accepteert …", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Achtergrond", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Waarschuwing!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Eind-tot-eindversleuteling bevindt zich momenteel in beta! Gebruik op eigen risico!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Woensdag", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Welkom bij de schattigste instant messenger in het Matrix-netwerk.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "We hebben je een email gestuurd", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Wie kan welke actie uitvoeren", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Wie mag deelnemen aan deze groep", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Waarom wil je dit rapporteren?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Wil je de chatback-up wissen en een nieuwe veiligheidssleutel te maken?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Met deze adressen kan je je wachtwoord herstellen.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Schrijf een bericht…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Ja", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Jij", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Je bent uitgenodigd voor deze chat", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Je neemt niet langer deel aan deze chat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Je kunt jezelf niet uitnodigen", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Je bent verbannen uit deze chat", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Je chats worden gesynchroniseerd…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Je eigen gebruikersnaam", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Je publieke sleutel", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Je wordt verbonden met {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Inzoomen", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Uitzoomen", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "QR-code scannen", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Type de uitnodigingslink in...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Deel je uitnodigingslink", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Scan de QR-code of deel je uitnodigingslink als je niet naast elkaar zit.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Verstuur met enter", - "@sendOnEnter": {}, - "homeserver": "Server", - "@homeserver": {}, - "serverRequiresEmail": "Deze server wil je email laten bevestigen bij de registratie.", - "@serverRequiresEmail": {}, - "newUsernameDescription": "Je persoon-id heeft dan het formaat @naam:server", - "@newUsernameDescription": {}, - "newPasswordDescription": "Om je wachtwoord te kunnen resetten moet je een email toevoegen aan je account.", - "@newPasswordDescription": {}, - "oneClientLoggedOut": "Één van jouw apparaten is uitgelogd", - "@oneClientLoggedOut": {}, - "enableMultiAccounts": "(BETA) Multi-accounts inschakelen op dit apparaat", - "@enableMultiAccounts": {}, - "bundleName": "Bundelnaam", - "@bundleName": {}, - "removeFromBundle": "Van bundel verwijderen", - "@removeFromBundle": {}, - "addToBundle": "Aan bundel toevoegen", - "@addToBundle": {}, - "editBundlesForAccount": "Bundels voor dit account wijzigen", - "@editBundlesForAccount": {}, - "addAccount": "Account toevoegen", - "@addAccount": {}, - "link": "Link", - "@link": {}, - "setupChatBackup": "Chat back-up instellen", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Ik heb de sleutel opgeschreven", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Uw chat back-up is ingesteld.", - "@yourChatBackupHasBeenSetUp": {}, - "yourUserId": "Uw persoon-ID:", - "@yourUserId": {}, - "setupChatBackupDescription": "Om je berichten te beschermen genereren we een veiligheidssleutel voor jouw.\nBewaar deze op een veilig plek, bijvoorbeeld in een wachtwoordmanager.", - "@setupChatBackupDescription": {}, - "unverified": "Niet geverifieerd", - "@unverified": {}, - "passwordsDoNotMatch": "Wachtwoorden komen niet overeen!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Voor een geldige email in.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Wachtwoord herhalen", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Kies een wachtwoord met minimaal {min} tekens.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageInfo": "Berichtinfo", - "@messageInfo": {}, - "time": "Tijd", - "@time": {}, - "messageType": "Berichttype", - "@messageType": {}, - "sender": "Afzender", - "@sender": {}, - "openGallery": "Galerij openen", - "@openGallery": {}, - "addToSpaceDescription": "Selecteer een space om deze chat aan toe te voegen.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Inloggen met één klik", - "@loginWithOneClick": {}, - "removeFromSpace": "Uit de space verwijderen", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Dit verwijdert deze chat uit de huidige space. Het zal dan nog steeds zichtbaar zijn onder \"Alle chats\".", - "@removeFromSpaceDescription": {}, - "start": "Start", - "@start": {}, - "setupChatBackupNow": "Stel je chat back-up nu in", - "@setupChatBackupNow": {}, - "saveTheSecurityKeyNow": "Sla je veiligheidssleutel nu op", - "@saveTheSecurityKeyNow": {}, - "pleaseEnterSecurityKeyDescription": "Om je chat back-up te ontgrendelen, voer je veiligheidssleutel in die je gemaakt hebt in de vorige sessie. Je veiligheidssleutel is NIET je wachtwoord.", - "@pleaseEnterSecurityKeyDescription": {}, - "commandHint_clearcache": "Cache wissen", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Maak een lege groepschat\nGebruik --no-encryption om de versleuteling uit te schakelen", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "Start een directe chat\nGebruik --no-encryption om de versleuteling uit te schakelen", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_discardsession": "Sessie weggooien", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "openVideoCamera": "Videocamera openen", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Jouw verhaal", - "@yourStory": {}, - "replyHasBeenSent": "Antwoord is verzonden", - "@replyHasBeenSent": {}, - "whoCanSeeMyStories": "Wie kan mijn verhalen zien?", - "@whoCanSeeMyStories": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "addToStory": "Toevoegen aan verhaal", - "@addToStory": {}, - "publish": "Publiceren", - "@publish": {}, - "unsubscribeStories": "Verhalen afmelden", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Deze persoon heeft nog niets in zijn verhaal geplaatst", - "@thisUserHasNotPostedAnythingYet": {}, - "storyFrom": "Verhaal van {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Houd er rekening mee dat personen elkaar in je verhaal kunnen zien en contact met elkaar kunnen opnemen.", - "@whoCanSeeMyStoriesDesc": {}, - "bubbleSize": "Bubbelgrootte", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Hoe gaat het nu?", - "@whatIsGoingOn": {}, - "addDescription": "Omschrijving toevoegen", - "@addDescription": {}, - "storyPrivacyWarning": "Houd er rekening mee dat personen elkaar kunnen zien en contacteren in je verhaal. Je verhalen zijn 24 uur zichtbaar, maar er is geen garantie dat ze van alle apparaten en servers worden verwijderd.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Ik begrijp het", - "@iUnderstand": {}, - "dismiss": "Sluiten", - "@dismiss": {}, - "markAsRead": "Markeer als gelezen", - "@markAsRead": {}, - "reportUser": "Persoon rapporteren", - "@reportUser": {}, - "openChat": "Chat openen", - "@openChat": {}, - "matrixWidgets": "Matrix Widgets", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Widgets en integraties wijzigen is nog niet mogelijk.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Widgets en integraties wijzigen", - "@editIntegrations": {}, - "reactedWith": "{sender} reageerde met {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "pinMessage": "Maak vast aan kamer", - "@pinMessage": {}, - "emojis": "Emoji's", - "@emojis": {}, - "placeCall": "Bellen", - "@placeCall": {}, - "unsupportedAndroidVersion": "Niet-ondersteunde Android-versie", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "Voor deze functie is een nieuwere Android-versie vereist. Controleer op updates of Lineage OS-ondersteuning.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "Houd er rekening mee dat videogesprekken momenteel in bèta zijn. Ze werken misschien niet zoals je verwacht of werken niet op alle platformen.", - "@videoCallsBetaWarning": {}, - "voiceCall": "Spraakoproep", - "@voiceCall": {}, - "pinnedEventsError": "Fout bij laden van vastgemaakte berichten", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Weet je zeker dat je de gebeurtenis definitief wilt losmaken?", - "@confirmEventUnpin": {}, - "experimentalVideoCalls": "Videogesprekken (experimenteel)", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Email of inlognaam", - "@emailOrUsername": {}, - "nextAccount": "Volgende account", - "@nextAccount": {}, - "switchToAccount": "Naar account {number} overschakelen", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "previousAccount": "Vorige account", - "@previousAccount": {}, - "widgetCustom": "Aangepast", - "@widgetCustom": {}, - "widgetName": "Naam", - "@widgetName": {}, - "widgetUrlError": "Dit is geen geldige URL.", - "@widgetUrlError": {}, - "widgetNameError": "Geef een naam op.", - "@widgetNameError": {}, - "errorAddingWidget": "Fout bij het toevoegen van de widget.", - "@errorAddingWidget": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "addWidget": "Widget toevoegen", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Tekstnotitie", - "@widgetEtherpad": {}, - "editWidgets": "Widgets wijzigen", - "@editWidgets": {}, - "separateChatTypes": "Gescheiden directe chats, groepen en spaces", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Toon gerelateerde directe chats in spaces", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youAcceptedTheInvitation": "Je hebt de uitnodiging geaccepteerd", - "@youAcceptedTheInvitation": {}, - "youRejectedTheInvitation": "Je hebt de uitnodiging afgewezen", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "Je bent toegetreden tot de chat", - "@youJoinedTheChat": {}, - "youBannedUser": "Je hebt {user} verbannen", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Je hebt de uitnodiging voor {user} ingetrokken", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "Je bent uitgenodigd door {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Je hebt {user} uitgenodigd", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Je hebt {user} weggestuurd", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Je hebt weggestuurd en verbannen {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Je hebt de ban op {user} opgeheven", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "Spaces-lijst tonen", - "@showSpaces": {}, - "noEmailWarning": "Voer een geldig e-mailadres in. Anders kan je je wachtwoord niet opnieuw instellen. Als je dat niet wilt, tik je nogmaals op de knop om door te gaan.", - "@noEmailWarning": {} -} diff --git a/assets/l10n/intl_pl.arb b/assets/l10n/intl_pl.arb deleted file mode 100644 index 10bce97d27..0000000000 --- a/assets/l10n/intl_pl.arb +++ /dev/null @@ -1,2432 +0,0 @@ -{ - "@@locale": "pl", - "@@last_modified": "2021-08-14 12:41:09.943634", - "about": "O nas", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Akceptuj", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} zaakceptował/-a zaproszenie", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Konto", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informacje o koncie", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktywował/-a szyfrowanie end-to-end", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Dodaj adres email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Dodaj opis grupy", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Dodaj nowego przyjaciela", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Masz już konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} odebrał połączenie", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Każdy może dołączyć", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Archiwum", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Zarchiwizowane pokoje", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Czy użytkownicy-goście mogą dołączyć", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Jesteś pewny/-a?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Czy napewno chcesz się wylogować?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Wpisz swoje hasło przechowywania lub klucz odzyskiwania żeby załadować klucze.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Aby zalogować inną osobę, proszę wpisać hasło przechowywania lub klucz odzyskiwania.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Wpisz hasło przechowywania lub klucz odzyskiwania aby zweryfikować sesję.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Zaakceptować tą prośbę weryfikacji od {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autoryzacja", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Zdjęcie profilowe zostało zmienione", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Serwer wspiera typy logowania:\n{serverVersions}\nAle ta aplikacja wpiera tylko:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Serwer wspiera wersje Spec:\n{serverVersions}\nAle aplikacja wspiera tylko {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Ban na czacie", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Zbanowany/-a", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} zbanował/-a {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Zablokuj Urządzenie", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Zablokowane", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Wiadomośći Botów", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Klucze załadowane", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Anuluj", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Zmień nazwę urządzenia", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} zmienił/-a zdjęcie profilowe", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} zmienił/-a opis czatu na: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} zmienił/-a nick na: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} zmienił/-a uprawnienia czatu", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} zmienił/-a wyświetlany nick na: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} zmienił/-a zasady dostępu dla gości", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} zmienił/-a zasady dostępu dla gości na: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} zmienił/-a widoczność historii", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} zmienił/-a widoczność historii na: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} zmienił/-a zasady wejścia", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} zmienił/-a zasady wejścia na: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} zmienił/-a zdjęcie profilowe", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} zmienił/-a skrót pokoju", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} zmienił/-a link do zaproszenia do pokoju", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Dziennik zmian", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Zmień hasło", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Zmień serwer domyślny", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Zmień swój styl", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Zmień nazwę grupy", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Zmień tapetę", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Zmień tapetę", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Szyfrowanie zostało uszkodzone", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Rozmowa", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Kopia zapasowa Rozmów", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Twoja kopia zapasowa Rozmów jest zabezpieczona kluczem bezpieczeństwa. Uważaj żeby go nie zgubić.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Szczegóły czatu", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Rozmowy", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Wybierz silne hasło", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Wybierz nick", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Wyczyść archiwum", - "@clearArchive": {}, - "close": "Zamknij", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Zablokuj użytkownika w tym pokoju", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Wyślij tekst sformatowany w HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Zaproś użytkownika do pokoju", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Dołącz do podanego pokoju", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Usuń tego użytkownika z tego pokoju", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Wyjdź z tego pokoju", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Opisz siebie", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Ustaw awatar dla tego pokoju (przez mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Ustaw nazwę wyświetlaną dla tego pokoju", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Ustaw moc uprawnień użytkownika (domyślnie: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Wyślij niesformatowany tekst", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Wyślij odpowiedź jako reakcję", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Wyślij wiadomość", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Odblokuj użytkownika w tym pokoju", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Nieprawidłowe polecenie", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} nie jest poleceniem.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Porównaj i sprawdź czy na innym urządzeniu wyświetlają się te same emoji:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Porównaj i sprawdź czy na innym urządzeniu wyświetlają się te same cyfry:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Potwierdź", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Połącz", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Próba połączenia nie powiodła się", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt został zaproszony do grupy", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Posiada wyświetlaną nazwę", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Posiada nazwę użytkownika", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Przeglądarka treści", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Skopiowano do schowka", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopiuj", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Skopiuj do schowka", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nie można odszyfrować wiadomości: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Nie można ustawić zdjęcia profilowego", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nie można ustawić wyświetlanego nicku", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} uczestników", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Stwórz", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Stwórz konto teraz", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} stworzył/-a czat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Stwórz nową grupę", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Obecnie aktywny/-a", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Ciemny", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "To dezaktywuje twoje konto. To jest nieodwracalne ! Czy jesteś pewien?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "delete": "Usuń", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Usuń konto", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Usuń wiadomość", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Odrzuć", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Urządzenie", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID Urządzenia", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Urządzenia", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Szyfrowanie jest bezpieczne tylko wtedy gdy, wszystkie urządzenia zostaną zweryfikowane.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Rozmowy bezpośrednie", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Odrzuć zdjęcie", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Wyświetlany nick został zmieniony", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Wsparcie", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Pobierz plik", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Edytuj", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Edytuj wyświetlany nick", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Edytuj instancje Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Zmień aliasy pokoju", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotikon już istnieje!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Nieprawidłowy kod emotikony!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Paczki emotikon dla pokoju", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Ustawienia Emotikon", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Kod Emotikony", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Musisz wybrać kod emotikony oraz obraz!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Pusty czat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Włącz paczkę emotikon globalnie", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Nie będziesz już mógł wyłączyć szyfrowania. Jesteś pewny?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Szyfrowane", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Szyfrowanie", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algorytm szyfrowania", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Szyfrowanie nie jest włączone", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Ustawienia szyfrowania end-to-end", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} zakończył połączenie", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Wpisz nazwę grupy", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Wpisz adres email", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Wpisz nick", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Wpisz swój serwer domowy", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Wszystko gotowe!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nazwa pliku", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Rozmiar pliku", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Przekaż", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Piątek", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Od dołączenia", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Od zaproszenia", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Przejdź do nowego pokoju", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupa", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Opis grupy", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Opis grupy został zmieniony", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Grupa jest publiczna", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupa z {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Goście są zabronieni", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Goście mogą dołączyć", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} wycofał/-a zaproszenie dla {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Pomoc", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Ukryj informacje o zredagowaniu", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Ukryj nieznane wdarzenia", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Serwer domowy nie jest kompatybilny", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Tożsamość", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignorowani użytkownicy", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Możesz ignorować użytkowników którzy cię irytują. Nie będziesz odbierać od nich wiadomości ani żadnych zaproszeń od użytkowników na tej liście.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignoruj użytkownika", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Nacisnąłem na link", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Złe hasło bezpieczeństwa lub klucz odzyskiwania", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Zaproś kontakty", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Zaproś kontakty do {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Zaproszono", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} zaprosił/-a {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Tylko zaproszeni użytkownicy", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Zaprosszenie dla mnie", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} zaprosił/-a cię do FluffyChat. \n1. Zainstaluj FluffyChat: https://fluffychat.im \n2. Zarejestuj się lub zaloguj \n3. Otwórz link zaproszenia: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Czy to odpowiedni klucz urządzenia?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "pisze…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} dołączył/-a do czatu", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Dołącz do pokoju", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Klucze są załadowane", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Brakuje kluczy", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} wyrzucił/-a {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} wyrzucił/-a i zbanował/-a {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Wyrzuć z czatu", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Ostatnio widziano: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Ostatnie widziane IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Widziany/-a dawno temu", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Opuść", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Opuścił/-a czat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licencja", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Jasny", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Załaduj jeszcze {count} uczestników", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Ładowanie… Proszę czekać.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Załaduj więcej…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Zaloguj", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Zaloguj się do {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Wyloguj", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Uczyń moderatorem", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Uczyń adminem", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Upewnij się, że identyfikator jest prawidłowy", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Zmiany członków", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Wzmianka", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Wiadomość zostanie usunięta dla wszystkich użytkowników", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Poniedziałek", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 kolejne wydarzenie} other{{count} więcej wydarzeń}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Wycisz czat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Należy pamiętać, że Pantalaimon wymaga na razie szyfrowania end-to-end.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nowa rozmowa", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nowa wiadomość w FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nowa prośba o weryfikację!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Dalej", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Nie", - "@no": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Możesz aktywować szyfrowanie dopiero kiedy pokój nie będzie publicznie dostępny.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Wygląda na to, że nie masz usług Google w swoim telefonie. To dobra decyzja dla twojej prywatności! Aby otrzymywać powiadomienia wysyłane w FluffyChat, zalecamy korzystanie z https://microg.org/ lub https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "none": "Brak", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Nie dodałeś jeszcze sposobu aby odzyskać swoje hasło.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Brak uprawnień", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Nie znaleziono publicznych pokoi…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nie znaleziono pokoi…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Na razie brak ststusów.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Powiadomienia", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Powiadomienia są włączone dla tego konta", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nie obsługiwane w sieci", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} wybrany", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "oopsSomethingWentWrong": "Ups! Coś poszło nie tak…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Otwórz aplikację by odczytać wiadomości", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Otwórz aparat", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcjonalnie) Nazwa grupy", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Urządzenia użytkowników", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "password": "Hasło", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Hasło zostało zmienione", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "people": "Osoby", - "@people": { - "type": "text", - "placeholders": {} - }, - "pin": "Przypnij", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Otwórz {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Wybierz nick", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Wprowadź proszę identyfikator matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Wpisz swój klucz bezpieczeństwa:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Wpisz swoje hasło", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Wpisz swój nick", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Wykonaj instrukcje na stronie internetowej i naciśnij dalej.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Publiczne Grupy", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Publiczne pokoje", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Zasady push", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "recording": "Nagranie", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} stworzył/-a wydarzenie", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "register": "Zarejestruj", - "@register": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} odrzucił/-a zaproszenie", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Dołącz ponownie", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Usuń", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Usuń wszystkie inne urządzenia", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Usunięta przez {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Usuń urządzenie", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Usuń blokadę", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Usuń wiadomość", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "reply": "Odpisz", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Prośba o pozwolenie", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Poproś o przeczytanie starszych wiadomości", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Odwołaj wszystkie uprawnienia", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Wersja pokoju", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sobota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Zapisano plik jako {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "searchForAChat": "Przeszukaj czat", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Klucz bezpieczeństwa", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Zagubiony klucz bezpieczeństwa?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Zobaczone przez {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Zobaczone przez {username} oraz {count} innych}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Zobaczone przez {username} oraz {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Wyślij", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Wyślij wiadomość", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Wyślij plik", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Wyślij obraz", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} wysłał/-a plik", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} wysłał/-a plik audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} wysłał/-a obraz", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} wysłał/-a naklejkę", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} wysłał/-a wideo", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "setAProfilePicture": "Ustaw zdjęcie profilowe", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Ustaw jako główny alias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Ustaw opis grupy", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Ustaw link zaproszeniowy", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Ustaw status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Ustawienia", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Udostępnij", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} udostępnił/-a lokalizacje", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "Pokaż hasło", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Zarejesturuj się", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Kod żródłowy", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Rozpocznij swój pierwszy czat teraz! 🙂\n- Naciśnij przycisk napisz wiadomość\n- Wpisz nazwę użytkownika przyjaciela\n- Baw się dobrze podczas rozmów", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Jak się masz dziś?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "sunday": "Niedziela", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchronizacja… Proszę czekać.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "System", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Naciśnij na urządzeniu aby zweryfikować", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Kliknij by zobaczyć menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ten pokój został przeniesiony do archiwum.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Czwartek", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Przenieś z innego urządzenia", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Spróbuj wysłać ponownie", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Wtorek", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} odbanował/-a {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unknownDevice": "Nieznane urządzenie", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Nieznany algorytm szyfrowania", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Nieznane zdarzenie '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unmuteChat": "Wyłącz wyciszenie", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Odepnij", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} nieprzeczytanych czatów}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} nieprzeczytanych wiadomości}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Użyć kolorów kompatybilnych z ekranami AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} oraz {count} innych pisze…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} oraz {username2} piszą…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} pisze…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} opuścił/-a czat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nick", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} wysłał/-a wydarzenie {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verified": "Zweryfikowane", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verify": "zweryfikuj", - "@verify": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Rozmowa wideo", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Widoczność historii czatu", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Widoczny dla wszystkich użytkowników", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Widoczny dla każdego", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Wiadomość głosowa", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Tapeta", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Szyfrowanie end-to-end jest obecnie w fazie beta! Używaj na własne ryzyko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Środa", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Witamy w najładniejszym komunikatorze w sieci matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kto może dołączyć do tej grupy", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Napisz wiadomość…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Tak", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Ty", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Dostałeś/-aś zaproszenie do tego czatu", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Nie uczestniczysz już w tym czacie", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Nie możesz zaprosić siebie", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Zostałeś zbanowany na tym czacie", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Twój nick", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Będziesz połączony do serwera {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Powiększ", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Pomniejsz", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "passwordsDoNotMatch": "Hasła nie pasują!", - "@passwordsDoNotMatch": {}, - "allChats": "Wszystkie", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Edytuj uprawnienia", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignoruj", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Brak połączenia z serwerem", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "createNewChatExplaination": "Po prostu zeskanuj kod QR lub jeśli nie jesteście obok siebie podziel się linkiem z zaproszeniem.", - "@createNewChatExplaination": {}, - "obtainingLocation": "Uzyskiwanie lokalizacji…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "addAccount": "Dodaj konto", - "@addAccount": {}, - "serverRequiresEmail": "Ten serwer wymaga potwierdzenia twojego adresu email w celu rejestracji.", - "@serverRequiresEmail": {}, - "or": "Lub", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Uczestnik", - "@participant": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Zapomniano hasła", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Proszę wybierz", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Proszę kliknij w odnośnik wysłany na email aby kontynuować.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Proszę podaj 4 cyfry. By wyłączyć blokadę pozostaw puste.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Usuń swój avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Pokazuj w wiadomościach pogrubienia i podkreślenia", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Zamień pokój na nową wersję", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Zgłoś wiadomość", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Zapisz plik", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "security": "Bezpieczeństwo", - "@security": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Zapisz plik do tego folderu", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Szukaj", - "@search": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Wyślij jako tekst", - "@sendAsText": { - "type": "text" - }, - "sendBugReports": "Pozwól wysyłać raporty o błędach do sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Wyślij dźwięk", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Wyślij wiadomości", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Wyślij oryginał", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Wyślij naklejkę", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Wyślij film", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sesja została zweryfikowana", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} rozpoczął rozmowę", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "yourPublicKey": "Twój klucz publiczny", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Twoja relacja", - "@yourStory": {}, - "enableMultiAccounts": "(BETA) Włącza obsługę wiele kont na tym urządzeniu", - "@enableMultiAccounts": {}, - "pickImage": "Wybierz obraz", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Odzyskiwanie hasła", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Otwórz w mapach", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "link": "Link", - "@link": {}, - "roomHasBeenUpgraded": "Pokój zostać zaktualizowany", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Pauza", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "whatIsGoingOn": "Co u Ciebie słychać?", - "@whatIsGoingOn": {}, - "pleaseEnterValidEmail": "Proszę podaj poprawny adres email.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Powtórz hasło", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Proszę podaj przynajmniej {min} znaków.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "all": "Wszystkie", - "@all": { - "type": "text", - "placeholders": {} - }, - "appLock": "Blokada aplikacji", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Pasują", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Wyślij enterem", - "@sendOnEnter": {}, - "autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotki", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "cantOpenUri": "Nie można otworzyć linku {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "configureChat": "Konfiguruj chat", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Podaj nazwę przestrzeni", - "@enterASpacepName": {}, - "homeserver": "Adres serwera", - "@homeserver": {}, - "locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "Jedno z twoich urządzeń zostało wylogowane", - "@oneClientLoggedOut": {}, - "privacy": "Prywatność", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Klucz publiczny", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Publiczna przestrzeń", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Dotknij by pokazać obraz", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Nie pasują", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Przełącz ulubione", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "Ustaw kopię zapasową", - "@setupChatBackup": {}, - "changesHaveBeenSaved": "Zapisano zmiany", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Twoja nazwa użytkownika:", - "@yourUserId": {}, - "iWroteDownTheKey": "Zapisałem klucz w bezpiecznym miejscu", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Twoja kopia zapasowa chatu została ustawiona.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "By chronić Twoje wiadomości, wygenerowaliśmy dla Ciebie klucz bezpieczeństwa.\nProszę zapisz go w bezpiecznym miejscu, takim jak menedżer haseł.", - "@setupChatBackupDescription": {}, - "chatHasBeenAddedToThisSpace": "Chat został dodany do tej przestrzeni", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Chat został usunięty z tej przestrzeni", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Zawartość została zgłoszona administratorom serwera", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "discover": "Odkrywaj", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Odkrywaj grupy", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Anuluj i nie pytaj ponownie", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Edytuj zdjęcie pokoju", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Rozmiar czcionki", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "friends": "Znajomi", - "@friends": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupy", - "@groups": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Nieprawidłowy adres email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Brak uprawnień. Proszę zezwól aplikacji na dostęp do lokalizacji aby móc ją udostępnić.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "openVideoCamera": "Nagraj film", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "loginWithOneClick": "Zaloguj się jednym kliknięciem", - "@loginWithOneClick": {}, - "messages": "Wiadomości", - "@messages": { - "type": "text", - "placeholders": {} - }, - "offensive": "Agresywne", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Proszę podaj pin", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "reason": "Powód", - "@reason": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Przekaż wiadomość", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "Polityka prywatności: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Ustaw niestandardowe emotki", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Dzięki tym adresom możesz odzyskać swoje hasło.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Ustaw jako publiczną", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Udostępnij lokalizację", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Ustaw poziom uprawnień", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "skip": "Pomiń", - "@skip": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nazwa przestrzeni", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Przełącz wyciszone", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Oznacz przeczytane/nieprzeczytane", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Niedostępne", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Użytkownik nie został zweryfikowany", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "publish": "Opublikuj", - "@publish": {}, - "whoCanSeeMyStories": "Kto może widzieć moje relacje?", - "@whoCanSeeMyStories": {}, - "scanQrCode": "Skanuj kod QR", - "@scanQrCode": {}, - "addToStory": "Dodaj do relacji", - "@addToStory": {}, - "typeInInviteLinkManually": "Wpisz link ręcznie...", - "@typeInInviteLinkManually": {}, - "createNewSpace": "Nowa przestrzeń", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Dźwięk, wibracje i kolor LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "clearText": "Wyczyść tekst", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "bubbleSize": "Rozmiar bąbelków", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Dodaj do przestrzeni", - "@addToSpace": {}, - "changeYourAvatar": "Zmień avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "commandHint_clearcache": "Wyczyść pamięć podręczną", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "enableChatBackup": "Włącz kopię zapasową aby nigdy nie stracić historii twoich wiadomości.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "commandHint_create": "Stwórz pusty chat\nUżyj --no-encryption by wyłączyć szyfrowanie", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "Rozpocznij bezpośredni chat\nUżyj --no-encryption by wyłączyć szyfrowanie", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "editBlockedServers": "Edytuj blokowane serwery", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Aktywuj szyfowanie", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Domyślny poziom uprawnień", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Ups! Wystąpił błąd podczas ustawiania powiadomień push.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "reject": "Odrzuć", - "@reject": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Zbyt wiele zapytań. Proszę spróbuj ponownie później.", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_pt.arb b/assets/l10n/intl_pt.arb deleted file mode 100644 index 8246d81497..0000000000 --- a/assets/l10n/intl_pt.arb +++ /dev/null @@ -1,3 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.940318" -} \ No newline at end of file diff --git a/assets/l10n/intl_pt_BR.arb b/assets/l10n/intl_pt_BR.arb deleted file mode 100644 index 0b2993a879..0000000000 --- a/assets/l10n/intl_pt_BR.arb +++ /dev/null @@ -1,2861 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.925971", - "about": "Sobre", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Aceitar", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} aceitou o convite", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Conta", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Dados da conta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ativou a criptografia ponta-a-ponta", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Adicionar email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Adicionar uma descrição para o grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Adicionar novo(a) amigo(a)", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "cognome", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Todas", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Todas as conversas", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Você já possui uma conta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} atendeu à chamada", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Qualquer pessoa pode participar", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Trava do aplicativo", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arquivo", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Sala arquivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Usuários convidados podem participar", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Tem certeza?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Tem certeza que deseja encerrar a sessão?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Por favor, insira sua frase secreta ou chave de recuperação para serem guardadas.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Para poder validar a outra pessoa, por favor, insira sua frase secreta ou chave de recuperação.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Por favor, insira a frase secreta ou chave de recuperação para verificar sua sessão.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Aceitar esta solicitação de verificação de {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pausar", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Tocar", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticação", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Reproduzir automaticamente figurinhas animadas e emojis", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar alterado", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "O servidor matriz suporta os tipos de login:\n{serverVersions}\nMas este app suporta apenas:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "O servidor matriz suporta as versões Spec:\n{serverVersions}\nMas este app suporta apenas {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Banir da conversa", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Banido", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} baniu {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloquear dispositivo", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bloqueado", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Mensagens de robôs", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Chaves guardadas", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancelar", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Não foi possível abrir a URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Alterar o nome do dispositivo", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} alterou o avatar da conversa", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} alterou a descrição da conversa para: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} alterou o nome da conversa para: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} alterou as permissões na conversa", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} mudou o seu nome de exibição para: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} alterou as regras de acesso dos convidados", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} alterou as regras de acesso dos convidados para: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} alterou a visibilidade do histórico", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} alterou a visibilidade do histórico para: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} alterou as regras para participação", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} alterou as regras para participação para: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} alterou seu avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} alterou os cognomes da sala", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} alterou o link de convite", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Lista de mudanças", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Alterar a senha", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Alterações foram salvas", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Alterar o servidor matriz", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Alterar o tema", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Alterar o nome do grupo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Alterar o servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Alterar o pano de fundo", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Alterar seu avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "A criptografia foi corrompida", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Conversas", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Backup da conversa", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "O backup da sua conversa é protegido com sua chave de segurança. Por favor, evite perdê-la.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detalhes da conversa", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Conversas", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Escolha uma senha forte", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Escolha um nome de usuário", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Limpar arquivo", - "@clearArchive": {}, - "clearText": "Limpar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Fechar", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Banir um(a) usuário(a) desta sala", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Enviar mensagem formatada em HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Convidar um(a) usuário(a) para esta sala", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Entrar numa sala", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Remover um(a) usuário(a) desta sala", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Sair desta sala", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Descrever você mesmo", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Determinar sua imagem para esta sala (via mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Determinar seu nome de exibição para esta sala", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Determinar o grau de poderes de um(a) usuário(a) (padrão: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Enviar mensagem sem formatação", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Enviar uma resposta como reação", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Enviar mensagem", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Revogar o banimento de um(a) usuário(a) desta sala", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Comando inválido", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} não é um comando.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Compare e certifique-se que os seguintes emojis batem com os do outro dispositivo:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Compare e certifique-se de que os seguintes números batem com os do outro dispositivo:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configurar conversa", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirma", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Conectar", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "A tentativa de conexão falhou", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "O contato foi convidado ao grupo", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Contém nome de exibição", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contém nome de usuário", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "O conteúdo foi denunciado para quem administra o servidor", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visualizador de conteúdo", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copiado para área de transferência", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copiar", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copiar para a área de transferência", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Não foi possível decriptar a mensagem: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Não foi possível fixar o avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Não foi possível fixar o nome de exibição", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participantes", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Criar", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Criar conta agora", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} criou a conversa", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Novo grupo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Novo espaço", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Assinatura cruzada desativada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Assinatura cruzada ativada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Ativo", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Escuro", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Isto desativará a conta do usuário. É irreversível! Tem certeza?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Nível de permissão padrão", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Apagar", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Apagar conta", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Apagar mensagem", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Rejeitar", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Dispositivo", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID do dispositivo", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Dispositivos", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "A criptografia só é segura quando todos os dispositivos forem verificados.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Conversas diretas", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Descartar imagem", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Desvendar", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Desvendar grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "O nome de exibição foi alterado", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Doar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar e não perguntar novamente", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Baixar arquivo", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Editar", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Editar servidores bloqueados", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Editar permissões da conversa", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Editar nome de exibição", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Alterar a instância Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Editar cognome da sala", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Editar o avatar da sala", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emoji já existe!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Código emoji inválido!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Pacote de emoji para a sala", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Configuração dos Emoji", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Código Emoji", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Você tem que escolher um código emoji e uma imagem!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Conversa vazia", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Habilite o backup de conversas para nunca perder acesso a elas.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Habilitar globalmente o pacote de emoji", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Habilitar criptografia", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Você não poderá desabilitar a criptografia posteriormente. Tem certeza?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Criptografado", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Criptografia", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritmo criptográfico", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "A criptografia não está habilitada", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Configuração da criptografia ponta-a-ponta", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} finalizou a chamada", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Insira um nome de grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Inserir endereço de e-mail", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Insira um nome pro espaço", - "@enterASpacepName": {}, - "enterAUsername": "Insira um nome de usuário", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Insira um servidor matriz", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Erro ao obter local: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Tudo pronto!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremamente ofensivo", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nome do arquivo", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Tamanho do arquivo", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Tamanho da fonte", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Encaminhar", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Sexta-feira", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amigos", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Desde que entrou", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Desde o convite", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Ir para a sala nova", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupo", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Descrição do grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descrição do grupo alterada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Grupo público", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupos", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupo com {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Convidados estão proibidos", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Convidados podem participar", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} revogou o convite para {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Ajuda", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Ocultar eventos removidos", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Ocultar eventos desconhecidos", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Servidor matriz não é compatível", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "O quão ofensivo é este conteúdo?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identidade", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorar", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Usuários ignorados", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Você pode ignorar usuários que estão lhe pertubando. Não será possível receber mensagens ou convites de usuários na sua lista pessoal de ignorados.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorar usuário", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Eu cliquei no link", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frase secreta ou chave de recuperação incorreta", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Inofensivo", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Email inválido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Convidar contato", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Convidar contato para {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Foi convidado", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} convidou {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Apenas usuários convidados", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Convite para mim", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} convidou você para o FluffyChat. \n1. Instale o FluffyChat: https://fluffychat.im \n2. Entre ou crie uma conta \n3. Abra o link do convite: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "A seguinte chave de dispositivo está correta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "está escrevendo…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} entrou na conversa", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Entrar na sala", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Chaves guardadas", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Chaves faltando", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} enxotou {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} expulsou e baniu {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Expulso da conversa", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Última vez ativo: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Último IP conhecido", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto há muito tempo atrás", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Sair", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Sair da conversa", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licença", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Claro", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Carregue {count} mais participantes", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Carregando... Aguarde.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Carregando mais…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "O serviço de localização está desabilitado. Por favor, habilite-o para compartilhar sua localização.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Permissão de localização negada. Conceda as permissões para habilitar o compartilhamento de localização.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Iniciar sessão", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Conectar a {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Entrar com {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Encerrar sessão", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Atribuir papel de moderador", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Atribuir papel de admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Certifique-se de que a identificação é válida", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Alterações de membros", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Mencionar", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Mensagens", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Mensagem será removida para todos os participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderador", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Segunda-feira", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Mais 1 evento} other{Mais {count} eventos}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Silenciar", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Por favor, observe que, por enquanto, você precisa do Pantalaimon para usar criptografia ponta-a-ponta.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nova conversa", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nova mensagem no FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nova solicitação de verificação!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Próximo", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Não", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Sem conexão com o servidor", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat atualmente não suporta a habilitação de assinatura cruzada. Por favor, habilite via Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Sem descrição", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nenhum emoji encontrado. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Você só pode ativar criptografia quando a sala não for mais publicamente acessível.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Aparentemente você não tem serviços Google no seu celular. Boa decisão para a sua privacidade! Para receber notificações no FluffyChat, recomendamos usar https://microg.org/ ou https://unifiedpush.org.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} não é um servidor matrix, usar {server2} talvez?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Por favor, habilite o backup de chaves via Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Nenhum", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Você ainda não adicionou uma forma de recuparar sua senha.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Sem permissão", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Não foram encontradas salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nenhuma sala encontrada…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Nenhum status encontrado por enquanto.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notificações", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notificações habilitadas para esta conta", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Sem suporte na versão Web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selecionados", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} usuários estão digitando…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Obtendo localização…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Ofensivo", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Desconectado", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Disponível", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Backup de chaves está desabilitado", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Backup de chaves está ativado", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Opa! Infelizmente, um erro ocorreu ao configurar as notificações.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Opa, algo deu errado…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Abra o app para ler as mensagens", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Abra a câmera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Abrir no mapas", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Opcional) Seu endereço de email", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Opcional) Nome do Grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Ou", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Participante", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositivos dos participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "frase secreta ou chave de recuperação", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Senha", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Esqueci a senha", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Senha foi alterada", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Recuperação de senha", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Pessoas", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Escolha uma imagem", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Alfinetar", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Tocar {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Por favor, selecione", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Por favor, escolha um código", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Por favor, escolha um nome de usuário", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Por favor, clique a ligação no e-mail para prosseguir.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Por favor, insira 4 dígitos ou deixe em branco para desativar a trava do aplicativo.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Por favor, insira o ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Por favor, insira sua chave de segurança:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Por favor, insira sua senha", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Por favor, insira seu PIN", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Por favor, insira seu nome de usuário", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Por favor, siga as instruções no site e toque em próximo.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacidade", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grupos Públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chave Pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Salas públicas", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Espaço público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Regras de notificação", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Motivo", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Gravando", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} removeu um evento", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Retratar mensagem", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registrar", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Recusar", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} recusou o convite", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Retornar", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Remover", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Remover todos os outros dispositivos", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Removido por {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Remover dispositivo", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Revogar banimento", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Remover mensagem", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Remover seu avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Exibir conteúdo formatado", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Substituir sala por uma nova versão", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Responder", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Denunciar mensagem", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Solicitar permissão", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Solicitar leitura de mensagens antigas", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revogar todas permissões", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Sala foi atualizada", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versão da sala", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Salvar arquivo como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Salvar arquivo", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Salvar arquivo nesta pasta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Buscar", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Buscar uma conversa", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Segurança", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Chave de segurança", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Chave de segurança perdida?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Visto por {username} e mais {count} pessoas}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Visto por {username} e {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Enviar", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Enviar mensagem", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Enviar como texto", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Enviar audio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Permitir envio de falhas via sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Enviar arquivo", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Enviar imagem", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Enviar mensagens", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Enviar original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Enviar figurinha", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Enviar vídeo", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} enviou um arquivo", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} enviou um audio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} enviou uma imagem", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} enviou uma figurinha", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} enviou um vídeo", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} enviou informações de chamada", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Informações sobre a sua privacidade: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessão verificada", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Fixar uma imagem de perfil", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Fixar como cognome principal", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Implantar emojis personalizados", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Fixar uma descrição do grupo", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Enviar link de convite", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Determinar níveis de permissão", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Alterar o status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Configurações", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Compartilhar", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} compartilhou sua localização", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Compartilhar localização", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Mostrar senha", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Registrar", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Identidade Única", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Pular", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Som, vibração e cor LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Código fonte", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Espaço é público", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Nome do espaço", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} iniciou uma chamada", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Inicie sua primeira conversa agora mesmo! 🙂\n- Pressione 'Nova conversa'\n- Escaneie o código QR de um(a) amigo(a)\n- Divirta-se conversando", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Como vai você?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Submeter", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Domingo", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Sincronizando… Por favor, aguarde.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Toque num dispositivo para verificar", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Toque para mostrar a imagem", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Toque para mostrar o menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Não correspondem", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Correspondem", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Esta sala foi arquivada.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Quinta-feira", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Alternar favorito", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Alternar Silenciado", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Marcar lido/não lido", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Demasiadas requisições. Por favor, tente novamente mais tarde!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transferir de outro dispositivo", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Tente enviar novamente", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Terça-feira", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Indisponível", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} revogou o banimento de {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Desbloquear dispositivo", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Dispositivo desconhecido", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Algoritmo de criptografia desconhecido", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Evento desconhecido '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Sessão desconhecida, favor verificar", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Destrancar o backup da conversa", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Cancelar silenciamento", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Desalfinetar", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 conversa não lida} other{{unreadCount} conversas não lidas}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 mensagem não lida} other{{unreadEvents} mensagens não lidas}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Usar cores compatíveis com AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} e mais {count} pessoas estão digitando…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} e {username2} estão digitando…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} está digitando…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} saiu da conversa", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Nome de usuário", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Usuário(a) não verificado(a)", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} enviou um evento {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Usuário(a) tem um status de verificação desconhecido", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Usuário(a) verificado(a)", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Verificado", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Sessão verificada com sucesso!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verificar", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verificar manualmente", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Iniciar verificação", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Verificação efetivada!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verificando outra conta", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verificar usuário", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Vídeochamada", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilidade do histórico da conversa", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Visível aos participantes", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Visível a qualquer pessoa", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Mensagem de voz", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Esperando que a outra pessoa aceite a solicitação…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Esperando que a outra pessoa aceite os emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Aguardando a outra pessoa aceitar os números…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Pano de fundo", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Atenção!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Criptografia ponta-a-ponta está em fase beta! Use por sua própria conta e risco!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Quarta-feira", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Bem-vindo(a) ao mensageiro mais fofo da rede Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Enviamos um e-mail para você", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Quem pode desempenhar quais ações", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Quais pessoas são permitidas participar deste grupo", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Por que você quer denunciar isto?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Limpar o backup da conversa para criar uma nova chave de segurança?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Você pode recuperar a sua senha com estes endereços.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Escreva uma mensagem…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Sim", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Você", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Você foi convidada(o) a esta conversa", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Você não está mais participando desta conversa", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Você não pode se autoconvidar", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Você foi banido desta conversa", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Sua conversas estão sendo sincronizadas…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Seu próprio nome de usuário", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Sua chave pública", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Você se conectará a {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Ampliar", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Reduzir", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "createNewChatExplaination": "Apenas escaneie o código QR ou compartilhe o link do convite se estiverem próximos entre si.", - "@createNewChatExplaination": {}, - "shareYourInviteLink": "Compartilhar o link do convite", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Digitar o link do convite manualmente...", - "@typeInInviteLinkManually": {}, - "oneClientLoggedOut": "Um dos seus clientes foi desvinculado", - "@oneClientLoggedOut": {}, - "addAccount": "Adicionar conta", - "@addAccount": {}, - "unverified": "Não verificado", - "@unverified": {}, - "bubbleSize": "Tamanho do balão", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "Seu backup de conversas foi configurado.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Para proteger suas mensagens, nós geramos uma chave de segurança para você.\nPor favor, guarde-a num lugar seguro, como um gerenciador de senhas.", - "@setupChatBackupDescription": {}, - "removeFromSpaceDescription": "Isto remove esta conversa do atual espaço. Ela continuará visível sob \"Todas conversas\".", - "@removeFromSpaceDescription": {}, - "newPasswordDescription": "Para poder recuperar a sua senha, você deve posteriormente cadastrar um email na sua conta.", - "@newPasswordDescription": {}, - "editBundlesForAccount": "Editar coleções para esta conta", - "@editBundlesForAccount": {}, - "serverRequiresEmail": "Este servidor precisa validar seu email para efetuar o registro.", - "@serverRequiresEmail": {}, - "messageInfo": "Informações da mensagem", - "@messageInfo": {}, - "sender": "Remetente", - "@sender": {}, - "publish": "Publicar", - "@publish": {}, - "storyPrivacyWarning": "Por favor, note que pessoas podem ver e contactar umas às outras no seu painel. Ele ficará visível por apenas 24 horas, mas não há garantias de que será apagado por todos dispositivos e servidores.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Eu compreendo", - "@iUnderstand": {}, - "yourStory": "Seu painel", - "@yourStory": {}, - "replyHasBeenSent": "Resposta enviada", - "@replyHasBeenSent": {}, - "removeFromSpace": "Remover do espaço", - "@removeFromSpace": {}, - "loginWithOneClick": "Entrar com um clique", - "@loginWithOneClick": {}, - "storyFrom": "Painel de {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Por favor, note que pessoas podem ver e contactar umas às outras no seu painel.", - "@whoCanSeeMyStoriesDesc": {}, - "link": "Link", - "@link": {}, - "start": "Começar", - "@start": {}, - "setupChatBackupNow": "Configurar seu backup de conversas agora", - "@setupChatBackupNow": {}, - "whatIsGoingOn": "O que está acontecendo?", - "@whatIsGoingOn": {}, - "addDescription": "Adicionar descrição", - "@addDescription": {}, - "passwordsDoNotMatch": "Senhas diferentes!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Por favor, insira um email válido.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Repita a senha", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Por favor, use ao menos {min} caracteres.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "addToSpace": "Adicionar ao espaço", - "@addToSpace": {}, - "sendOnEnter": "Enviar ao pressionar enter", - "@sendOnEnter": {}, - "homeserver": "Servidor matriz", - "@homeserver": {}, - "yourUserId": "Seu ID de usuário:", - "@yourUserId": {}, - "setupChatBackup": "Configurar backup da conversa", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Eu anotei a chave", - "@iWroteDownTheKey": {}, - "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "A conversa foi removida deste espaço", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "commandHint_clearcache": "Limpar dados temporários", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Criar uma sala vazia.\nUse --no-encryption para desabilitar a criptografia", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Descartar sessão", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Iniciar uma conversa direta\nUse --no-encryption para desabilitar a criptografia", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "scanQrCode": "Escanear o código QR", - "@scanQrCode": {}, - "newUsernameDescription": "Seu ID de usuário(a) deve ter o formato @usuario:nomedoservidor", - "@newUsernameDescription": {}, - "openVideoCamera": "Abra a câmera para um vídeo", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToBundle": "Adicionar à coleção", - "@addToBundle": {}, - "removeFromBundle": "Remover desta coleção", - "@removeFromBundle": {}, - "bundleName": "Nome da coleção", - "@bundleName": {}, - "enableMultiAccounts": "(BETA) Habilitar múltiplas contas neste dispositivo", - "@enableMultiAccounts": {}, - "time": "Hora", - "@time": {}, - "messageType": "Tipo da mensagem", - "@messageType": {}, - "openGallery": "Abrir galeria", - "@openGallery": {}, - "addToSpaceDescription": "Selecione um espaço para adicionar esta conversa.", - "@addToSpaceDescription": {}, - "pleaseEnterSecurityKeyDescription": "Para destravar seu backup de conversas, por favor, insira sua chave de segurança gerada na sessão anterior. Sua chave de segurança NÃO é a sua senha.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Salvar a chave de segurança agora", - "@saveTheSecurityKeyNow": {}, - "addToStory": "Adicionar ao painel", - "@addToStory": {}, - "whoCanSeeMyStories": "Quem pode ver meu painel?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Desinscrever de painéis", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Este(a) usuário(a) ainda não postou no seu painel", - "@thisUserHasNotPostedAnythingYet": {}, - "videoWithSize": "Vídeo ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "markAsRead": "Marcar como lido", - "@markAsRead": {}, - "dismiss": "Descartar", - "@dismiss": {}, - "matrixWidgets": "Ferramentas Matrix", - "@matrixWidgets": {}, - "separateChatTypes": "Separar Conversas Diretas, Grupos e Espaços", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "openChat": "Abrir conversa", - "@openChat": {}, - "reportUser": "Delatar usuário", - "@reportUser": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Chamar", - "@placeCall": {}, - "integrationsNotImplemented": "Ainda não é possível editar ferramentas e integrações.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Editar ferramentas e integrações", - "@editIntegrations": {}, - "reactedWith": "{sender} reagiu com {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "confirmEventUnpin": "Tem certeza que quer desafixar o evento permanentemente?", - "@confirmEventUnpin": {}, - "pinMessage": "Afixar à sala", - "@pinMessage": {}, - "pinnedEventsError": "Erro ao carregar mensagens afixadas", - "@pinnedEventsError": {}, - "voiceCall": "Chamada de voz", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Versão Android não suportada", - "@unsupportedAndroidVersion": {}, - "widgetNameError": "Por favor, forneça um nome de exibição.", - "@widgetNameError": {}, - "unsupportedAndroidVersionLong": "Esta funcionalidade requer uma versão mais nova do Android. Por favor, busque atualizações ou suporte ao Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "emailOrUsername": "Email ou nome de usuário", - "@emailOrUsername": {}, - "videoCallsBetaWarning": "Por favor, note que chamadas de vídeo estão atualmente em teste. Podem não funcionar como esperado ou sequer funcionar em algumas plataformas.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Vídeo chamadas experimentais", - "@experimentalVideoCalls": {}, - "widgetVideo": "Vídeo", - "@widgetVideo": {}, - "errorAddingWidget": "Erro ao adicionar a ferramenta.", - "@errorAddingWidget": {}, - "addWidget": "Adicionar ferramenta", - "@addWidget": {}, - "widgetEtherpad": "Anotação", - "@widgetEtherpad": {}, - "widgetUrlError": "Isto não é uma URL válida.", - "@widgetUrlError": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Personalizado", - "@widgetCustom": {}, - "widgetName": "Nome", - "@widgetName": {}, - "switchToAccount": "Alternar para a conta {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Próxima conta", - "@nextAccount": {}, - "previousAccount": "Conta anterior", - "@previousAccount": {}, - "editWidgets": "Editar ferramentas", - "@editWidgets": {}, - "showSpaces": "Mostrar lista de espaços", - "@showSpaces": {}, - "showDirectChatsInSpaces": "Mostrar Conversas Diretas relacionadas nos Espaços", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youRejectedTheInvitation": "Você rejeitou o convite", - "@youRejectedTheInvitation": {}, - "youBannedUser": "Você baniu {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Você revogou o convite para {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "Você foi convidado por {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Você convidou {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youAcceptedTheInvitation": "Você aceitou o convite", - "@youAcceptedTheInvitation": {}, - "youJoinedTheChat": "Você entrou na conversa", - "@youJoinedTheChat": {}, - "youKicked": "Você expulsou {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Você expulsou e baniu {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Você revogou o banimento de {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - } -} diff --git a/assets/l10n/intl_pt_PT.arb b/assets/l10n/intl_pt_PT.arb deleted file mode 100644 index bdec9572fe..0000000000 --- a/assets/l10n/intl_pt_PT.arb +++ /dev/null @@ -1,2003 +0,0 @@ -{ - "passwordsDoNotMatch": "As palavras-passe não correspondem!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Por favor, insere um endereço de correio eletrónico válido.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Repete a palavra-passe", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Por favor, usa no mínimo {min} caracteres.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "about": "Acerca de", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Aceitar", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} aceitou o convite", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Conta", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informação de conta", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} ativou encriptação ponta-a-ponta", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Adicionar correio eletrónico", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Adicionar descrição de grupo", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Adicionar novo amigo", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Adicionar ao espaço", - "@addToSpace": {}, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alcunha", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Todos(as)", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Todas as conversas", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Já tens uma conta?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} atendeu a chamada", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Qualquer pessoa pode entrar", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Arquivo", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Sala arquivada", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Todos os visitantes podem entrar", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Tens a certeza?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Tens a certeza que queres sair?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Para poderes assinar a outra pessoa, por favor, insere a tua senha de armazenamento seguro ou a chave de recuperação.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Por favor, insere a tua senha de armazenamento seguro ou a chave de recuperação para verificares a tua sessão.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Aceitar este pedido de verificação de {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pausar", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Reproduzir", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Autenticação", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Automaticamente reproduzir autocolantes e emotes animados", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar alterado", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Enviar com Enter", - "@sendOnEnter": {}, - "badServerVersionsException": "O servidor suporta as versões Spec:\n{serverVersions}\nMas esta aplicação apenas suporta {suportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerLoginTypesException": "O servidor suporta os tipos de início de sessão:\n{serverVersions}\nMas esta aplicação apenas suporta:\n{suportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Banir da conversa", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Banido(a)", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} baniu {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Bloquear dispositivo", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Bloqueado", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Mensagens de robôs", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Chaves armazenadas em cache", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Cancelar", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Não é possível abrir o URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Alterar nome do dispositivo", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatPermissions": "{username} alterou as permissões da conversa", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} alterou o seu nome para: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} alterou as regras de acesso de visitantes para: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} alterou as regras de entrada", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} alterou as regras de entrada para: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} alterou o seu avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} alterou as alcunhas da sala", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} alterou a ligação de convite", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Registo de alterações", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Alterar palavra-passe", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "As alterações foram guardadas", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Alterar o servidor", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Alterar o teu estilo", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Alterar o nome do grupo", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Alterar o servidor", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Alterar o fundo", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Alterar o teu avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "A encriptação foi corrompida", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Conversa", - "@chat": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "O teu ID de utilizador:", - "@yourUserId": {}, - "setupChatBackup": "Configurar cópia de segurança de conversas", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Eu anotei a chave num papel", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "A cópia de segurança foi configurada.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "Cópia de segurança de conversas", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "setupChatBackupDescription": "Para proteger as tuas mensagens, gerámos uma chave de segurança para ti.\nPor favo, mantém-na num sítio seguro, como um gestor de palavras-passe.", - "@setupChatBackupDescription": {}, - "chatBackupDescription": "A tua cópia de segurança de conversas está protegida com uma chave de segurança. Por favor, certifica-te que não a perdes.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Detalhes de conversa", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "A conversa foi removida deste espaço", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "Conversas", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Escolhe uma palavra-passe forte", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Escolhe um nome de utilizador", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Limpar arquivo", - "@clearArchive": {}, - "clearText": "Limpar texto", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Fechar", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Banir o utilizador dado desta sala", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Enviar texto formatado com HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Convidar o utilizador dado a esta sala", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Entrar na sala dada", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Remover o utilizador dado desta sala", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Sair desta sala", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Descreve-te", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Definir a tua imagem para esta sala (por mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Definir o teu nome para esta sala", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Definir o nível de poder do utilizador dado (por omissão: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Enviar texto não formatado", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Enviar respostas como reações", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Enviar texto", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Perdoar o utilizador dado", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Comando inválido", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} não é um comando.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Compara e certifica-te que os emojis que se seguem correspondem aos do outro dispositivo:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Compara e certifica-te que os números que se seguem correspondem aos do outro dispositivo:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Configurar conversa", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Confirmar", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Ligar", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Falha ao tentar ligar", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "O contacto foi convidado para o grupo", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Contém nome de exibição", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Contém nome de utilizador", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "O conteúdo foi denunciado aos admins do servidor", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Visualizador de conteúdo", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Copiado para a área de transferência", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Copiar", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Copiar para a área de transferência", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Não foi possível desencriptar mensagem: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Não foi possível definir o avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Não foi possível definir o nome de exibição", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} participantes", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Criar", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Criar conta agora", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} criou a conversa", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Criar novo grupo", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Novo espaço", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Assinatura cruzada ativada", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Assinatura cruzada desativada", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Ativo(a) agora", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Escuro", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date} às {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Isto irá desativar a tua conta. Não é reversível! Tens a certeza?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Nível de permissão normal", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Eliminar", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Eliminar conta", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Eliminar mensagem", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Recusar", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Dispositivo", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID de dispositivo", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Dispositivos", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "A encriptação só é segura quando todos os dispositivos forem verificados.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Conversas diretas", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Descartar imagem", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Descobrir", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Descobrir grupos", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Nome de exibição alterado", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Doar", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Cancelar e não voltar a perguntar", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Descarregar ficheiro", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Editar", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Editar servidores bloqueados", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Editar permissões de conversa", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Editar nome de exibição", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Editar instância de Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Editar alcunhas da sala", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Editar avatar da sala", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emote já existente!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Código de emote inválido!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Pacotes de emotes da sala", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Configurações de emotes", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Código do emote", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Precisas de escolher um código de emote e uma imagem!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Conversa vazia", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Ativar a cópia de segurança para nunca perder acesso às tuas conversas.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Ativar pacote de emotes globalmente", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Ativar encriptação", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Nunca mais poderás desativar a encriptação. Tens a certeza?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Encriptada", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Encriptação", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Algoritmo de encriptação", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "A encriptação não está ativada", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Configurações de encriptação ponta-a-ponta", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} terminou a chamada", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Insere o nome do grupo", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Insere um endereço de correio eletrónico", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Insere o nome do espaço", - "@enterASpacepName": {}, - "enterAUsername": "Insere um nome de utilizador", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Servidor", - "@homeserver": {}, - "enterYourHomeserver": "Insere o teu servidor", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Erro ao obter localização: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Tudo a postos!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremamente ofensivo", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Nome do ficheiro", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Tamanho do ficheiro", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Tamanho da letra", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Reencaminhar", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Sexta-feira", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Amigos", - "@friends": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Ir para a nova sala", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grupo", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Descrição do grupo", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Descrição do grupo alterada", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "O grupo é público", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupos", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Grupo com {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "São proibidos visitantes", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Podem entrar visitantes", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} revogou o convite para {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Ajuda", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Esconder eventos eliminados", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Esconder eventos desconhecidos", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "O servidor é incompatível", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Quão ofensivo é este conteúdo?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identidade", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorar", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Utilizadores ignorados", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Podes ignorar utilizadores que te incomodem. Não irás poder receber quaisquer mensagens ou convites para salas de utilizadores na tua lista pessoal de ignorados.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Nome do utilizador a ignorar", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Eu cliquei na ligação", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Senha ou chave de recuperação incorretos", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Inofensivo", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Correio eletrónico inválido", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Convidar contacto", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Convidar contacto para {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Convidado(a)", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} convidou {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Utilizadores(as) convidados(as) apenas", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Convite para mim", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} convidou-te para o FluffyChat.\n1. Instala o FluffyChat: https://fluffychat.im\n2. Regista-te ou inicia sessão.\n3. Abre a ligação de convite: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "A seguinte chave de dispositivo está correta?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "está a escrever…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} entrou na conversa", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Entrar na sala", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Chaves estão armazenadas em cache", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Chaves em falta", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} expulsou {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} expulsou e baniu {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Expulsar da conversa", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Ativo(a) pela última vez: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Último IP visto", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Visto(a) há muito tempo", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Sair", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Saiu da conversa", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licença", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Claro", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Carregar mais {count} participantes", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "A carregar... Por favor aguarde.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Carregar mais…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Os serviços de localização estão desativados. Por favor, ativa-os para poder partilhar a sua localização.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Permissão de localização recusada. Por favor, concede permissão para poderes partilhar a tua posição.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Entrar", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Entrar em {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWithOneClick": "Entrar com um clique", - "@loginWithOneClick": {}, - "logout": "Sair", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Promover a moderador", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Promover a admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Certifica-te que o identificador é válido", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Alterações de membros", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Mencionar", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Mensagens", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "A mensagem será eliminada para todos os participantes", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderador", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Segunda-feira", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Silenciar conversa", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Nova conversa", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nova mensagem no FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Novo pedido de verificação!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Próximo", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Não", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Nenhuma ligação ao servidor", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "O FluffyChat, de momento, não suporta ativar a assinatura cruzada. Por favor, ativa-a a partir do Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Nenhuma descrição", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nenhuns emotes encontrados. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Só podes ativar a encriptação quando a sala não for publicamente acessível.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Parece que não tens nenhuns serviços da Google no seu telemóvel. É uma boa decisão para a sua privacidade! Para receber notificações instantâneas no FluffyChat, recomendamos que uses https://microg.org/ ou https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} não é um servidor Matrix, usar {server2}?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "shareYourInviteLink": "Partilhar a ligação de convite", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "Escrever a ligação de convite manualmente...", - "@typeInInviteLinkManually": {}, - "noMegolmBootstrap": "Por favor, ativa a cópia de segurança de chaves online a partir do Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Nenhum", - "@none": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} alterou o avatar da conversa", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} alterou a visibilidade do histórico para: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheChatDescriptionTo": "{username} alterou a descrição da conversa para: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} alterou o nome da conversa para: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheGuestAccessRules": "{username} alterou as regras de acesso de visitantes", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibility": "{username} alterou a visibilidade do histórico", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sendBugReports": "Permitir enviar relatórios de problemas com o sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Enviar a mensagem", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Enviar áudio", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Perdeste a chave de segurança?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Enviar como texto", - "@sendAsText": { - "type": "text" - }, - "send": "Enviar", - "@send": { - "type": "text", - "placeholders": {} - }, - "appLock": "Bloqueio da aplicação", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "Para poderes recuperar a tua palavra-passe, deves adicionar um endereço de correio eletrónico à tua conta.", - "@newPasswordDescription": {}, - "newUsernameDescription": "O teu ID de utilizador terá o formato @utilizador:servidor", - "@newUsernameDescription": {}, - "noPasswordRecoveryDescription": "Ainda não adicionaste uma forma de recuperar a tua palavra-passe.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Sem permissão", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Não foram encontradas nenhumas salas públicas…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Não foram encontradas nenhumas salas…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Nenhuns estados encontrados até agora.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Notificações", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notificações ativadas para esta conta", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Não suportadas na web", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} selecionados(as)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "Estão {count} utilizadores(as) a escrever…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "A obter localização…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Offensivo", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "A cópia de segurança online de chaves está desativada", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "A cópia de segurança online de chaves está ativada", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Ups! Infelizmente, ocorreu um erro ao configurar as notificações instantâneas.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Ups, algo correu mal…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Abrir aplicação para ler mensagens", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Abrir câmara", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "oneClientLoggedOut": "Um dos teus clientes terminou sessão", - "@oneClientLoggedOut": {}, - "addAccount": "Adicionar conta", - "@addAccount": {}, - "editBundlesForAccount": "Editar pacotes para esta conta", - "@editBundlesForAccount": {}, - "addToBundle": "Adicionar ao pacote", - "@addToBundle": {}, - "removeFromBundle": "Remover deste pacote", - "@removeFromBundle": {}, - "bundleName": "Nome do pacote", - "@bundleName": {}, - "enableMultiAccounts": "(BETA) Ativar múltiplas contas neste dispositivo", - "@enableMultiAccounts": {}, - "openInMaps": "Abrir nos mapas", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "link": "Ligação", - "@link": {}, - "serverRequiresEmail": "Este servidor precisa de validar o teu endereço de correio eletrónico para o registo.", - "@serverRequiresEmail": {}, - "optionalGroupName": "(Opcional) Nome do grupo", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Ou", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Participante", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Dispositivos de utilizadores participantes", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "senha ou chave de recuperação", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Palavra-passe", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Palavra-passe esquecida", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "A palavra-passe foi alterada", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Recuperação de palavra-passe", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Pessoas", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Escolher uma imagem", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Afixar", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Reproduzir {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Por favor, escolhe", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Por favor, escolhe um código-passe", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Por favor, escolhe um nome de utilizador", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Por favor, clica na ligação no correio eletrónico e depois continua.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Por favor, insere 4 dígitos ou deixa vazio para desativar o bloqueio da aplicação.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Por favor, insere um ID Matrix.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Por favor, insere a tua chave de segurança:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Por favor, insere a tua palavra-passe", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Por favor, insere o teu código", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Por favor, insere o teu nome de utilizador", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Por favor, segue as instruções no website e clica em \"Seguinte\".", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Privacidade", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Grupos públicos", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Chave pública", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Salas públicas", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Espaço público", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "reason": "Razão", - "@reason": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} eliminou um evento", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "recording": "A gravar", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Eliminar mensagem", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Registar", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Rejeitar", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} rejeitou o convite", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Reentrar", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Remover", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Remover todos os outros dispositivos", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Removido por {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Remover dispositivo", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Perdoar nesta conversa", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Remover mensagem", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Remover o teu avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Exibir conteúdo de mensagem rico", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Substituir sala com versão mais recente", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Responder", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Reportar mensagem", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Pedir permissão", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Pedir para ler mensagens antigas", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Revogar todas as permissões", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "A sala foi atualizada", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Versão da sala", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sábado", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Ficheiro guardado como {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Guardar ficheiro", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Guardar ficheiro nesta pasta", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Procurar", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Procurar por conversa", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Segurança", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Chave de segurança", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndUser": "Visto por {username} e por {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "sendFile": "Enviar ficheiro", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Enviar imagem", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Enviar mensagens", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Enviar original", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Enviar autocolante", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Enviar vídeo", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} enviar um ficheiro", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} enviar um áudio", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} enviar uma imagem", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} enviou um autocolante", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} enviou um vídeo", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - } -} diff --git a/assets/l10n/intl_ro.arb b/assets/l10n/intl_ro.arb deleted file mode 100644 index 95675ddacc..0000000000 --- a/assets/l10n/intl_ro.arb +++ /dev/null @@ -1,182 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.918296", - "about": "Despre", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Accept", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} a aceptat invitați", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Cont", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informații despre cont", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} a activat criptarea end-to-end", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Adaugă o descriere de", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administrator", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "poreclă", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Ai deja un cont?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{sendername} a acceptat apelul", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Oricine se poate alătura", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Arhivă", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Grup arhivat", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Vizitatorii \"guest\" se pot alătura", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ești sigur?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Te rog introdu parola ta sau cheile de recuparare pentru a depozita cheile.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Pentru a putea conecta cealaltă persoană, te rog introdu parola sau cheia ta de recuperare.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Te rog introdu parola sau cheia ta de recuperare pentru a-ți verifica sesiunea.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Accepți cererea de verificare de la {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autentificare", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Image de profil schimbată", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Interzis din conversație", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Interzis", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} a interzis pe {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blochează dispozitiv", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Chei salvate", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Anulează", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Schimbă numele dispozitiv", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} a schimbat poza conversați", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} a schimbat descrierea grupului în '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} a schimbat porecla în '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - } -} \ No newline at end of file diff --git a/assets/l10n/intl_ru.arb b/assets/l10n/intl_ru.arb deleted file mode 100644 index 67509d2206..0000000000 --- a/assets/l10n/intl_ru.arb +++ /dev/null @@ -1,2892 +0,0 @@ -{ - "@@locale": "ru", - "@@last_modified": "2021-08-14 12:41:09.903021", - "about": "О проекте", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Принять", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} принял(а) приглашение войти в чат", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Учётная запись", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Сведения об учётной записи", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} активировал(а) сквозное шифрование", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Добавить электронную почту", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Добавить описание группы", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Добавить нового друга", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Администратор", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "псевдоним", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Все", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Все чаты", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Уже есть учётная запись?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} ответил(а) на звонок", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Каждый может присоединиться", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Блокировка приложения", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Архив", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Архивированная комната", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Разрешено ли гостям присоединяться", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Вы уверены?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Вы действительно хотите выйти?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Введите кодовую фразу для безопасного хранилища или ключ восстановления, чтобы кэшировать ключи.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Для подписи ключа другого пользователя, пожалуйста, введите вашу парольную фразу или ключ восстановления.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Пожалуйста, введите вашу парольную фразу или ключ восстановления для подтвердждения сессии.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Принять этот запрос подтверждения от {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Пауза", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Играть", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Аутентификация", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Автоматически воспроизводить анимированные стикеры и эмодзи", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Аватар изменён", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Домашний сервер поддерживает следующие типы входа в систему:\n{serverVersions}\nНо это приложение поддерживает только:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Домашний сервер поддерживает следующие версии спецификации:\n{serverVersions}\nНо это приложение поддерживает только {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Заблокировать в чате", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Заблокирован(а)", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} заблокировал(а) {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Заблокировать устройство", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Заблокировано", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Сообщения ботов", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Ключи кэшированы", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Отмена", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Не удается открыть URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Изменить имя устройства", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} изменил(а) аватар чата", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} изменил(а) описание чата на: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} изменил(а) имя чата на: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} изменил(а) права доступа к чату", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} изменил(а) отображаемое имя на: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} изменил(а) правила гостевого доступа", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} изменил(а) правила гостевого доступа на: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} изменил(а) видимость истории", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} изменил(а) видимость истории на: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} изменил(а) правила присоединения", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} изменил(а) правила присоединения на: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} изменил(а) аватар", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} изменил(а) псевдонимы комнаты", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} изменил(а) ссылку для приглашения", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Журнал изменений", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Изменить пароль", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Изменения были сохранены", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Изменить сервер Matrix", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Тема", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Изменить название группы", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Изменить сервер", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Изменить фон чатов", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Изменить свой аватар", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Шифрование было повреждено", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Чат", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Резервное копирование чата", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Резервная старых сообщений защищена ключом восстановления. Пожалуйста, не потеряйте его.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Детали чата", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Чаты", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Выберите надёжный пароль", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Выберите имя пользователя", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Очистить архив", - "@clearArchive": {}, - "clearText": "Очистить текст", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Закрыть", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Заблокировать данного пользователя в этой комнате", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Отправить текст формата HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Пригласить данного пользователя в эту комнату", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Присоединиться к данной комнате", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Удалить данного пользователя из этой комнаты", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Покинуть эту комнату", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Опишите себя", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Установите свою фотографию для этой комнаты (автор: mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Задайте отображаемое имя для этой комнаты", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Установить уровень прав данного пользователя (по умолчанию: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Отправить неотформатированный текст", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Отправить ответ как реакцию", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Отправить текст", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Разблокировать данного пользователя в этой комнате", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Недопустимая команда", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} не является командой.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Сравните и убедитесь, что следующие эмодзи соответствуют эмодзи на другом устройстве:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Сравните и убедитесь, что следующие числа соответствуют числам на другом устройстве:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Настроить чат", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Подтвердить", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Присоединиться", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Попытка подключения не удалась", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Контакт был приглашен в группу", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Содержит отображаемое имя", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Содержит имя пользователя", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "О контенте было сообщено администраторам сервера", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Просмотр содержимого", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Скопировано в буфер обмена", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Копировать", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Скопировать в буфер обмена", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Не удалось расшифровать сообщение: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Не удалось установить аватар", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Не удалось установить отображаемое имя", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} участника(ов)", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Создать", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Создать учётную запись сейчас", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} создал(а) чат", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Новая группа", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Новое пространство", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Кросс-подпись отключена", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Кросс-подпись включена", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "В настоящее время активен(а)", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Тёмная", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{timeOfDay}, {date}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Это деактивирует вашу учётную запись пользователя. Данное действие не может быть отменено! Вы уверены?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Уровень разрешений по умолчанию", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Удалить", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Удалить аккаунт", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Удалить сообщение", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Отклонить", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Устройство", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Идентификатор устройства", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Устройства", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Шифрование является безопасным только тогда, когда все устройства проверены.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Личные чаты", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Удалить изображение", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Обзор", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Обзор групп", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Отображаемое имя было изменено", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Пожертвовать", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Отменить и больше не спрашивать", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Скачать файл", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Редактировать", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Редактировать заблокированные серверы", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Изменить разрешения чата", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Отображаемое имя", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Сервер Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Редактировать псевдонимы комнаты", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Изменить аватар комнаты", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Эмодзи уже существует!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Недопустимый краткий код эмодзи!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Наборы эмодзи для комнаты", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Настройки эмодзи", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Краткий код для эмодзи", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Вам нужно задать код эмодзи и изображение!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Пустой чат", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Включите резервное копирование чатов, чтобы никогда не терять доступ к своим чатам.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Включить набор эмодзи глобально", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Включить шифрование", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Вы больше не сможете отключить шифрование. Вы уверены?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Зашифровано", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Шифрование", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Алгоритм шифрования", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Шифрование не включено", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Настройки сквозного шифрования", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} завершил(а) звонок", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Введите название группы", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Введите адрес электронной почты", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Введите название пространства", - "@enterASpacepName": {}, - "enterAUsername": "Введите имя пользователя", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Введите адрес вашего сервера Matrix", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Ошибка получения местоположения: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Всё готово!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Крайне оскорбительный", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Имя файла", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Размер файла", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Размер шрифта", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Переслать", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Пятница", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Друзья", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "С момента присоединения", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "С момента приглашения", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "В новую комнату", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Группа", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Описание группы", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Описание группы изменено", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Публичная группа", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Группы", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Группа с {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Гости не могут присоединиться", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Гости могут присоединиться", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} отозвал(а) приглашение для {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Помощь", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Скрыть отредактированные события", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Скрыть неизвестные события", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Несовместимый сервер Matrix", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Насколько оскорбительным является этот контент?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Идентификация", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Игнорировать", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Игнорируемые пользователи", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Вы можете игнорировать пользователей, которые вам мешают. Вы не сможете получать сообщения или приглашения в комнату от пользователей из вашего личного списка игнорирования.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Игнорировать имя пользователя", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Я перешёл по ссылке", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Неверный пароль или ключ восстановления", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Безобидный", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Неверный адрес", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Пригласить контакт", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Пригласить контакт в {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Приглашён", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} пригласил(а) {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Только приглашённым пользователям", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Приглашение для меня", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} пригласил(а) вас в FluffyChat. \n1. Установите FluffyChat: https://fluffychat.im \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Правильно ли указан следующий ключ устройства?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "печатает…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} присоединился(ась) к чату", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Присоединиться к комнате", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Ключи сохранены в кэше", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Ключи отсутствуют", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} исключил(а) {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} исключил(а) и заблокировал(а) {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Исключить из чата", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Последнее посещение: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Последний IP, с которого заходили", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "был(а) в сети давно", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Покинуть", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Покинуть чат", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Лицензия", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Светлая", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Загрузить еще {count} участника(ов)", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Загрузка... Пожалуйста, подождите.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Загрузить больше…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Службы определения местоположения отключены. Включите их, чтобы иметь возможность обмениваться информацией о своем местоположении.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Разрешение на определение местоположения отклонено. Пожалуйста, предоставьте это разрешение, чтобы иметь возможность делиться своим местоположением.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Войти", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Войти в {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "Войти через {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Выйти", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Сделать модератором", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Сделать администратором", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Убедитесь, что идентификатор действителен", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Изменения участников", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Упомянуть", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Сообщения", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Сообщение будет удалено для всех участников", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Модератор", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Понедельник", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{Еще 1 событие} other{ещё {count} событий}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Отключить уведомления", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Помните, что вам нужен Pantalaimon для использования сквозного шифрования.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Новый чат", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Новое сообщение во FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Новый запрос на подтверждение!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Далее", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Нет", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Нет соединения с сервером", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat в настоящее время не поддерживает включение кросс-подписи. Пожалуйста, включите его в Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Нет описания", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Эмодзи не найдены 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Вы можете активировать шифрование только тогда, когда комната перестает быть общедоступной.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Похоже, у вас нет служб Google на вашем телефоне. Это хорошее решение для вашей конфиденциальности! Для получения push-уведомлений во FluffyChat мы рекомендуем использовать https://microg.org/ или https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} не является matrix-сервером, использовать {server2} вместо него?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Пожалуйста, включите резервное копирование онлайн-ключей из Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ничего", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Вы ещё не добавили способ восстановления пароля.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Нет прав доступа", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Никаких общественных комнат не найдено…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Комнаты не найдены…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Статусы пока не найдены.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Уведомления", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Уведомления включены для этой учётной записи", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Не поддерживается в веб-версии", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} выбран(о)", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} пользователей печатают…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Получение местоположения…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Оскорбительный", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Не в сети", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Ок", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "В сети", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Резервное копирование ключей на сервере отключено", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Резервное копирование ключей на сервере включено", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Ой! К сожалению, при настройке push-уведомлений произошла ошибка.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Упс! Что-то пошло не так…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Откройте приложение для чтения сообщений", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Открыть камеру", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Открыть на картах", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(Необязательно) Ваш адрес электронной почты", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(необязательно) Название группы", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Или", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Участник", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Участвующие устройства", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "пароль или ключ восстановления", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Пароль", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Забыли пароль", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Пароль был изменён", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Восстановление пароля", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Люди", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Выбрать изображение", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Закрепить", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Проиграть {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Пожалуйста, выберите", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Пожалуйста, выберите код доступа", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Пожалуйста, выберите имя пользователя", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Пожалуйста, нажмите на ссылку в электронной почте, для того чтобы продолжить.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Введите 4 цифры или оставьте поле пустым, чтобы отключить блокировку приложения.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Пожалуйста, введите Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Пожалуйста, введите свой ключ безопасности:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Пожалуйста, введите ваш пароль", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Пожалуйста, введите свой пин-код", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Пожалуйста, введите имя пользователя", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Следуйте инструкциям на веб-сайте и нажмите «Далее».", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Конфиденциальность", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Публичные группы", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Открытый ключ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Публичные комнаты", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Публичное пространство", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Правила push", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Причина", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Запись", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} отредактировал(а) событие", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Отредактировать сообщение", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Зарегистрироваться", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Отклонить", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} отклонил(а) приглашение", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Зайти повторно", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Удалить", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Удалить все другие устройства", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Удалено пользователем {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Удалить устройство", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Разблокировать в чате", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Удалить сообщение", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Удалить свой аватар", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Показывать текст с форматированием", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Заменить комнату более новой версией", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Ответить", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Сообщить о сообщении", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Запросить разрешение", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Запросить доступ к предыдущим сообщениям", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Отменить все права доступа", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Комната обновлена", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Версия комнаты", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Суббота", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Файл сохранён как {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Сохранить файл", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Сохранить файл в эту папку", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Поиск", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Поиск чата", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Безопасность", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Ключ безопасности", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ключ безопасности потерян?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Просмотрено пользователем {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Просмотрено пользователями {username} и {count} другими}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Просмотрено пользователями {username} и {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Отправить", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Отправить сообщение", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Отправить как текст", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Отправить аудио", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Разрешить отправку отчетов об ошибках в sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Отправить файл", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Отправить изображение", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Отправить сообщения", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Отправить оригинал", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Отправить стикер", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Отправить видео", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} отправил(а) файл", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} отправил(а) аудио", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} отправил(а) изображение", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} отправил(а) стикер", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} отправил(а) видео", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} отправил(а) информацию о звонке", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Информация о вашей конфиденциальности: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Сессия подтверждена", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Установить изображение профиля", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Установить как основной псевдоним", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Установить пользовательские эмодзи", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Задать описание группы", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Установить ссылку для приглашения", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Установить уровень разрешений", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Задать статус", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Настройки", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Поделиться", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} поделился(ась) местоположением", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Поделиться местоположением", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Показать пароль", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Зарегистрироваться", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Единая точка входа", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Пропустить", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Звук, вибрация, цвет светодиода", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Исходный код", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Публичное пространство", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Название пространства", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} начал(а) звонок", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Начните свой первый чат прямо сейчас! 🙂\n- Нажмите на 'Новый чат'\n- Сканируйте QR-код друга\n- Веселитесь в чате", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Статус", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Как у вас сегодня дела?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Отправить", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Воскресенье", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Синхронизация… Пожалуйста, подождите.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Системная", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Нажмите на устройство, чтобы проверить", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Нажмите, чтобы показать изображение", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Нажмите, чтобы показать меню", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Они не совпадают", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Они совпадают", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Эта комната была заархивирована.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Четверг", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes}:{suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Переключить избранное", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Переключить без звука", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Отметить как прочитанное/непрочитанное", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Слишком много запросов. Пожалуйста, повторите попытку позже!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Перенос с другого устройства", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Попробуйте отправить ещё раз", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Вторник", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Недоступен", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} разблокировал(а) {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Разблокировать устройство", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Неизвестное устройство", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Неизвестный алгоритм шифрования", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Неизвестное событие '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Неизвестная сессия, пожалуйста, проверьте", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Разблокировать резервную копию чата", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Включить уведомления", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Открепить", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} непрочитанных чата(ов)}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} непрочитанных сообщения(ий)}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Использовать цвета, совместимые с AMOLED?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} и {count} других участников печатают…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} и {username2} печатают…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} печатает…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} покинул(а) чат", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Имя пользователя", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Пользователь не проверен", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} отправил(а) событие типа \"{type}\"", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "У пользователя неизвестный статус верификации", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Пользователь проверен", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Проверено", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Успешно проверена сессия!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Проверить", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Проверить вручную", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Начать проверку", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Вы успешно проверены!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Проверка другой учётной записи", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Проверить пользователя", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Видеозвонок", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Видимость истории чата", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Видима для всех участников", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Видна всем", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Отправить голосовое сообщение", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Жду, когда партнер примет запроc…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Жду, когда партнер примет эмодзи…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "В ожидании партнёра, чтобы принять числа…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Обои", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Предупреждение!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Сквозное шифрование в настоящее время в бета-версии! Используйте на свой риск!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Среда", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Добро пожаловать в самый симпатичный мессенджер в сети Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Мы отправили вам электронное письмо", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Кто и какое действие может выполнять", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Кому разрешено вступать в эту группу", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Почему вы хотите сообщить об этом?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Удалить резервную копию чата, чтобы создать новый ключ восстановления?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "По этим адресам вы можете восстановить свой пароль.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Напишите сообщение…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Да", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Вы", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Вы приглашены в этот чат", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Вы больше не участвуете в этом чате", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Вы не можете пригласить себя", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Вы были заблокированы в этом чате", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Ваши чаты синхронизируются…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Ваше имя пользователя", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Ваш открытый ключ", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Вы будете подключены к {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Приблизить", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Отдалить", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Чат был удален из этого пространства", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Чат был добавлен в это пространство", - "@chatHasBeenAddedToThisSpace": {}, - "addToSpace": "Добавить в пространство", - "@addToSpace": {}, - "scanQrCode": "Сканировать QR-код", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Введите ссылку приглашения...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Поделиться ссылкой приглашения", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Просто отсканируйте QR-код или поделитесь ссылкой приглашения, если вы не рядом друг с другом.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Отправлять по Enter", - "@sendOnEnter": {}, - "homeserver": "Сервер Matrix", - "@homeserver": {}, - "serverRequiresEmail": "Этот сервер должен подтвердить ваш адрес электронной почты для регистрации.", - "@serverRequiresEmail": {}, - "enableMultiAccounts": "(БЕТА) Включить несколько учетных записей на этом устройстве", - "@enableMultiAccounts": {}, - "bundleName": "Название пакета", - "@bundleName": {}, - "removeFromBundle": "Удалить из этого пакета", - "@removeFromBundle": {}, - "addToBundle": "Добавить в пакет", - "@addToBundle": {}, - "editBundlesForAccount": "Изменить пакеты для этой учетной записи", - "@editBundlesForAccount": {}, - "addAccount": "Добавить учетную запись", - "@addAccount": {}, - "newUsernameDescription": "Ваш идентификатор пользователя будет иметь формат @имяпользователя:названиесервера", - "@newUsernameDescription": {}, - "newPasswordDescription": "Чтобы иметь возможность восстановить свой пароль, вы должны позже добавить адрес электронной почты в свою учетную запись.", - "@newPasswordDescription": {}, - "link": "Ссылка", - "@link": {}, - "oneClientLoggedOut": "Один из ваших клиентов вышел", - "@oneClientLoggedOut": {}, - "yourChatBackupHasBeenSetUp": "Резервное копирование чата настроено.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Для защиты ваших сообщений мы сгенерировали для вас ключ восстановления.\nПожалуйста, храните его в надежном месте, например, в менеджере паролей.", - "@setupChatBackupDescription": {}, - "setupChatBackup": "Настройте резервное копирование чата", - "@setupChatBackup": {}, - "yourUserId": "Ваш ID пользователя:", - "@yourUserId": {}, - "unverified": "Не проверено", - "@unverified": {}, - "iWroteDownTheKey": "Ключ записан", - "@iWroteDownTheKey": {}, - "passwordsDoNotMatch": "Пароли не совпадают!", - "@passwordsDoNotMatch": {}, - "commandHint_clearcache": "Очистить кэш", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "Удалить сеанс", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Начните личный чат\nИспользуйте --no-encryption, чтобы отключить шифрование", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "messageInfo": "Информация о сообщении", - "@messageInfo": {}, - "openGallery": "Открыть галерею", - "@openGallery": {}, - "removeFromSpace": "Удалить из пространства", - "@removeFromSpace": {}, - "removeFromSpaceDescription": "Это удалит данный чат из текущего пространства. Он все еще будет виден в разделе \"Все чаты\".", - "@removeFromSpaceDescription": {}, - "loginWithOneClick": "Вход одним нажатием", - "@loginWithOneClick": {}, - "pleaseEnterValidEmail": "Пожалуйста, введите действительный адрес электронной почты.", - "@pleaseEnterValidEmail": {}, - "pleaseChooseAtLeastChars": "Пожалуйста, выберите не менее {min} символов.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "commandHint_create": "Создайте пустой групповой чат\nИспользуйте --no-encryption, чтобы отключить шифрование", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "sender": "Отправитель", - "@sender": {}, - "addToSpaceDescription": "Выберите пространство, чтобы добавить к нему этот чат.", - "@addToSpaceDescription": {}, - "start": "Начать", - "@start": {}, - "setupChatBackupNow": "Настройте резервную копию чата прямо сейчас", - "@setupChatBackupNow": {}, - "time": "Время", - "@time": {}, - "messageType": "Тип сообщения", - "@messageType": {}, - "pleaseEnterSecurityKeyDescription": "Чтобы разблокировать резервную копию чата, введите ключ безопасности, сгенерированный в предыдущей сессии. Ваш ключ безопасности НЕ является вашим паролем.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Сохранить ключ безопасности сейчас", - "@saveTheSecurityKeyNow": {}, - "repeatPassword": "Повторите пароль", - "@repeatPassword": {}, - "openVideoCamera": "Открыть камеру для видео", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "yourStory": "Ваша история", - "@yourStory": {}, - "replyHasBeenSent": "Ответ отправлен", - "@replyHasBeenSent": {}, - "videoWithSize": "Видео ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "История за {date}:\n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "addToStory": "Добавить в историю", - "@addToStory": {}, - "publish": "Опубликовать", - "@publish": {}, - "whoCanSeeMyStories": "Кто может видеть мои истории?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Отписаться от историй", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Этот пользователь еще ничего не опубликовал в своей истории", - "@thisUserHasNotPostedAnythingYet": {}, - "bubbleSize": "Размер пузыря", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "whoCanSeeMyStoriesDesc": "Обратите внимание, что люди могут видеть и связываться друг с другом в вашей истории.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Что происходит?", - "@whatIsGoingOn": {}, - "addDescription": "Добавить описание", - "@addDescription": {}, - "storyPrivacyWarning": "Обратите внимание, что люди могут видеть и связываться друг с другом в вашей истории. Ваши истории будут видны в течение 24 часов, но нет гарантии, что они будут удалены со всех устройств и серверов.", - "@storyPrivacyWarning": {}, - "iUnderstand": "Я понимаю", - "@iUnderstand": {}, - "dismiss": "Отклонить", - "@dismiss": {}, - "markAsRead": "Отметить как прочитанное", - "@markAsRead": {}, - "reportUser": "Сообщить о пользователе", - "@reportUser": {}, - "openChat": "Открыть чат", - "@openChat": {}, - "matrixWidgets": "Виджеты Matrix", - "@matrixWidgets": {}, - "editIntegrations": "Редактирование виджетов и интеграций", - "@editIntegrations": {}, - "integrationsNotImplemented": "Редактирование виджетов и интеграций пока невозможно.", - "@integrationsNotImplemented": {}, - "reactedWith": "{sender} реагирует с {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Эмоджи", - "@emojis": {}, - "voiceCall": "Голосовой звонок", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Неподдерживаемая версия Android", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "Для этой функции требуется более новая версия Android. Проверьте наличие обновлений или поддержку Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "placeCall": "Совершить звонок", - "@placeCall": {}, - "videoCallsBetaWarning": "Обратите внимание, что видеозвонки в настоящее время находятся в бета-версии. Они могут работать не так, как ожидалось, или вообще не работать на всех платформах.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Экспериментальные видеозвонки", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Адрес электронной почты или имя пользователя", - "@emailOrUsername": {}, - "pinMessage": "Прикрепить к комнате", - "@pinMessage": {}, - "pinnedEventsError": "Ошибка загрузки закрепленных сообщений", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Вы уверены, что хотите навсегда открепить событие?", - "@confirmEventUnpin": {}, - "switchToAccount": "Переключиться на учётную запись {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Следующая учётная запись", - "@nextAccount": {}, - "previousAccount": "Предыдущая учётная запись", - "@previousAccount": {}, - "editWidgets": "Редактировать виджеты", - "@editWidgets": {}, - "addWidget": "Добавить виджет", - "@addWidget": {}, - "widgetVideo": "Видео", - "@widgetVideo": {}, - "widgetEtherpad": "Текстовая записка", - "@widgetEtherpad": {}, - "widgetCustom": "Пользовательский", - "@widgetCustom": {}, - "widgetJitsi": "Совещание Jitsi", - "@widgetJitsi": {}, - "widgetName": "Имя", - "@widgetName": {}, - "widgetUrlError": "Этот URL не действителен.", - "@widgetUrlError": {}, - "widgetNameError": "Пожалуйста, укажите отображаемое имя.", - "@widgetNameError": {}, - "errorAddingWidget": "Ошибка при добавлении виджета.", - "@errorAddingWidget": {}, - "showDirectChatsInSpaces": "Показывать связанные Личные чаты в Пространствах", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "separateChatTypes": "Разделять Личные чаты, Группы и Пространства", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "youRejectedTheInvitation": "Вы отклонили приглашение", - "@youRejectedTheInvitation": {}, - "youAcceptedTheInvitation": "Вы приняли приглашение", - "@youAcceptedTheInvitation": {}, - "youUnbannedUser": "Вы разблокировали {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youJoinedTheChat": "Вы присоединились к чату", - "@youJoinedTheChat": {}, - "youKickedAndBanned": "Вы исключили и заблокировали {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Вы пригласили {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "Вы исключили {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youHaveWithdrawnTheInvitationFor": "Вы отозвали приглашение для {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youBannedUser": "Вы заблокировали {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "Вы были приглашены {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "Показать список пространств", - "@showSpaces": {}, - "noEmailWarning": "Пожалуйста, введите действительный адрес электронной почты. В противном случае вы не сможете сбросить пароль. Если вы не хотите этого делать, нажмите еще раз на кнопку, чтобы продолжить.", - "@noEmailWarning": {}, - "recoveryKeyLost": "Ключ восстановления утерян?", - "@recoveryKeyLost": {}, - "stories": "Истории", - "@stories": {}, - "users": "Пользователи", - "@users": {}, - "enableAutoBackups": "Включить автоматическое резервное копирование", - "@enableAutoBackups": {}, - "unlockOldMessages": "Разблокировать старые сообщения", - "@unlockOldMessages": {}, - "storeInSecureStorageDescription": "Сохраните ключ восстановления в безопасном хранилище этого устройства.", - "@storeInSecureStorageDescription": {}, - "storeSecurlyOnThisDevice": "Сохранить на этом устройстве", - "@storeSecurlyOnThisDevice": {}, - "saveKeyManuallyDescription": "Сохраните этот ключ вручную, вызвав диалог общего доступа системы или буфера обмена.", - "@saveKeyManuallyDescription": {}, - "recoveryKey": "Ключ восстановления", - "@recoveryKey": {}, - "pleaseEnterRecoveryKey": "Введите ключ восстановления:", - "@pleaseEnterRecoveryKey": {}, - "saveTheRecoveryKeyNow": "Сохранить ключ восстановления сейчас", - "@saveTheRecoveryKeyNow": {}, - "pleaseEnterRecoveryKeyDescription": "Чтобы разблокировать старые сообщения, введите ключ восстановления, сгенерированный в предыдущем сеансе. Ваш ключ восстановления НЕ является вашим паролем.", - "@pleaseEnterRecoveryKeyDescription": {}, - "storeInAndroidKeystore": "Сохранить в Android KeyStore", - "@storeInAndroidKeystore": {}, - "storeInAppleKeyChain": "Сохранить в Apple KeyChain", - "@storeInAppleKeyChain": {} -} diff --git a/assets/l10n/intl_si.arb b/assets/l10n/intl_si.arb deleted file mode 100644 index b473cd377a..0000000000 --- a/assets/l10n/intl_si.arb +++ /dev/null @@ -1,374 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.895217", - "about": "පිළිබඳව", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "පිළිගන්න", - "@accept": { - "type": "text", - "placeholders": {} - }, - "account": "ගිණුම", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "ගිණුමේ තොරතුරු", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "addEmail": "වි-තැපෑල එකතු කරන්න", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "admin": "පරිපාලක", - "@admin": { - "type": "text", - "placeholders": {} - }, - "allChats": "සියලුම සංවාද", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "දැනටමත් ගිණුමක් තිබේද?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "ඕනෑම කෙනෙකුට එක්විය හැකිය", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "සංරක්ෂිතය", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "සංරක්ෂිත කාමරය", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "ආගන්තුක පරිශීලකයින්ට එක්වීමට අවසර තිබේද", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "ඔබට විශ්වාසද?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "ඔබට නික්මීමට අවශ්‍ය බව විශ්වාසද?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "ධාවනය", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "උපාංගය අවහිර කරන්න", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "යතුරු නිහිතගතයි", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "අවලංගු කරන්න", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "උපාංගයේ නම වෙනස් කරන්න", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changePassword": "මුරපදය වෙනස් කරන්න", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "chat": "සංවාදය", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "සංවාද උපස්ථය", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "සංවාදයේ විස්තර", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "සංවාද", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "ශක්තිමත් මුරපදයක් තෝරන්න", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "පරිශීලක නාමයක් තෝරන්න", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "සංරක්ෂිතය හිස් කරන්න", - "@clearArchive": {}, - "close": "වසන්න", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_join": "දී ඇති කාමරයට එක්වන්න", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_leave": "මෙම කාමරය හැරයන්න", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandInvalid": "විධානය වලංගු නොවේ", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{{command} විධානයක් නොවේ.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "සසඳා බලා පහත දැක්වෙන ඉමොජි අනෙක් උපාංගයට නිසැකවම ගැලපෙන බවට වග බලා ගන්න:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "සංසන්දනය කර පහත දැක්වෙන අංක අනෙක් උපාංගට නිසැකව ගැලපෙන බවට වග බලා ගන්න:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "තහවුරු කරන්න", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "සබඳින්න", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "සබැඳීමේ උත්සාහය අසාර්ථකයි", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "සමූහය වෙත සබඳතාවයකට ආරාධනා කර ඇත", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "copy": "පිටපත්", - "@copy": { - "type": "text", - "placeholders": {} - }, - "create": "සාදන්න", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "දැන් ගිණුමක් සාදන්න", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "නව සමූහයක් සාදන්න", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "donate": "පරිත්‍යාග", - "@donate": { - "type": "text", - "placeholders": {} - }, - "encryption": "සංකේතාංකනය", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "සියල්ල සූදානම්!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "fontSize": "මුද්‍රණඅකුරේ ප්‍රමාණය", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "නව කාමරයට යන්න", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "කාමරයට එක්වන්න", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "යතුරු නිහිතගත යි", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "next": "ඊලඟ", - "@next": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "ප්‍රසිද්ධ කාමර හමු නොවිණි…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "people": "මිනිසුන්", - "@people": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "ප්‍රසිද්ධ සමූහ", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "removeDevice": "උපාංගය ඉවත්කරන්න", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "කාමරයේ අනුවාදය", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "ලෙස ගොනුව සුරකින්න {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "ගොනුව සුරකින්න", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "ගොනුව මෙම බහාලුමට සුරකින්න", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "securityKey": "ආරක්ෂක යතුර", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "ආරක්ෂක යතුර නැතිවුනාද?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "send": "යවන්න", - "@send": { - "type": "text", - "placeholders": {} - }, - "showPassword": "මුරපදය පෙන්වන්න", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "sunday": "ඉරිදා", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "username": "පරිශීලක නාමය", - "@username": { - "type": "text", - "placeholders": {} - }, - "videoCall": "දෘශ්‍ය ඇමතුම", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "බිතුපත", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "අවවාදයයි!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "wednesday": "බදාදා", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "පණිවිඩයක් ලියන්න…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "ඔව්", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "ඔබ", - "@you": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "ඔබට හිමි පරිශීලකනාමය", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "විශාලනය", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "කුඩාලනය", - "@zoomOut": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_sk.arb b/assets/l10n/intl_sk.arb deleted file mode 100644 index 51421c228b..0000000000 --- a/assets/l10n/intl_sk.arb +++ /dev/null @@ -1,1792 +0,0 @@ -{ - "@@locale": "sk", - "@@last_modified": "2021-08-14 12:41:09.879987", - "about": "O aplikácii", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Prijať", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} prijali pozvánku", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Účet", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Informácie o účte", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktivovali koncové šifrovanie", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Pridať popis skupiny", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Administrátor", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Máte už účet?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "anyoneCanJoin": "Ktokoľvek sa môže pripojiť", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Archivovať", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Archivovaná miestnosť", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Môžu sa pripojiť hostia", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ste si istí?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Prosím zadajte vašu prístupovu frázu k \"bezpečému úložisku\" alebo \"kľúč na obnovu\" pre uloženie kľúčov.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\".", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Prosím zadajte vašu prístupovú frázu k \"bezpečnému úložisku\" alebo \"kľúč na obnovu\" pre overenie vašej relácie.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Akcepovať žiadosť o verifikáciu od {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autentifikácia", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar bol zmenený", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Zabanovať z chatu", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Zabanovaný", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} zabanoval {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Zakázať zariadenie", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Klúče sa úspešne uložili", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Zrušiť", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} si zmenili svôj avatar", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} zmenili popis chatu na: „{description}“", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} zmenili meno chatu na: „{chatname}“", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} zmenili nastavenie oprávnení chatu", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} si zmenili prezývku na: {displayname}", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} zmenili prístupové práva pre hosťov", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} zmenili prístupové práva pro hosťov na: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} zmenili nastavenie viditelnosti histórie chatu", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} zmenili nastavenie viditelnosti histórie chatu na: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} zmenili nastavenie pravidiel pripojenia", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} zmenili nastavenie pravidiel pripojenia na: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} si zmenili profilový obrázok", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} zmenili nastavenie aliasov chatu", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} zmenili odkaz k pozvánke do miestnosti", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "História zmien", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Zmeniť použitý server", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Zmena štýlu", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Zmeniť názov skupiny", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Zmeniť server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Zmeniť pozadie", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Šifrovanie bolo poškodené", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Podrobnosti o chate", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Vyberte si silné heslo", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Vyberte si užívateľské meno", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Zavrieť", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Potvrdiť", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Pripojiť", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Pokus o pripojenie zlyhal", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt bol pozvaný do skupiny", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Prehliadač obsahu", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Skopírované do schránky", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopírovať", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Nebolo možné dešifrovať správu: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Nepodarilo sa nastaviť avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Nepodarilo sa nastaviť prezývku užívateľa", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} účastníkov", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Vytvoriť", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Vytvoriť účet teraz", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} založili chat", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Vytvoriť novú skupinu", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Vzájomné overenie je vypnuté", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Vzájomné overenie je zapnuté", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Momentálne prítomní", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Tmavá", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "delete": "Odstrániť", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Odstrániť správu", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Zamietnuť", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Zariadenie", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "Zariadenia", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Zahodiť obrázok", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Prezývka bola zmenená", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Prispejte", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Stiahnuť súbor", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Zmeniť prezývku", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Nastavenie inštancie Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Emotikon už existuje!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Nesprávné označenie emotikonu!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Nastavenie emotikonov", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Kód emotikonu", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Musíte zvoliť kód emotikonu a obrázok!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Prázdny chat", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Šifrovanie už nebude možné vypnúť. Ste si tým istí?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "Šifrovanie", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Šifrovací algoritmus", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Šifrovanie nie je aktívne", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Nastavenie koncového šifrovania", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "enterAGroupName": "Zadajte názov skupiny", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Zadajte uživateľské meno", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Zadajte svoj homeserver", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "Názov súboru", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Veľkosť súboru", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Preposlať", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Piatok", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Od pripojenia", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Od pozvania", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Skupina", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Popis skupiny", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Popis skupiny bol zmenený", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Skupina je verejná", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Skupina s {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Hostia sú zakázaní", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Hostia sa môžu pripojiť", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} vzal späť pozvánku pre {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Pomoc", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Homeserver nie je kompatibilný", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identita", - "@identity": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Nesprávna prístupová fráza alebo kľúč na obnovenie", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Pozvať kontakt", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Pozvať kontakt do {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Pozvanie", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} pozvali {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Len pozvaní používatelia", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Je nasledujúci kód zariadenia správny?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "píše…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} sa pripojili do chatu", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "keysCached": "Kľúče sú uložené", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Kľúče chýbaju", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} vyhodili {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} vyhodili a zabanovali {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Vyhodiť z chatu", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Naposledy prítomní: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Naposledy zaznamenaná IP adresa", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Videný veľmi dávno", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Opustiť", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Opustili chat", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licencia", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Svetlá", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Načítať ďalších {count} účastníkov", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Načítava sa… Čakajte prosím.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Načítať viac…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Prihlásiť sa", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Prihlásenie k {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Odhlásiť sa", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Pridať práva moderátora", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Pridať práva administrátora", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Skontrolujte, či je identifikátor platný", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Správa bude odstránená pre všetkých účastníkov", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderátor", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Pondelok", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Stlmiť chat", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Prosím berte na vedomie, že na koncové šifrovanie zatiaľ potrebujete Pantalaimon.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nová správa v FluffyChate", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Nová žiadosť o verifikáciu!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat v súčasnosti nepodporuje povolenie krížového podpisu. Prosím, povoľte ho z Riot.im.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Nenašli sa žiadne emotikony. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Fluffychat v súčasnosti nepodporuje povolenie online zálohu klúčov. Prosím, povoľte ho z Riot.im.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Žiadne", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Chýba povolenie", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Nenašli sa žiadne miestnosti…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Nepodporované vo webovej verzii", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} označených správ", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "ok": "ok", - "@ok": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online záloha kľúčov je vypnutá", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online záloha kľúčov je zapnutá", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Och! Niečo sa pokazilo…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Na prečítanie správy otvorte aplikáciu", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Otvoriť fotoaparát", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Voliteľné) Názov skupiny", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Zúčastnené užívateľské zariadenia", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "prístupová fráza alebo kľúč na obnovenie", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Heslo", - "@password": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Vybrať obrázok", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "play": "Prehrať (fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Vyberte si používateľské meno", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Vyberte si matrix identifkátor.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Prosím zadajte svoje heslo", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Zadajte svoje používateľské meno", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Verejné miestnosti", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "Nahrávam", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} odstránili udalosť", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Odmietnuť", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} odmietli pozvánku", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Vrátiť sa", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Odstrániť", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Odstráňiť všetky ostatné zariadenia", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Odstánené užívateľom {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Odstráňiť zariadenie", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Odblokovať", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Odstrániť správu", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Zobraziť formátovaný obsah", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Odpovedať", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Vyžiadať si povolenie", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Žiadosť o prečítanie starších správ", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Zrušiť všetky povolenia", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Miestnosť bola upgradeovaná", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Sobota", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Vyhladať v chate", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Videné užívateľom {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Videné užívateľom {username} a {count} dalšími}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Videné užívateľmi {username} a {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Odoslať", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Odoslať správu", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Odoslať súbor", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Odoslať obrázok", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} poslali súbor", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} poslali zvukovú nahrávku", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} poslali obrázok", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} poslali nálepku", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} poslali video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sessionVerified": "Relácia je overená", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Nastaviť profilový obrázok", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Nastaviť popis skupiny", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Nastaviť odkaz pre pozvánku", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Nastaviť status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Nastavenia", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Zdieľať", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} zdieľa lokáciu", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Zaregistrovať sa", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Preskočiť", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Zdrojový kód", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Začnite svoj prvý chat hneď teraz! 🙂\n - Kliknite na tlačítko správy\n- Zabávajte sa chatovaním", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Ako sa dnes máte?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Odoslať", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Nedeľa", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Systémová farba", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Ťuknutím zobrazíte menu", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Sa nezhodujú", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Zhodujú sa", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Táto miestnosť bola archivovaná.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Štvrtok", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Skúsiť znova odoslať", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Utorok", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} odbanovali {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Odblokovať zariadenie", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Neznáme zariadenie", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Neznámy šifrovací algoritmus", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Neznáma udalosť „{type}“", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Neznáma relácia, prosím verifikujte ju", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Zrušiť stlmenie chatu", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} neprečítaných chatov}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{{unreadEvents} neprečítaných správ}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Použiť AMOLED kompatibilné farby?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} a {count} dalších píšu…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} a {username2} píšu…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} píše…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} opustili chat", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Užívateľské meno", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} poslali udalosť {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Úspešne overenie relácie!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Overiť", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifikovať manuálne", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Spustiť verifikáciu", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Verifikácia bola úspešná!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verifikujem protiľahlý účet", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifikovať používateľa", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videohovor", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Viditeľnosť histórie chatu", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Viditeľné pre všetkých účastníkov", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Viditeľné pre každého", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Hlasová správa", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Čaká sa, kým partner prijme požiadavku…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Čaká sa, kým partner prijme emotikon…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Čaká sa na to, kým partner prijme čísla…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Pozadie", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Konečné šifrovanie je momentálne v Beta verzii! Používajte na vlastné riziko!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Streda", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Vítajte v najroztomilejšom instant messengeri v sieti matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Kto môže vstúpiť do tejto skupiny", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Napísať správu…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Áno", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Vy", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Ste pozvaní do tohto chatu", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Už sa nezúčastňujete tohto chatu", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Nemôžete pozvať samých seba", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Máte zablokovaný prístup k tomuto chatu", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Vaša vlastná prezývka", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Budete pripojený na {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "publicGroups": "Verejné Skupiny", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "people": "Ľudia", - "@people": { - "type": "text", - "placeholders": {} - }, - "chats": "Čety", - "@chats": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Zmeniť heslo", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Zmeniť názov zariadenia", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Domovský server podporuje verzie špecifikácie:\n{serverVersions}\nAle táto aplikácie podporuje iba {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "answeredTheCall": "{senderName} prevzal hovor", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sendAudio": "Poslať zvuk", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterValidEmail": "Prosím zadajte správnu emailovú adresu.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Heslá niesú zhodné!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "Prosím zvoľte si aspoň {min} znakov.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "addEmail": "Pridať email", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Pridať nového priateľa", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "appLock": "Uzamknutie aplikácie", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "security": "Bezpečnosť", - "@security": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Nahlásiť správu", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Poslať nálepku", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Zastaviť", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Bezpečnostný kľúč", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Verzia miestnosti", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Poslať správy", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Pripojiť sa k miestnosti", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Neplatný email", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Nastaviť úroveň oprávnení", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setupChatBackup": "Nastaviť zálohy chatov", - "@setupChatBackup": {}, - "badServerLoginTypesException": "Server podporuje tieto typy prihlásenia:\n{serverVersions}\nAle táto aplikácia podporuje iba:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "changesHaveBeenSaved": "Zmeny boli uložené", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Záloha chatov", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Pridať do priestoru", - "@addToSpace": {}, - "cantOpenUri": "Nemožno otvoriť identifikátor prostriedku {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "yourChatBackupHasBeenSetUp": "Záloha vašich chatov bola nastavená.", - "@yourChatBackupHasBeenSetUp": {}, - "clearText": "Vymazať text", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "repeatPassword": "Zopakujte heslo", - "@repeatPassword": {}, - "all": "Všetky", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Všetky chaty", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Ste si istí, že sa chcete odhlásiť?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Spustiť", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Odoslať pri vstupe", - "@sendOnEnter": {}, - "yourUserId": "Vaše užívateľské ID:", - "@yourUserId": {}, - "ignoredUsers": "Ignorovaní užívatelia", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorovať", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "search": "Hľadať", - "@search": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Poslať ako text", - "@sendAsText": { - "type": "text" - }, - "sendOriginal": "Poslať originál", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Poslať video", - "@sendVideo": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_sl.arb b/assets/l10n/intl_sl.arb deleted file mode 100644 index d24d008b21..0000000000 --- a/assets/l10n/intl_sl.arb +++ /dev/null @@ -1,724 +0,0 @@ -{ - "passwordsDoNotMatch": "Geslo se ne ujema!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Vnesite veljaven elektronski naslov.", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "Ponovite geslo", - "@repeatPassword": {}, - "about": "O aplikaciji", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Sprejmi", - "@accept": { - "type": "text", - "placeholders": {} - }, - "account": "Račun", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Podatki o računu", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "Uporabnik {username} je aktiviral šifriranje od konca do konca", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Dodajte e-pošto", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Dodajte opis skupine", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Dodaj novega prijatelja", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Dodajte v prostor", - "@addToSpace": {}, - "alias": "vzdevek", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Vse", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Vsi klepeti", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Že imate račun?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "Oseba {senderName} je odgovorila na klic", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Pridruži se lahko vsak", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Zaklepanje aplikacije", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arhivirana soba", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Če želite podpisati drugo osebo, vnesite geslo za varno trgovino ali obnovitveni ključ.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Vnesite geslo za varno hrambo ali ključ za obnovitev, da preverite svojo sejo.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Ali želite sprejeti to zahtevo za preverjanje od {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Pavza", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Predvajaj", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Preverjanje pristnosti", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Samodejno predvajajte animirane nalepke in čustva", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar spremenjen", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Domači strežnik podpira vrste prijave:\n{serverVersions}\nToda ta aplikacija podpira samo:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "sendOnEnter": "Pošlji ob vstopu", - "@sendOnEnter": {}, - "banFromChat": "Prepoved klepeta", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Prepovedano", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} je prepovedan v {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blokirana naprava", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Blokirano", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Botova sporočila", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Ključi so shranjeni", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Prekliči", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "URI-ja {uri} ni mogoče odpreti", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changedTheChatAvatar": "{username} je spremenil avatar za klepet", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatPermissions": "{username} je spremenila dovoljenja za klepet", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} je spremenil svoje prikazno ime v: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} je spremenila pravila dostopa za goste", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} je spremenila pravila dostopa za goste v: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} je spremenil vidnost zgodovine v: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} je spremenil pravila za pridružitev", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} je spremenila pravila pridružitve v: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} je spremenil avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} je spremenil vzdevke sobe", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} je spremenil povezavo za povabilo", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Dnevnik sprememb", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Spremeni geslo", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Spremembe so shranjene", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Spremenite domači strežnik", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Spremenite svoj slog", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Spremenite ime skupine", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Spremenite strežnik", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Spremenite svoj avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "chat": "Klepet", - "@chat": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "Vaš ID uporabnika:", - "@yourUserId": {}, - "setupChatBackup": "Nastavite varnostno kopiranje klepeta", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Zapisal sem ključ", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Varnostna kopija klepeta je nastavljena.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "Varnostno kopiranje klepeta", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Podrobnosti klepeta", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Klepet je bil dodan v ta prostor", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Klepet je bil odstranjen iz tega prostora", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "Klepeti", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Izberite močno geslo", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Izberi uporabniško ime", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Počisti arhiv", - "@clearArchive": {}, - "clearText": "Počisti besedilo", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Zapri", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Izključi določenega uporabnika iz te sobe", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Pošljite besedilo v obliki HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Povabi danega uporabnika v to sobo", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Pridružite se dani sobi", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Odstranite danega uporabnika iz te sobe", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_me": "Opisi sebe", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Nastavite svojo sliko za to sobo", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_op": "Nastavite raven moči danega uporabnika (privzeto: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_react": "Pošljite odgovor kot reakcijo", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Pošlji besedilo", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Prekliči izključitev določenega uporabnika iz te sobe", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Ukaz ni veljaven", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} is not a command.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Primerjajte in se prepričajte, da se naslednji emoji ujemajo s tistimi iz druge naprave:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Primerjajte in se prepričajte, da se naslednje številke ujemajo s številkami druge naprave:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Konfigurirajte klepet", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Potrdi", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Poskus povezave ni uspel", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Vsebuje prikazno ime", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Vsebuje uporabniško ime", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Pregledovalnik vsebine", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAtLeastChars": "Izberite najmanj {min} znakov.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "archive": "Arhiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ali si prepričan?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} je sprejel povabilo", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "areYouSureYouWantToLogout": "Ali ste prepričani, da se želite odjaviti?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "changedTheChatDescriptionTo": "{username} je spremenil opis klepeta v: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "areGuestsAllowedToJoin": "Ali se lahko gostujoči uporabniki pridružijo", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Domači strežnik podpira različice Spec:\n{serverVersions}\nToda ta aplikacija podpira samo {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "changedTheChatNameTo": "{username} je spremenil ime klepeta v: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changeDeviceName": "Spremenite ime naprave", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Spremeni ozadje", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changedTheHistoryVisibility": "{username} je spremenila vidnost zgodovine", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "channelCorruptedDecryptError": "Šifriranje je poškodovano", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "setupChatBackupDescription": "Za zaščito vaših sporočil smo za vas ustvarili varnostni ključ.\nProsimo, da to shranite na varnem mestu, na primer v upravitelju gesel.", - "@setupChatBackupDescription": {}, - "contentHasBeenReported": "Vsebina je bila prijavljena skrbnikom strežnika", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Varnostna kopija klepeta je zavarovana z varnostnim ključem. Prosimo, pazite, da ga ne izgubite.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomnick": "Nastavite prikazno ime za to sobo", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "connect": "Povežite se", - "@connect": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakt je bil povabljen v skupino", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "commandHint_leave": "Zapusti to sobo", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_plain": "Pošlji neformatirano besedilo", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "copiedToClipboard": "Kopirano v odložišče", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopiraj", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopiraj v odložišče", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Sporočila ni bilo mogoče dešifrirati: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Avatarja ni bilo mogoče nastaviti", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Prikaznega imena ni bilo mogoče nastaviti", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} udeležencev", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Ustvari", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Ustvarite račun zdaj", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "Ustvari novo skupino", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nov prostor", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Navzkrižno podpisovanje DA", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Navzkrižno podpisovanje NE", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Trenutno aktiven", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Temno", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Privzeta raven dovoljenja", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "createdTheChat": "{username} je ustvaril klepet", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "deactivateAccountWarning": "S tem boste deaktivirali vaš uporabniški račun. Tega ni mogoče razveljaviti! Ali si prepričan?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_sr.arb b/assets/l10n/intl_sr.arb deleted file mode 100644 index eab3d6944e..0000000000 --- a/assets/l10n/intl_sr.arb +++ /dev/null @@ -1,2409 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.857024", - "about": "О програму", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Прихвати", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} прихвата позивницу", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Налог", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Подаци о налогу", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} укључи шифровање с краја на крај", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "Додај е-адресу", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Додај опис групе", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Додај новог пријатеља", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "Админ", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "алијас", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Сви", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Већ имате налог?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} одговори на позив", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "свако може да се придружи", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Закључавање апликације", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Архива", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Архивирана соба", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Да ли је гостима дозвољен приступ", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Сигурни сте?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Заиста желите да се одјавите?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Унесите своју безбедносну фразу или кључ за опоравак да кеширате кључеве.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Да бисте могли да пријавите другу особу, унесите своју безбедносну фразу или кључ опоравка.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Унесите своју безбедносну фразу или кључ за опоравак да бисте верификовали сесију.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Прихватате ли захтев за верификацију од корисника {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Пауза", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Пуштање", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Аутентификација", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Аватар измењен", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Домаћи сервер подржава начине пријаве:\n{serverVersions}\nали ова апликација подржава само:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Домаћи сервер подржава верзије:\n{serverVersions}\nали ова апликација подржава само {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Забрани у ћаскању", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Забрањен", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} забрани корисника {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Блокирај уређај", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Блокиран", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Поруке Бота", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Кључеви кеширани", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Откажи", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Промени назив уређаја", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} промени аватар ћаскања", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} промени опис ћаскања у: „{description}“", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} промени назив ћаскања у: „{chatname}“", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} измени дозволе ћаскања", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} промени приказно име на: „{displayname}“", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} измени правила за приступ гостију", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} измени правила за приступ гостију на: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} измени видљивост историје", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} измени видљивост историје на: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} измени правила приступања", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} измени правила приступања на: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} измени свој аватар", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} измени алијас собе", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} измени везу позивнице", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Дневник измена", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Измени лозинку", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Измене су сачуване", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Промени домаћи сервер", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Измените изглед", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Измени назив групе", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Промени сервер", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Измени тапет", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Измените свој аватар", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Шифровање је покварено", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Ћаскање", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Копија ћаскања", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Ваша резервна копија ћаскања је обезбеђена кључем. Немојте да га изгубите.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Детаљи ћаскања", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "Ћаскања", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Изаберите јаку лозинку", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Изаберите корисничко име", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Очисти архиву", - "@clearArchive": {}, - "clearText": "Обриши текст", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Затвори", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Блокирај задатог корисника за ову собу", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "Шаљи ХТМЛ обликован текст", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Позови задатог корисника у собу", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Придружи се наведеној соби", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Уклони задатог корисника из собе", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Напусти ову собу", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Опишите себе", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomnick": "Поставља ваш надимак за ову собу", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Подеси ниво задатог корисника (подразумевано: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Шаљи неформатиран текст", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Шаљи одговор као реакцију", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Пошаљи текст", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Скини забрану задатом кориснику за ову собу", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "compareEmojiMatch": "Упоредите и проверите да су емоџији идентични као на другом уређају:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Упоредите и проверите да су следећи бројеви идентични као на другом уређају:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Подешавање ћаскања", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Потврди", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Повежи се", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Неуспео покушај повезивања", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Особа је позвана у групу", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Садржи приказно име", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Садржи корисничко име", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Садржај је пријављен администраторима сервера", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Прегледач садржаја", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Копирано у клипборд", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Копирај", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Копирај у клипборд", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Не могу да дешифрујем поруку: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Не могу да поставим аватар", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Не могу да поставим име за приказ", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "учесника: {count}", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Направи", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Направи налог сада", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} направи ћаскање", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Направи нову групу", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Међу-потписивање искључено", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Међу-потписивање укључено", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Тренутно активно", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "тамни", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day} {month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day} {month} {year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Ово ће деактивирати ваш кориснички налог. Не може се повратити! Сигурни сте?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Подразумевани ниво приступа", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Обриши", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Обриши налог", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Брисање поруке", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Одбиј", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Уређај", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ИД уређаја", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Уређаји", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Шифровање је безбедно само када су сви уређаји оверени.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Директна ћаскања", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Одбаци слику", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Истражи", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Истражи групе", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Име за приказ је измењено", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Донација", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Преузми фајл", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Уреди", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Уреди блокиране сервере", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Уредите дозволе ћаскања", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Уреди име за приказ", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Уреди Џитси инстанцу", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Уреди алијасе собе", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Уређује аватар собе", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Емоти већ постоји!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Неисправна скраћеница за емоти!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Пакети емотија за собу", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Поставке емотија", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "скраћеница", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Морате да изаберете скраћеницу и слику за емоти!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "празно ћаскање", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Глобално укључи пакет емотија", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Укључује шифровање", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Шифровање више нећете моћи да искључите. Сигурни сте?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Шифровано", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Шифровање", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Алгоритам шифровања", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Шифровање није укључено", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Поставке шифровања с краја на крај", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} заврши позив", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "унесите назив групе", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Унесите адресу е-поште", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Унесите корисничко име", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Унесите свој домаћи сервер", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Све је спремно!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Екстремно увредљив", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Назив фајла", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Величина фајла", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Величина фонта", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "Напред", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "петак", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Пријатељи", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "од приступања", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "од позивања", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Иди у нову собу", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Група", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Опис групе", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Опис групе измењен", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Група је јавна", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Групе", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Група са корисником {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "гости су забрањени", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "гости могу приступити", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} поништи позивницу за корисника {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Помоћ", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Сакриј редиговане догађаје", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Сакриј непознате догађаје", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Сервер није компатибилан", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Колико је увредљив овај садржај?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ИД", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Идентитет", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Игнориши", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Игнорисани корисници", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Можете игнорисати кориснике који вас нервирају. Нећете примати никакве поруке нити позивнице од корисника са ваше листе за игнорисање.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Игнориши корисника", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Кликнуо сам на везу", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Неисправна фраза или кључ опоравка", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Није увредљив", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Лоша е-адреса", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Позивање особа", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Позови особу у групу {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Позван", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} позва корисника {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "само позвани корисници", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Позивнице за мене", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} вас позива у FluffyChat. \n1. Инсталирајте FluffyChat: https://fluffychat.im \n2. Региструјте се или пријавите \n3. Отворите везу позивнице: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Да ли је кључ уређаја исправан?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "куца…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} се придружи ћаскању", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Придружи се соби", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Кључеви су кеширани", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Кључеви недостају", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} избаци корисника {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} избаци и забрани корисника {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Избаци из ћаскања", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Последња активност: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Последњи ИП", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "одавно није на мрежи", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Напусти", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Напусти ћаскање", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Лиценца", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "светли", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Учитај још {count} учесника", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Учитавам… Сачекајте.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Учитај још…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Пријава", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Пријава на {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "{brand} за пријаву", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Одјава", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Направи модератора", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Направи админа", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Проверите да је идентификатор исправан", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Измене чланова", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Спомени", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Поруке", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Поруке ће бити уклоњене за све учеснике", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Модератор", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "понедељак", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Ућуткај ћаскање", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "За сада, потребан је Пантелејмон (Pantalaimon) да бисте користили шифровање с краја на крај.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Ново ћаскање", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Нова порука — FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Нови захтев за верификацију!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Следеће", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Не", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Нема везе са сервером", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat тренутно не подржава међу-потписивање. Укључите га из апликације „Елемент“.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Нема описа", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Нема емотија. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Шифровање се може активирати након што соба престане да буде јавно доступна.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Чини се да немате Гугл услуге на телефону. То је добра одлука за вашу приватност! Да би се протурале нотификације у FluffyChat, препоручујемо коришћење https://microg.org/ или https://unifiedpush.org/", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Прављење резерве кључева на мрежи укључите из Елемента.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ништа", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Још нисте одредили начин за опоравак лозинке.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Нема дозвола", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Нисам нашао јавне собе…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Нисам нашао собе…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "За сад нема стања.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Обавештења", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Обавештења укључена за овај налог", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Није подржано на вебу", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "изабрано {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} корисника куца…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "Увредљив", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Ван везе", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "у реду", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "На вези", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Резерва кључева на мрежи је искључена", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Резерва кључева на мрежи је укључена", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Нажалост, дошло је до грешке при подешавању дотурања обавештења.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Нешто је пошло наопако…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Отворите апликацију да прочитате поруке", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Отвори камеру", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(необавезно) ваша е-адреса", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(опционо) назив групе", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "или", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Учесник", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Уређаји који учествују", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "фраза или кључ опоравка", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Лозинка", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Заборављена лозинка", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Лозинка је промењена", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Опоравак лозинке", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Људи", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Избор слике", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Закачи", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Пусти {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Изаберите", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Изаберите код за пролаз", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Изаберите корисничко име", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Кликните на везу у примљеној е-пошти па наставите.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Унесите 4 цифре или оставите празно да не закључавате апликацију.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Унесите ИД са Матрикса.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Унесите свој сигурносни кључ:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Унесите своју лозинку", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Унесите свој пин", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Унесите своје корисничко име", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Испратите упутства на веб сајту и тапните на „Следеће“.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Приватност", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Јавне групе", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Јавни кључ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Јавне собе", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Правила протурања", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Разлог", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Снимам", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} редигова догађај", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Редигуј поруку", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Регистрација", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Одбиј", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} одби позивницу", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Поново се придружи", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Уклони", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Уклони све остале уређаје", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Уклонио корисник {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Уклони уређај", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Уклони изгнанство", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Уклони поруку", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Уклоните свој аватар", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Приказуј обогаћен садржај поруке", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Замени собу новијом верзијом", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Одговори", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Пријави поруку", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Затражи дозволу", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Затражи читање старијих порука", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Повуци све дозволе", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Соба је надограђена", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Верзија собе", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "субота", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "Претражи", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "претражи ћаскања", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Безбедност", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Сигурносни кључ", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Изгубљен сигурносни кључ?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username} прегледа", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{{username} прегледа и {count} осталих}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Прегледали {username} и {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Пошаљи", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Пошаљи поруку", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Пошаљи аудио", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Дозволи слање извештаја о грешци помоћу sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Пошаљи фајл", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Пошаљи слику", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Слање порука", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Пошаљи оригинал", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Пошаљи видео", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} посла фајл", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} посла аудио", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} посла слику", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} посла налепницу", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} посла видео", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} посла податке о позиву", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Информације о вашој приватности: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Сесија је верификована", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Постави слику профила", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Постави као главни алијас", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "постави посебне емотије", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Постави опис групе", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Поставља везу позивнице", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Одреди ниво дозволе", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Постави статус", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Поставке", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Подели", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} подели локацију", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "Прикажи лозинку", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Регистрација", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Јединствена пријава", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Прескочи", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Звук, вибрација и ЛЕД боје", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Изворни код", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} започе позив", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Покрените своје прво ћаскање! 🙂\n- Тапните на дугме поруке\n- Унесите корисничко име пријатеља\n- Уживајте у ћаскању", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Стање", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Како сте данас?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Пошаљи", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "недеља", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "системски", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Тапните уређај да оверите", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Тапните за мени", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Не поклапају се", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Поклапају се", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Ова соба је архивирана.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "четвртак", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Мењај омиљеност", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Мењај ућутканост", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Означи не/прочитано", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Превише упита. Покушајте касније!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Пренос са другог уређаја", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Покушај слање поново", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "уторак", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Недоступно", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} одблокира корисника {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Одблокирај уређај", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Непознат уређај", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Непознат алгоритам шифровања", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Непознат догађај „{type}“", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Непозната сесија. Верификујте је", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Откључај резерву ћаскања", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Врати обавештења", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Откачи", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, other{непрочитаних ћаскања: {unreadCount}}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, other{непрочитаних порука: {unreadEvents}}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Користити боје за АМОЛЕД?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} и {count} корисника куцају…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} и {username2} куцају…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} куца…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} напусти ћаскање", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Корисничко име", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Корисник није оверен", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} посла {type} догађај", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Стање овере није познато", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Корисник је оверен", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Оверен", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Успешно верификована сесија!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Верификуј", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Верификуј ручно", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Покрени верификацију", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Успешно сте верификовали!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Верификујем други налог", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Верификуј корисника", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Видео позив", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Одреди видљивост историје", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "видљиво свим учесницима", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "видљиво свима", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Гласовна порука", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Чекам да саговорник прихвати захтев…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Чекам да саговорник прихвати емоџије…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Чекам да саговорник прихвати бројеве…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Тапета", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Упозорење!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Шифровање с краја на крај је тренутно у бета фази! Користите на сопствени ризик!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "среда", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Добродошли у најслађи брзи гласник на Матрикс мрежи.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Послали смо вам е-пошту", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "ко може шта да ради", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Ко може да се придружи групи", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Зашто желите ово да пријавите?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Да обришем резервну копију како би направио нови сигурносни кључ?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Са овим адресама можете опоравити своју лозинку.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "напишите поруку…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Да", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Ви", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Позвани сте у ово ћаскање", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Више не учествујете у овом ћаскању", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Не можете позвати себе", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Забрањено вам је ово ћаскање", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Ваше корисничко име", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Ваш јавни кључ", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Бићете повезани на {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Увећај", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Умањи", - "@zoomOut": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_sv.arb b/assets/l10n/intl_sv.arb deleted file mode 100644 index 0eed3660c7..0000000000 --- a/assets/l10n/intl_sv.arb +++ /dev/null @@ -1,2801 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.835634", - "about": "Om", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Acceptera", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} accepterade inbjudan", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Konto", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Information om kontot", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} aktiverade ändpunktskryptering", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Lägg till en gruppbeskrivning", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Admin", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Alla", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Har du redan ett konto?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} besvarade samtalet", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Vem som helst kan gå med", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "App-lås", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arkiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arkiverat Rum", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Får gästanvändare gå med", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Är du säker?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Vänligen ange din lösenfras eller återställningsnyckel för säker lagring för att lagra nycklarna.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Vänligen ange din lösenfras eller återställningsnyckel för säker lagring för att verifiera din session.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Acceptera denna verifikationsförfrågan från {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Autentisering", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Avatar har ändrats", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Hemservern stöjder Spec-versionen:\n{serverVersions}\nMen denna app stödjer enbart {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Bannlys från chatt", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Bannlyst", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} bannlös {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Blockera Enhet", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot meddelanden", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Cachade nycklar", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Avbryt", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Ändra enhetsnamn", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ändrade sin chatt-avatar", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} ändrade chatt-beskrivningen till: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} ändrade sitt chatt-namn till: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} ändrade chatt-rättigheterna", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} ändrade visningsnamnet till: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} ändrade reglerna för gästaccess", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} ändrade reglerna för gästaccess till: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} ändrade historikens synlighet", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} ändrade historikens synlighet till: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} ändrade anslutningsreglerna", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} ändrade anslutningsreglerna till {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} ändrade sin avatar", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} ändrade rummets alias", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} ändrade inbjudningslänken", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Förändringslogg", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Ändra lösenord", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Ändringarna har blivit sparade", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Ändra hemserver", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Ändra din stil", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Ändra namn på gruppen", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Ändra server", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Ändra bakgrund", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Krypteringen har blivit korrupt", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Chatt", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Chatt-detaljer", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Välj ett starkt lösenord", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Välj ett användarnamn", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Stäng", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Jämför och se till att följande emoji matchar den andra enheten:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Jämför och se till att följande nummer matchar den andra enheten:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Konfigurera chatt", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Bekräfta", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Anslut", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Anslutning misslyckades", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Innehåller visningsnamn", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Innehåller användarnamn", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "Innehållet har rapporterats till server-admins", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Innehållsvisare", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Kopierat till urklipp", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopiera", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Kunde ej avkoda meddelande: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Kunde ej sätta avatar", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Kunde ej sätta visningsnamn", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} deltagare", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Skapa", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Skapa konto nu", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} skapade chatten", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Skapa ny grupp", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Korssignering av", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Korssignering på", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "För närvarande aktiv", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Mörkt", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Standard behörighetsnivå", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Radera", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Ta bort konto", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Ta bort meddelande", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Neka", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Enhet", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Enhets-ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Enheter", - "@devices": { - "type": "text", - "placeholders": {} - }, - "directChats": "Direkt Chatt", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Ta bort bilden", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Utforska", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Utforska grupper", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Visningsnamn har ändrats", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Donera", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Ladda ner fil", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Ändra", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "redigera blockerade servrar", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Ändra chatt-rättigheter", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Ändra visningsnamn", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Ändra Jitsi-instans", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "redigera rumsavatar", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Dekalen existerar redan!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Ogiltig dekal-kod!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Dekalpaket för rummet", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Emote inställningar", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Dekal kod", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Du måste välja en dekal-kod och en bild!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Tom chatt", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Aktivera dekal-paket globalt", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Aktivera kryptering", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Du kommer inte ha fortsatt möjlighet till att inaktivera krypteringen. Är du säker?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Krypterad", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Kryptering", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Krypteringsalgoritm", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Kryptering är ej aktiverad", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Inställningar för ändpunktskryptering", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} avslutade samtalet", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Ange ett gruppnamn", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Ange en e-postaddress", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Ange ett användarnamn", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Ange din hemserver", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Extremt stötande", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Filnamn", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Filstorlek", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Framåt", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Fredag", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Från att gå med", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Från inbjudan", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Grupp", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Gruppbeskrivning", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Gruppbeskrivningen ändrad", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Gruppen är publik", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Grupper", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Gruppen med {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Gäster är förbjudna", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Gäster kan ansluta", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} har tagit tillbaka inbjudan för {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Hjälp", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Göm redigerade händelser", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Göm okända händelser", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Hemservern är inte kompatibel", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Hur stötande är detta innehåll?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Identitet", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Ignorera", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Ignorera användare", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Du kan ignorera användare som stör dig. Du kommer inte att ha möjlighet att få några meddelanden eller rums-inbjudningar från användare på din personliga ignoreringslista.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Ignorera användarnamn", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Jag har klickat på länken", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Felaktig lösenordsfras eller åsterställningsnyckel", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Oförargligt", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Bjud in kontakt", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Bjud in kontakt till {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Inbjuden", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} bjöd in {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Endast inbjudna användare", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Inbjudning till mig", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} bjöd in dig till FluffyChat. \n1. Installera FluffyChat: https://fluffychat.im \n2. Registrera dig eller logga in \n3. Öppna inbjudningslänk: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Är föjande enhetsnyckel riktig?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "skriver…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} anslöt till chatten", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Anslut till rum", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Nycklarna är cachade", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Nyckarna saknas", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} sparkade {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} sparkade och bannade {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Sparka från chatt", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Senast aktiv: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Senast visade IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Sågs för längesedan", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Lämna", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Lämnade chatten", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Licens", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Ljust", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Ladda {count} mer deltagare", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Laddar... Var god vänta.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Ladda mer…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Logga in", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Logga in till {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Logga ut", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Skapa en moderator", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Skapa en admin", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Se till att identifieraren är giltig", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Medlemsändringar", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Nämn", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Meddelanden", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Meddelandet kommer tas bort för alla deltagare", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Måndag", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Tysta chatt", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Var medveten om att du behöver Pantalaimon för att använda ändpunktskryptering tillsvidare.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Ny chatt", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Nya meddelanden i FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Ny verifikationsbegäran!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "Nästa", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Nej", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Ingen anslutning till servern", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat stödjer ej aktiverad korssignering för tillfället. Vänligen aktivera detta inifrån Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Ingen beskrivning", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Hittade inga dekaler. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få push notifikationer i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Vänligen slå på online-nyckelbackup inifrån Element istället.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Ingen", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Du har inte lagt till något sätt för att återställa ditt lösenord än.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Ingen behörighet", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Hittade inga publika rum…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Hittade inga rum…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Inga statusar hittade än sålänge.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Aviseringar", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notifikationer är påslaget för detta konto", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Stöds inte på webben", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} vald", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} användare skriver…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "Stötande", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Online Nyckel-backup är inaktiverad", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online Nyckel-backup är aktiverad", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oops, någonting gick fel…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Öppna app för att lästa meddelanden", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Öppna kamera", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Optional) Gruppnamn", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participant": "Deltagare", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Deltagande användarenheter", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "lösenord eller återställningsnyckel", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Lösenord", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Glömt lösenord", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Lösenordet har ändrats", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Återställ lösenord", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Välj en bild", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Nåla fast", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "Spela {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAPasscode": "Ange ett lösenord", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Välj ett användarnamn", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Klicka på länken i e-postmeddelandet för att sedan fortsätta.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Ange 4 siffror eller lämna tom för att inaktivera app-lås.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Ange ditt Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Ange ditt lösenord", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Ange ditt användarnamn", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Följ instruktionerna på hemsidan och tryck på nästa.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Integritet", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Publik Nyckel", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Publika Rum", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Push regler", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Anledning", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Spelar in", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} redigerade en händelse", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Redigera meddelande", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "reject": "Avböj", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} avböjde inbjudan", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Återanslut", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Ta bort", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Ta bort alla andra enheter", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Bortagen av {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Ta bort enhet", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Ta bort chatt-blockering", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Ta bort meddelande", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Återge innehåll med rikt meddelande", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Ersätt rum med nyare version", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Svara", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Rapportera meddelande", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Begär behörighet", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Begär att läsa äldre meddelanden", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Återkalla alla behörigheter", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Rummet har blivit uppgraderat", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Lördag", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "Sök", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Sök efter en chatt", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Säkerhet", - "@security": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Sedd av {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{Sedd av {username} och {count} andra}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "Sedd av {username} och {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Skicka", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Skicka ett meddelande", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Skicka ljud", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Tillåt att skicka buggrapporter med sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Skicka fil", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Skicka bild", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Skickade meddelanden", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Skicka orginal", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Skicka video", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} skickade en fil", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} skickade ett ljudklipp", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} skickade ett ljudklipp", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} skickade en sticker", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} skickade en video", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} skickade samtalsinformation", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Information om din intigritet: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Sessionen är verifierad", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Ställ in en profilbild", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Ställ in anpassade dekaler", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Ställ in gruppbeskrivning", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Ställ in inbjudningslänk", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Ställ in behörighetsnivå", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Ställ in status", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Inställningar", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Dela", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} delade sin position", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Registrera", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Hoppa över", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Ljud, vibrations-LED-färg", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Källkod", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} startade ett samtal", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Starta din första chatt nu! 🙂\n- tryck på \"ny chatt\"\n- Skanna en väns QR-kod\n- Ha så kul med chattandet", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Status", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Hur mår du i dag?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Skicka in", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Söndag", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "System", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Tryck för att visa menyn", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Dom Matchar Inte", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Dom Matchar", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Detta rummet har blivit arkiverat.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Torsdag", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours24}:{minutes}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Växla favorit", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Växla tystad", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Markera läst/oläst", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "För många förfrågningar. Vänligen försök senare!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Försök att skicka igen", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Tisdag", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Upptagen", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} avbannade {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Avblockera enhet", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Okänd enhet", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Okänd krypteringsalgoritm", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Okänd händelse '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Okänd session, vänligen verifiera", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Slå på ljudet för chatten", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Avnåla", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{en oläst chatt} other{{unreadCount} olästa chattar}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{ett oläst meddelande} other{{unreadEvents} olästa meddelanden}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "Använd AMOLED kompatibla färger?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} och {count} andra skriver…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} och {username2} skriver…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} skriver…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} lämnade chatten", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Användarnamn", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} skickade en {type} händelse", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Bekräftad session!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Verifiera", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Verifiera Manuellt", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Starta verifiering", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Du har lyckats verifiera!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Verifiera andra konton", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Verifiera Användare", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Videosamtal", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Chatt-historikens synlighet", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Synlig för alla deltagare", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Synlig för alla", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Röstmeddelande", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Väntar på att deltagaren accepterar begäran…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Väntar på att deltagaren accepterar emojien…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Väntar på att deltagaren accepterar nummer…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Bakgrund", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Varning!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Ändpunktskryptering är för närvarande i Beta! Använd på egen risk!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Onsdag", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Välkommen till den sötaste messenger-klienten i Matrix nätverket.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Vi skickade dig ett e-postmeddelande", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Vem kan utföra vilken åtgärd", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Vilka som är tilllåtna att ansluta till denna grupp", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Varför vill du rapportera detta?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Med dessa addresser kan du återställa ditt lösenord.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Skriv ett meddelande…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Ja", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Du", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Du är inbjuden till denna chatt", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Du deltar inte längre i denna chatt", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Du kan inte bjuda in dig själv", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Du har blivit bannad från denna chatt", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Ditt egna användarnamn", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Din publika nyckel", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Du kommer att anslutas till {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "commandHint_html": "Skicka HTML-formatted text", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_ban": "Bannlys användaren från detta rum", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "clearText": "Rensa text", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Rensa arkiv", - "@clearArchive": {}, - "chats": "Chatter", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Chatt har tagits bort från detta utrymme", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chatt har lagts till i detta utrymme", - "@chatHasBeenAddedToThisSpace": {}, - "chatBackup": "Chatt backup", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Ändra din avatar", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Kan inte öppna URL {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "blocked": "Blockerad", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Hemma servern stödjer följande inloggnings typer :\n {serverVersions}\nMen denna applikation stödjer enbart:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "autoplayImages": "Automatisk spela upp animerade klistermärken och emoji", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "audioPlayerPlay": "Spela", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Paus", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "allChats": "Alla chattar", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Lägg till i utrymme", - "@addToSpace": {}, - "addNewFriend": "Lägg till ny vän", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Lägg till e-post", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomavatar": "Sätt din bild för detta rum (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_me": "Beskriv dig själv", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_leave": "Lämna detta rum", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_kick": "Ta bort användare från detta rum", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_join": "Gå med i rum", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_invite": "Bjud in användaren till detta rum", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "locationPermissionDeniedNotice": "Plats åtkomst nekad. Var god godkän detta för att kunna dela din plats.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Platstjänster är inaktiverade. Var god aktivera dom för att kunna dela din plats.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Felaktigt e-post", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Gå till det nya rummet", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "friends": "Vänner", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Teckensnitt storlek", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Allt är klart!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Fel vid erhållande av plats: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "enterASpacepName": "Ange utrymmets namn", - "@enterASpacepName": {}, - "enableChatBackup": "Aktivera chatt backup för att inte förlora åtkomst till dina chattar.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Redigera rum alias", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Avbryt och fråga inte igen", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Kryptering är enbart säker när samtliga enheter har verifierats.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Nytt utrymme", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Kopiera till urklipp", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "commandMissing": "{command} är inte ett kommando.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "commandInvalid": "Felaktigt kommando", - "@commandInvalid": { - "type": "text" - }, - "commandHint_unban": "Tillåt användare i rummet", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandHint_send": "Skicka text", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_react": "Skicka svar som reaktion", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_plain": "Skicka oformaterad text", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_op": "Sätt användarens kraft nivå ( standard: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_myroomnick": "Sätt ditt användarnamn för rummet", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "noEncryptionForPublicRooms": "Du kan endast aktivera kryptering när rummet inte längre är publikt tillgängligt.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Logga in med {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "noMatrixServer": "{server1} är inte en matrix server, använd {server2} istället?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "obtainingLocation": "Erhåller plats…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Var god ange din säkerhets nyckel:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Var god välj", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "people": "Människor", - "@people": { - "type": "text", - "placeholders": {} - }, - "or": "Eller", - "@or": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "( Frivilligt) Din e-postadress", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Öppna i karta", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Oj! Tyvärr uppstod ett fel vid upprättande av push notiser.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synkroniserar… Var god vänta.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Utrymmes namn", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Utrymme är publikt", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Visa lösenord", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Dela plats", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Sätt som primärt alias", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Skicka klistermärke", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Skicka som text", - "@sendAsText": { - "type": "text" - }, - "securityKeyLost": "Borttappad säkerhets nyckel?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Säkerhets nyckel", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Spara fil i denna mapp", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "saveFile": "Spara fil", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Sparad som {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "roomVersion": "Rum version", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Ta bort din avatar", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "register": "Registrera", - "@register": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Publika utrymmen", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Publika grupper", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Ange din pin-kod", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Dina chattar synkroniseras…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Radera din chatt-backup för att skapa en ny säkerhetsnyckel?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "verified": "Verifierad", - "@verified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Användaren är verifierad", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Användare har en okänd verifikationsstatus", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Användaren är inte verifierad", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Lås upp chatt backup", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Överför till annan enhet", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Tryck för att visa bild", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Tryck på en enhet för att verifiera", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Zooma ut", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Zooma in", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "shareYourInviteLink": "Dela din inbjudan", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Skana QR koden eller dela inbjudan länken om ni ej är i närheten av varandra.", - "@createNewChatExplaination": {}, - "chatBackupDescription": "Din chatt backup är skyddad av en säkerhets nyckel. Se till att du inte förlorar den.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, other{{count} mer events}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "commandHint_create": "Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Kasta bort sessionen", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Starta en direkt-chatt\nAnvänd --no-encryption för att inaktivera kryptering", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "homeserver": "Hemserver", - "@homeserver": {}, - "oneClientLoggedOut": "En av dina klienter har loggats ut", - "@oneClientLoggedOut": {}, - "addAccount": "Lägg till konto", - "@addAccount": {}, - "editBundlesForAccount": "Lägg till paket för detta konto", - "@editBundlesForAccount": {}, - "addToBundle": "Utöka paket", - "@addToBundle": {}, - "bundleName": "Paketnamn", - "@bundleName": {}, - "serverRequiresEmail": "Servern behöver validera din e-postadress för registrering.", - "@serverRequiresEmail": {}, - "singlesignon": "Single Sign On", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "unverified": "Ej verifierad", - "@unverified": {}, - "messageInfo": "Meddelandeinformation", - "@messageInfo": {}, - "messageType": "Meddelandetyp", - "@messageType": {}, - "time": "Tid", - "@time": {}, - "sender": "Avsändare", - "@sender": {}, - "removeFromSpace": "Ta bort från utrymme", - "@removeFromSpace": {}, - "addToSpaceDescription": "Välj ett utrymme som chatten skall läggas till i.", - "@addToSpaceDescription": {}, - "start": "Starta", - "@start": {}, - "pleaseEnterSecurityKeyDescription": "För att låsa upp din chatt-backup, vänligen ange säkerhetsnyckeln som skapats i en tidigare session. Säkerhetsnyckeln är INTE densamma som ditt lösenord.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Spara säkerhetsnyckeln nu", - "@saveTheSecurityKeyNow": {}, - "iUnderstand": "Jag förstår", - "@iUnderstand": {}, - "yourStory": "Din berättelse", - "@yourStory": {}, - "openGallery": "Öppna galleri", - "@openGallery": {}, - "storyFrom": "Berättelse från {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "passwordsDoNotMatch": "Lösenorden stämmer inte överens!", - "@passwordsDoNotMatch": {}, - "repeatPassword": "Upprepa lösenord", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Vänligen ange minst {min} tecken.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "markAsRead": "Markera som läst", - "@markAsRead": {}, - "setupChatBackup": "Konfigurera chatt-backup", - "@setupChatBackup": {}, - "setupChatBackupDescription": "För att skydda dina meddelanden så det skapats en säkerhetsnyckel.\nFörvara nyckeln på ett säkert ställe, t ex med en lösenordshanterare.", - "@setupChatBackupDescription": {}, - "commandHint_clearcache": "Rensa cache", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "newUsernameDescription": "Ditt användar-ID kommer att ha formatet @användarnamn:servernamn", - "@newUsernameDescription": {}, - "openVideoCamera": "Aktivera kamera för video", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "link": "Länk", - "@link": {}, - "publish": "Publicera", - "@publish": {}, - "unsubscribeStories": "Avprenumerera berättelser", - "@unsubscribeStories": {}, - "replyHasBeenSent": "Svar har skickats", - "@replyHasBeenSent": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "whatIsGoingOn": "Vad händer?", - "@whatIsGoingOn": {}, - "addDescription": "Lägg till beskrivning", - "@addDescription": {}, - "reportUser": "Rapportera användare", - "@reportUser": {}, - "openChat": "Öppna Chatt", - "@openChat": {}, - "yourUserId": "Ditt användar-ID:", - "@yourUserId": {}, - "sendOnEnter": "Skicka med Enter", - "@sendOnEnter": {}, - "iWroteDownTheKey": "Jag har antecknat nyckeln", - "@iWroteDownTheKey": {}, - "addToStory": "Addera till berättelse", - "@addToStory": {}, - "pleaseEnterValidEmail": "Vänligen ange en giltig e-postadress.", - "@pleaseEnterValidEmail": {}, - "scanQrCode": "Skanna QR-kod", - "@scanQrCode": {}, - "bubbleSize": "Storlek på bubbla", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "Din chatt-backup har konfigurerats.", - "@yourChatBackupHasBeenSetUp": {}, - "loginWithOneClick": "Logga in med ett klick", - "@loginWithOneClick": {}, - "typeInInviteLinkManually": "Skriv in länk med inbjudan manuellt...", - "@typeInInviteLinkManually": {}, - "newPasswordDescription": "För att kunna återställa ditt lösenord så bör du vid tillfälle lägga till en e-postadress till ditt konto.", - "@newPasswordDescription": {}, - "removeFromBundle": "Ta bort från paket", - "@removeFromBundle": {}, - "enableMultiAccounts": "(BETA) Aktivera multi-konton på denna enhet", - "@enableMultiAccounts": {}, - "removeFromSpaceDescription": "Detta raderar chatten från det nuvarande utrymmet. Chatten är fortfarande synlig under \"Alla chattar\".", - "@removeFromSpaceDescription": {}, - "whoCanSeeMyStories": "Vem kan se mina berättelser?", - "@whoCanSeeMyStories": {}, - "setupChatBackupNow": "Konfigurera din chatt-backup nu", - "@setupChatBackupNow": {}, - "whoCanSeeMyStoriesDesc": "Notera att användare kan se och kontakta varandra i din berättelse.", - "@whoCanSeeMyStoriesDesc": {}, - "thisUserHasNotPostedAnythingYet": "Den här användaren har inte lagt till något till deras berättelse än", - "@thisUserHasNotPostedAnythingYet": {}, - "storyPrivacyWarning": "Notera att användare kan se och kontakta varandra i din berättelse. Din berättelse är synlig i 24 timmar, men det finns ingen garanti för att berättelser raderas från alla enheter och servrar.", - "@storyPrivacyWarning": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Ring", - "@placeCall": {}, - "voiceCall": "Röstsamtal", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Inget stöd för denna version av Android", - "@unsupportedAndroidVersion": {}, - "videoCallsBetaWarning": "Videosamtal är för närvarande under testning. De kanske inte fungerar som det är tänkt eller på alla plattformar.", - "@videoCallsBetaWarning": {}, - "unsupportedAndroidVersionLong": "Denna funktion kräver en senare version av Android.", - "@unsupportedAndroidVersionLong": {}, - "dismiss": "Avfärda", - "@dismiss": {}, - "matrixWidgets": "Matrix widgetar", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Det går inte att redigera widgetar och integrationer ännu.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Redigera widgetar och integrationer", - "@editIntegrations": {}, - "reactedWith": "{sender} reagerade med {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "pinMessage": "Fäst i rum", - "@pinMessage": {}, - "pinnedEventsError": "Ett fel uppstod när fastnålade meddelanden skulle hämtas", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", - "@confirmEventUnpin": {}, - "experimentalVideoCalls": "Experimentella videosamtal", - "@experimentalVideoCalls": {}, - "switchToAccount": "Byt till konto {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Nästa konto", - "@nextAccount": {}, - "previousAccount": "Föregående konto", - "@previousAccount": {}, - "emailOrUsername": "Användarnamn eller e-postadress", - "@emailOrUsername": {}, - "addWidget": "Lägg till widget", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Anteckning", - "@widgetEtherpad": {}, - "widgetCustom": "Anpassad", - "@widgetCustom": {}, - "widgetName": "Namn", - "@widgetName": {}, - "widgetUrlError": "Detta är inte en giltig URL.", - "@widgetUrlError": {}, - "errorAddingWidget": "Ett fel uppstod när widgeten skulle läggas till.", - "@errorAddingWidget": {}, - "editWidgets": "Redigera widgetar", - "@editWidgets": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetNameError": "Vänligen ange ett visningsnamn.", - "@widgetNameError": {} -} diff --git a/assets/l10n/intl_ta.arb b/assets/l10n/intl_ta.arb deleted file mode 100644 index 8d75972a1e..0000000000 --- a/assets/l10n/intl_ta.arb +++ /dev/null @@ -1,20 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.826673", - "acceptedTheInvitation": "{username} அழைப்பை ஏற்றுக்கொண்டார்", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "accept": "ஏற்றுக்கொள்", - "@accept": { - "type": "text", - "placeholders": {} - }, - "about": "பற்றி", - "@about": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_tr.arb b/assets/l10n/intl_tr.arb deleted file mode 100644 index c5ca4975b9..0000000000 --- a/assets/l10n/intl_tr.arb +++ /dev/null @@ -1,2892 +0,0 @@ -{ - "@@locale": "tr", - "@@last_modified": "2021-08-14 12:41:09.803728", - "about": "Hakkında", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Kabul et", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} katılma davetini kabul etti", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Hesap", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Hesap bilgileri", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} uçtan uca şifrelemeyi etkinleştirdi", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "E-posta ekle", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "Grup açıklaması ekle", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Yeni arkadaş ekle", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Alana ekle", - "@addToSpace": {}, - "admin": "Yönetici", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "takma ad", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "Tümü", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Tüm sohbetler", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Hesabınız var mı?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} aramayı yanıtladı", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Herkes katılabilir", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "Uygulama kilidi", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "Arşiv", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Arşivlenmiş Oda", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Misafir kullanıcıların katılmasına izin veriliyor mu", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Emin misiniz?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Oturumu açmak istediğinizden emin misiniz?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Anahtarları önbelleğe almak için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Diğer kişiyi imzalayabilmek için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Lütfen oturumunuzu doğrulamak için güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "{username} kişisinden gelen bu doğrulama isteği kabul edilsin mi?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "Duraklat", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Oynat", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "Doğrulama", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Canlandırmalı çıkartmaları ve ifadeleri otomatik olarak oynat", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "avatarHasBeenChanged": "Avatar değiştirildi", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Ana sunucu aşağıdaki oturum açma türlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca aşağıdakileri destekliyor:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "Ana sunucu aşağıdaki Spec sürümlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca {supportedVersions} destekliyor", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "Sohbetten engelle", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Engellendi", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username}, {targetName} kişisini engelledi", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Aygıtı Engelle", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "Engellendi", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Bot mesajları", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Önbelleğe alınan anahtarlar", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "İptal", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "{uri} URI'si açılamıyor", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "changeDeviceName": "Aygıt adını değiştir", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} sohbet avatarını değiştirdi", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} sohbet açıklamasını değiştirdi: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} sohbet adını değiştirdi: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} sohbet izinlerini değiştirdi", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} görünen adını '{displayname}' olarak değiştirdi", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} misafir erişim kurallarını değiştirdi", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} misafir erişim kurallarını değiştirdi: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} geçmiş görünürlüğünü değiştirdi", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} geçmiş görünürlüğünü değiştirdi: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} katılım kurallarını değiştirdi", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} katılım kurallarını değiştirdi: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} avatarını değiştirdi", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} oda takma adlarını değiştirdi", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} davet bağlantısını değiştirdi", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Değişiklikler", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Parolayı değiştir", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Değişiklikler kaydedildi", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Ana sunucuyu değiştir", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Tarzınızı değiştirin", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Grubun adını değiştir", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Sunucuyu değiştir", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Duvar kağıdını değiştir", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Avatarınızı değiştirin", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Şifreleme bozuldu", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Sohbet", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Sohbet yedekleme", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Eski mesajlarınız bir kurtarma anahtarı ile güvence altına alındı. Lütfen kaybetmediğinizden emin olun.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Sohbet ayrıntıları", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Sohbet bu alana eklendi", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "Sohbet bu alandan kaldırıldı", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chats": "Sohbetler", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Güçlü bir parola seçin", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Bir kullanıcı adı seçin", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "Arşivi temizle", - "@clearArchive": {}, - "clearText": "Metni temizle", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "Kapat", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "Verilen kullanıcıyı bu odadan yasaklayın", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "HTML biçimli metin gönderin", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Verilen kullanıcıyı bu odaya davet edin", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Verilen odaya katılın", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Verilen kullanıcıyı bu odadan kaldırın", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Bu odadan ayrılın", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Kendinizi tanımlayın", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Bu oda için resminizi ayarlayın (mxc-uri ile)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Bu oda için görünen adınızı ayarlayın", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Verilen kullanıcının güç seviyesini ayarlayın (öntanımlı: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Biçimlendirilmemiş metin gönderin", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Tepki olarak yanıt gönderin", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Metin gönderin", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Verilen kullanıcının bu odadaki yasağını kaldırın", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Komut geçersiz", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} bir komut değil.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Karşılaştırın ve aşağıdaki emojilerin diğer aygıttaki emojilerle eşleştiğinden emin olun:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Karşılaştırın ve aşağıdaki numaraların diğer aygıttaki numaralarla eşleştiğinden emin olun:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "Sohbeti yapılandır", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "Onayla", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Bağlan", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Bağlantı denemesi başarısız oldu", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kişi gruba davet edildi", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Görünen ad içerir", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Kullanıcı adı içerir", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "İçerik, sunucu yöneticilerine bildirildi", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "İçerik görüntüleyici", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Panoya kopyalandı", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Kopyala", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "Panoya kopyala", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Mesajın şifresi çözülemedi: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Avatar ayarlanamadı", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Görünen ad ayarlanamadı", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} katılımcı", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Oluştur", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Şimdi hesap oluştur", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} sohbeti oluşturdu", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Yeni grup oluştur", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Yeni alan", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Çapraz imzalama kapalı", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Çapraz imzalama açık", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Şu anda etkin", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Koyu", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day} {month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "Bu, kullanıcı hesabınızı devre dışı bırakacak. Bu geri alınamaz! Emin misiniz?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Öntanımlı izin seviyesi", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "Sil", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Hesabı sil", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Mesajı sil", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Reddet", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Aygıt", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Aygıt kimliği", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "Aygıtlar", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Şifreleme yalnızca tüm aygıtlar doğrulandığında güvenlidir.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "Doğrudan Sohbetler", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Resmi at", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "Keşfet", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Grupları keşfet", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Görünen ad değiştirildi", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Bağış", - "@donate": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "İptal et ve bir daha sorma", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Dosyayı indir", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "Düzenle", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Engellenen sunucuları düzenle", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Sohbet izinlerini düzenle", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Görünen adı düzenle", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Jitsi örneğini düzenle", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Oda takma adlarını düzenle", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Oda avatarını düzenle", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "İfade zaten var!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Geçersiz ifade kısa kodu!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Oda için ifade paketleri", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "İfade Ayarları", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "İfade kısa kodu", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Bir ifade kısa kodu ve bir resim seçmeniz gerekiyor!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Boş sohbet", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Sohbetlerinize erişimi asla kaybetmemek için sohbet yedeklemeyi etkinleştirin.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "İfade paketini küresel olarak etkinleştir", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Şifrelemeyi etkinleştir", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Artık şifrelemeyi devre dışı bırakamayacaksınız. Emin misiniz?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Şifreli", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "Şifreleme", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Şifreleme algoritması", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Şifreleme etkinleştirilmedi", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Uçtan uca şifreleme ayarları", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} aramayı sonlandırdı", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Bir grup adı girin", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Bir e-posta adresi girin", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Bir alan adı girin", - "@enterASpacepName": {}, - "enterAUsername": "Bir kullanıcı adı girin", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Ana sunucunuzu girin", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Konum alınırken hata oluştu: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "everythingReady": "Herşey hazır!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "Aşırı rahatsız edici", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "Dosya adı", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Dosya boyutu", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Yazı tipi boyutu", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "İlet", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "Cuma", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "Arkadaşlar", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "Katılmadan", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "Davetten", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "Yeni odaya git", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "Grup", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Grup açıklaması", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Grup açıklaması değiştirildi", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Grup herkese açık", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "Gruplar", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "{displayname} ile grup", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Misafirlere izin verilmiyor", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Misafirler katılabilir", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username}, {targetName} için daveti geri çekti", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Yardım", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "Düzenlenmiş etkinlikleri gizle", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "Bilinmeyen etkinlikleri gizle", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Ana sunucu uyumlu değil", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Bu içerik ne kadar rahatsız edici?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "Kimlik", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Kimlik", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "Yok say", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Yok sayılan kullanıcılar", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "Sizi rahatsız eden kullanıcıları yok sayabilirsiniz. Kişisel yok sayma listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamayacaksınız.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Kullanıcıyı yok say", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Bağlantıya tıkladım", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Yanlış parola veya kurtarma anahtarı", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Rahatsız edici değil", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Geçersiz e-posta", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Kişi davet et", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Kişiyi {groupName} grubuna davet et", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Davet edildi", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username}, {targetName} kişisini davet etti", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Sadece davet edilen kullanıcılar", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Benim için davet et", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} sizi FluffyChat'e davet etti. \n1. FluffyChat kurun: https://fluffychat.im \n2. Kaydolun veya giriş yapın \n3. Davet bağlantısını açın: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Aşağıdaki aygıt anahtarı doğru mu?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "yazıyor…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} sohbete katıldı", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "Odaya katıl", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "Anahtarlar önbelleğe alındı", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Anahtarlar eksik", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}, {targetName} kişisini attı", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username}, {targetName} kişisini attı ve engelledi", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Sohbetten at", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Son görülen: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Son görülen IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Uzun zaman önce görüldü", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Ayrıl", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Sohbetten ayrıldı", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Lisans", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Açık", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "{count} katılımcı daha yükle", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Yükleniyor… Lütfen bekleyin.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Daha fazla yükle…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Konum hizmetleri devre dışı. Lütfen konumunuzu paylaşabilmek için etkinleştirin.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Konum izni reddedildi. Lütfen konumunuzu paylaşabilmek için izin verin.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "login": "Oturum aç", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "{homeserver} üzerinde oturum aç", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "{brand} ile oturum aç", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "Oturumu kapat", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Moderatör yap", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Yönetici yap", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Tanımlayıcının geçerli olduğundan emin olun", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Üye değişiklikleri", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "Bahset", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "Mesajlar", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Mesaj tüm katılımcılar için kaldırılacak", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Moderatör", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Pazartesi", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 etkinlik daha} other{{count} etkinlik daha}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "Sohbeti sessize al", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Uçtan uca şifreleme kullanmak için şimdilik Pantalaimon'a ihtiyacınız olduğunu lütfen unutmayın.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "Yeni sohbet", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "FluffyChat'te yeni mesaj", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Yeni doğrulama isteği!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "İleri", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "Hayır", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Sunucuyla bağlantı yok", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat şu anda çapraz imzalamanın etkinleştirilmesini desteklemiyor. Lütfen bunu Element içinden etkinleştirin.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Açıklama yok", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "İfade bulunamadı. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Şifrelemeyi yalnızca oda artık herkese açık olmadığında etkinleştirebilirsiniz.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Görünüşe göre telefonunuzda Google hizmetleri yok. Bu, gizliliğiniz için iyi bir karar! FluffyChat'te anlık bildirimler almak için https://microg.org/ veya https://unifiedpush.org/ kullanmanızı tavsiye ediyoruz.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} matrix sunucusu değil, onun yerine {server2} kullanılsın mı?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "noMegolmBootstrap": "Lütfen bunun yerine Element içinden çevrim içi anahtar yedeklemeyi açın.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Yok", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Henüz parolanızı kurtarmak için bir yol eklemediniz.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "İzin yok", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "Herkese açık oda bulunamadı…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Oda bulunamadı…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Şimdiye kadar hiçbir durum bulunamadı.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "Bildirimler", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Bu hesap için bildirimler etkinleştirildi", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Web'de desteklenmiyor", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} seçildi", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} kullanıcı yazıyor…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "obtainingLocation": "Konum alınıyor…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Rahatsız edici", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Çevrim dışı", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "Tamam", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "Çevrim içi", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Çevrim içi anahtar yedekleme devre dışı bırakıldı", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Çevrim içi anahtar yedekleme etkinleştirildi", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Tüh! Maalesef anlık bildirimlerini ayarlarken bir hata oluştu.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Tüh, bir şeyler yanlış gitti…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Mesajları okumak için uygulamayı aç", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Kamerayı aç", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "Haritalarda aç", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(İsteğe bağlı) E-posta adresiniz", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(İsteğe bağlı) Grup adı", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "Veya", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "Katılımcı", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Katılan kullanıcı aygıtları", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "parola veya kurtarma anahtarı", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Parola", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Parola unutuldu", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Parola değiştirildi", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Parola kurtarma", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "İnsanlar", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Bir resim seç", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "Sabitle", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "{fileName} dosyasını oynat", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "Lütfen seçin", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Lütfen bir geçiş kodu seçin", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "Lütfen bir kullanıcı adı seçin", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Lütfen e-postadaki bağlantıya tıklayın ve devam edin.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Lütfen 4 basamak girin veya uygulama kilidini devre dışı bırakmak için boş bırakın.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Lütfen bir Matrix kimliği girin.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Lütfen güvenlik anahtarınızı girin:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Lütfen parolanızı girin", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Lütfen PIN kodunuzu girin", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Lütfen kullanıcı adınızı girin", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Lütfen web sitesindeki talimatları izleyin ve \"İleri\" düğmesine dokunun.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "Gizlilik", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "Herkese Açık Gruplar", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Ortak Anahtar", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Herkese Açık Odalar", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Herkese açık alan", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Gönderme kuralları", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "Neden", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "Kaydediliyor", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} bir etkinliği düzenledi", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "Mesajı düzenle", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Kaydol", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "Reddet", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} daveti reddetti", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Yeniden katıl", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Kaldır", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Diğer tüm aygıtları kaldır", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "{username} tarafından kaldırıldı", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Aygıtı kaldır", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Sohbet engelini kaldır", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Mesajı kaldır", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Avatarınızı kaldırın", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Zengin mesaj içeriğini görüntüle", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Odayı yeni sürümle değiştir", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "Yanıtla", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Mesajı bildir", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "İzin iste", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Eski mesajları okumayı iste", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Tüm izinleri iptal et", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Oda yükseltildi", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "Oda sürümü", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "Cumartesi", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "Dosya {filename} olarak kaydedildi", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "Dosyayı kaydet", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Dosyayı bu klasöre kaydet", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "Ara", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Sohbet ara", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "Güvenlik", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Güvenlik anahtarı", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Güvenlik anahtarı kayıp mı?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username} tarafından görüldü", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{{username} ve {count} diğerleri tarafından görüldü}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username} ve {username2} tarafından görüldü", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Gönder", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Bir mesaj gönder", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Metin olarak gönder", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "Ses gönder", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "sentry.io ile hata raporları göndermeye izin ver", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Dosya gönder", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Resim gönder", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Mesaj gönder", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Orijinali gönder", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Çıkartma gönder", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Video gönder", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} bir dosya gönderdi", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} bir ses gönderdi", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} bir resim gönderdi", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} bir çıkartma gönderdi", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} bir video gönderdi", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} arama bilgilerini gönderdi", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "Gizliliğiniz hakkında bilgiler: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "Oturum doğrulandı", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Profil fotoğrafı ayarla", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Ana takma ad olarak ayarla", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Özel ifadeler ayarla", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Grup açıklaması ayarla", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Davet bağlantısı ayarla", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "İzin seviyesini ayarla", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Durumu ayarla", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Ayarlar", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Paylaş", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} konumunu paylaştı", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "shareLocation": "Konumu paylaş", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Parolayı göster", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "Hesap oluştur", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Tek oturum açma", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "Atla", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Ses, titreşim, LED rengi", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Kaynak kodları", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Alan herkese açık", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Alan adı", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} bir arama başlattı", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "Hemen ilk sohbetinize başlayın! 🙂\n- 'Yeni sohbet' düğmesine dokunun\n- Bir arkadaşınızın QR kodunu tarayın\n- Eğlenceli bir şekilde sohbet edin", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "Durum", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Bugün nasılsınız?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Gönder", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Pazar", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Eşzamanlanıyor… Lütfen bekleyin.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Sistem", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Doğrulamak için bir aygıta dokunun", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "Resmi göstermek için dokunun", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Menüyü göstermek için dokunun", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Eşleşmediler", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Eşleştiler", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Bu oda arşivlendi.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Perşembe", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "Sık Kullanılanlara Ekle/Çıkar", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "Sessize Al/Sessizden Çıkar", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Okundu/Okunmadı Olarak İşaretle", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Çok fazla istek. Lütfen daha sonra tekrar deneyin!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Başka bir aygıttan aktar", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Tekrar göndermeyi deneyin", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Salı", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Yok", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username}, {targetName} kişisinin engelini kaldırdı", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Aygıtın Engellemesini Kaldır", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Bilinmeyen aygıt", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Bilinmeyen şifreleme algoritması", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Bilinmeyen etkinlik '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Bilinmeyen oturum, lütfen doğrulayın", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "Sohbet yedeklemesinin kilidini aç", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Sohbeti sessizden çıkar", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "Sabitlemeyi kaldır", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 okunmamış sohbet} other{{unreadCount} okunmamış sohbet}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 okunmamış mesaj} other{{unreadEvents} okunmamış mesaj}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "AMOLED ile uyumlu renkler kullanılsın mı?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} ve {count} diğer kişi yazıyor…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} ve {username2} yazıyor…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} yazıyor…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} sohbetten ayrıldı", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Kullanıcı adı", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Kullanıcı doğrulanmadı", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} bir {type} etkinliği gönderdi", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "Kullanıcının bilinmeyen bir doğrulama durumu var", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Kullanıcı doğrulandı", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "Doğrulandı", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "Oturum başarıyla doğrulandı!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Doğrula", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Manuel Olarak Doğrula", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Doğrulamayı Başlat", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Başarıyla doğrulandı!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Diğer hesap doğrulanıyor", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Kullanıcıyı Doğrula", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Görüntülü arama", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Sohbet geçmişi görünürlüğü", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Tüm katılımcılar için görünür", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Herkes için görünür", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Sesli mesaj", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Ortağın isteği kabul etmesi bekleniyor…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Ortağın emojiyi kabul etmesi bekleniyor…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Ortağın numaraları kabul etmesi bekleniyor…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Duvar kağıdı", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "Uyarı!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Uçtan uca şifreleme şimdilik Beta aşamasında! Risk alarak kullanın!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Çarşamba", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Matrix ağındaki en şirin anlık mesajlaşma uygulamasına hoş geldiniz.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Size bir e-posta gönderdik", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Kim hangi eylemi gerçekleştirebilir", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Bu gruba kimler katılabilir", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Bunu neden bildirmek istiyorsunuz?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Yeni bir kurtarma anahtarı oluşturmak için sohbet yedeğiniz silinsin mi?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Bu adresler ile parolanızı kurtarabilirsiniz.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Bir mesaj yaz…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Evet", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Sen", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Sohbete davet edildiniz", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Artık bu sohbette katılımcı değilsiniz", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Kendinizi davet edemezsiniz", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Bu sohbetten engellendiniz", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "Sohbetleriniz eşzamanlanıyor…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Kullanıcı adınız", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Ortak anahtarınız", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "{homeserver} sunucusuna bağlanacaksınız", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "Yakınlaştır", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Uzaklaştır", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "scanQrCode": "QR kodunu tarayın", - "@scanQrCode": {}, - "typeInInviteLinkManually": "Davet bağlantısını el ile yazın...", - "@typeInInviteLinkManually": {}, - "shareYourInviteLink": "Davet bağlantınızı paylaşın", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Sadece QR kodunu tarayın veya yan yana değilseniz davet bağlantınızı paylaşın.", - "@createNewChatExplaination": {}, - "sendOnEnter": "Enter tuşu ile gönder", - "@sendOnEnter": {}, - "homeserver": "Ana sunucu", - "@homeserver": {}, - "serverRequiresEmail": "Bu sunucunun kayıt için e-posta adresinizi doğrulaması gerekiyor.", - "@serverRequiresEmail": {}, - "newUsernameDescription": "Kullanıcı kimliğiniz @kullanıcıadı:sunucuadı biçiminde olacaktır.", - "@newUsernameDescription": {}, - "newPasswordDescription": "Parolanızı kurtarabilmek için daha sonra hesabınıza bir e-posta adresi eklemelisiniz.", - "@newPasswordDescription": {}, - "enableMultiAccounts": "(BETA) Bu aygıtta çoklu hesapları etkinleştir", - "@enableMultiAccounts": {}, - "bundleName": "Paket adı", - "@bundleName": {}, - "removeFromBundle": "Bu paketten kaldır", - "@removeFromBundle": {}, - "addToBundle": "Pakete ekle", - "@addToBundle": {}, - "editBundlesForAccount": "Bu hesap için paketleri düzenle", - "@editBundlesForAccount": {}, - "addAccount": "Hesap ekle", - "@addAccount": {}, - "oneClientLoggedOut": "İstemcilerinizden birinin oturumu kapatıldı", - "@oneClientLoggedOut": {}, - "link": "Bağlantı", - "@link": {}, - "setupChatBackup": "Sohbet yedeklemeyi ayarla", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Anahtarı yazdım", - "@iWroteDownTheKey": {}, - "yourChatBackupHasBeenSetUp": "Sohbet yedeklemeniz ayarlandı.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "Mesajlarınızı korumak için sizin için bir kurtarma anahtarı oluşturduk.\nLütfen bunu parola yöneticisi gibi güvenli bir yerde saklayın.", - "@setupChatBackupDescription": {}, - "unverified": "Doğrulanmadı", - "@unverified": {}, - "yourUserId": "Kullanıcı kimliğiniz:", - "@yourUserId": {}, - "repeatPassword": "Parolayı tekrarlayın", - "@repeatPassword": {}, - "passwordsDoNotMatch": "Parolalar eşleşmiyor!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "Lütfen geçerli bir e-posta adresi girin.", - "@pleaseEnterValidEmail": {}, - "pleaseChooseAtLeastChars": "Lütfen en az {min} karakter seçin.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageInfo": "Mesaj bilgileri", - "@messageInfo": {}, - "time": "Zaman", - "@time": {}, - "messageType": "Mesaj Türü", - "@messageType": {}, - "sender": "Gönderen", - "@sender": {}, - "openGallery": "Galeriyi aç", - "@openGallery": {}, - "removeFromSpace": "Alandan kaldır", - "@removeFromSpace": {}, - "addToSpaceDescription": "Bu sohbeti eklemek için bir alan seçin.", - "@addToSpaceDescription": {}, - "removeFromSpaceDescription": "Bu, sohbeti geçerli alandan kaldırır. Daha sonra \"Tüm sohbetler\" altında görünmeye devam edecektir.", - "@removeFromSpaceDescription": {}, - "loginWithOneClick": "Tek tıklamayla oturum aç", - "@loginWithOneClick": {}, - "start": "Başla", - "@start": {}, - "setupChatBackupNow": "Sohbet yedeklemenizi şimdi ayarlayın", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Sohbet yedeklemenizin kilidini açmak için lütfen önceki bir oturumda oluşturulan güvenlik anahtarınızı girin. Güvenlik anahtarınız parolanız DEĞİLDİR.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Güvenlik anahtarını şimdi kaydet", - "@saveTheSecurityKeyNow": {}, - "commandHint_clearcache": "Önbelleği temizleyin", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_dm": "Doğrudan sohbet başlatın\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_create": "Boş bir grup sohbeti oluşturun\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Oturumu silin", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "openVideoCamera": "Bir video için kamerayı aç", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "Hikayeye ekle", - "@addToStory": {}, - "publish": "Yayınla", - "@publish": {}, - "whoCanSeeMyStories": "Hikayelerimi kimler görebilir?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Hikayelerin aboneliğini iptal et", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Bu kullanıcı henüz hikayesinde hiçbir şey yayınlamadı", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Senin hikayen", - "@yourStory": {}, - "replyHasBeenSent": "Yanıt gönderildi", - "@replyHasBeenSent": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "{date} tarihinden hikaye: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "İnsanların hikayenizde birbirlerini görebileceğini ve iletişim kurabileceğini lütfen unutmayın.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Ne oluyor?", - "@whatIsGoingOn": {}, - "addDescription": "Açıklama ekle", - "@addDescription": {}, - "bubbleSize": "Baloncuk boyutu", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Anladım", - "@iUnderstand": {}, - "storyPrivacyWarning": "İnsanların hikayenizde birbirlerini görebileceğini ve iletişim kurabileceğini lütfen unutmayın. Hikayeleriniz 24 saat boyunca görünür olacaktır ancak tüm aygıtlardan ve sunuculardan silineceklerinin garantisi yoktur.", - "@storyPrivacyWarning": {}, - "dismiss": "Kapat", - "@dismiss": {}, - "markAsRead": "Okundu olarak işaretle", - "@markAsRead": {}, - "reportUser": "Kullanıcıyı bildir", - "@reportUser": {}, - "openChat": "Sohbeti Aç", - "@openChat": {}, - "matrixWidgets": "Matrix Widget'ları", - "@matrixWidgets": {}, - "integrationsNotImplemented": "Widget'lar ve bütünleşmeler henüz düzenlenemiyor.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Widget'ları ve bütünleşmeleri düzenle", - "@editIntegrations": {}, - "reactedWith": "{sender}, {reaction} ile tepki verdi", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Emojiler", - "@emojis": {}, - "placeCall": "Arama yap", - "@placeCall": {}, - "voiceCall": "Sesli arama", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Desteklenmeyen Android sürümü", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "Bu özellik daha yeni bir Android sürümü gerektiriyor. Lütfen güncellemelere veya LineageOS desteğine bakın.", - "@unsupportedAndroidVersionLong": {}, - "pinMessage": "Odaya sabitle", - "@pinMessage": {}, - "pinnedEventsError": "Sabitlenmiş mesajlar yüklenirken hata oluştu", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Etkinliğin sabitlemesini kalıcı olarak kaldırmak istediğinizden emin misiniz?", - "@confirmEventUnpin": {}, - "videoCallsBetaWarning": "Görüntülü aramaların şu anda beta aşamasında olduğunu lütfen unutmayın. Tüm platformlarda beklendiği gibi veya hiç çalışmayabilirler.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Deneysel görüntülü aramalar", - "@experimentalVideoCalls": {}, - "emailOrUsername": "E-posta veya kullanıcı adı", - "@emailOrUsername": {}, - "switchToAccount": "{number}. hesaba geç", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Sonraki hesap", - "@nextAccount": {}, - "previousAccount": "Önceki hesap", - "@previousAccount": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Özel", - "@widgetCustom": {}, - "widgetUrlError": "Bu geçerli bir URL değil.", - "@widgetUrlError": {}, - "widgetNameError": "Lütfen görünecek bir ad girin.", - "@widgetNameError": {}, - "errorAddingWidget": "Widget eklenirken hata oluştu.", - "@errorAddingWidget": {}, - "editWidgets": "Widget'ları düzenle", - "@editWidgets": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "addWidget": "Widget ekle", - "@addWidget": {}, - "widgetEtherpad": "Metin notu", - "@widgetEtherpad": {}, - "widgetName": "Ad", - "@widgetName": {}, - "separateChatTypes": "Doğrudan Sohbetleri, Grupları ve Alanları Ayır", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Alanlarda ilgili Doğrudan Sohbetleri göster", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youJoinedTheChat": "Sohbete katıldınız", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "Daveti kabul ettiniz", - "@youAcceptedTheInvitation": {}, - "youKickedAndBanned": "{user} kullanıcısını attınız ve yasakladınız", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "{user} kullanıcısının yasağını kaldırdınız", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "{user} kullanıcısını attınız", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youRejectedTheInvitation": "Daveti reddettiniz", - "@youRejectedTheInvitation": {}, - "youHaveWithdrawnTheInvitationFor": "{user} için daveti geri çektiniz", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "{user} tarafından davet edildiniz", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "{user} kullanıcısını davet ettiniz", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youBannedUser": "{user} kullanıcısını yasakladınız", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "Alanlar listesini göster", - "@showSpaces": {}, - "noEmailWarning": "Lütfen geçerli bir e-posta adresi girin. Aksi takdirde parolanızı sıfırlayamazsınız. İstemiyorsanız, devam etmek için düğmeye tekrar dokunun.", - "@noEmailWarning": {}, - "storeInAppleKeyChain": "Apple KeyChain'de sakla", - "@storeInAppleKeyChain": {}, - "pleaseEnterRecoveryKey": "Lütfen kurtarma anahtarınızı girin:", - "@pleaseEnterRecoveryKey": {}, - "recoveryKeyLost": "Kurtarma anahtarı kayıp mı?", - "@recoveryKeyLost": {}, - "pleaseEnterRecoveryKeyDescription": "Eski mesajlarınızın kilidini açmak için lütfen önceki bir oturumda oluşturulan kurtarma anahtarınızı girin. Kurtarma anahtarınız parolanız DEĞİLDİR.", - "@pleaseEnterRecoveryKeyDescription": {}, - "users": "Kullanıcılar", - "@users": {}, - "storeInSecureStorageDescription": "Kurtarma anahtarını bu aygıtın güvenli deposunda saklayın.", - "@storeInSecureStorageDescription": {}, - "enableAutoBackups": "Otomatik yedeklemeleri etkinleştir", - "@enableAutoBackups": {}, - "recoveryKey": "Kurtarma anahtarı", - "@recoveryKey": {}, - "saveTheRecoveryKeyNow": "Kurtarma anahtarını şimdi kaydet", - "@saveTheRecoveryKeyNow": {}, - "stories": "Hikayeler", - "@stories": {}, - "storeInAndroidKeystore": "Android KeyStore'da sakla", - "@storeInAndroidKeystore": {}, - "unlockOldMessages": "Eski mesajların kilidini aç", - "@unlockOldMessages": {}, - "saveKeyManuallyDescription": "Sistem paylaşımı iletişim kutusunu veya panoyu tetikleyerek bu anahtarı elle kaydedin.", - "@saveKeyManuallyDescription": {}, - "storeSecurlyOnThisDevice": "Bu aygıtta güvenli bir şekilde sakla", - "@storeSecurlyOnThisDevice": {} -} diff --git a/assets/l10n/intl_uk.arb b/assets/l10n/intl_uk.arb deleted file mode 100644 index 35b53f8104..0000000000 --- a/assets/l10n/intl_uk.arb +++ /dev/null @@ -1,2887 +0,0 @@ -{ - "@@locale": "uk", - "@@last_modified": "2021-08-14 12:41:09.790615", - "about": "Про застосунок", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Прийняти", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} приймає запрошення", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Обліковий запис", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Інформація про обліковий запис", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} активує наскрізне шифрування", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Додати опис групи", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Адміністратор", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "псевдонім", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Уже маєте обліковий запис?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} відповідає на виклик", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Будь-хто може приєднатись", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Архів", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Заархівована кімната", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Чи дозволено гостям приєднуватись", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Ви впевнені?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Введіть свою парольну фразу або ключ відновлення для кешування ключів.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "Для підпису ключа іншого користувача введіть свою парольну фразу або ключ відновлення.", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "Введіть свою парольну фразу або ключ відновлення для підтвердження сеансу.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Прийняти цей запит на підтвердження від {username}?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "authentication": "Автентифікація", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "Аватар змінено", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Заблокувати в бесіді", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "Заблоковано", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} блокує {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "Заблокувати пристрій", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Ключі кешовано", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "Скасувати", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} змінює аватар бесіди", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} змінює опис бесіди на: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} змінює назву бесіди на: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} змінює права доступу бесіди", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} змінює показуване ім'я на: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} змінює правила гостьового доступу", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} змінює правила гостьового доступу на: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} змінює видимість історії", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} змінює видимість історії на: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} змінює правила приєднання", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} змінює правила приєднання на: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} змінює аватар", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} змінює псевдоніми кімнати", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} змінює посилання для запрошення", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "Журнал змін", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Змінити домашній сервер", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "Змінити стиль", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Змінити назву групи", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Змінити сервер", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Змінити тло", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Шифрування було пошкоджено", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "Бесіда", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Подробиці бесіди", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Виберіть надійний пароль", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Виберіть ім'я користувача", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "close": "Закрити", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "Порівняйте і переконайтесь, що показані емодзі збігаються емодзі на іншому пристрої:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "Порівняйте і переконайтесь, що вказані числа збігаються з числами на іншому пристрої:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "confirm": "Підтвердити", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "Під'єднатись", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Не вдалося під'єднатися", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Контакт був запрошений в групу", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "Переглядач вмісту", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "Скопійовано в буфер обміну", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "Копіювати", - "@copy": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Помилка розшифрування повідомлення: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "Помилка встановлення аватара", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "Помилка встановлення показуваного імені", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "Учасників: {count}", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "Створити", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "Створити обліковий запис зараз", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} створює бесіду", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "Створити нову групу", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "Перехресне підписування вимкнено", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "Перехресне підписування увімкнено", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "Зараз у мережі", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "Темний", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{timeOfDay}, {date}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "delete": "Видалити", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Видалити повідомлення", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "Відхилити", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "Пристрій", - "@device": { - "type": "text", - "placeholders": {} - }, - "devices": "Пристрої", - "@devices": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Видалити зображення", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Показуване ім'я було змінено", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "Підтримати", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Завантажити файл", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Змінити показуване ім'я", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "Редагувати сервер Jitsi", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "Емодзі вже існує!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "Неприпустимий короткий код емодзі!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Налаштування емодзі", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "Короткий код для емодзі", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Укажіть короткий код емодзі та зображення!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "Порожня бесіда", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "Ви більше не зможете вимкнути шифрування. Ви впевнені?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encryption": "Шифрування", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "Алгоритм шифрування", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "Шифрування вимкнено", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "Налаштування наскрізного шифрування", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} завершує виклик", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "Введіть назву групи", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "Введіть ім'я користувача", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "Введіть адресу домашнього сервера", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "fileName": "Назва файлу", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "Розмір файлу", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "forward": "Переслати", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "П'ятниця", - "@friday": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "З моменту приєднання", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "З моменту запрошення", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "Група", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "Опис групи", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "Опис групи було змінено", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "Загальнодоступна група", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groupWith": "Група з {displayname}", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "Гості не можуть приєднуватись", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "Гості можуть приєднуватись", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} відкликає запрошення для {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "Довідка", - "@help": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "Домашній сервер не сумісний", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "Ідентифікація", - "@identity": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Неправильна парольна фраза або ключ відновлення", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "Запросити контакт", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "Запросити контакт до {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "Запрошено", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} запрошує {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "Лише запрошені користувачі", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} запрошує вас у FluffyChat. \n1. Установіть FluffyChat: http://fluffychat.im \n2. Зареєструйтесь або увійдіть \n3. Відкрийте запрошувальне посилання: {link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "Чи правильний цей ключ пристрою?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "пише…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} приєднується до бесіди", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "keysCached": "Ключі кешовано", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "Немає ключів", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} вилучає {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} вилучає та блокує {targetName}", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "Вилучити з бесіди", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "Остання активність: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "Остання IP-адреса входу", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "Давно не було в мережі", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "Вийти", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "Виходить з бесіди", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "Ліцензія", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "Світлий", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "Завантажити ще {count} учасників", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "Завантаження… Будь ласка, зачекайте.", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "Завантажити ще…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "Увійти", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "Увійти до {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "Вийти", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "Призначити модератором", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "Призначити адміністратором", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "Переконайтеся, що ідентифікатор дійсний", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "Повідомлення буде вилучено для всіх учасників", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "Модератор", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "Понеділок", - "@monday": { - "type": "text", - "placeholders": {} - }, - "muteChat": "Вимкнути сповіщення", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "Майте на увазі, що на цей час вам потрібен Pantalaimon, щоб використовувати наскрізне шифрування.", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "Нове повідомлення у FluffyChat", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "Новий запит перевірки!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat зараз не підтримує увімкнення перехресного підписування. Увімкніть його з Element.", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "Емоджі не знайдено. 😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "Схоже, на вашому телефоні немає служб Google. Це гарне рішення для вашої приватності! Щоб отримувати push-сповіщення у FluffyChat, ми радимо використовувати https://microg.org/ або https://unifiedpush.org/.", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "Замість цього увімкніть резервне копіювання онлайн-ключів з Element.", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "Нічого", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPermission": "Немає прав доступу", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "Кімнат не знайдено…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "Не підтримується вебверсією", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "Вибрано {number}", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "ok": "Гаразд", - "@ok": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "Резервне онлайн-копіювання ключів вимкнено", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Резервне онлайн-копіювання ключів увімкнено", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Халепа, щось пішло не так…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "Відкрийте застосунок читання повідомлень", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "Відкрити камеру", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(Необов’язково) Назва групи", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "Пристрої користувачів-учасників", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "парольна фраза або ключ відновлення", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "Пароль", - "@password": { - "type": "text", - "placeholders": {} - }, - "pickImage": "Вибрати зображення", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "play": "Відтворити {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAUsername": "Виберіть ім'я користувача", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "Введіть Matrix ID.", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Введіть свій пароль", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Введіть своє ім'я користувача", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "Загальнодоступні кімнати", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "recording": "Запис", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} змінює подію", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "reject": "Відхилити", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} відхиляє запрошення", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "Приєднатися знову", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "Вилучити", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "Вилучити всі інші пристрої", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "Вилучено користувачем {username}", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "Вилучити пристрій", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "Розблокувати у бесіді", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "Вилучити повідомлення", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "Показувати форматований вміст повідомлення", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "reply": "Відповісти", - "@reply": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "Запит дозволу", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "Запит на читання давніших повідомлень", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "Відкликати всі дозволи", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Кімнату було оновлено", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "Субота", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "Пошук бесіди", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "Переглянуто {username}", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndUser": "Переглянули {username} і {username2}", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "Надіслати", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "Надіслати повідомлення", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendFile": "Надіслати файл", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "Надіслати зображення", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} надсилає файл", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} надсилає аудіо", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} надсилає зображення", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} надсилає наліпку", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} надсилає відео", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sessionVerified": "Сеанс звірено", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "Додати зображення профілю", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "Додати опис групи", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "Указати посилання для запрошення", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setStatus": "Указати статус", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "Налаштування", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "Поділитися", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} ділиться своїм місцеперебуванням", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "signUp": "Зареєструватися", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "Пропустити", - "@skip": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "Джерельний код", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startYourFirstChat": "Почніть свою першу бесіду просто зараз! 🙂\n- Торкніться «Нова бесіда»\n- Скануйте QR-код друга\n- Отримуйте задоволення від спілкування", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "Як справи сьогодні?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "Надіслати", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "Неділя", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "Системна", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "Торкніться, щоб відкрити меню", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "Вони відрізняються", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "Вони збігаються", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "Цю кімнату було заархівовано.", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "Четвер", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{hours12}:{minutes} {suffix}", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "Спробуйте надіслати ще раз", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "Вівторок", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} розблоковує {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "Розблокувати пристрій", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "Невідомий пристрій", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Невідомий алгоритм шифрування", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "Невідома подія '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "Невідомий сеанс, будь ласка, перевірте", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "Увімкнути сповіщення", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "useAmoledTheme": "Використовувати сумісні з AMOLED кольори?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} та {count} інших пишуть…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} і {username2} пишуть…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} пише…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} виходить з бесіди", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "Ім'я користувача", - "@username": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} надсилає подію {type}", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "verifiedSession": "Сеанс успішно перевірено!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "Перевірити", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "Перевірити вручну", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "Почати перевірку", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "Ви успішно перевірені!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "Перевірка іншого облікового запису", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "Перевірити користувача", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "Відеовиклик", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Видимість історії бесіди", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "Видима для всіх учасників", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "Видима для всіх", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "Голосове повідомлення", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Очікування прийняття запиту партнером…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "Очікування прийняття емоджі партнером…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "Очікування прийняття чисел партнером…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "Тло", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "Наскрізне шифрування наразі в бета-версії! Користуйтеся на свій страх і ризик!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "Середа", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "Ласкаво просимо до найсимпатичнішого месенджера в мережі Matrix.", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Кому дозволено приєднуватися до цієї групи", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "Написати повідомлення…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "Так", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "Ви", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "Вас запрошують до цієї бесіди", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Ви більше не берете участь у цій бесіді", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "Ви не можете запросити себе", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Ви були заблоковані у цій бесіді", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "Ваше власне ім'я користувача", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "pushRules": "Правила сповіщень", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Сповіщення ввімкнені для цього облікового запису", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notifications": "Сповіщення", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "Зміни учасників", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "Запрошення для мене", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "Введіть адресу е-пошти", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "encrypted": "Зашифровано", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "Увімкнути пакунок емоджі глобально", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "Набори емоджі для кімнати", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "edit": "Редагувати", - "@edit": { - "type": "text", - "placeholders": {} - }, - "directChats": "Особисті бесіди", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "deviceId": "ID пристрою", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Видалити обліковий запис", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deactivateAccountWarning": "Це деактивує ваш обліковий запис. Це неможливо скасувати! Ви впевнені?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "Містить ім’я користувача", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "Містить показуване ім’я", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Змінити пароль", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "Змінити назву пристрою", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "botMessages": "Повідомлення ботів", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "or": "Або", - "@or": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "Установити основним псевдонімом", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "verified": "Перевірений", - "@verified": { - "type": "text", - "placeholders": {} - }, - "blocked": "Заблоковано", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "no": "Ні", - "@no": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "Надсилати натисканням Enter", - "@sendOnEnter": {}, - "commandHint_ban": "Заблокувати цього користувача кімнати", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_kick": "Вилучити цього користувача з цієї кімнати", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_myroomavatar": "Встановіть зображення для цієї кімнати (від mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Укажіть показуване ім'я для цієї кімнати", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandMissing": "{command} не є командою.", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "copyToClipboard": "Копіювати до буфера обміну", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "Новий простір", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "Увімкнути шифрування", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enterASpacepName": "Введіть назву простору", - "@enterASpacepName": {}, - "ignoreListDescription": "Ви можете нехтувати користувачів, які вас турбують. Ви не зможете отримувати повідомлення або запрошення в кімнату від користувачів у вашому особистому списку нехтування.", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "Неприпустима е-пошта", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "joinRoom": "Приєднатися до кімнати", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "mention": "Згадати", - "@mention": { - "type": "text", - "placeholders": {} - }, - "next": "Далі", - "@next": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "Немає з'єднання з сервером", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "shareYourInviteLink": "Поділіться своїм посиланням запрошення", - "@shareYourInviteLink": {}, - "createNewChatExplaination": "Просто зіскануйте QR-код або поділіться посиланням на запрошення, якщо ви не поруч один з одним.", - "@createNewChatExplaination": {}, - "typeInInviteLinkManually": "Введіть посилання запрошення власноруч...", - "@typeInInviteLinkManually": {}, - "scanQrCode": "Сканувати QR-код", - "@scanQrCode": {}, - "noPasswordRecoveryDescription": "Ви ще не додали спосіб відновлення пароля.", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "numUsersTyping": "{count} користувачів пишуть…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "online": "Онлайн", - "@online": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "Дідько! На жаль, сталася помилка під час налаштування push-сповіщень.", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "Забули пароль", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "pleaseChoose": "Виберіть", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "Введіть 4 цифри або залиште порожнім, щоб вимкнути блокування застосунку.", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "redactMessage": "Редагувати повідомлення", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "Зареєструватися", - "@register": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "Поскаржитися на повідомлення", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Ключ безпеки", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Замінити кімнату новішою версією", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "Надіслати аудіо", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "Установити користувацькі емоджі", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Торкніться пристрою, щоб перевірити", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "userUnknownVerification": "Користувач має невідомий стан перевірки", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "Ми надіслали вам електронний лист", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "Стерти резервну копію бесіди, щоб створити новий ключ відновлення?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Збільшити", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "Додати простір", - "@addToSpace": {}, - "roomVersion": "Версія кімнати", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "Редагувати дозволи бесіди", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "Мною виконано перехід за посиланням", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "sentryInfo": "Відомості про вашу приватність: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "Зміни збережено", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "Огляд груп", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} розпочинає виклик", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "appLock": "Блокування застосунку", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "dontAskAgain": "Скасувати та не запитувати знову", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "commandInvalid": "Неприпустима команда", - "@commandInvalid": { - "type": "text" - }, - "extremeOffensive": "Украй образливий", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Наскільки образливий цей вміст?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "participant": "Учасник", - "@participant": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Додати е-пошту", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "ignore": "Нехтувати", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "fontSize": "Розмір шрифту", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "clearText": "Очистити текст", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "Додати нового друга", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Домашній сервер підтримує такі версії специфікацій:\n{serverVersions}\nАле цей застосунок підтримує лише {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "areYouSureYouWantToLogout": "Ви впевнені, що хочете вийти?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "Домашній сервер підтримує такі типи входу:\n{serverVersions}\nАле цей застосунок підтримує лише:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "all": "Усі", - "@all": { - "type": "text", - "placeholders": {} - }, - "allChats": "Усі бесіди", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "commandHint_join": "Приєднатися до цієї кімнати", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "chats": "Бесіди", - "@chats": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "Змінити аватар", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "link": "Посилання", - "@link": {}, - "security": "Безпека", - "@security": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "Надіслати наліпку", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Ключ безпеки втрачено?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUserAndCountOthers": "{count, plural, other{Переглянули {username} і {count} інших}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "tapToShowImage": "Торкніться, щоб показати зображення", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "Помилка під час отримання розташування: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "hideRedactedEvents": "Сховати змінені події", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "Синхронізація… Будь ласка, зачекайте.", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPause": "Пауза", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "Відтворити", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "noDescription": "Без опису", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} не є сервером matrix, використовувати {server2} натомість?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "reason": "Причина", - "@reason": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "Типовий рівень дозволів", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "Надіслати як текст", - "@sendAsText": { - "type": "text" - }, - "saveFile": "Зберегти файл", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "autoplayImages": "Автоматично відтворювати анімовані наліпки та емоджі", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "savedFileAs": "Файл збережено як {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "pleaseChooseAPasscode": "Виберіть код доступу", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "Натисніть на посилання в електронному листі, а потім продовжуйте.", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "Позначити прочитаним/непрочитаним", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Перенесення з іншого пристрою", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "Надсилати повідомлення", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "Надіслати оригінал", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Хто і яку дію може виконувати", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Чому ви хочете поскаржитися?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "messages": "Повідомлення", - "@messages": { - "type": "text", - "placeholders": {} - }, - "newChat": "Нова бесіда", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Усе готово!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "friends": "Друзі", - "@friends": { - "type": "text", - "placeholders": {} - }, - "homeserver": "Домашній сервер", - "@homeserver": {}, - "goToTheNewRoom": "Перейти до нової кімнати", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "groups": "Групи", - "@groups": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "Необразливий", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Активувати шифрування можна лише тоді, коли кімната більше не буде загальнодоступною.", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenRemovedFromThisSpace": "Бесіду видалено з цього простору", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Бесіду додано до цього простору", - "@chatHasBeenAddedToThisSpace": {}, - "chatBackupDescription": "Ваші старі повідомлення захищені ключем відновлення. Переконайтеся, що ви не втратите його.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Резервне копіювання бесіди", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "Резервне копіювання бесіди налаштовано.", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackup": "Налаштувати резервне копіювання бесіди", - "@setupChatBackup": {}, - "iWroteDownTheKey": "Ключ записано", - "@iWroteDownTheKey": {}, - "setupChatBackupDescription": "Щоб захистити ваші повідомлення, ми створили для вас ключ відновлення.\nЗберігайте його в надійному місці, наприклад, у менеджері паролів.", - "@setupChatBackupDescription": {}, - "clearArchive": "Очистити архів", - "@clearArchive": {}, - "commandHint_html": "Надіслати текст у форматі HTML", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "yourUserId": "Ваш ID користувача:", - "@yourUserId": {}, - "commandHint_invite": "Запросіть цього користувача до цієї кімнати", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_leave": "Вийти з цієї кімнати", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Опишіть себе", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "hideUnknownEvents": "Сховати невідомі події", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "Нехтувані користувачі", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "Нехтувати ім'я користувача", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "Увімкніть резервне копіювання бесід, щоб ніколи не втратити доступ до них.", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "loginWith": "Увійти за допомогою {brand}", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "noPublicRoomsFound": "Загальнодоступних кімнат не знайдено…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "Поки що статусів не знайдено.", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "obtainingLocation": "Отримання розташування…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "offensive": "Образливий", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "Офлайн", - "@offline": { - "type": "text", - "placeholders": {} - }, - "addAccount": "Додати обліковий запис", - "@addAccount": {}, - "enableMultiAccounts": "(БЕТА) Увімкнути кілька облікових записів на цьому пристрої", - "@enableMultiAccounts": {}, - "openInMaps": "Відкрити в картах", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "newUsernameDescription": "Ваш ID користувача матиме формат @username:servername", - "@newUsernameDescription": {}, - "serverRequiresEmail": "Цей сервер потребує перевірки вашої адресу е-пошти для реєстрації.", - "@serverRequiresEmail": {}, - "pleaseFollowInstructionsOnWeb": "Виконайте вказівки вебсайту та торкніться далі.", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "Зберегти файл до цієї теки", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "Надіслати відео", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "Вилучити свій аватар", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "unpin": "Відкріпити", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "Указати рівні дозволів", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "Поділитися місцеперебуванням", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "Єдиний вхід", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "Забагато запитів. Спробуйте пізніше!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "unavailable": "Недоступний", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unreadMessages": "{unreadEvents, plural, =1{1 непрочитане повідомлення} few{{unreadEvents} непрочитані повідомлення} many{{unreadEvents} непрочитаних повідомлень} other{{unreadEvents} непрочитані повідомлення}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "unreadChats": "{unreadCount, plural, =1{1 непрочитана бесіда} few{{unreadCount} непрочитані бесіди} many{{unreadCount} непрочитаних бесід} other{{unreadCount} непрочитані бесіди}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unlockChatBackup": "Розблокувати резервну копію бесіди", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "За допомогою цих адрес ви можете відновити свій пароль.", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Ви будете під'єднані до {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "yourChatsAreBeingSynced": "Ваші бесіди синхронізуються…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "privacy": "Приватність", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "search": "Пошук", - "@search": { - "type": "text", - "placeholders": {} - }, - "sentCallInformations": "{senderName} надсилає відомості про виклик", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "discover": "Огляд", - "@discover": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "Не вдалося відкрити URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "contentHasBeenReported": "Скаргу на вміст надіслано адміністраторам сервера", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "commandHint_op": "Укажіть рівень повноважень цього користувача (типово: 50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Надіслати неформатований текст", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Надіслати відповідь як реакцію", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Надіслати текст", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Розблокувати цього користувача у цій кімнаті", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "configureChat": "Налаштувати бесіду", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Шифрування безпечне лише тоді, коли всі пристрої перевірено.", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Введіть ключ безпеки:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "Редагувати заблоковані сервери", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{ще 1 подія} few{ще {count} події} many{ще {count} подій} other{ще {count} події}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "publicGroups": "Загальнодоступні групи", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "Відкритий ключ", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Показати пароль", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "Змінити псевдоніми кімнати", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "Змінити аватар кімнати", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "Дозволити надсилання звітів про вади за допомогою sentry.io", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "Пароль змінено", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "Відновлення пароля", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "Люди", - "@people": { - "type": "text", - "placeholders": {} - }, - "pin": "Закріпити", - "@pin": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "Звук, вібрація, колір світлодіода", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "Введіть свій PIN-код", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "Загальнодоступний простір", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "spaceName": "Назва простору", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "warning": "Попередження!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "Ваш відкритий ключ", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "Простір загальнодоступний", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "status": "Статус", - "@status": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "Користувача не перевірено", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userVerified": "Перевірений користувач", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "unverified": "Неперевірений", - "@unverified": {}, - "zoomOut": "Зменшити", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "Служби визначення місцеположення вимкнені. Увімкніть їх, щоб могти надавати доступ до вашого місцеположення.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Дозвіл на розташування відхилено. Надайте можливість ділитися своїм місцеперебуванням.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "newPasswordDescription": "Щоб мати можливість відновити пароль потрібно буде додати адресу е-пошти до свого облікового запису.", - "@newPasswordDescription": {}, - "oneClientLoggedOut": "На одному з ваших клієнтів виконано вихід із системи", - "@oneClientLoggedOut": {}, - "bundleName": "Назва вузла", - "@bundleName": {}, - "toggleFavorite": "Перемикнути вибране", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "removeFromBundle": "Вилучити з цього вузла", - "@removeFromBundle": {}, - "toggleMuted": "Увімкнути/вимкнути звук", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "editBundlesForAccount": "Змінити вузол для цього облікового запису", - "@editBundlesForAccount": {}, - "addToBundle": "Додати до вузлів", - "@addToBundle": {}, - "pleaseEnterValidEmail": "Введіть дійсну адресу е-пошти.", - "@pleaseEnterValidEmail": {}, - "passwordsDoNotMatch": "Паролі не збігаються!", - "@passwordsDoNotMatch": {}, - "repeatPassword": "Повторити пароль", - "@repeatPassword": {}, - "pleaseChooseAtLeastChars": "Виберіть принаймні {min} символів.", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "messageInfo": "Відомості про повідомлення", - "@messageInfo": {}, - "time": "Час", - "@time": {}, - "messageType": "Тип повідомлення", - "@messageType": {}, - "openGallery": "Відкрити галерею", - "@openGallery": {}, - "sender": "Відправник", - "@sender": {}, - "addToSpaceDescription": "Виберіть простір, щоб додати до нього цю бесіду.", - "@addToSpaceDescription": {}, - "loginWithOneClick": "Увійти одним натисканням", - "@loginWithOneClick": {}, - "removeFromSpaceDescription": "Це вилучає цей бесіду з поточного простору. Її все одно буде видно у розділі «Усі бесіди».", - "@removeFromSpaceDescription": {}, - "removeFromSpace": "Вилучити з простору", - "@removeFromSpace": {}, - "start": "Почати", - "@start": {}, - "setupChatBackupNow": "Налаштуйте резервне копіювання бесіди зараз", - "@setupChatBackupNow": {}, - "pleaseEnterSecurityKeyDescription": "Щоб розблокувати резервну копію бесіди, введіть ключ безпеки, який був створений під час попереднього сеансу. Ключ безпеки — це не ваш пароль.", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "Зберегти ключ безпеки зараз", - "@saveTheSecurityKeyNow": {}, - "commandHint_discardsession": "Відкинути сеанс", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_clearcache": "Очистити кеш", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Створіть порожню групову бесіду\nВикористовуйте --no-encryption, щоб вимкнути шифрування", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "Початок особистої бесіди\nВикористовуйте --no-encryption, що вимкнути шифрування", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "openVideoCamera": "Відкрити камеру для відео", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "Додати до історії", - "@addToStory": {}, - "publish": "Опублікувати", - "@publish": {}, - "whoCanSeeMyStories": "Хто може бачити мої історії?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "Скасувати підписку на історії", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "Цей користувач ще нічого не опублікував у своїй історії", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "Ваша історія", - "@yourStory": {}, - "replyHasBeenSent": "Відповідь надіслано", - "@replyHasBeenSent": {}, - "videoWithSize": "Відео ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "Історія за {date}: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "Зауважте, що у вашій історії люди можуть бачити та зв’язуватися одне з одним.", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "Що відбувається?", - "@whatIsGoingOn": {}, - "addDescription": "Додати опис", - "@addDescription": {}, - "bubbleSize": "Розмір бульбашки", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "iUnderstand": "Я розумію", - "@iUnderstand": {}, - "storyPrivacyWarning": "Зверніть увагу, що люди можуть бачити та зв'язуватися один з одним у вашій історії. Ваші історії будуть видимі впродовж 24 годин, але немає жодної гарантії, що вони будуть видалені з усіх пристроїв і серверів.", - "@storyPrivacyWarning": {}, - "dismiss": "Відхилити", - "@dismiss": {}, - "markAsRead": "Позначити прочитаним", - "@markAsRead": {}, - "reportUser": "Поскаржився на користувача", - "@reportUser": {}, - "openChat": "Відкрити бесіду", - "@openChat": {}, - "integrationsNotImplemented": "Редагування віджетів та інтеграцій поки що неможливе.", - "@integrationsNotImplemented": {}, - "editIntegrations": "Редагувати віджети та інтеграції", - "@editIntegrations": {}, - "matrixWidgets": "Віджети Matrix", - "@matrixWidgets": {}, - "reactedWith": "{sender} реагує з {reaction}", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "emojis": "Емоджі", - "@emojis": {}, - "pinMessage": "Прикріпити в кімнаті", - "@pinMessage": {}, - "pinnedEventsError": "Помилка завантаження закріплених повідомлень", - "@pinnedEventsError": {}, - "confirmEventUnpin": "Ви впевнені, що бажаєте назавжди відкріпите подію?", - "@confirmEventUnpin": {}, - "placeCall": "Здійснити виклик", - "@placeCall": {}, - "unsupportedAndroidVersion": "Непідтримувана версія Android", - "@unsupportedAndroidVersion": {}, - "voiceCall": "Голосовий виклик", - "@voiceCall": {}, - "unsupportedAndroidVersionLong": "Для цієї функції потрібна новіша версія Android. Перевірте наявність оновлень або підтримку Lineage OS.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "Зауважте, що відеовиклики на ранньому етапі розробки. Вони можуть працювати не так, як очікувалося, або взагалі не працювати на всіх платформах.", - "@videoCallsBetaWarning": {}, - "emailOrUsername": "Електронна адреса або ім’я користувача", - "@emailOrUsername": {}, - "experimentalVideoCalls": "Експериментальні відеовиклики", - "@experimentalVideoCalls": {}, - "switchToAccount": "Перемкнутися на обліковий запис {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "Наступний обліковий запис", - "@nextAccount": {}, - "previousAccount": "Попередній обліковий запис", - "@previousAccount": {}, - "editWidgets": "Редагувати віджети", - "@editWidgets": {}, - "addWidget": "Додати віджет", - "@addWidget": {}, - "widgetVideo": "Відео", - "@widgetVideo": {}, - "widgetCustom": "Користувацький", - "@widgetCustom": {}, - "widgetName": "Назва", - "@widgetName": {}, - "widgetNameError": "Укажіть коротку назву.", - "@widgetNameError": {}, - "widgetEtherpad": "Текстова примітка", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetUrlError": "Це недійсна URL-адреса.", - "@widgetUrlError": {}, - "errorAddingWidget": "Помилка додавання віджета.", - "@errorAddingWidget": {}, - "separateChatTypes": "Окремі особисті бесіди, групи та простори", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "Показувати пов'язані особисті бесіди у просторах", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youInvitedBy": "Ви були запрошені {user}", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youAcceptedTheInvitation": "Ви прийняли запрошення", - "@youAcceptedTheInvitation": {}, - "youRejectedTheInvitation": "Ви відхилили запрошення", - "@youRejectedTheInvitation": {}, - "youHaveWithdrawnTheInvitationFor": "Ви відкликали запрошення для {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youBannedUser": "Ви заблокували {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "Ви вилучили й заблокували {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "youJoinedTheChat": "Ви приєдналися до бесіди", - "@youJoinedTheChat": {}, - "youKicked": "Ви вилучили {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "Ви розблокували {user}", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "Ви запросили {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "Показати список просторів", - "@showSpaces": {}, - "noEmailWarning": "Введіть справжню адресу електронної пошти. В іншому випадку ви не зможете скинути пароль. Якщо ви цього не хочете, торкніться кнопки ще раз, щоб продовжити.", - "@noEmailWarning": {}, - "saveTheRecoveryKeyNow": "Збережіть ключ відновлення зараз", - "@saveTheRecoveryKeyNow": {}, - "saveKeyManuallyDescription": "Збережіть цей ключ вручну, запустивши діалогове вікно спільного доступу до системи або буфер обміну.", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "Зберегти в Android KeyStore", - "@storeInAndroidKeystore": {}, - "storeInAppleKeyChain": "Зберегти в Apple KeyChain", - "@storeInAppleKeyChain": {}, - "storeSecurlyOnThisDevice": "Зберегти на цей пристрій", - "@storeSecurlyOnThisDevice": {}, - "pleaseEnterRecoveryKeyDescription": "Щоб розблокувати старі повідомлення, введіть ключ відновлення, згенерований у попередньому сеансі. Ваш ключ відновлення це НЕ ваш пароль.", - "@pleaseEnterRecoveryKeyDescription": {}, - "pleaseEnterRecoveryKey": "Введіть ключ відновлення:", - "@pleaseEnterRecoveryKey": {}, - "recoveryKey": "Ключ відновлення", - "@recoveryKey": {}, - "recoveryKeyLost": "Ключ відновлення втрачено?", - "@recoveryKeyLost": {}, - "enableAutoBackups": "Увімкнути автоматичне резервне копіювання", - "@enableAutoBackups": {}, - "users": "Користувачі", - "@users": {}, - "stories": "Історії", - "@stories": {}, - "unlockOldMessages": "Розблокувати старі повідомлення", - "@unlockOldMessages": {}, - "storeInSecureStorageDescription": "Збережіть ключ відновлення в безпечному сховищі цього пристрою.", - "@storeInSecureStorageDescription": {} -} diff --git a/assets/l10n/intl_vi.arb b/assets/l10n/intl_vi.arb deleted file mode 100644 index d732bc53d5..0000000000 --- a/assets/l10n/intl_vi.arb +++ /dev/null @@ -1,569 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.781172", - "about": "Giới thiệu", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "Đồng ý", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} đã đồng ý lời mời", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "Tài khoản", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "Thông tin tài khoản", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} đã kích hoạt mã hóa đầu cuối 2 chiều", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addGroupDescription": "Thêm mô tả cho nhóm", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "admin": "Quản trị viên", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "bí danh", - "@alias": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "Bạn đã có tài khoản?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "{senderName} đã trả lời cuộc gọi", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "Mọi người đều có thể gia nhập", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "archive": "Lưu trữ", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "Phòng hội thảo đã lưu trữ", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Khách vãng lai có được tham gia không", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "Bạn chắc chứ?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "Vui lòng nhập cụm mật khẩu hoặc khóa khôi phục để lưu khóa vào bộ nhớ cache.", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "blockDevice": "Thiết bị bị chặn", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "Thu nhỏ", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "zoomIn": "Phóng to", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "Bạn sẽ được kết nối tới {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "verified": "Đã xác thực", - "@verified": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "Chuyển từ thiết bị khác", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "Chạm vào một thiết bị để chứng thực", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "showPassword": "Hiển thị mật khẩu", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "Thất lạc khoá bảo mật?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "securityKey": "Khóa bảo mật", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Vui lòng làm theo hướng dẫn trên trang web và bấm tiếp", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "Vui lòng nhập khoá bảo mật", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "Bạn chỉ có thể kích hoạt mã hoá khi phòng này không mở", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "next": "Tiếp", - "@next": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "Mọi thứ đã sẵn sàng!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "Cài đặt biểu tượng cảm xúc", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "Sửa tên hiển thị", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "Tải ảnh xuống", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Tên hiển thị đã được thay đổi", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "Xoá hình ảnh", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "Mã hoá chỉ bảo mật khi tất cả các thiết bị đều được chứng thực", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "devices": "Các thiết bị", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceId": "Mã xác định thiết bị", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "device": "Thiết bị", - "@device": { - "type": "text", - "placeholders": {} - }, - "deny": "Từ chối", - "@deny": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "Xoá tin nhắn", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "Xoá tài khoản", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "delete": "Xoá", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deactivateAccountWarning": "Việc này sẽ vô hiệu hoá tài khoản của bạn. Điều này không thể đảo ngược được! Bạn chắc là vẫn muốn tiếp tục chứ?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "currentlyActive": "Đang hoạt động", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "createNewGroup": "Tạo một nhóm mới", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} đã tạo cuộc trò chuyện", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createAccountNow": "Tạo tài khoản mới ngay", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "create": "Tạo", - "@create": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} thành viên", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "couldNotSetDisplayname": "Không thể thay tên hiển thị", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "couldNotSetAvatar": "Không thể đặt ảnh đại diện", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "Không thể giải mã tin nhắn: {error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "copy": "Sao chép", - "@copy": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Liên hệ đã được mời vào nhóm", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "Kết nối thất bại", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "connect": "Kết nối", - "@connect": { - "type": "text", - "placeholders": {} - }, - "confirm": "Xác nhận", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "So sánh và đảm bảo các số sau đây giống trên máy còn lại", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "So sánh và đảm bảo các biểu tượng cảm xúc sau đây giống với các biểu tượng trên máy còn lại", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "close": "Đóng", - "@close": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "Chọn tên người dùng", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "Chọn một mật khẩu mạnh", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "Chi tiết cuộc trò chuyện", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "Bản sao lưu cuộc trò chuyện của bạn được bảo mật bằng một khoá bảo mật. Bạn đừng làm mất nó.", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "Sao lưu cuộc trò chuyện", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "Thay hình nền", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "Thay đổi máy chủ", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Thay đổi tên nhóm", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "Thay đổi máy chủ nhà", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changePassword": "Thay đổi mật khẩu", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changelog": "Lịch sử thay đổi", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changedTheRoomInvitationLink": "{username} đã thay đổi đường dẫn mời", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} đã đổi địa chỉ phòng chat", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheProfileAvatar": "{username} đã thay đổi ảnh đại diện của mình", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} đã thay đổi quy tắc truy cập đối với khách thành: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheGuestAccessRules": "{username} đã thay đổi quy tắc truy cập đối với khách", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatPermissions": "{username} đã thay đổi quyền trong phòng chat", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatNameTo": "{username} đã thay đổi tên phòng chat thành: '{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatDescriptionTo": "{username} đã thay đổi mô tả phòng chat thành: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatAvatar": "{username} đã thay đổi ảnh phòng chat", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changeDeviceName": "Thay đổi tên thiết bị", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "cancel": "Hủy", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "Khóa đã được lưu vào bộ nhớ tạm", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "blocked": "Đã chặn", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} đã cấm {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "banned": "Đã bị cấm", - "@banned": { - "type": "text", - "placeholders": {} - }, - "banFromChat": "Cấm khỏi cuộc trò chuyện", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "badServerVersionsException": "Máy chủ nhà hỗ trợ Spec phiên bản:\n{serverVerions}\nNhưng ứng dụng này chỉ hỗ trợ {supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerLoginTypesException": "Máy chủ nhà hỗ trợ kiểu đăng nhập:\n{serverVersions}\nNhưng ứng dụng này chỉ hỗ trợ:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "avatarHasBeenChanged": "Ảnh đại diện đã được thay đổi", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "authentication": "Xác thực", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "Bạn có đồng ý yêu cầu chứng thực từ {username} không?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "askSSSSVerify": "Vui lòng nhập mật khẩu bảo mật hoặc khóa khôi phục để chứng thực phiên của bạn.", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Bạn có chắc bạn muốn đăng xuất không?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "addEmail": "Thêm email", - "@addEmail": { - "type": "text", - "placeholders": {} - } -} diff --git a/assets/l10n/intl_zh.arb b/assets/l10n/intl_zh.arb deleted file mode 100644 index 95b2c0889c..0000000000 --- a/assets/l10n/intl_zh.arb +++ /dev/null @@ -1,2892 +0,0 @@ -{ - "@@locale": "zh", - "@@last_modified": "2021-08-14 12:41:09.767805", - "about": "关于", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "接受", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username} 已接受邀请", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "账户", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "账户信息", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username} 激活了端到端加密", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "添加电子邮件", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "添加一条群组介绍", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "添加新的好友", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "管理员", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "别名", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "全部", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "已经有账户了?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "已开始与 {senderName} 通话", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "任何人都可以加入", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "应用锁", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "存档", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "已存档的聊天室", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "是否允许游客加入", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "您确定吗?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "您确定要注销吗?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "请输入您的安全存储密码或恢复密钥以存储密钥。", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "请输入您的安全存储的密码短语或恢复密钥,以向对方签名。", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "请输入安全存储密码或恢复密钥以验证您的会话。", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "是否接受来自 {username} 的验证申请?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "暂停", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "播放", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "身份验证", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "头像已更改", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "主服务器支持的登录方式:\n{serverVersions}\n但本应用仅支持:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "主服务器支持的 Spec 版本:\n{serverVersions}\n但本应用仅支持 {supportedVersions} 版本", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "从对话中封禁", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "已被封禁", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username} 封禁了 {targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "屏蔽设备", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "已屏蔽", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "机器人消息", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "密钥已缓存", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "取消", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "更改设备名称", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} 更改了会话头像", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username} 将聊天描述更改为:'{description}'", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username} 将聊天名称更改为:'{chatname}'", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username} 更改了会话权限", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} 将展示名称更改为:'{displayname}'", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username} 更改了游客访问规则", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username} 更改了游客访问规则为:{rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username} 更改了历史记录观察状态", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username} 更改了历史记录观察状态到:{rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username} 更改了加入的规则", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username} 更改了加入的规则为:{joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username} 更改了头像", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username} 更改了聊天室别名", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username} 更改了邀请链接", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "更改记录", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "更改密码", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "更改已被保存", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "更改主服务器", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "改变风格", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "更改了群组名称", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "更改服务器", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "更改壁纸", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "changeYourAvatar": "更改您的头像", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "加密已被破坏", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "会话", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "聊天记录备份", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "您的旧信息受恢复密钥保护。请确保您不会丢失它。", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "会话详情", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chats": "聊天", - "@chats": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "输入一个强密码", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "输入一个昵称", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "清除存档", - "@clearArchive": {}, - "clearText": "清除文本", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "关闭", - "@close": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "在此聊天室封禁该用户", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_html": "发送 HTML 格式化文本", - "@commandHint_html": { - "type": "text", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "邀请该用户加入此聊天室", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "加入该聊天室", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "将该用户移出此聊天室", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "退出该聊天室", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "介绍自己", - "@commandHint_me": { - "type": "text", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "设置您的聊天室头像(通过 mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "设置您的聊天室昵称", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "设置该用户的权限等级(默认:50)", - "@commandHint_op": { - "type": "text", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "发送纯文本", - "@commandHint_plain": { - "type": "text", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "将回复作为响应发送", - "@commandHint_react": { - "type": "text", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "发送文本", - "@commandHint_send": { - "type": "text", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "在此聊天室解封该用户", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "指令无效", - "@commandInvalid": { - "type": "text" - }, - "commandMissing": "{command} 不是指令。", - "@commandMissing": { - "type": "text", - "placeholders": { - "command": {} - }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "对比并确认这些表情匹配其他那些设备:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "比较以下数字,确保它们和另一设备上的相同:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "配置聊天", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "确认", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "连接", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "连接尝试失败", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "联系人已被邀请至群组", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "包含显示名称", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "包含用户名", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "此内容已被报告至服务器管理员处", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "内容查看器", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "已复制到剪贴板", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "复制", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "复制到剪贴板", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "不能解密消息:{error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "不能设定头像", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "不能设定显示名称", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count} 名参与者", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "创建", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "现在创建账户", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username} 创建了聊天", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "创建新群组", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "交叉签名未启用", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "交叉签名已启用", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "目前活跃", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "深色", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "这将停用您的用户账户。这不能被撤销,您确定吗?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "默认权限级别", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "删除", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "删除账户", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "删除消息", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "否认", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "设备", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "设备 ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "设备", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "加密仅在所有设备都被验证时才安全。", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "一对一聊天", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "丢弃图片", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "探索", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "发现群组", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "显示名称已被改变", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "捐助", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "下载文件", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "编辑", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "编辑被阻止的服务器", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "编辑聊天权限", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "编辑显示名称", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "编辑 Jitsi 实例", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAliases": "编辑聊天室别名", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "编辑聊天室头像", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "表情已存在!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "无效的表情快捷码!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "聊天室的表情包", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "表情设置", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "表情快捷码", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "您需要选择一个表情快捷码和一张图片!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "空聊天", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableChatBackup": "启用聊天记录备份以确保不会丢失您的聊天记录。", - "@enableChatBackup": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "在全局启用表情包", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "启用加密", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "您之后将无法停用加密,确定吗?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "加密的", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "加密", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "加密算法", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "加密未启用", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "端到端加密设置", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName} 结束了通话", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "输入群组名称", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "输入一个电子邮件地址", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "输入用户名", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "输入您的主服务器地址", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "一切就绪!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "令人极度反感", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "文件名", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "文件大小", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "字体大小", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "转发", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "星期五", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "好友", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "自加入起", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "自邀请起", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "goToTheNewRoom": "前往新的聊天室", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "group": "群组", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "群组描述", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "群组描述已被更改", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "群组是公开的", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "群组", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "名称为{displayname}的群组", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "游客被禁止", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "游客可以加入", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} 撤回了对 {targetName} 的邀请", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "帮助", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "隐藏编辑事件", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "隐藏未知事件", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "主服务器不兼容", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "这些内容有多令人反感?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "身份", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "忽略", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "已忽略的用户", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "您可以忽略打扰您的用户。您将不会收到来自忽略列表中用户的任何消息或聊天室邀请。", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "忽略用户名", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "我已经点击了链接", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "不正确的密码短语或恢复密钥", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "不令人反感", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "invalidEmail": "无效的电子邮件", - "@invalidEmail": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "邀请联系人", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "邀请联系人到 {groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "已邀请", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username} 邀请了 {targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "仅被邀请用户", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "来自我的邀请", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username} 邀请您使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开该邀请链接:{link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "下列设备密钥是否正确?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "正在输入…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username} 加入了聊天", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "加入聊天室", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "密钥已被缓存", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "密钥缺失", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username} 踢了 {targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username} 踢了 {targetName} 并将其封禁", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "从聊天室踢出", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "上次活跃: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "上次使用的IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "很长时间未上线", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "离开", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "离开了聊天", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "许可证", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "浅色", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "加载 {count} 个更多的参与者", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "加载中…请等待。", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "加载更多…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "登录", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "登录 {homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "loginWith": "使用 {brand} 登录", - "@loginWith": { - "type": "text", - "placeholders": { - "brand": {} - } - }, - "logout": "注销", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "创建监管者", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "创建管理员", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "确保识别码正确", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "成员变更", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "提到", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "消息", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "消息将对所有参与者移除", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "监管者", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "星期一", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{1 个更多事件} other{{count} 个更多事件}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "将该聊天静音", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "请注意当前您需要Pantalaimon以使用端到端加密功能。", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "新的聊天", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "来自 FluffyChat 的新消息", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "新的验证请求!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "下一步", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "不", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "未与服务器建立连接", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "Fluffychat 目前不支持启用交叉签名。请在 Element 中启用。", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "没有说明", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "未找到表情。😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "您只能在聊天室不可被公众访问时才能启用加密。", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "看起来您手机上没有谷歌服务框架。这对保护您的隐私而言是个好决定!要接收 FluffyChat 的推送通知,推荐您使用 https://microg.org/ 或 https://unifiedpush.org/。", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "FluffyChat 目前不支持启用在线密钥备份。请在 Element 中启用。", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "无", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "您尚未添加恢复密码的方法。", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "没有权限", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "没有找到公共聊天室…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "未找到聊天室…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "目前还没有发现任何状态。", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "通知", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "已为此账户启用通知", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "在网页版不支持", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number} 已选择", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count} 人正在输入…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "令人反感", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "离线", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "好", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "在线", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "在线密钥备份被停用", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "在线密钥备份已启用", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsPushError": "哎呀!十分不幸,配置推送通知时发生了错误。", - "@oopsPushError": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "哎呀,出了点差错…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "打开应用以查看消息", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "打开相机", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalAddEmail": "(可选) 您的电子邮件地址", - "@optionalAddEmail": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(可选) 群组名称", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "or": "或", - "@or": { - "type": "text", - "placeholders": {} - }, - "participant": "参与者", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "参与者的设备", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "密码短语或恢复密钥", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "密码", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "忘记密码", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "密码已被更改", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "密码恢复", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "people": "联系人", - "@people": { - "type": "text", - "placeholders": {} - }, - "pickImage": "选择图像", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "固定", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "播放 {fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChoose": "请选择", - "@pleaseChoose": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAPasscode": "请选择一个密码", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "请选择用户名", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "请点击电子邮件中的链接,然后继续。", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "请输入 4 位数字或留空以停用应用锁。", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "请输入 Matrix ID。", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "请键入您的安全密钥:", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "请输入您的密码", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPin": "请输入您的 PIN", - "@pleaseEnterYourPin": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "请输入您的用户名", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "请按照网站上的提示,点击下一步。", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "隐私", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "公共群组", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "publicKey": "公钥", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "公开聊天室", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "推送规则", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "原因", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "录制", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username} 编辑了一个事件", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "重新编辑信息", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "register": "注册", - "@register": { - "type": "text", - "placeholders": {} - }, - "reject": "拒绝", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} 拒绝了邀请", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "重新加入", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "移除", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "移除其他全部设备", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "被{username}移除", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "移除设备", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "解禁聊天", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "移除消息", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "removeYourAvatar": "移除您的头像", - "@removeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "渲染富文本内容", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "用较新的版本替换聊天室", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "回复", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "举报信息", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "请求权限", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "请求读取旧的消息", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "撤销全部权限", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "聊天室已升级", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "聊天室版本", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "saturday": "星期六", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "savedFileAs": "保存文件为 {filename}", - "@savedFileAs": { - "type": "text", - "placeholders": { - "filename": {} - } - }, - "saveFile": "保存文件", - "@saveFile": { - "type": "text", - "placeholders": {} - }, - "saveFileToFolder": "将文件保存到此文件夹", - "@saveFileToFolder": { - "type": "text", - "placeholders": {} - }, - "search": "搜索", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "搜索聊天室", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "安全", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "安全密钥", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "丢失安全密钥?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "被 {username} 看见", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{被 {username} 和 {count} 个其他人看见}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "被 {username} 和 {username2} 看见", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "发送", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "发送一条消息", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAsText": "以文本发送", - "@sendAsText": { - "type": "text" - }, - "sendAudio": "发送音频", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "允许向 sentry.io 发送错误报告", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "发送文件", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "发送图像", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "发送消息", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "发送原图", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendSticker": "发送贴纸", - "@sendSticker": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "发送视频", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username} 发送了文件", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username} 发送了音频", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username} 发送了图片", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} 发送了贴纸", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} 发送了视频", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} 发送了通话信息", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "关于您隐私的信息: https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "会话已验证", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "设置个人资料图片", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setAsCanonicalAlias": "设为主要别名", - "@setAsCanonicalAlias": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "设置自定义表情", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "设置群组描述", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "设置邀请链接", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "设置权限级别", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "设置状态", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "设置", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "分享", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} 分享了位置", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "显示密码", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "注册", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "singlesignon": "单点登录", - "@singlesignon": { - "type": "text", - "placeholders": {} - }, - "skip": "跳过", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "声音、振动和 LED 颜色", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "源代码", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName} 开始了通话", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "现在开始您的第一个聊天!🙂\n- 点击“新聊天”按钮\n- 输入好友的二维码\n- 聊得开心", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "状态", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "您今天怎么样?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "提交", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "星期日", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "synchronizingPleaseWait": "同步中…请等待。", - "@synchronizingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "系统", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "点选一部设备进行验证", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowImage": "点击以显示图片", - "@tapToShowImage": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "点击以显示菜单", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "它们不匹配", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "它们匹配", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "该聊天室已被归档。", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "星期四", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{suffix} {hours12}时{minutes}分", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "切换收藏", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "切换静音", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "标记已读/未读", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "请求太多。请稍后再试!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "从其他设备传输", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "尝试重新发送", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "星期二", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "不可用", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username} 解封了 {targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "解锁设备", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "未知设备", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "未知加密算法", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "未知事件 '{type}'", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "未知会话,请验证", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "解锁聊天记录备份", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "解除聊天的静音", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "取消固定", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} 个未读聊天}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} 条未读消息}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "使用适合 AMOLED 屏的颜色?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username} 和其他 {count} 人正在输入…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username} 和 {username2} 正在输入…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username} 正在输入…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username} 离开了聊天", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "用户名", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "用户未验证", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} 发送了一个 {type} 事件", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "用户的验证状态未知", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "用户已验证", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "已验证", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "成功验证会话!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "验证", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "手动验证", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "开始验证", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "您已成功验证!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "验证其他账户", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "验证用户", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "视频通话", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "聊天记录的可见性", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "对所有参与者可见", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "对所有人可见", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "语音消息", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "等待对方接受请求…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "等待对方接受 emoji…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "等待对方接受数字…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "壁纸", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "警告!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "端到端加密目前在测试阶段!请自行承担风险!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "星期三", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "欢迎来到 Matrix 网络中最可爱的即时通讯应用。", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "我们向您发送了一封电子邮件", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "谁可以执行哪些操作", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "谁被允许加入本群组", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "您举报的理由是什么?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "确定要清除您的聊天记录备份以创建新的恢复密钥吗?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "通过这些地址,您可以恢复密码。", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "写一条消息…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "是", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "您", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "您被邀请到该聊天", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "您已不再参与此聊天", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "您不能邀请您自己", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "您已被该聊天封禁", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourChatsAreBeingSynced": "正在同步您的聊天…", - "@yourChatsAreBeingSynced": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "您自己的用户名", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "您的公钥", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "您将连接到 {homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "放大", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "缩小", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "allChats": "所有会话", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "加入空间", - "@addToSpace": {}, - "obtainingLocation": "获取位置中…", - "@obtainingLocation": { - "type": "text", - "placeholders": {} - }, - "noMatrixServer": "{server1} 不是一个Matrix服务器,试试{server2}?", - "@noMatrixServer": { - "type": "text", - "placeholders": { - "server1": {}, - "server2": {} - } - }, - "locationPermissionDeniedNotice": "位置权限被拒绝.请授予此权限以分享你的位置.", - "@locationPermissionDeniedNotice": { - "type": "text", - "placeholders": {} - }, - "locationDisabledNotice": "位置服务已禁用.请启用此服务以分享你的位置.", - "@locationDisabledNotice": { - "type": "text", - "placeholders": {} - }, - "errorObtainingLocation": "取得地址错误: {error}", - "@errorObtainingLocation": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "enterASpacepName": "输入空间名称", - "@enterASpacepName": {}, - "dontAskAgain": "取消并不再询问", - "@dontAskAgain": { - "type": "text", - "placeholders": {} - }, - "createNewSpace": "创建新空间", - "@createNewSpace": { - "type": "text", - "placeholders": {} - }, - "cantOpenUri": "无法打开URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "autoplayImages": "自动播放动态贴纸和表情", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "spaceName": "空间名称", - "@spaceName": { - "type": "text", - "placeholders": {} - }, - "spaceIsPublic": "空间是公开的", - "@spaceIsPublic": { - "type": "text", - "placeholders": {} - }, - "shareLocation": "分享位置", - "@shareLocation": { - "type": "text", - "placeholders": {} - }, - "publicSpace": "公共空间", - "@publicSpace": { - "type": "text", - "placeholders": {} - }, - "openInMaps": "在地图中打开", - "@openInMaps": { - "type": "text", - "placeholders": {} - }, - "sendOnEnter": "按 Enter 键发送", - "@sendOnEnter": {}, - "passwordsDoNotMatch": "密码不匹配!", - "@passwordsDoNotMatch": {}, - "pleaseChooseAtLeastChars": "请至少输入 {min} 个字符。", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "createNewChatExplaination": "请他人扫描上方二维码以开始新的聊天,若他人无法扫码,您可以直接点击二维码分享您的邀请链接。", - "@createNewChatExplaination": {}, - "yourChatBackupHasBeenSetUp": "您的聊天记录备份已设置。", - "@yourChatBackupHasBeenSetUp": {}, - "setupChatBackupDescription": "为了保护您的信息,我们为您生成了一个恢复密钥。\n请将其保存在安全的地方,如密码管理器中。", - "@setupChatBackupDescription": {}, - "scanQrCode": "扫描二维码", - "@scanQrCode": {}, - "chatHasBeenAddedToThisSpace": "会话已添加到此空间", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "会话已从此空间移除", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "homeserver": "服务器", - "@homeserver": {}, - "newPasswordDescription": "若您要使用密码重置功能,您在注册之后需要给账户添加一个电子邮件地址。", - "@newPasswordDescription": {}, - "oneClientLoggedOut": "您的一个客户端已登出", - "@oneClientLoggedOut": {}, - "removeFromBundle": "从此集合中移除", - "@removeFromBundle": {}, - "unverified": "未认证", - "@unverified": {}, - "pleaseEnterValidEmail": "请输入一个有效的电子邮件地址。", - "@pleaseEnterValidEmail": {}, - "repeatPassword": "再次输入密码", - "@repeatPassword": {}, - "yourUserId": "您的 ID:", - "@yourUserId": {}, - "setupChatBackup": "设置聊天记录备份", - "@setupChatBackup": {}, - "iWroteDownTheKey": "我已经记下了密钥", - "@iWroteDownTheKey": {}, - "shareYourInviteLink": "分享您的邀请链接", - "@shareYourInviteLink": {}, - "typeInInviteLinkManually": "手动输入邀请链接…", - "@typeInInviteLinkManually": {}, - "newUsernameDescription": "您的 ID 格式为 @username:servername", - "@newUsernameDescription": {}, - "addAccount": "添加账户", - "@addAccount": {}, - "editBundlesForAccount": "编辑该账户的集合", - "@editBundlesForAccount": {}, - "enableMultiAccounts": "(测试功能)在本设备上添加多个账户", - "@enableMultiAccounts": {}, - "addToBundle": "添加到集合中", - "@addToBundle": {}, - "bundleName": "集合名称", - "@bundleName": {}, - "link": "链接", - "@link": {}, - "serverRequiresEmail": "此服务器需要验证您的电子邮件地址以进行注册。", - "@serverRequiresEmail": {}, - "messageType": "消息类型", - "@messageType": {}, - "sender": "发送者", - "@sender": {}, - "openGallery": "打开图库", - "@openGallery": {}, - "messageInfo": "消息信息", - "@messageInfo": {}, - "time": "时间", - "@time": {}, - "loginWithOneClick": "一键登录", - "@loginWithOneClick": {}, - "addToSpaceDescription": "选择一个空间以添加此聊天。", - "@addToSpaceDescription": {}, - "setupChatBackupNow": "立即设置您的聊天备份", - "@setupChatBackupNow": {}, - "removeFromSpaceDescription": "这将从当前空间中删除此聊天。 但它仍在“所有聊天”下可见。", - "@removeFromSpaceDescription": {}, - "pleaseEnterSecurityKeyDescription": "要解锁您的聊天备份,请输入您在之前会话中生成的安全密钥。 您的安全密钥不是您的密码。", - "@pleaseEnterSecurityKeyDescription": {}, - "saveTheSecurityKeyNow": "立即保存安全密钥", - "@saveTheSecurityKeyNow": {}, - "removeFromSpace": "从空间删除", - "@removeFromSpace": {}, - "start": "开始", - "@start": {}, - "commandHint_discardsession": "丢弃会话", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "启动一对一聊天\n使用 --no-encryption 选项来禁用加密", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_clearcache": "清除缓存", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "创建空的群聊\n使用 --no-encryption 选项来禁用加密", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "openVideoCamera": "打开相机拍摄视频", - "@openVideoCamera": { - "type": "text", - "placeholders": {} - }, - "addToStory": "添加到 Story", - "@addToStory": {}, - "publish": "发布", - "@publish": {}, - "whoCanSeeMyStories": "谁能看到我的 Story?", - "@whoCanSeeMyStories": {}, - "unsubscribeStories": "取消 Story 订阅", - "@unsubscribeStories": {}, - "thisUserHasNotPostedAnythingYet": "该用户尚未在 Story 发布任何内容", - "@thisUserHasNotPostedAnythingYet": {}, - "yourStory": "你的 Story", - "@yourStory": {}, - "replyHasBeenSent": "已发送回复", - "@replyHasBeenSent": {}, - "videoWithSize": "视频 ({size})", - "@videoWithSize": { - "type": "text", - "placeholders": { - "size": {} - } - }, - "storyFrom": "自 {date} 起的 Story: \n{body}", - "@storyFrom": { - "type": "text", - "placeholders": { - "date": {}, - "body": {} - } - }, - "whoCanSeeMyStoriesDesc": "请注意,人们可以在你的 Story 中看到彼此并相互联系。", - "@whoCanSeeMyStoriesDesc": {}, - "whatIsGoingOn": "发生什么事了?", - "@whatIsGoingOn": {}, - "addDescription": "添加描述", - "@addDescription": {}, - "bubbleSize": "气泡大小", - "@bubbleSize": { - "type": "text", - "placeholders": {} - }, - "storyPrivacyWarning": "请注意,人们可以在你的 Story 中看到和联系彼此。您的故事在 24 小时内可见,但不能保证它们将从所有设备和服务器上删除。", - "@storyPrivacyWarning": {}, - "iUnderstand": "我了解", - "@iUnderstand": {}, - "dismiss": "驳回", - "@dismiss": {}, - "markAsRead": "标为已读", - "@markAsRead": {}, - "reportUser": "举报用户", - "@reportUser": {}, - "openChat": "打开聊天", - "@openChat": {}, - "matrixWidgets": "Matrix 小部件", - "@matrixWidgets": {}, - "integrationsNotImplemented": "尚无法编辑小部件和集成。", - "@integrationsNotImplemented": {}, - "editIntegrations": "编辑小部件和集成", - "@editIntegrations": {}, - "reactedWith": "{sender} 通过 {reaction} 进行了回应", - "@reactedWith": { - "type": "text", - "placeholders": { - "sender": {}, - "reaction": {} - } - }, - "pinnedEventsError": "加载置顶消息时出错", - "@pinnedEventsError": {}, - "confirmEventUnpin": "你确定要永久性取消置顶这一活动吗?", - "@confirmEventUnpin": {}, - "pinMessage": "置顶到聊天室", - "@pinMessage": {}, - "emojis": "颜文字", - "@emojis": {}, - "unsupportedAndroidVersionLong": "这个功能需要较新版本的 Android 系统。请检查更新或 Lineage OS 支持。", - "@unsupportedAndroidVersionLong": {}, - "unsupportedAndroidVersion": "不受支持的 Android 版本", - "@unsupportedAndroidVersion": {}, - "voiceCall": "语音通话", - "@voiceCall": {}, - "placeCall": "打电话", - "@placeCall": {}, - "videoCallsBetaWarning": "请注意,视频通话目前处于测试阶段。它们可能不能像预期的那样工作,或者在所有平台上都不能工作。", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "实验性的视频通话", - "@experimentalVideoCalls": {}, - "emailOrUsername": "电子邮箱或用户名", - "@emailOrUsername": {}, - "switchToAccount": "切换到账户 {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": {} - } - }, - "nextAccount": "下个账户", - "@nextAccount": {}, - "previousAccount": "上个账户", - "@previousAccount": {}, - "editWidgets": "编辑小部件", - "@editWidgets": {}, - "widgetVideo": "视频", - "@widgetVideo": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "自定义", - "@widgetCustom": {}, - "widgetNameError": "请提供显示名称。", - "@widgetNameError": {}, - "errorAddingWidget": "添加小部件出错。", - "@errorAddingWidget": {}, - "addWidget": "添加小部件", - "@addWidget": {}, - "widgetEtherpad": "文本笔记", - "@widgetEtherpad": {}, - "widgetName": "名称", - "@widgetName": {}, - "widgetUrlError": "这不是有效的 URL。", - "@widgetUrlError": {}, - "separateChatTypes": "分开私聊、群组和空间", - "@separateChatTypes": { - "type": "text", - "placeholders": {} - }, - "showDirectChatsInSpaces": "在空间中显示相关私聊", - "@showDirectChatsInSpaces": { - "type": "text", - "placeholders": {} - }, - "youRejectedTheInvitation": "你拒绝了邀请", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "你加入了聊天", - "@youJoinedTheChat": {}, - "youBannedUser": "你封禁了 {user}", - "@youBannedUser": { - "placeholders": { - "user": {} - } - }, - "youInvitedBy": "你受到 {user} 的邀请", - "@youInvitedBy": { - "placeholders": { - "user": {} - } - }, - "youInvitedUser": "你邀请了 {user}", - "@youInvitedUser": { - "placeholders": { - "user": {} - } - }, - "youKicked": "你踢掉了 {user}", - "@youKicked": { - "placeholders": { - "user": {} - } - }, - "youUnbannedUser": "你解除了对 {user} 的封禁", - "@youUnbannedUser": { - "placeholders": { - "user": {} - } - }, - "youAcceptedTheInvitation": "你接受了邀请", - "@youAcceptedTheInvitation": {}, - "youHaveWithdrawnTheInvitationFor": "你撤回了对 {user} 的邀请", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": {} - } - }, - "youKickedAndBanned": "你踢掉并封禁了 {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": {} - } - }, - "showSpaces": "显示空间列表", - "@showSpaces": {}, - "noEmailWarning": "请输入有效电子邮件地址。否则你将无法重置密码。如果你不想输入邮件地址,再次轻点按钮以继续。", - "@noEmailWarning": {}, - "storeInSecureStorageDescription": "将恢复密钥存储在此设备的安全存储中。", - "@storeInSecureStorageDescription": {}, - "storeInAppleKeyChain": "存储在 Apple KeyChain 中", - "@storeInAppleKeyChain": {}, - "unlockOldMessages": "解锁旧信息", - "@unlockOldMessages": {}, - "pleaseEnterRecoveryKey": "请输入你的恢复密钥:", - "@pleaseEnterRecoveryKey": {}, - "recoveryKey": "恢复密钥", - "@recoveryKey": {}, - "recoveryKeyLost": "丢失了恢复密钥?", - "@recoveryKeyLost": {}, - "pleaseEnterRecoveryKeyDescription": "要解锁您的旧邮件,请输入你在之前会话中生成的恢复密钥。 你的恢复密钥不是你的密码。", - "@pleaseEnterRecoveryKeyDescription": {}, - "saveKeyManuallyDescription": "通过触发系统共享对话框或剪贴板手动保存此密钥。", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "存储在 Android KeyStore 中", - "@storeInAndroidKeystore": {}, - "storeSecurlyOnThisDevice": "在此设备上安全存储", - "@storeSecurlyOnThisDevice": {}, - "saveTheRecoveryKeyNow": "立即保存恢复密钥", - "@saveTheRecoveryKeyNow": {}, - "enableAutoBackups": "启用自动备份", - "@enableAutoBackups": {}, - "users": "用户", - "@users": {}, - "stories": "故事", - "@stories": {} -} diff --git a/assets/l10n/intl_zh_Hant.arb b/assets/l10n/intl_zh_Hant.arb deleted file mode 100644 index 4952d2ec9f..0000000000 --- a/assets/l10n/intl_zh_Hant.arb +++ /dev/null @@ -1,2405 +0,0 @@ -{ - "@@last_modified": "2021-08-14 12:41:09.708353", - "about": "關於", - "@about": { - "type": "text", - "placeholders": {} - }, - "accept": "接受", - "@accept": { - "type": "text", - "placeholders": {} - }, - "acceptedTheInvitation": "{username}已接受邀請", - "@acceptedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "account": "帳號", - "@account": { - "type": "text", - "placeholders": {} - }, - "accountInformation": "帳號資訊", - "@accountInformation": { - "type": "text", - "placeholders": {} - }, - "activatedEndToEndEncryption": "{username}已啟用點對點加密", - "@activatedEndToEndEncryption": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "addEmail": "新增電子郵件", - "@addEmail": { - "type": "text", - "placeholders": {} - }, - "addGroupDescription": "新增一個群組描述", - "@addGroupDescription": { - "type": "text", - "placeholders": {} - }, - "addNewFriend": "新增朋友", - "@addNewFriend": { - "type": "text", - "placeholders": {} - }, - "admin": "管理員", - "@admin": { - "type": "text", - "placeholders": {} - }, - "alias": "別稱", - "@alias": { - "type": "text", - "placeholders": {} - }, - "all": "全部", - "@all": { - "type": "text", - "placeholders": {} - }, - "alreadyHaveAnAccount": "已經有帳號了?", - "@alreadyHaveAnAccount": { - "type": "text", - "placeholders": {} - }, - "answeredTheCall": "已開始與{senderName}通話", - "@answeredTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "anyoneCanJoin": "任何人可以加入", - "@anyoneCanJoin": { - "type": "text", - "placeholders": {} - }, - "appLock": "密碼鎖定", - "@appLock": { - "type": "text", - "placeholders": {} - }, - "archive": "封存", - "@archive": { - "type": "text", - "placeholders": {} - }, - "archivedRoom": "已封存的對話", - "@archivedRoom": { - "type": "text", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "是否允許訪客加入", - "@areGuestsAllowedToJoin": { - "type": "text", - "placeholders": {} - }, - "areYouSure": "您確定嗎?", - "@areYouSure": { - "type": "text", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "您確定要登出嗎?", - "@areYouSureYouWantToLogout": { - "type": "text", - "placeholders": {} - }, - "askSSSSCache": "請輸入您安全儲存的密碼短語或恢復金鑰以快取金鑰。", - "@askSSSSCache": { - "type": "text", - "placeholders": {} - }, - "askSSSSSign": "請輸入您安全儲存的密碼短語或恢復金鑰,以向對方簽名。", - "@askSSSSSign": { - "type": "text", - "placeholders": {} - }, - "askSSSSVerify": "請輸入您安全儲存的密碼短語或恢復金鑰以驗證您的工作階段。", - "@askSSSSVerify": { - "type": "text", - "placeholders": {} - }, - "askVerificationRequest": "是否接受來自{username}的驗證申請?", - "@askVerificationRequest": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "audioPlayerPause": "暫停", - "@audioPlayerPause": { - "type": "text", - "placeholders": {} - }, - "audioPlayerPlay": "播放", - "@audioPlayerPlay": { - "type": "text", - "placeholders": {} - }, - "authentication": "身份驗證", - "@authentication": { - "type": "text", - "placeholders": {} - }, - "avatarHasBeenChanged": "頭貼已變更", - "@avatarHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "badServerLoginTypesException": "目前伺服器支援的登入類型:\n{serverVersions}\n但本應用程式僅支援:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "badServerVersionsException": "目前伺服器支援的Spec版本:\n{serverVersions}\n但本應用程式僅支援{supportedVersions}", - "@badServerVersionsException": { - "type": "text", - "placeholders": { - "serverVersions": {}, - "supportedVersions": {} - } - }, - "banFromChat": "已從聊天室中封禁", - "@banFromChat": { - "type": "text", - "placeholders": {} - }, - "banned": "已被封禁", - "@banned": { - "type": "text", - "placeholders": {} - }, - "bannedUser": "{username}封禁了{targetName}", - "@bannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "blockDevice": "封鎖裝置", - "@blockDevice": { - "type": "text", - "placeholders": {} - }, - "blocked": "已封鎖", - "@blocked": { - "type": "text", - "placeholders": {} - }, - "botMessages": "機器人訊息", - "@botMessages": { - "type": "text", - "placeholders": {} - }, - "cachedKeys": "金鑰已快取", - "@cachedKeys": { - "type": "text", - "placeholders": {} - }, - "cancel": "取消", - "@cancel": { - "type": "text", - "placeholders": {} - }, - "changeDeviceName": "變更裝置名稱", - "@changeDeviceName": { - "type": "text", - "placeholders": {} - }, - "changedTheChatAvatar": "{username}變更了對話頭貼", - "@changedTheChatAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheChatDescriptionTo": "{username}變更了對話介紹為:「{description}」", - "@changedTheChatDescriptionTo": { - "type": "text", - "placeholders": { - "username": {}, - "description": {} - } - }, - "changedTheChatNameTo": "{username}變更了暱稱為:「{chatname}」", - "@changedTheChatNameTo": { - "type": "text", - "placeholders": { - "username": {}, - "chatname": {} - } - }, - "changedTheChatPermissions": "{username}變更了對話權限", - "@changedTheChatPermissions": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheDisplaynameTo": "{username} 變更了顯示名稱為:「{displayname}」", - "@changedTheDisplaynameTo": { - "type": "text", - "placeholders": { - "username": {}, - "displayname": {} - } - }, - "changedTheGuestAccessRules": "{username}變更了訪客訪問規則", - "@changedTheGuestAccessRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheGuestAccessRulesTo": "{username}變更了訪客訪問規則為:{rules}", - "@changedTheGuestAccessRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheHistoryVisibility": "{username}變更了歷史記錄觀察狀態", - "@changedTheHistoryVisibility": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheHistoryVisibilityTo": "{username}變更了歷史紀錄觀察狀態到:{rules}", - "@changedTheHistoryVisibilityTo": { - "type": "text", - "placeholders": { - "username": {}, - "rules": {} - } - }, - "changedTheJoinRules": "{username}變更了加入的規則", - "@changedTheJoinRules": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheJoinRulesTo": "{username}變更了加入的規則為:{joinRules}", - "@changedTheJoinRulesTo": { - "type": "text", - "placeholders": { - "username": {}, - "joinRules": {} - } - }, - "changedTheProfileAvatar": "{username}變更了頭貼", - "@changedTheProfileAvatar": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomAliases": "{username}變更了聊天室名", - "@changedTheRoomAliases": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changedTheRoomInvitationLink": "{username}變更了邀請連結", - "@changedTheRoomInvitationLink": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "changelog": "變更日誌", - "@changelog": { - "type": "text", - "placeholders": {} - }, - "changePassword": "變更密碼", - "@changePassword": { - "type": "text", - "placeholders": {} - }, - "changesHaveBeenSaved": "變更已被儲存", - "@changesHaveBeenSaved": { - "type": "text", - "placeholders": {} - }, - "changeTheHomeserver": "變更主機位址", - "@changeTheHomeserver": { - "type": "text", - "placeholders": {} - }, - "changeTheme": "變更主題", - "@changeTheme": { - "type": "text", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "變更了群組名稱", - "@changeTheNameOfTheGroup": { - "type": "text", - "placeholders": {} - }, - "changeTheServer": "變更伺服器", - "@changeTheServer": { - "type": "text", - "placeholders": {} - }, - "changeWallpaper": "變更聊天背景", - "@changeWallpaper": { - "type": "text", - "placeholders": {} - }, - "channelCorruptedDecryptError": "加密已被破壞", - "@channelCorruptedDecryptError": { - "type": "text", - "placeholders": {} - }, - "chat": "聊天", - "@chat": { - "type": "text", - "placeholders": {} - }, - "chatBackup": "備份聊天室", - "@chatBackup": { - "type": "text", - "placeholders": {} - }, - "chatBackupDescription": "您的聊天記錄備份已被安全金鑰鑰加密。請您確保不會弄丟它。", - "@chatBackupDescription": { - "type": "text", - "placeholders": {} - }, - "chatDetails": "對話詳細", - "@chatDetails": { - "type": "text", - "placeholders": {} - }, - "chooseAStrongPassword": "輸入一個較強的密碼", - "@chooseAStrongPassword": { - "type": "text", - "placeholders": {} - }, - "chooseAUsername": "輸入您的使用者名稱", - "@chooseAUsername": { - "type": "text", - "placeholders": {} - }, - "clearText": "清除文字", - "@clearText": { - "type": "text", - "placeholders": {} - }, - "close": "關閉", - "@close": { - "type": "text", - "placeholders": {} - }, - "compareEmojiMatch": "對比並確認這些表情符合其他那些裝置:", - "@compareEmojiMatch": { - "type": "text", - "placeholders": {} - }, - "compareNumbersMatch": "比較以下數字,確保它們和另一個裝置上的相同:", - "@compareNumbersMatch": { - "type": "text", - "placeholders": {} - }, - "configureChat": "設定聊天室", - "@configureChat": { - "type": "text", - "placeholders": {} - }, - "confirm": "確認", - "@confirm": { - "type": "text", - "placeholders": {} - }, - "connect": "連接", - "@connect": { - "type": "text", - "placeholders": {} - }, - "connectionAttemptFailed": "嘗試連接失敗", - "@connectionAttemptFailed": { - "type": "text", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "聯絡人已被邀請至群組", - "@contactHasBeenInvitedToTheGroup": { - "type": "text", - "placeholders": {} - }, - "containsDisplayName": "包含顯示名稱", - "@containsDisplayName": { - "type": "text", - "placeholders": {} - }, - "containsUserName": "包含使用者名稱", - "@containsUserName": { - "type": "text", - "placeholders": {} - }, - "contentHasBeenReported": "此內容已被回報給伺服器管理員們", - "@contentHasBeenReported": { - "type": "text", - "placeholders": {} - }, - "contentViewer": "內容檢視器", - "@contentViewer": { - "type": "text", - "placeholders": {} - }, - "copiedToClipboard": "已複製到剪貼簿", - "@copiedToClipboard": { - "type": "text", - "placeholders": {} - }, - "copy": "複製", - "@copy": { - "type": "text", - "placeholders": {} - }, - "copyToClipboard": "複製到剪貼簿", - "@copyToClipboard": { - "type": "text", - "placeholders": {} - }, - "couldNotDecryptMessage": "不能解密訊息:{error}", - "@couldNotDecryptMessage": { - "type": "text", - "placeholders": { - "error": {} - } - }, - "couldNotSetAvatar": "不能設定頭貼", - "@couldNotSetAvatar": { - "type": "text", - "placeholders": {} - }, - "couldNotSetDisplayname": "不能設定顯示名稱", - "@couldNotSetDisplayname": { - "type": "text", - "placeholders": {} - }, - "countParticipants": "{count}個參與者", - "@countParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "create": "建立", - "@create": { - "type": "text", - "placeholders": {} - }, - "createAccountNow": "現在建立帳號", - "@createAccountNow": { - "type": "text", - "placeholders": {} - }, - "createdTheChat": "{username}建立了聊天室", - "@createdTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "createNewGroup": "建立新群組", - "@createNewGroup": { - "type": "text", - "placeholders": {} - }, - "crossSigningDisabled": "第三方登入未啟用", - "@crossSigningDisabled": { - "type": "text", - "placeholders": {} - }, - "crossSigningEnabled": "第三方登入已啟用", - "@crossSigningEnabled": { - "type": "text", - "placeholders": {} - }, - "currentlyActive": "目前活躍", - "@currentlyActive": { - "type": "text", - "placeholders": {} - }, - "darkTheme": "夜間模式", - "@darkTheme": { - "type": "text", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "text", - "placeholders": { - "date": {}, - "timeOfDay": {} - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "text", - "placeholders": { - "month": {}, - "day": {} - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "text", - "placeholders": { - "year": {}, - "month": {}, - "day": {} - } - }, - "deactivateAccountWarning": "這將停用您的帳號。這個決定是不能挽回的!您確定嗎?", - "@deactivateAccountWarning": { - "type": "text", - "placeholders": {} - }, - "defaultPermissionLevel": "預設權限等級", - "@defaultPermissionLevel": { - "type": "text", - "placeholders": {} - }, - "delete": "刪除", - "@delete": { - "type": "text", - "placeholders": {} - }, - "deleteAccount": "刪除帳號", - "@deleteAccount": { - "type": "text", - "placeholders": {} - }, - "deleteMessage": "刪除訊息", - "@deleteMessage": { - "type": "text", - "placeholders": {} - }, - "deny": "否認", - "@deny": { - "type": "text", - "placeholders": {} - }, - "device": "裝置", - "@device": { - "type": "text", - "placeholders": {} - }, - "deviceId": "裝置ID", - "@deviceId": { - "type": "text", - "placeholders": {} - }, - "devices": "裝置", - "@devices": { - "type": "text", - "placeholders": {} - }, - "deviceVerifyDescription": "只有在所有的裝置都經過驗證後,加密才會是安全的。", - "@deviceVerifyDescription": { - "type": "text", - "placeholders": {} - }, - "directChats": "直接傳訊", - "@directChats": { - "type": "text", - "placeholders": {} - }, - "discardPicture": "放棄圖片", - "@discardPicture": { - "type": "text", - "placeholders": {} - }, - "discover": "探索", - "@discover": { - "type": "text", - "placeholders": {} - }, - "discoverGroups": "探索群組", - "@discoverGroups": { - "type": "text", - "placeholders": {} - }, - "displaynameHasBeenChanged": "顯示名稱已被變更", - "@displaynameHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "donate": "捐贈", - "@donate": { - "type": "text", - "placeholders": {} - }, - "downloadFile": "下載文件", - "@downloadFile": { - "type": "text", - "placeholders": {} - }, - "edit": "編輯", - "@edit": { - "type": "text", - "placeholders": {} - }, - "editBlockedServers": "編輯被封鎖的伺服器", - "@editBlockedServers": { - "type": "text", - "placeholders": {} - }, - "editChatPermissions": "編輯聊天室權限", - "@editChatPermissions": { - "type": "text", - "placeholders": {} - }, - "editDisplayname": "編輯顯示名稱", - "@editDisplayname": { - "type": "text", - "placeholders": {} - }, - "editJitsiInstance": "編輯Jitsi實例", - "@editJitsiInstance": { - "type": "text", - "placeholders": {} - }, - "editRoomAvatar": "編輯聊天室頭貼", - "@editRoomAvatar": { - "type": "text", - "placeholders": {} - }, - "emoteExists": "表情已存在!", - "@emoteExists": { - "type": "text", - "placeholders": {} - }, - "emoteInvalid": "無效的表情快捷鍵!", - "@emoteInvalid": { - "type": "text", - "placeholders": {} - }, - "emotePacks": "聊天室的表情符號", - "@emotePacks": { - "type": "text", - "placeholders": {} - }, - "emoteSettings": "表情設定", - "@emoteSettings": { - "type": "text", - "placeholders": {} - }, - "emoteShortcode": "表情快捷鍵", - "@emoteShortcode": { - "type": "text", - "placeholders": {} - }, - "emoteWarnNeedToPick": "您需要選取一個表情快捷鍵和一張圖片!", - "@emoteWarnNeedToPick": { - "type": "text", - "placeholders": {} - }, - "emptyChat": "空的聊天室", - "@emptyChat": { - "type": "text", - "placeholders": {} - }, - "enableEmotesGlobally": "在全域啟用表情符號", - "@enableEmotesGlobally": { - "type": "text", - "placeholders": {} - }, - "enableEncryption": "啟用加密", - "@enableEncryption": { - "type": "text", - "placeholders": {} - }, - "enableEncryptionWarning": "您將不能再停用加密,確定嗎?", - "@enableEncryptionWarning": { - "type": "text", - "placeholders": {} - }, - "encrypted": "加密的", - "@encrypted": { - "type": "text", - "placeholders": {} - }, - "encryption": "加密", - "@encryption": { - "type": "text", - "placeholders": {} - }, - "encryptionAlgorithm": "加密算法", - "@encryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "encryptionNotEnabled": "加密未啟用", - "@encryptionNotEnabled": { - "type": "text", - "placeholders": {} - }, - "end2endEncryptionSettings": "點對點加密設定", - "@end2endEncryptionSettings": { - "type": "text", - "placeholders": {} - }, - "endedTheCall": "{senderName}結束了通話", - "@endedTheCall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "enterAGroupName": "輸入群組名稱", - "@enterAGroupName": { - "type": "text", - "placeholders": {} - }, - "enterAnEmailAddress": "輸入一個電子郵件位址", - "@enterAnEmailAddress": { - "type": "text", - "placeholders": {} - }, - "enterAUsername": "輸入使用者名稱", - "@enterAUsername": { - "type": "text", - "placeholders": {} - }, - "enterYourHomeserver": "輸入伺服器位址", - "@enterYourHomeserver": { - "type": "text", - "placeholders": {} - }, - "everythingReady": "一切就緒!", - "@everythingReady": { - "type": "text", - "placeholders": {} - }, - "extremeOffensive": "極端令人反感", - "@extremeOffensive": { - "type": "text", - "placeholders": {} - }, - "fileName": "檔案名稱", - "@fileName": { - "type": "text", - "placeholders": {} - }, - "fileSize": "檔案大小", - "@fileSize": { - "type": "text", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "text", - "placeholders": {} - }, - "fontSize": "字體大小", - "@fontSize": { - "type": "text", - "placeholders": {} - }, - "forward": "轉發", - "@forward": { - "type": "text", - "placeholders": {} - }, - "friday": "星期五", - "@friday": { - "type": "text", - "placeholders": {} - }, - "friends": "朋友", - "@friends": { - "type": "text", - "placeholders": {} - }, - "fromJoining": "自加入起", - "@fromJoining": { - "type": "text", - "placeholders": {} - }, - "fromTheInvitation": "自邀請起", - "@fromTheInvitation": { - "type": "text", - "placeholders": {} - }, - "group": "群組", - "@group": { - "type": "text", - "placeholders": {} - }, - "groupDescription": "群組描述", - "@groupDescription": { - "type": "text", - "placeholders": {} - }, - "groupDescriptionHasBeenChanged": "群組描述已被變更", - "@groupDescriptionHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "groupIsPublic": "群組是公開的", - "@groupIsPublic": { - "type": "text", - "placeholders": {} - }, - "groups": "群組", - "@groups": { - "type": "text", - "placeholders": {} - }, - "groupWith": "名稱為{displayname}的群組", - "@groupWith": { - "type": "text", - "placeholders": { - "displayname": {} - } - }, - "guestsAreForbidden": "訪客已被禁止", - "@guestsAreForbidden": { - "type": "text", - "placeholders": {} - }, - "guestsCanJoin": "訪客可以加入", - "@guestsCanJoin": { - "type": "text", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username}收回了對{targetName}的邀請", - "@hasWithdrawnTheInvitationFor": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "help": "幫助", - "@help": { - "type": "text", - "placeholders": {} - }, - "hideRedactedEvents": "隱藏編輯過的事件", - "@hideRedactedEvents": { - "type": "text", - "placeholders": {} - }, - "hideUnknownEvents": "隱藏未知事件", - "@hideUnknownEvents": { - "type": "text", - "placeholders": {} - }, - "homeserverIsNotCompatible": "伺服器不相容", - "@homeserverIsNotCompatible": { - "type": "text", - "placeholders": {} - }, - "howOffensiveIsThisContent": "這個內容有多令人反感?", - "@howOffensiveIsThisContent": { - "type": "text", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "text", - "placeholders": {} - }, - "identity": "身份", - "@identity": { - "type": "text", - "placeholders": {} - }, - "ignore": "無視", - "@ignore": { - "type": "text", - "placeholders": {} - }, - "ignoredUsers": "已無視的使用者", - "@ignoredUsers": { - "type": "text", - "placeholders": {} - }, - "ignoreListDescription": "您可以無視打擾您的使用者。您將不會再收到來自無視列表中使用者的任何消息或聊天室邀請。", - "@ignoreListDescription": { - "type": "text", - "placeholders": {} - }, - "ignoreUsername": "無視使用者名稱", - "@ignoreUsername": { - "type": "text", - "placeholders": {} - }, - "iHaveClickedOnLink": "我已經點擊了網址", - "@iHaveClickedOnLink": { - "type": "text", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "錯誤的密碼短語或恢復金鑰", - "@incorrectPassphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "inoffensive": "不令人反感", - "@inoffensive": { - "type": "text", - "placeholders": {} - }, - "inviteContact": "邀請聯絡人", - "@inviteContact": { - "type": "text", - "placeholders": {} - }, - "inviteContactToGroup": "邀請聯絡人到{groupName}", - "@inviteContactToGroup": { - "type": "text", - "placeholders": { - "groupName": {} - } - }, - "invited": "已邀請", - "@invited": { - "type": "text", - "placeholders": {} - }, - "invitedUser": "{username}邀請了{targetName}", - "@invitedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "invitedUsersOnly": "只有被邀請的使用者", - "@invitedUsersOnly": { - "type": "text", - "placeholders": {} - }, - "inviteForMe": "來自我的邀請", - "@inviteForMe": { - "type": "text", - "placeholders": {} - }, - "inviteText": "{username}邀請您使用FluffyChat\n1. 安裝FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:{link}", - "@inviteText": { - "type": "text", - "placeholders": { - "username": {}, - "link": {} - } - }, - "isDeviceKeyCorrect": "下列裝置金鑰是否正確?", - "@isDeviceKeyCorrect": { - "type": "text", - "placeholders": {} - }, - "isTyping": "正在輸入...…", - "@isTyping": { - "type": "text", - "placeholders": {} - }, - "joinedTheChat": "{username}加入了聊天室", - "@joinedTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "joinRoom": "加入聊天室", - "@joinRoom": { - "type": "text", - "placeholders": {} - }, - "keysCached": "金鑰已被快取", - "@keysCached": { - "type": "text", - "placeholders": {} - }, - "keysMissing": "金鑰遺失", - "@keysMissing": { - "type": "text", - "placeholders": {} - }, - "kicked": "{username}踢了{targetName}", - "@kicked": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickedAndBanned": "{username}踢了{targetName}並將其封禁", - "@kickedAndBanned": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "kickFromChat": "從聊天室踢出", - "@kickFromChat": { - "type": "text", - "placeholders": {} - }, - "lastActiveAgo": "最後活動時間:{localizedTimeShort}", - "@lastActiveAgo": { - "type": "text", - "placeholders": { - "localizedTimeShort": {} - } - }, - "lastSeenIp": "最後使用的IP", - "@lastSeenIp": { - "type": "text", - "placeholders": {} - }, - "lastSeenLongTimeAgo": "很長一段時間沒有上線了", - "@lastSeenLongTimeAgo": { - "type": "text", - "placeholders": {} - }, - "leave": "離開", - "@leave": { - "type": "text", - "placeholders": {} - }, - "leftTheChat": "離開了聊天室", - "@leftTheChat": { - "type": "text", - "placeholders": {} - }, - "license": "授權", - "@license": { - "type": "text", - "placeholders": {} - }, - "lightTheme": "日間模式", - "@lightTheme": { - "type": "text", - "placeholders": {} - }, - "loadCountMoreParticipants": "載入{count}個更多的參與者", - "@loadCountMoreParticipants": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "loadingPleaseWait": "載入中… 請稍候。", - "@loadingPleaseWait": { - "type": "text", - "placeholders": {} - }, - "loadMore": "載入更多…", - "@loadMore": { - "type": "text", - "placeholders": {} - }, - "login": "登入", - "@login": { - "type": "text", - "placeholders": {} - }, - "logInTo": "登入{homeserver}", - "@logInTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "logout": "登出", - "@logout": { - "type": "text", - "placeholders": {} - }, - "makeAModerator": "建立版主", - "@makeAModerator": { - "type": "text", - "placeholders": {} - }, - "makeAnAdmin": "建立管理員", - "@makeAnAdmin": { - "type": "text", - "placeholders": {} - }, - "makeSureTheIdentifierIsValid": "確保識別碼正確", - "@makeSureTheIdentifierIsValid": { - "type": "text", - "placeholders": {} - }, - "memberChanges": "變更成員", - "@memberChanges": { - "type": "text", - "placeholders": {} - }, - "mention": "提及", - "@mention": { - "type": "text", - "placeholders": {} - }, - "messages": "訊息", - "@messages": { - "type": "text", - "placeholders": {} - }, - "messageWillBeRemovedWarning": "將移除所有參與者的訊息", - "@messageWillBeRemovedWarning": { - "type": "text", - "placeholders": {} - }, - "moderator": "版主", - "@moderator": { - "type": "text", - "placeholders": {} - }, - "monday": "星期一", - "@monday": { - "type": "text", - "placeholders": {} - }, - "moreEvents": "{count,plural, =1{還有1個事件} other{還有{count}個事件}}", - "@moreEvents": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "muteChat": "將該聊天室靜音", - "@muteChat": { - "type": "text", - "placeholders": {} - }, - "needPantalaimonWarning": "請注意您需要Pantalaimon才能使用點對點加密功能。", - "@needPantalaimonWarning": { - "type": "text", - "placeholders": {} - }, - "newChat": "新聊天室", - "@newChat": { - "type": "text", - "placeholders": {} - }, - "newMessageInFluffyChat": "來自 FluffyChat 的新訊息", - "@newMessageInFluffyChat": { - "type": "text", - "placeholders": {} - }, - "newVerificationRequest": "新的驗證請求!", - "@newVerificationRequest": { - "type": "text", - "placeholders": {} - }, - "next": "下一個", - "@next": { - "type": "text", - "placeholders": {} - }, - "no": "否", - "@no": { - "type": "text", - "placeholders": {} - }, - "noConnectionToTheServer": "無法連接到伺服器", - "@noConnectionToTheServer": { - "type": "text", - "placeholders": {} - }, - "noCrossSignBootstrap": "FluffyChat目前不支援啟用Cross-Signing。請在Riot中啟用。", - "@noCrossSignBootstrap": { - "type": "text", - "placeholders": {} - }, - "noDescription": "沒有描述", - "@noDescription": { - "type": "text", - "placeholders": {} - }, - "noEmotesFound": "表情符號不存在。😕", - "@noEmotesFound": { - "type": "text", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "您只能在這個聊天室不再被允許公開訪問後,才能啟用加密。", - "@noEncryptionForPublicRooms": { - "type": "text", - "placeholders": {} - }, - "noGoogleServicesWarning": "看起來您手機上沒有Google服務框架。這對於保護您的隱私而言是個好決定!但為了收到FluffyChat的推播通知,我們推薦您使用 https://microg.org/ 或 https://unifiedpush.org/。", - "@noGoogleServicesWarning": { - "type": "text", - "placeholders": {} - }, - "noMegolmBootstrap": "FluffyChat目前不支援啟用線上金鑰備份。請在Riot中啟用。", - "@noMegolmBootstrap": { - "type": "text", - "placeholders": {} - }, - "none": "無", - "@none": { - "type": "text", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "您尚未新增恢復密碼的方法。", - "@noPasswordRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "noPermission": "沒有權限", - "@noPermission": { - "type": "text", - "placeholders": {} - }, - "noPublicRoomsFound": "找不到公開的聊天室…", - "@noPublicRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noRoomsFound": "找不到聊天室…", - "@noRoomsFound": { - "type": "text", - "placeholders": {} - }, - "noStatusesFound": "目前還沒有發現任何狀態。", - "@noStatusesFound": { - "type": "text", - "placeholders": {} - }, - "notifications": "通知", - "@notifications": { - "type": "text", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "已為此帳號啟用通知", - "@notificationsEnabledForThisAccount": { - "type": "text", - "placeholders": {} - }, - "notSupportedInWeb": "在網頁版不支援", - "@notSupportedInWeb": { - "type": "text", - "placeholders": {} - }, - "numberSelected": "{number}已選擇", - "@numberSelected": { - "type": "text", - "placeholders": { - "number": {} - } - }, - "numUsersTyping": "{count}個人正在輸入…", - "@numUsersTyping": { - "type": "text", - "placeholders": { - "count": {} - } - }, - "offensive": "令人反感", - "@offensive": { - "type": "text", - "placeholders": {} - }, - "offline": "離線", - "@offline": { - "type": "text", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "text", - "placeholders": {} - }, - "online": "線上", - "@online": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupDisabled": "線上金鑰備份被停用", - "@onlineKeyBackupDisabled": { - "type": "text", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "線上金鑰備份已啟用", - "@onlineKeyBackupEnabled": { - "type": "text", - "placeholders": {} - }, - "oopsSomethingWentWrong": "哎呀!出了一點差錯…", - "@oopsSomethingWentWrong": { - "type": "text", - "placeholders": {} - }, - "openAppToReadMessages": "打開應用程式以讀取訊息", - "@openAppToReadMessages": { - "type": "text", - "placeholders": {} - }, - "openCamera": "開啟相機", - "@openCamera": { - "type": "text", - "placeholders": {} - }, - "optionalGroupName": "(可選)群組名稱", - "@optionalGroupName": { - "type": "text", - "placeholders": {} - }, - "participant": "參與者", - "@participant": { - "type": "text", - "placeholders": {} - }, - "participatingUserDevices": "參與者裝置", - "@participatingUserDevices": { - "type": "text", - "placeholders": {} - }, - "passphraseOrKey": "密碼短語或恢復金鑰", - "@passphraseOrKey": { - "type": "text", - "placeholders": {} - }, - "password": "密碼", - "@password": { - "type": "text", - "placeholders": {} - }, - "passwordForgotten": "忘記密碼", - "@passwordForgotten": { - "type": "text", - "placeholders": {} - }, - "passwordHasBeenChanged": "密碼已被變更", - "@passwordHasBeenChanged": { - "type": "text", - "placeholders": {} - }, - "passwordRecovery": "恢復密碼", - "@passwordRecovery": { - "type": "text", - "placeholders": {} - }, - "pickImage": "選擇圖片", - "@pickImage": { - "type": "text", - "placeholders": {} - }, - "pin": "釘選", - "@pin": { - "type": "text", - "placeholders": {} - }, - "play": "播放{fileName}", - "@play": { - "type": "text", - "placeholders": { - "fileName": {} - } - }, - "pleaseChooseAPasscode": "請選擇一個密碼", - "@pleaseChooseAPasscode": { - "type": "text", - "placeholders": {} - }, - "pleaseChooseAUsername": "請選擇使用者名稱", - "@pleaseChooseAUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseClickOnLink": "請點擊電子郵件中的網址,然後繼續。", - "@pleaseClickOnLink": { - "type": "text", - "placeholders": {} - }, - "pleaseEnter4Digits": "請輸入4位數字,或留空以停用密碼鎖定。", - "@pleaseEnter4Digits": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterAMatrixIdentifier": "請輸入Matrix ID。", - "@pleaseEnterAMatrixIdentifier": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterSecurityKey": "請輸入您的安全金鑰 :", - "@pleaseEnterSecurityKey": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourPassword": "請輸入您的密碼", - "@pleaseEnterYourPassword": { - "type": "text", - "placeholders": {} - }, - "pleaseEnterYourUsername": "請輸入您的使用者名稱", - "@pleaseEnterYourUsername": { - "type": "text", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "請按照網站上的說明進行操作,然後點擊下一步。", - "@pleaseFollowInstructionsOnWeb": { - "type": "text", - "placeholders": {} - }, - "privacy": "隱私", - "@privacy": { - "type": "text", - "placeholders": {} - }, - "publicKey": "公鑰", - "@publicKey": { - "type": "text", - "placeholders": {} - }, - "publicRooms": "公開的聊天室", - "@publicRooms": { - "type": "text", - "placeholders": {} - }, - "pushRules": "推播規則", - "@pushRules": { - "type": "text", - "placeholders": {} - }, - "reason": "原因", - "@reason": { - "type": "text", - "placeholders": {} - }, - "recording": "錄音中", - "@recording": { - "type": "text", - "placeholders": {} - }, - "redactedAnEvent": "{username}編輯了一個事件", - "@redactedAnEvent": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "redactMessage": "重新編輯訊息", - "@redactMessage": { - "type": "text", - "placeholders": {} - }, - "reject": "拒絕", - "@reject": { - "type": "text", - "placeholders": {} - }, - "rejectedTheInvitation": "{username}拒絕了邀請", - "@rejectedTheInvitation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "rejoin": "重新加入", - "@rejoin": { - "type": "text", - "placeholders": {} - }, - "remove": "移除", - "@remove": { - "type": "text", - "placeholders": {} - }, - "removeAllOtherDevices": "移除所有其他裝置", - "@removeAllOtherDevices": { - "type": "text", - "placeholders": {} - }, - "removedBy": "被{username}移除", - "@removedBy": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "removeDevice": "移除裝置", - "@removeDevice": { - "type": "text", - "placeholders": {} - }, - "unbanFromChat": "解禁聊天", - "@unbanFromChat": { - "type": "text", - "placeholders": {} - }, - "removeMessage": "移除訊息", - "@removeMessage": { - "type": "text", - "placeholders": {} - }, - "renderRichContent": "繪製圖文訊息內容", - "@renderRichContent": { - "type": "text", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "用較新的版本取代聊天室", - "@replaceRoomWithNewerVersion": { - "type": "text", - "placeholders": {} - }, - "reply": "回覆", - "@reply": { - "type": "text", - "placeholders": {} - }, - "reportMessage": "檢舉訊息", - "@reportMessage": { - "type": "text", - "placeholders": {} - }, - "requestPermission": "請求權限", - "@requestPermission": { - "type": "text", - "placeholders": {} - }, - "requestToReadOlderMessages": "請求讀取過去的訊息", - "@requestToReadOlderMessages": { - "type": "text", - "placeholders": {} - }, - "revokeAllPermissions": "撤銷所有權限", - "@revokeAllPermissions": { - "type": "text", - "placeholders": {} - }, - "roomHasBeenUpgraded": "聊天室已更新", - "@roomHasBeenUpgraded": { - "type": "text", - "placeholders": {} - }, - "saturday": "星期六", - "@saturday": { - "type": "text", - "placeholders": {} - }, - "search": "搜尋", - "@search": { - "type": "text", - "placeholders": {} - }, - "searchForAChat": "搜尋聊天室", - "@searchForAChat": { - "type": "text", - "placeholders": {} - }, - "security": "安全", - "@security": { - "type": "text", - "placeholders": {} - }, - "securityKey": "安全金鑰", - "@securityKey": { - "type": "text", - "placeholders": {} - }, - "securityKeyLost": "遺失安全金鑰?", - "@securityKeyLost": { - "type": "text", - "placeholders": {} - }, - "seenByUser": "{username}已讀", - "@seenByUser": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "seenByUserAndCountOthers": "{count, plural, other{{username}和其他{count}個人已讀}}", - "@seenByUserAndCountOthers": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "seenByUserAndUser": "{username}和{username2}已讀", - "@seenByUserAndUser": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "send": "傳送", - "@send": { - "type": "text", - "placeholders": {} - }, - "sendAMessage": "傳送訊息", - "@sendAMessage": { - "type": "text", - "placeholders": {} - }, - "sendAudio": "傳送音訊", - "@sendAudio": { - "type": "text", - "placeholders": {} - }, - "sendBugReports": "允許向sentry.io回報錯誤", - "@sendBugReports": { - "type": "text", - "placeholders": {} - }, - "sendFile": "傳送文件", - "@sendFile": { - "type": "text", - "placeholders": {} - }, - "sendImage": "傳送圖片", - "@sendImage": { - "type": "text", - "placeholders": {} - }, - "sendMessages": "傳送訊息", - "@sendMessages": { - "type": "text", - "placeholders": {} - }, - "sendOriginal": "傳送原始內容", - "@sendOriginal": { - "type": "text", - "placeholders": {} - }, - "sendVideo": "傳送影片", - "@sendVideo": { - "type": "text", - "placeholders": {} - }, - "sentAFile": "{username}傳送了一個文件", - "@sentAFile": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAnAudio": "{username}傳送了一個音訊", - "@sentAnAudio": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAPicture": "{username}傳送了一張圖片", - "@sentAPicture": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentASticker": "{username} 傳送了貼圖", - "@sentASticker": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentAVideo": "{username} 傳送了影片", - "@sentAVideo": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "sentCallInformations": "{senderName} 傳送了通話資訊", - "@sentCallInformations": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "sentryInfo": "關於您的隱私:https://sentry.io/security/", - "@sentryInfo": { - "type": "text", - "placeholders": {} - }, - "sessionVerified": "工作階段已被驗證", - "@sessionVerified": { - "type": "text", - "placeholders": {} - }, - "setAProfilePicture": "設定個人檔案頭貼", - "@setAProfilePicture": { - "type": "text", - "placeholders": {} - }, - "setCustomEmotes": "自訂表情符號", - "@setCustomEmotes": { - "type": "text", - "placeholders": {} - }, - "setGroupDescription": "設定群組描述", - "@setGroupDescription": { - "type": "text", - "placeholders": {} - }, - "setInvitationLink": "設定邀請連結", - "@setInvitationLink": { - "type": "text", - "placeholders": {} - }, - "setPermissionsLevel": "設定權限級別", - "@setPermissionsLevel": { - "type": "text", - "placeholders": {} - }, - "setStatus": "設定狀態", - "@setStatus": { - "type": "text", - "placeholders": {} - }, - "settings": "設定", - "@settings": { - "type": "text", - "placeholders": {} - }, - "share": "分享", - "@share": { - "type": "text", - "placeholders": {} - }, - "sharedTheLocation": "{username} 分享了位置", - "@sharedTheLocation": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "showPassword": "顯示密碼", - "@showPassword": { - "type": "text", - "placeholders": {} - }, - "signUp": "註冊", - "@signUp": { - "type": "text", - "placeholders": {} - }, - "skip": "跳過", - "@skip": { - "type": "text", - "placeholders": {} - }, - "soundVibrationLedColor": "聲音、振動及LED", - "@soundVibrationLedColor": { - "type": "text", - "placeholders": {} - }, - "sourceCode": "原始碼", - "@sourceCode": { - "type": "text", - "placeholders": {} - }, - "startedACall": "{senderName}開始了通話", - "@startedACall": { - "type": "text", - "placeholders": { - "senderName": {} - } - }, - "startYourFirstChat": "請開始您的聊天之旅☆(ゝω●)\n- 點擊「新聊天室」\n- 掃描朋友的二維碼\n- 一起開心的聊天吧", - "@startYourFirstChat": { - "type": "text", - "placeholders": {} - }, - "status": "狀態", - "@status": { - "type": "text", - "placeholders": {} - }, - "statusExampleMessage": "今天過得如何?", - "@statusExampleMessage": { - "type": "text", - "placeholders": {} - }, - "submit": "送出", - "@submit": { - "type": "text", - "placeholders": {} - }, - "sunday": "星期日", - "@sunday": { - "type": "text", - "placeholders": {} - }, - "systemTheme": "自動", - "@systemTheme": { - "type": "text", - "placeholders": {} - }, - "tapOnDeviceToVerify": "在一個裝置上點擊以進行驗證", - "@tapOnDeviceToVerify": { - "type": "text", - "placeholders": {} - }, - "tapToShowMenu": "點擊以顯示功能表", - "@tapToShowMenu": { - "type": "text", - "placeholders": {} - }, - "theyDontMatch": "它們不相符", - "@theyDontMatch": { - "type": "text", - "placeholders": {} - }, - "theyMatch": "它們相符", - "@theyMatch": { - "type": "text", - "placeholders": {} - }, - "thisRoomHasBeenArchived": "這個聊天室已被封存。", - "@thisRoomHasBeenArchived": { - "type": "text", - "placeholders": {} - }, - "thursday": "星期四", - "@thursday": { - "type": "text", - "placeholders": {} - }, - "timeOfDay": "{suffix} {hours12}點{minutes}分", - "@timeOfDay": { - "type": "text", - "placeholders": { - "hours12": {}, - "hours24": {}, - "minutes": {}, - "suffix": {} - } - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "text", - "placeholders": {} - }, - "toggleFavorite": "切換收藏夾", - "@toggleFavorite": { - "type": "text", - "placeholders": {} - }, - "toggleMuted": "切換靜音", - "@toggleMuted": { - "type": "text", - "placeholders": {} - }, - "toggleUnread": "標記為已讀/未讀", - "@toggleUnread": { - "type": "text", - "placeholders": {} - }, - "tooManyRequestsWarning": "太多請求了。請稍候再試!", - "@tooManyRequestsWarning": { - "type": "text", - "placeholders": {} - }, - "transferFromAnotherDevice": "從其他裝置傳輸", - "@transferFromAnotherDevice": { - "type": "text", - "placeholders": {} - }, - "tryToSendAgain": "再次嘗試傳送", - "@tryToSendAgain": { - "type": "text", - "placeholders": {} - }, - "tuesday": "星期二", - "@tuesday": { - "type": "text", - "placeholders": {} - }, - "unavailable": "無法取得", - "@unavailable": { - "type": "text", - "placeholders": {} - }, - "unbannedUser": "{username}解除封禁了{targetName}", - "@unbannedUser": { - "type": "text", - "placeholders": { - "username": {}, - "targetName": {} - } - }, - "unblockDevice": "解除鎖定裝置", - "@unblockDevice": { - "type": "text", - "placeholders": {} - }, - "unknownDevice": "未知裝置", - "@unknownDevice": { - "type": "text", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "未知的加密演算法", - "@unknownEncryptionAlgorithm": { - "type": "text", - "placeholders": {} - }, - "unknownEvent": "未知事件「{type}」", - "@unknownEvent": { - "type": "text", - "placeholders": { - "type": {} - } - }, - "unknownSessionVerify": "未知的工作階段,請驗證", - "@unknownSessionVerify": { - "type": "text", - "placeholders": {} - }, - "unlockChatBackup": "解鎖聊天記錄備份", - "@unlockChatBackup": { - "type": "text", - "placeholders": {} - }, - "unmuteChat": "取消靜音聊天室", - "@unmuteChat": { - "type": "text", - "placeholders": {} - }, - "unpin": "取消釘選", - "@unpin": { - "type": "text", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} 個未讀聊天室}}", - "@unreadChats": { - "type": "text", - "placeholders": { - "unreadCount": {} - } - }, - "unreadMessages": "{unreadEvents, plural, =1{1 unread message} other{{unreadEvents} 個未讀訊息}}", - "@unreadMessages": { - "type": "text", - "placeholders": { - "unreadEvents": {} - } - }, - "useAmoledTheme": "使用適合AMOLED螢幕的顏色?", - "@useAmoledTheme": { - "type": "text", - "placeholders": {} - }, - "userAndOthersAreTyping": "{username}和其他{count}個人正在輸入…", - "@userAndOthersAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "count": {} - } - }, - "userAndUserAreTyping": "{username}和{username2}正在輸入…", - "@userAndUserAreTyping": { - "type": "text", - "placeholders": { - "username": {}, - "username2": {} - } - }, - "userIsTyping": "{username}正在輸入…", - "@userIsTyping": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "userLeftTheChat": "{username}離開了聊天室", - "@userLeftTheChat": { - "type": "text", - "placeholders": { - "username": {} - } - }, - "username": "使用者名稱", - "@username": { - "type": "text", - "placeholders": {} - }, - "userNotVerified": "使用者尚未驗證", - "@userNotVerified": { - "type": "text", - "placeholders": {} - }, - "userSentUnknownEvent": "{username}傳送了一個{type}事件", - "@userSentUnknownEvent": { - "type": "text", - "placeholders": { - "username": {}, - "type": {} - } - }, - "userUnknownVerification": "未知的使用者驗證狀態", - "@userUnknownVerification": { - "type": "text", - "placeholders": {} - }, - "userVerified": "使用者已驗證", - "@userVerified": { - "type": "text", - "placeholders": {} - }, - "verified": "已驗證", - "@verified": { - "type": "text", - "placeholders": {} - }, - "verifiedSession": "工作階段成功驗證!", - "@verifiedSession": { - "type": "text", - "placeholders": {} - }, - "verify": "驗證", - "@verify": { - "type": "text", - "placeholders": {} - }, - "verifyManual": "手動驗證", - "@verifyManual": { - "type": "text", - "placeholders": {} - }, - "verifyStart": "開始驗證", - "@verifyStart": { - "type": "text", - "placeholders": {} - }, - "verifySuccess": "您成功驗證了!", - "@verifySuccess": { - "type": "text", - "placeholders": {} - }, - "verifyTitle": "正在驗證其他帳號", - "@verifyTitle": { - "type": "text", - "placeholders": {} - }, - "verifyUser": "驗證使用者", - "@verifyUser": { - "type": "text", - "placeholders": {} - }, - "videoCall": "視訊通話", - "@videoCall": { - "type": "text", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "聊天記錄的可見性", - "@visibilityOfTheChatHistory": { - "type": "text", - "placeholders": {} - }, - "visibleForAllParticipants": "對所有參與者可見", - "@visibleForAllParticipants": { - "type": "text", - "placeholders": {} - }, - "visibleForEveryone": "對所有人可見", - "@visibleForEveryone": { - "type": "text", - "placeholders": {} - }, - "voiceMessage": "語音訊息", - "@voiceMessage": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "正在等待夥伴接受請求…", - "@waitingPartnerAcceptRequest": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerEmoji": "正在等待夥伴接受表情符號…", - "@waitingPartnerEmoji": { - "type": "text", - "placeholders": {} - }, - "waitingPartnerNumbers": "正在等待夥伴接受數字…", - "@waitingPartnerNumbers": { - "type": "text", - "placeholders": {} - }, - "wallpaper": "桌布", - "@wallpaper": { - "type": "text", - "placeholders": {} - }, - "warning": "警告!", - "@warning": { - "type": "text", - "placeholders": {} - }, - "warningEncryptionInBeta": "點對點加密目前處於Beta測試中!使用的話後果自負呦!", - "@warningEncryptionInBeta": { - "type": "text", - "placeholders": {} - }, - "wednesday": "星期三", - "@wednesday": { - "type": "text", - "placeholders": {} - }, - "welcomeText": "歡迎使用Matrix中最可愛的即時通訊軟體(*´▽`*)。", - "@welcomeText": { - "type": "text", - "placeholders": {} - }, - "weSentYouAnEmail": "我們向您傳送了一封電子郵件", - "@weSentYouAnEmail": { - "type": "text", - "placeholders": {} - }, - "whoCanPerformWhichAction": "誰可以執行這個動作", - "@whoCanPerformWhichAction": { - "type": "text", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "誰可以加入這個群組", - "@whoIsAllowedToJoinThisGroup": { - "type": "text", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "您檢舉的原因是什麼?", - "@whyDoYouWantToReportThis": { - "type": "text", - "placeholders": {} - }, - "wipeChatBackup": "要清除您的聊天記錄備份以建立新的安全金鑰嗎?", - "@wipeChatBackup": { - "type": "text", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "有了這些位址,您就可以恢復密碼。", - "@withTheseAddressesRecoveryDescription": { - "type": "text", - "placeholders": {} - }, - "writeAMessage": "輸入訊息…", - "@writeAMessage": { - "type": "text", - "placeholders": {} - }, - "yes": "是", - "@yes": { - "type": "text", - "placeholders": {} - }, - "you": "您", - "@you": { - "type": "text", - "placeholders": {} - }, - "youAreInvitedToThisChat": "有人邀請您加入這個聊天室", - "@youAreInvitedToThisChat": { - "type": "text", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "您不再參與這個聊天室了", - "@youAreNoLongerParticipatingInThisChat": { - "type": "text", - "placeholders": {} - }, - "youCannotInviteYourself": "您不能邀請您自己", - "@youCannotInviteYourself": { - "type": "text", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "您已經被這個聊天室封禁", - "@youHaveBeenBannedFromThisChat": { - "type": "text", - "placeholders": {} - }, - "yourOwnUsername": "您的使用者名稱", - "@yourOwnUsername": { - "type": "text", - "placeholders": {} - }, - "yourPublicKey": "您的公鑰", - "@yourPublicKey": { - "type": "text", - "placeholders": {} - }, - "youWillBeConnectedTo": "您將會連接到{homeserver}", - "@youWillBeConnectedTo": { - "type": "text", - "placeholders": { - "homeserver": {} - } - }, - "zoomIn": "放大", - "@zoomIn": { - "type": "text", - "placeholders": {} - }, - "zoomOut": "縮小", - "@zoomOut": { - "type": "text", - "placeholders": {} - }, - "publicGroups": "公開的群組", - "@publicGroups": { - "type": "text", - "placeholders": {} - }, - "people": "人", - "@people": { - "type": "text", - "placeholders": {} - }, - "chats": "聊天室", - "@chats": { - "type": "text", - "placeholders": {} - }, - "allChats": "所有會話", - "@allChats": { - "type": "text", - "placeholders": {} - }, - "commandHint_ban": "在此聊天室封禁該使用者", - "@commandHint_ban": { - "type": "text", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "清除快取", - "@commandHint_clearcache": { - "type": "text", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "建立一個空的群聊\n使用 --no-encryption 選項來禁用加密", - "@commandHint_create": { - "type": "text", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "丟棄工作階段", - "@commandHint_discardsession": { - "type": "text", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "啟動一對一聊天\n使用 --no-encryption 選項來禁用加密", - "@commandHint_dm": { - "type": "text", - "description": "Usage hint for the command /dm" - }, - "commandHint_invite": "邀請該使用者加入此聊天室", - "@commandHint_invite": { - "type": "text", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "加入此聊天室", - "@commandHint_join": { - "type": "text", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "將這個使用者移出此聊天室", - "@commandHint_kick": { - "type": "text", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "退出此聊天室", - "@commandHint_leave": { - "type": "text", - "description": "Usage hint for the command /leave" - }, - "commandHint_myroomnick": "設定您的聊天室暱稱", - "@commandHint_myroomnick": { - "type": "text", - "description": "Usage hint for the command /myroomnick" - }, - "editRoomAliases": "編輯聊天室名", - "@editRoomAliases": { - "type": "text", - "placeholders": {} - }, - "roomVersion": "聊天室的版本", - "@roomVersion": { - "type": "text", - "placeholders": {} - }, - "addToSpace": "加入空間", - "@addToSpace": {}, - "cantOpenUri": "無法打開URI {uri}", - "@cantOpenUri": { - "type": "text", - "placeholders": { - "uri": {} - } - }, - "repeatPassword": "再次輸入密碼", - "@repeatPassword": {}, - "yourChatBackupHasBeenSetUp": "您的聊天記錄備份已設定。", - "@yourChatBackupHasBeenSetUp": {}, - "pleaseChooseAtLeastChars": "請至少輸入 {min} 个字元。", - "@pleaseChooseAtLeastChars": { - "type": "text", - "placeholders": { - "min": {} - } - }, - "setupChatBackupDescription": "為了保護您的消息,我們為您生成了一個安全金鑰。\n請將其儲存在安全的地方,例如密碼管理器中。", - "@setupChatBackupDescription": {}, - "goToTheNewRoom": "前往新聊天室", - "@goToTheNewRoom": { - "type": "text", - "placeholders": {} - }, - "commandHint_myroomavatar": "設置您的聊天室頭貼(通過 mxc-uri)", - "@commandHint_myroomavatar": { - "type": "text", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_unban": "在此聊天室解封該使用者", - "@commandHint_unban": { - "type": "text", - "description": "Usage hint for the command /unban" - }, - "passwordsDoNotMatch": "密碼不匹配!", - "@passwordsDoNotMatch": {}, - "pleaseEnterValidEmail": "請輸入一個有效的電子郵件地址。", - "@pleaseEnterValidEmail": {}, - "autoplayImages": "自動播放動態貼圖和表情", - "@autoplayImages": { - "type": "text", - "placeholder": {} - }, - "sendOnEnter": "按 Enter 鍵發送", - "@sendOnEnter": {}, - "changeYourAvatar": "更改您的大頭貼", - "@changeYourAvatar": { - "type": "text", - "placeholders": {} - }, - "yourUserId": "您的ID:", - "@yourUserId": {}, - "setupChatBackup": "設定聊天記錄備份", - "@setupChatBackup": {}, - "iWroteDownTheKey": "我已經記下了金鑰", - "@iWroteDownTheKey": {}, - "chatHasBeenAddedToThisSpace": "聊天室已添加到此空間", - "@chatHasBeenAddedToThisSpace": {}, - "chatHasBeenRemovedFromThisSpace": "聊天室已從此空間移除", - "@chatHasBeenRemovedFromThisSpace": { - "type": "text", - "placeholders": {} - }, - "clearArchive": "清除存檔", - "@clearArchive": {} -} diff --git a/assets/login_wallpaper.png b/assets/login_wallpaper.png deleted file mode 100644 index 2ca8c39e66..0000000000 Binary files a/assets/login_wallpaper.png and /dev/null differ diff --git a/assets/logo.png b/assets/logo.png deleted file mode 100644 index 7a46e62c34..0000000000 Binary files a/assets/logo.png and /dev/null differ diff --git a/assets/logo.svg b/assets/logo.svg deleted file mode 100644 index a3a9516451..0000000000 --- a/assets/logo.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/assets/logo/img/logo.png b/assets/logo/img/logo.png new file mode 100644 index 0000000000..4de3dd32e9 Binary files /dev/null and b/assets/logo/img/logo.png differ diff --git a/assets/logo/img/logo_background.png b/assets/logo/img/logo_background.png new file mode 100644 index 0000000000..1d9a40c283 Binary files /dev/null and b/assets/logo/img/logo_background.png differ diff --git a/assets/logo/img/logo_font.png b/assets/logo/img/logo_font.png new file mode 100644 index 0000000000..0daf28a746 Binary files /dev/null and b/assets/logo/img/logo_font.png differ diff --git a/assets/logo/img/logo_foreground.png b/assets/logo/img/logo_foreground.png new file mode 100644 index 0000000000..448ece371e Binary files /dev/null and b/assets/logo/img/logo_foreground.png differ diff --git a/assets/logo/img/logo_mono.png b/assets/logo/img/logo_mono.png new file mode 100644 index 0000000000..454bdfeb05 Binary files /dev/null and b/assets/logo/img/logo_mono.png differ diff --git a/assets/logo/img/logo_standalone.png b/assets/logo/img/logo_standalone.png new file mode 100644 index 0000000000..f01eff8acf Binary files /dev/null and b/assets/logo/img/logo_standalone.png differ diff --git a/assets/logo/mini/logo_font_mini.png b/assets/logo/mini/logo_font_mini.png new file mode 100644 index 0000000000..9f7b4c9254 Binary files /dev/null and b/assets/logo/mini/logo_font_mini.png differ diff --git a/assets/logo/mini/logo_mini.png b/assets/logo/mini/logo_mini.png new file mode 100644 index 0000000000..f53eac8c78 Binary files /dev/null and b/assets/logo/mini/logo_mini.png differ diff --git a/assets/logo/mini/logo_mono_mini.png b/assets/logo/mini/logo_mono_mini.png new file mode 100644 index 0000000000..5fd514e005 Binary files /dev/null and b/assets/logo/mini/logo_mono_mini.png differ diff --git a/assets/logo/vector/logo.svg b/assets/logo/vector/logo.svg new file mode 100644 index 0000000000..c65d0ea206 --- /dev/null +++ b/assets/logo/vector/logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/logo/vector/logo_background.svg b/assets/logo/vector/logo_background.svg new file mode 100644 index 0000000000..343063da57 --- /dev/null +++ b/assets/logo/vector/logo_background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/assets/logo/vector/logo_foreground.svg b/assets/logo/vector/logo_foreground.svg new file mode 100644 index 0000000000..5f093068e1 --- /dev/null +++ b/assets/logo/vector/logo_foreground.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/logo/vector/logo_mono.svg b/assets/logo/vector/logo_mono.svg new file mode 100644 index 0000000000..d0d28f6975 --- /dev/null +++ b/assets/logo/vector/logo_mono.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/logo/vector/logo_notification.svg b/assets/logo/vector/logo_notification.svg new file mode 100644 index 0000000000..257d3b76ed --- /dev/null +++ b/assets/logo/vector/logo_notification.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/logo/vector/logo_standalone.svg b/assets/logo/vector/logo_standalone.svg new file mode 100644 index 0000000000..171c6bf005 --- /dev/null +++ b/assets/logo/vector/logo_standalone.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/private_chat_wallpaper.png b/assets/private_chat_wallpaper.png deleted file mode 100644 index f8e7c732cf..0000000000 Binary files a/assets/private_chat_wallpaper.png and /dev/null differ diff --git a/assets/share.png b/assets/share.png deleted file mode 100644 index 7e96adaf6d..0000000000 Binary files a/assets/share.png and /dev/null differ diff --git a/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg b/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg deleted file mode 100644 index 3950f49039..0000000000 Binary files a/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg and /dev/null differ diff --git a/assets/sounds/notification.ogg b/assets/sounds/notification.ogg new file mode 100644 index 0000000000..390f2bf8ef Binary files /dev/null and b/assets/sounds/notification.ogg differ diff --git a/assets/typing.gif b/assets/typing.gif deleted file mode 100644 index 11ee05e16a..0000000000 Binary files a/assets/typing.gif and /dev/null differ diff --git a/assets/verification.png b/assets/verification.png deleted file mode 100644 index 8bc9979884..0000000000 Binary files a/assets/verification.png and /dev/null differ diff --git a/assets/vodozemac/.gitignore b/assets/vodozemac/.gitignore new file mode 100644 index 0000000000..d9bc442612 --- /dev/null +++ b/assets/vodozemac/.gitignore @@ -0,0 +1 @@ +vodozemac_bindings_dart* \ No newline at end of file diff --git a/config.sample.json b/config.sample.json index ff37ec2388..ebc126e890 100644 --- a/config.sample.json +++ b/config.sample.json @@ -1,10 +1,32 @@ { - "application_name": "FluffyChat", - "application_welcome_message": null, - "default_homeserver": "matrix.org", - "web_base_url": "https://fluffychat.im/web", - "privacy_url": "https://fluffychat.im/en/privacy.html", - "render_html": false, - "hide_redacted_events": false, - "hide_unknown_events": false + "applicationName": "FluffyChat", + "defaultHomeserver": "matrix.org", + "presetHomeserver": "", + "welcomeText": "", + "privacyUrl": "https://github.com/krille-chan/fluffychat/blob/main/PRIVACY.md", + "audioRecordingNumChannels": 1, + "audioRecordingAutoGain": true, + "audioRecordingEchoCancel": false, + "audioRecordingNoiseSuppress": true, + "audioRecordingBitRate": 64000, + "audioRecordingSamplingRate": 44100, + "renderHtml": true, + "fontSizeFactor": 1, + "messagePreviewMaxLines": 128, + "hideRedactedEvents": false, + "hideUnknownEvents": true, + "separateChatTypes": false, + "autoplayImages": true, + "sendTypingNotifications": true, + "sendPublicReadReceipts": true, + "swipeRightToLeftToReply": true, + "sendOnEnter": false, + "showPresences": true, + "displayNavigationRail": false, + "experimentalVoip": false, + "shareKeysWith": "all", + "noEncryptionWarningShown": false, + "displayChatDetailsColumn": false, + "colorSchemeSeedInt": 4283835834, + "enableSoftLogout": false } \ No newline at end of file diff --git a/dart_dependency_validator.yaml b/dart_dependency_validator.yaml new file mode 100644 index 0000000000..0d9b486182 --- /dev/null +++ b/dart_dependency_validator.yaml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +ignore: + - handy_window + - sqlcipher_flutter_libs \ No newline at end of file diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000000..41bc19dc43 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/docs/LICENSE b/docs/LICENSE deleted file mode 100644 index 2e59d72303..0000000000 --- a/docs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Tailwind Toolbox - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/docs/OFL.txt b/docs/OFL.txt deleted file mode 100644 index 075d1aefb5..0000000000 --- a/docs/OFL.txt +++ /dev/null @@ -1,91 +0,0 @@ -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/ZenKurenaido-Regular.ttf b/docs/ZenKurenaido-Regular.ttf deleted file mode 100644 index fe08f0a85c..0000000000 Binary files a/docs/ZenKurenaido-Regular.ttf and /dev/null differ diff --git a/docs/appstore-badge.png b/docs/appstore-badge.png deleted file mode 100644 index e96d5c0695..0000000000 Binary files a/docs/appstore-badge.png and /dev/null differ diff --git a/docs/bg.svg b/docs/bg.svg deleted file mode 100644 index 362754b44d..0000000000 --- a/docs/bg.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/browser-badge.png b/docs/browser-badge.png deleted file mode 100644 index fa6f278adf..0000000000 Binary files a/docs/browser-badge.png and /dev/null differ diff --git a/docs/en/privacy.html b/docs/en/privacy.html deleted file mode 100644 index 6651972a13..0000000000 --- a/docs/en/privacy.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - -

Please follow this link.

- - \ No newline at end of file diff --git a/docs/favicon.png b/docs/favicon.png deleted file mode 100644 index d55415b199..0000000000 Binary files a/docs/favicon.png and /dev/null differ diff --git a/docs/fdroid_button.png b/docs/fdroid_button.png deleted file mode 100644 index 31e43f283d..0000000000 Binary files a/docs/fdroid_button.png and /dev/null differ diff --git a/docs/fdroid_repo.md b/docs/fdroid_repo.md deleted file mode 100644 index 45f1267987..0000000000 --- a/docs/fdroid_repo.md +++ /dev/null @@ -1,60 +0,0 @@ -# F-Droid Repository - -Our own F-Droid repository contains the Google Services which is not possible in the main F-Droid repository. Release candidates -are also published on it. - -## Add Repository to F-Droid - -Easiest way to add the Repository is to either scan the QR-Code or if you are on your phone directly click it. - -{::nomarkdown} - - - -{:/} - - -### If the QR-Code doesn't work: - -First check if you have f-droid installed. If not you can get it from: [https://f-droid.org/](https://f-droid.org/). -After you made sure you installed it and you didn't have it installed before you can try again the QR-Code. -If this still isn't working follow the next steps: - -1. Open the f-droid App -2. Go to the `Settings` Tab in the Bottom bar -3. Click the `Repositories` Action -4. Click on the plus sign at the top. -5. Fill in `https://fdroid.fluffychat.im` into the top field and `8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB` in the bottom field. - -## What is the fingerprint? - -The fingerprint of the Repository is: `8E2637AEF6697CC6DD486AF044A6EE45B1A742AE3EF56566E748CDE8BC65C1FB` - -# Nightly Repository - -## Add Repository to F-Droid - -Easiest way to add the Repository is to either scan the QR-Code or if you are on your phone directly click it. - -{::nomarkdown} - - - -{:/} - - -### If the QR-Code doesn't work: - -First check if you have f-droid installed. If not you can get it from: [https://f-droid.org/](https://f-droid.org/). -After you made sure you installed it and you didn't have it installed before you can try again the QR-Code. -If this still isn't working follow the next steps: - -1. Open the f-droid App -2. Go to the `Settings` Tab in the Bottom bar -3. Click the `Repositories` Action -4. Click on the plus sign at the top. -5. Fill in `https://nightly.fdroid.fluffychat.im` into the top field and `21A469657300576478B623DF99D8EB889A80BCD939ACA60A4074741BEAEC397D` in the bottom field. - -## What is the fingerprint? - -The fingerprint of the Repository is: `21A469657300576478B623DF99D8EB889A80BCD939ACA60A4074741BEAEC397D` diff --git a/docs/firefox_icon.png b/docs/firefox_icon.png deleted file mode 100644 index 6accca90eb..0000000000 Binary files a/docs/firefox_icon.png and /dev/null differ diff --git a/docs/flathub-badge-en.png b/docs/flathub-badge-en.png deleted file mode 100644 index facf256f86..0000000000 Binary files a/docs/flathub-badge-en.png and /dev/null differ diff --git a/docs/google-play-badge.png b/docs/google-play-badge.png deleted file mode 100644 index 6a93e1843a..0000000000 Binary files a/docs/google-play-badge.png and /dev/null differ diff --git a/docs/how_to_fork.md b/docs/how_to_fork.md deleted file mode 100644 index 2452c13fdb..0000000000 --- a/docs/how_to_fork.md +++ /dev/null @@ -1,39 +0,0 @@ -# How to create your own FluffyChat fork - -## 1. License -FluffyChat is licensed under AGPL. Read the license -(https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/LICENSE) and -make sure that your fork is open source under the same license and that you -fulfill all requirements. Maybe you should consider contacting a lawyer **before** -you publish your fork. - -## 2. Disable end-to-end encryption! -Due to US export regulations you are not allowed to publish your app in -a store or anywhere on a US server before you have removed everything regarding -the encryption or fulfill the regulations. - -Learn more: -https://www.bis.doc.gov/index.php/policy-guidance/encryption - -If you need help from us with using E2EE in your fork read more below under the -topic "**Official Support**". - -## 3. Stay up to date! -FluffyChat contains security related stuff. If we find a security bug, we will -try to fix it as soon as possible and ship it with a new version. But this -means that your fork is out of date and a security risk. You can't be awake -24 hours a day so you must decide how you protect your users by chosing one -of the following methods: - -1. Make your fork as minimal as possible and enable repository mirroring. Set -up a CI which publishes new versions automatically if FluffyChat publishes a -bug fix. -2. Never sleep and pay a big team where one guy at least is never sleeping. -3. Contact [famedly.com](https://famedly.com) to buy official support. - -## 4. Official Support -FluffyChat is free as in free speech and not free beer! Please contact -my company [famedly.com](https://famedly.com) for offers and official support -and take in mind that it costs a lot of work and time to maintain FluffyChat -or the Famedly Matrix SDK. So we can't give you support for free. So please -expect around 1$ per month per user of your fork. diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 482110f6ef..0000000000 --- a/docs/index.html +++ /dev/null @@ -1,573 +0,0 @@ - - - - - - - - FluffyChat - Official Website - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - -
-

- Open. Nonprofit. Cute.

-

- Easy to use (matrix) messenger. Secure and decentralized.

- -

Mobile app:

-
- - - - -
-

Desktop app:

-
- - - - -
- -
- - -
- -
- - - - -
- - -
- - - - \ No newline at end of file diff --git a/docs/qr-code-nightly.svg b/docs/qr-code-nightly.svg deleted file mode 100644 index d36a2844bd..0000000000 --- a/docs/qr-code-nightly.svg +++ /dev/null @@ -1,3431 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/qr-code.svg b/docs/qr-code.svg deleted file mode 100644 index b12c1e5871..0000000000 --- a/docs/qr-code.svg +++ /dev/null @@ -1,2831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/screenshots/desktop.png b/docs/screenshots/desktop.png deleted file mode 100644 index 319925885f..0000000000 Binary files a/docs/screenshots/desktop.png and /dev/null differ diff --git a/docs/screenshots/mobile.png b/docs/screenshots/mobile.png deleted file mode 100644 index 3e8a352d2d..0000000000 Binary files a/docs/screenshots/mobile.png and /dev/null differ diff --git a/docs/screenshots/product.jpeg b/docs/screenshots/product.jpeg deleted file mode 100644 index 32bf25881a..0000000000 Binary files a/docs/screenshots/product.jpeg and /dev/null differ diff --git a/docs/screenshots/screenshots.png b/docs/screenshots/screenshots.png deleted file mode 100644 index b974493d6b..0000000000 Binary files a/docs/screenshots/screenshots.png and /dev/null differ diff --git a/docs/screenshots/showcase1.jpeg b/docs/screenshots/showcase1.jpeg deleted file mode 100644 index 94875ee76f..0000000000 Binary files a/docs/screenshots/showcase1.jpeg and /dev/null differ diff --git a/docs/screenshots/showcase2.jpeg b/docs/screenshots/showcase2.jpeg deleted file mode 100644 index 4b78b88d16..0000000000 Binary files a/docs/screenshots/showcase2.jpeg and /dev/null differ diff --git a/docs/screenshots/showcase3.jpeg b/docs/screenshots/showcase3.jpeg deleted file mode 100644 index 44c2ef47cd..0000000000 Binary files a/docs/screenshots/showcase3.jpeg and /dev/null differ diff --git a/docs/screenshots/showcase4.jpeg b/docs/screenshots/showcase4.jpeg deleted file mode 100644 index 75978f0404..0000000000 Binary files a/docs/screenshots/showcase4.jpeg and /dev/null differ diff --git a/docs/screenshots/showcase5.jpeg b/docs/screenshots/showcase5.jpeg deleted file mode 100644 index ca25818afd..0000000000 Binary files a/docs/screenshots/showcase5.jpeg and /dev/null differ diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js deleted file mode 100644 index 2991816a39..0000000000 --- a/docs/tailwind.config.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - purge: [ - './index.html' - ], - darkMode: false, - theme: { - extend: {}, - }, - variants: { - extend: {}, - }, - plugins: [], - } - \ No newline at end of file diff --git a/docs/tailwind.css b/docs/tailwind.css deleted file mode 100644 index 4c689171bc..0000000000 --- a/docs/tailwind.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com*//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-moz-tab-size:4;-o-tab-size:4;tab-size:4;line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:initial;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{box-sizing:border-box;border:0 solid}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:-moz-focusring{outline:auto}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:after,:before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.inset-auto{top:auto;right:auto;bottom:auto;left:auto}.inset-px{top:1px;right:1px;bottom:1px;left:1px}.inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.-inset-0{top:0;right:0;bottom:0;left:0}.-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.inset-full{top:100%;right:100%;bottom:100%;left:100%}.-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.inset-x-0{left:0;right:0}.inset-x-1{left:.25rem;right:.25rem}.inset-x-2{left:.5rem;right:.5rem}.inset-x-3{left:.75rem;right:.75rem}.inset-x-4{left:1rem;right:1rem}.inset-x-5{left:1.25rem;right:1.25rem}.inset-x-6{left:1.5rem;right:1.5rem}.inset-x-7{left:1.75rem;right:1.75rem}.inset-x-8{left:2rem;right:2rem}.inset-x-9{left:2.25rem;right:2.25rem}.inset-x-10{left:2.5rem;right:2.5rem}.inset-x-11{left:2.75rem;right:2.75rem}.inset-x-12{left:3rem;right:3rem}.inset-x-14{left:3.5rem;right:3.5rem}.inset-x-16{left:4rem;right:4rem}.inset-x-20{left:5rem;right:5rem}.inset-x-24{left:6rem;right:6rem}.inset-x-28{left:7rem;right:7rem}.inset-x-32{left:8rem;right:8rem}.inset-x-36{left:9rem;right:9rem}.inset-x-40{left:10rem;right:10rem}.inset-x-44{left:11rem;right:11rem}.inset-x-48{left:12rem;right:12rem}.inset-x-52{left:13rem;right:13rem}.inset-x-56{left:14rem;right:14rem}.inset-x-60{left:15rem;right:15rem}.inset-x-64{left:16rem;right:16rem}.inset-x-72{left:18rem;right:18rem}.inset-x-80{left:20rem;right:20rem}.inset-x-96{left:24rem;right:24rem}.inset-x-auto{left:auto;right:auto}.inset-x-px{left:1px;right:1px}.inset-x-0\.5{left:.125rem;right:.125rem}.inset-x-1\.5{left:.375rem;right:.375rem}.inset-x-2\.5{left:.625rem;right:.625rem}.inset-x-3\.5{left:.875rem;right:.875rem}.-inset-x-0{left:0;right:0}.-inset-x-1{left:-.25rem;right:-.25rem}.-inset-x-2{left:-.5rem;right:-.5rem}.-inset-x-3{left:-.75rem;right:-.75rem}.-inset-x-4{left:-1rem;right:-1rem}.-inset-x-5{left:-1.25rem;right:-1.25rem}.-inset-x-6{left:-1.5rem;right:-1.5rem}.-inset-x-7{left:-1.75rem;right:-1.75rem}.-inset-x-8{left:-2rem;right:-2rem}.-inset-x-9{left:-2.25rem;right:-2.25rem}.-inset-x-10{left:-2.5rem;right:-2.5rem}.-inset-x-11{left:-2.75rem;right:-2.75rem}.-inset-x-12{left:-3rem;right:-3rem}.-inset-x-14{left:-3.5rem;right:-3.5rem}.-inset-x-16{left:-4rem;right:-4rem}.-inset-x-20{left:-5rem;right:-5rem}.-inset-x-24{left:-6rem;right:-6rem}.-inset-x-28{left:-7rem;right:-7rem}.-inset-x-32{left:-8rem;right:-8rem}.-inset-x-36{left:-9rem;right:-9rem}.-inset-x-40{left:-10rem;right:-10rem}.-inset-x-44{left:-11rem;right:-11rem}.-inset-x-48{left:-12rem;right:-12rem}.-inset-x-52{left:-13rem;right:-13rem}.-inset-x-56{left:-14rem;right:-14rem}.-inset-x-60{left:-15rem;right:-15rem}.-inset-x-64{left:-16rem;right:-16rem}.-inset-x-72{left:-18rem;right:-18rem}.-inset-x-80{left:-20rem;right:-20rem}.-inset-x-96{left:-24rem;right:-24rem}.-inset-x-px{left:-1px;right:-1px}.-inset-x-0\.5{left:-.125rem;right:-.125rem}.-inset-x-1\.5{left:-.375rem;right:-.375rem}.-inset-x-2\.5{left:-.625rem;right:-.625rem}.-inset-x-3\.5{left:-.875rem;right:-.875rem}.inset-x-1\/2{left:50%;right:50%}.inset-x-1\/3{left:33.333333%;right:33.333333%}.inset-x-2\/3{left:66.666667%;right:66.666667%}.inset-x-1\/4{left:25%;right:25%}.inset-x-2\/4{left:50%;right:50%}.inset-x-3\/4{left:75%;right:75%}.inset-x-full{left:100%;right:100%}.-inset-x-1\/2{left:-50%;right:-50%}.-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.-inset-x-1\/4{left:-25%;right:-25%}.-inset-x-2\/4{left:-50%;right:-50%}.-inset-x-3\/4{left:-75%;right:-75%}.-inset-x-full{left:-100%;right:-100%}.inset-y-0{top:0;bottom:0}.inset-y-1{top:.25rem;bottom:.25rem}.inset-y-2{top:.5rem;bottom:.5rem}.inset-y-3{top:.75rem;bottom:.75rem}.inset-y-4{top:1rem;bottom:1rem}.inset-y-5{top:1.25rem;bottom:1.25rem}.inset-y-6{top:1.5rem;bottom:1.5rem}.inset-y-7{top:1.75rem;bottom:1.75rem}.inset-y-8{top:2rem;bottom:2rem}.inset-y-9{top:2.25rem;bottom:2.25rem}.inset-y-10{top:2.5rem;bottom:2.5rem}.inset-y-11{top:2.75rem;bottom:2.75rem}.inset-y-12{top:3rem;bottom:3rem}.inset-y-14{top:3.5rem;bottom:3.5rem}.inset-y-16{top:4rem;bottom:4rem}.inset-y-20{top:5rem;bottom:5rem}.inset-y-24{top:6rem;bottom:6rem}.inset-y-28{top:7rem;bottom:7rem}.inset-y-32{top:8rem;bottom:8rem}.inset-y-36{top:9rem;bottom:9rem}.inset-y-40{top:10rem;bottom:10rem}.inset-y-44{top:11rem;bottom:11rem}.inset-y-48{top:12rem;bottom:12rem}.inset-y-52{top:13rem;bottom:13rem}.inset-y-56{top:14rem;bottom:14rem}.inset-y-60{top:15rem;bottom:15rem}.inset-y-64{top:16rem;bottom:16rem}.inset-y-72{top:18rem;bottom:18rem}.inset-y-80{top:20rem;bottom:20rem}.inset-y-96{top:24rem;bottom:24rem}.inset-y-auto{top:auto;bottom:auto}.inset-y-px{top:1px;bottom:1px}.inset-y-0\.5{top:.125rem;bottom:.125rem}.inset-y-1\.5{top:.375rem;bottom:.375rem}.inset-y-2\.5{top:.625rem;bottom:.625rem}.inset-y-3\.5{top:.875rem;bottom:.875rem}.-inset-y-0{top:0;bottom:0}.-inset-y-1{top:-.25rem;bottom:-.25rem}.-inset-y-2{top:-.5rem;bottom:-.5rem}.-inset-y-3{top:-.75rem;bottom:-.75rem}.-inset-y-4{top:-1rem;bottom:-1rem}.-inset-y-5{top:-1.25rem;bottom:-1.25rem}.-inset-y-6{top:-1.5rem;bottom:-1.5rem}.-inset-y-7{top:-1.75rem;bottom:-1.75rem}.-inset-y-8{top:-2rem;bottom:-2rem}.-inset-y-9{top:-2.25rem;bottom:-2.25rem}.-inset-y-10{top:-2.5rem;bottom:-2.5rem}.-inset-y-11{top:-2.75rem;bottom:-2.75rem}.-inset-y-12{top:-3rem;bottom:-3rem}.-inset-y-14{top:-3.5rem;bottom:-3.5rem}.-inset-y-16{top:-4rem;bottom:-4rem}.-inset-y-20{top:-5rem;bottom:-5rem}.-inset-y-24{top:-6rem;bottom:-6rem}.-inset-y-28{top:-7rem;bottom:-7rem}.-inset-y-32{top:-8rem;bottom:-8rem}.-inset-y-36{top:-9rem;bottom:-9rem}.-inset-y-40{top:-10rem;bottom:-10rem}.-inset-y-44{top:-11rem;bottom:-11rem}.-inset-y-48{top:-12rem;bottom:-12rem}.-inset-y-52{top:-13rem;bottom:-13rem}.-inset-y-56{top:-14rem;bottom:-14rem}.-inset-y-60{top:-15rem;bottom:-15rem}.-inset-y-64{top:-16rem;bottom:-16rem}.-inset-y-72{top:-18rem;bottom:-18rem}.-inset-y-80{top:-20rem;bottom:-20rem}.-inset-y-96{top:-24rem;bottom:-24rem}.-inset-y-px{top:-1px;bottom:-1px}.-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.inset-y-1\/2{top:50%;bottom:50%}.inset-y-1\/3{top:33.333333%;bottom:33.333333%}.inset-y-2\/3{top:66.666667%;bottom:66.666667%}.inset-y-1\/4{top:25%;bottom:25%}.inset-y-2\/4{top:50%;bottom:50%}.inset-y-3\/4{top:75%;bottom:75%}.inset-y-full{top:100%;bottom:100%}.-inset-y-1\/2{top:-50%;bottom:-50%}.-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.-inset-y-1\/4{top:-25%;bottom:-25%}.-inset-y-2\/4{top:-50%;bottom:-50%}.-inset-y-3\/4{top:-75%;bottom:-75%}.-inset-y-full{top:-100%;bottom:-100%}.top-0{top:0}.top-1{top:.25rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-6{top:1.5rem}.top-7{top:1.75rem}.top-8{top:2rem}.top-9{top:2.25rem}.top-10{top:2.5rem}.top-11{top:2.75rem}.top-12{top:3rem}.top-14{top:3.5rem}.top-16{top:4rem}.top-20{top:5rem}.top-24{top:6rem}.top-28{top:7rem}.top-32{top:8rem}.top-36{top:9rem}.top-40{top:10rem}.top-44{top:11rem}.top-48{top:12rem}.top-52{top:13rem}.top-56{top:14rem}.top-60{top:15rem}.top-64{top:16rem}.top-72{top:18rem}.top-80{top:20rem}.top-96{top:24rem}.top-auto{top:auto}.top-px{top:1px}.top-0\.5{top:.125rem}.top-1\.5{top:.375rem}.top-2\.5{top:.625rem}.top-3\.5{top:.875rem}.-top-0{top:0}.-top-1{top:-.25rem}.-top-2{top:-.5rem}.-top-3{top:-.75rem}.-top-4{top:-1rem}.-top-5{top:-1.25rem}.-top-6{top:-1.5rem}.-top-7{top:-1.75rem}.-top-8{top:-2rem}.-top-9{top:-2.25rem}.-top-10{top:-2.5rem}.-top-11{top:-2.75rem}.-top-12{top:-3rem}.-top-14{top:-3.5rem}.-top-16{top:-4rem}.-top-20{top:-5rem}.-top-24{top:-6rem}.-top-28{top:-7rem}.-top-32{top:-8rem}.-top-36{top:-9rem}.-top-40{top:-10rem}.-top-44{top:-11rem}.-top-48{top:-12rem}.-top-52{top:-13rem}.-top-56{top:-14rem}.-top-60{top:-15rem}.-top-64{top:-16rem}.-top-72{top:-18rem}.-top-80{top:-20rem}.-top-96{top:-24rem}.-top-px{top:-1px}.-top-0\.5{top:-.125rem}.-top-1\.5{top:-.375rem}.-top-2\.5{top:-.625rem}.-top-3\.5{top:-.875rem}.top-1\/2{top:50%}.top-1\/3{top:33.333333%}.top-2\/3{top:66.666667%}.top-1\/4{top:25%}.top-2\/4{top:50%}.top-3\/4{top:75%}.top-full{top:100%}.-top-1\/2{top:-50%}.-top-1\/3{top:-33.333333%}.-top-2\/3{top:-66.666667%}.-top-1\/4{top:-25%}.-top-2\/4{top:-50%}.-top-3\/4{top:-75%}.-top-full{top:-100%}.right-0{right:0}.right-1{right:.25rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.right-7{right:1.75rem}.right-8{right:2rem}.right-9{right:2.25rem}.right-10{right:2.5rem}.right-11{right:2.75rem}.right-12{right:3rem}.right-14{right:3.5rem}.right-16{right:4rem}.right-20{right:5rem}.right-24{right:6rem}.right-28{right:7rem}.right-32{right:8rem}.right-36{right:9rem}.right-40{right:10rem}.right-44{right:11rem}.right-48{right:12rem}.right-52{right:13rem}.right-56{right:14rem}.right-60{right:15rem}.right-64{right:16rem}.right-72{right:18rem}.right-80{right:20rem}.right-96{right:24rem}.right-auto{right:auto}.right-px{right:1px}.right-0\.5{right:.125rem}.right-1\.5{right:.375rem}.right-2\.5{right:.625rem}.right-3\.5{right:.875rem}.-right-0{right:0}.-right-1{right:-.25rem}.-right-2{right:-.5rem}.-right-3{right:-.75rem}.-right-4{right:-1rem}.-right-5{right:-1.25rem}.-right-6{right:-1.5rem}.-right-7{right:-1.75rem}.-right-8{right:-2rem}.-right-9{right:-2.25rem}.-right-10{right:-2.5rem}.-right-11{right:-2.75rem}.-right-12{right:-3rem}.-right-14{right:-3.5rem}.-right-16{right:-4rem}.-right-20{right:-5rem}.-right-24{right:-6rem}.-right-28{right:-7rem}.-right-32{right:-8rem}.-right-36{right:-9rem}.-right-40{right:-10rem}.-right-44{right:-11rem}.-right-48{right:-12rem}.-right-52{right:-13rem}.-right-56{right:-14rem}.-right-60{right:-15rem}.-right-64{right:-16rem}.-right-72{right:-18rem}.-right-80{right:-20rem}.-right-96{right:-24rem}.-right-px{right:-1px}.-right-0\.5{right:-.125rem}.-right-1\.5{right:-.375rem}.-right-2\.5{right:-.625rem}.-right-3\.5{right:-.875rem}.right-1\/2{right:50%}.right-1\/3{right:33.333333%}.right-2\/3{right:66.666667%}.right-1\/4{right:25%}.right-2\/4{right:50%}.right-3\/4{right:75%}.right-full{right:100%}.-right-1\/2{right:-50%}.-right-1\/3{right:-33.333333%}.-right-2\/3{right:-66.666667%}.-right-1\/4{right:-25%}.-right-2\/4{right:-50%}.-right-3\/4{right:-75%}.-right-full{right:-100%}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-6{bottom:1.5rem}.bottom-7{bottom:1.75rem}.bottom-8{bottom:2rem}.bottom-9{bottom:2.25rem}.bottom-10{bottom:2.5rem}.bottom-11{bottom:2.75rem}.bottom-12{bottom:3rem}.bottom-14{bottom:3.5rem}.bottom-16{bottom:4rem}.bottom-20{bottom:5rem}.bottom-24{bottom:6rem}.bottom-28{bottom:7rem}.bottom-32{bottom:8rem}.bottom-36{bottom:9rem}.bottom-40{bottom:10rem}.bottom-44{bottom:11rem}.bottom-48{bottom:12rem}.bottom-52{bottom:13rem}.bottom-56{bottom:14rem}.bottom-60{bottom:15rem}.bottom-64{bottom:16rem}.bottom-72{bottom:18rem}.bottom-80{bottom:20rem}.bottom-96{bottom:24rem}.bottom-auto{bottom:auto}.bottom-px{bottom:1px}.bottom-0\.5{bottom:.125rem}.bottom-1\.5{bottom:.375rem}.bottom-2\.5{bottom:.625rem}.bottom-3\.5{bottom:.875rem}.-bottom-0{bottom:0}.-bottom-1{bottom:-.25rem}.-bottom-2{bottom:-.5rem}.-bottom-3{bottom:-.75rem}.-bottom-4{bottom:-1rem}.-bottom-5{bottom:-1.25rem}.-bottom-6{bottom:-1.5rem}.-bottom-7{bottom:-1.75rem}.-bottom-8{bottom:-2rem}.-bottom-9{bottom:-2.25rem}.-bottom-10{bottom:-2.5rem}.-bottom-11{bottom:-2.75rem}.-bottom-12{bottom:-3rem}.-bottom-14{bottom:-3.5rem}.-bottom-16{bottom:-4rem}.-bottom-20{bottom:-5rem}.-bottom-24{bottom:-6rem}.-bottom-28{bottom:-7rem}.-bottom-32{bottom:-8rem}.-bottom-36{bottom:-9rem}.-bottom-40{bottom:-10rem}.-bottom-44{bottom:-11rem}.-bottom-48{bottom:-12rem}.-bottom-52{bottom:-13rem}.-bottom-56{bottom:-14rem}.-bottom-60{bottom:-15rem}.-bottom-64{bottom:-16rem}.-bottom-72{bottom:-18rem}.-bottom-80{bottom:-20rem}.-bottom-96{bottom:-24rem}.-bottom-px{bottom:-1px}.-bottom-0\.5{bottom:-.125rem}.-bottom-1\.5{bottom:-.375rem}.-bottom-2\.5{bottom:-.625rem}.-bottom-3\.5{bottom:-.875rem}.bottom-1\/2{bottom:50%}.bottom-1\/3{bottom:33.333333%}.bottom-2\/3{bottom:66.666667%}.bottom-1\/4{bottom:25%}.bottom-2\/4{bottom:50%}.bottom-3\/4{bottom:75%}.bottom-full{bottom:100%}.-bottom-1\/2{bottom:-50%}.-bottom-1\/3{bottom:-33.333333%}.-bottom-2\/3{bottom:-66.666667%}.-bottom-1\/4{bottom:-25%}.-bottom-2\/4{bottom:-50%}.-bottom-3\/4{bottom:-75%}.-bottom-full{bottom:-100%}.left-0{left:0}.left-1{left:.25rem}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.left-5{left:1.25rem}.left-6{left:1.5rem}.left-7{left:1.75rem}.left-8{left:2rem}.left-9{left:2.25rem}.left-10{left:2.5rem}.left-11{left:2.75rem}.left-12{left:3rem}.left-14{left:3.5rem}.left-16{left:4rem}.left-20{left:5rem}.left-24{left:6rem}.left-28{left:7rem}.left-32{left:8rem}.left-36{left:9rem}.left-40{left:10rem}.left-44{left:11rem}.left-48{left:12rem}.left-52{left:13rem}.left-56{left:14rem}.left-60{left:15rem}.left-64{left:16rem}.left-72{left:18rem}.left-80{left:20rem}.left-96{left:24rem}.left-auto{left:auto}.left-px{left:1px}.left-0\.5{left:.125rem}.left-1\.5{left:.375rem}.left-2\.5{left:.625rem}.left-3\.5{left:.875rem}.-left-0{left:0}.-left-1{left:-.25rem}.-left-2{left:-.5rem}.-left-3{left:-.75rem}.-left-4{left:-1rem}.-left-5{left:-1.25rem}.-left-6{left:-1.5rem}.-left-7{left:-1.75rem}.-left-8{left:-2rem}.-left-9{left:-2.25rem}.-left-10{left:-2.5rem}.-left-11{left:-2.75rem}.-left-12{left:-3rem}.-left-14{left:-3.5rem}.-left-16{left:-4rem}.-left-20{left:-5rem}.-left-24{left:-6rem}.-left-28{left:-7rem}.-left-32{left:-8rem}.-left-36{left:-9rem}.-left-40{left:-10rem}.-left-44{left:-11rem}.-left-48{left:-12rem}.-left-52{left:-13rem}.-left-56{left:-14rem}.-left-60{left:-15rem}.-left-64{left:-16rem}.-left-72{left:-18rem}.-left-80{left:-20rem}.-left-96{left:-24rem}.-left-px{left:-1px}.-left-0\.5{left:-.125rem}.-left-1\.5{left:-.375rem}.-left-2\.5{left:-.625rem}.-left-3\.5{left:-.875rem}.left-1\/2{left:50%}.left-1\/3{left:33.333333%}.left-2\/3{left:66.666667%}.left-1\/4{left:25%}.left-2\/4{left:50%}.left-3\/4{left:75%}.left-full{left:100%}.-left-1\/2{left:-50%}.-left-1\/3{left:-33.333333%}.-left-2\/3{left:-66.666667%}.-left-1\/4{left:-25%}.-left-2\/4{left:-50%}.-left-3\/4{left:-75%}.-left-full{left:-100%}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.focus-within\:z-0:focus-within{z-index:0}.focus-within\:z-10:focus-within{z-index:10}.focus-within\:z-20:focus-within{z-index:20}.focus-within\:z-30:focus-within{z-index:30}.focus-within\:z-40:focus-within{z-index:40}.focus-within\:z-50:focus-within{z-index:50}.focus-within\:z-auto:focus-within{z-index:auto}.focus\:z-0:focus{z-index:0}.focus\:z-10:focus{z-index:10}.focus\:z-20:focus{z-index:20}.focus\:z-30:focus{z-index:30}.focus\:z-40:focus{z-index:40}.focus\:z-50:focus{z-index:50}.focus\:z-auto:focus{z-index:auto}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.col-start-5{grid-column-start:5}.col-start-6{grid-column-start:6}.col-start-7{grid-column-start:7}.col-start-8{grid-column-start:8}.col-start-9{grid-column-start:9}.col-start-10{grid-column-start:10}.col-start-11{grid-column-start:11}.col-start-12{grid-column-start:12}.col-start-13{grid-column-start:13}.col-start-auto{grid-column-start:auto}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.col-end-3{grid-column-end:3}.col-end-4{grid-column-end:4}.col-end-5{grid-column-end:5}.col-end-6{grid-column-end:6}.col-end-7{grid-column-end:7}.col-end-8{grid-column-end:8}.col-end-9{grid-column-end:9}.col-end-10{grid-column-end:10}.col-end-11{grid-column-end:11}.col-end-12{grid-column-end:12}.col-end-13{grid-column-end:13}.col-end-auto{grid-column-end:auto}.row-auto{grid-row:auto}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.row-start-4{grid-row-start:4}.row-start-5{grid-row-start:5}.row-start-6{grid-row-start:6}.row-start-7{grid-row-start:7}.row-start-auto{grid-row-start:auto}.row-end-1{grid-row-end:1}.row-end-2{grid-row-end:2}.row-end-3{grid-row-end:3}.row-end-4{grid-row-end:4}.row-end-5{grid-row-end:5}.row-end-6{grid-row-end:6}.row-end-7{grid-row-end:7}.row-end-auto{grid-row-end:auto}.float-right{float:right}.float-left{float:left}.float-none{float:none}.clear-left{clear:left}.clear-right{clear:right}.clear-both{clear:both}.clear-none{clear:none}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-7{margin:1.75rem}.m-8{margin:2rem}.m-9{margin:2.25rem}.m-10{margin:2.5rem}.m-11{margin:2.75rem}.m-12{margin:3rem}.m-14{margin:3.5rem}.m-16{margin:4rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-28{margin:7rem}.m-32{margin:8rem}.m-36{margin:9rem}.m-40{margin:10rem}.m-44{margin:11rem}.m-48{margin:12rem}.m-52{margin:13rem}.m-56{margin:14rem}.m-60{margin:15rem}.m-64{margin:16rem}.m-72{margin:18rem}.m-80{margin:20rem}.m-96{margin:24rem}.m-auto{margin:auto}.m-px{margin:1px}.m-0\.5{margin:.125rem}.m-1\.5{margin:.375rem}.m-2\.5{margin:.625rem}.m-3\.5{margin:.875rem}.-m-0{margin:0}.-m-1{margin:-.25rem}.-m-2{margin:-.5rem}.-m-3{margin:-.75rem}.-m-4{margin:-1rem}.-m-5{margin:-1.25rem}.-m-6{margin:-1.5rem}.-m-7{margin:-1.75rem}.-m-8{margin:-2rem}.-m-9{margin:-2.25rem}.-m-10{margin:-2.5rem}.-m-11{margin:-2.75rem}.-m-12{margin:-3rem}.-m-14{margin:-3.5rem}.-m-16{margin:-4rem}.-m-20{margin:-5rem}.-m-24{margin:-6rem}.-m-28{margin:-7rem}.-m-32{margin:-8rem}.-m-36{margin:-9rem}.-m-40{margin:-10rem}.-m-44{margin:-11rem}.-m-48{margin:-12rem}.-m-52{margin:-13rem}.-m-56{margin:-14rem}.-m-60{margin:-15rem}.-m-64{margin:-16rem}.-m-72{margin:-18rem}.-m-80{margin:-20rem}.-m-96{margin:-24rem}.-m-px{margin:-1px}.-m-0\.5{margin:-.125rem}.-m-1\.5{margin:-.375rem}.-m-2\.5{margin:-.625rem}.-m-3\.5{margin:-.875rem}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-11{margin-left:2.75rem;margin-right:2.75rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-14{margin-left:3.5rem;margin-right:3.5rem}.mx-16{margin-left:4rem;margin-right:4rem}.mx-20{margin-left:5rem;margin-right:5rem}.mx-24{margin-left:6rem;margin-right:6rem}.mx-28{margin-left:7rem;margin-right:7rem}.mx-32{margin-left:8rem;margin-right:8rem}.mx-36{margin-left:9rem;margin-right:9rem}.mx-40{margin-left:10rem;margin-right:10rem}.mx-44{margin-left:11rem;margin-right:11rem}.mx-48{margin-left:12rem;margin-right:12rem}.mx-52{margin-left:13rem;margin-right:13rem}.mx-56{margin-left:14rem;margin-right:14rem}.mx-60{margin-left:15rem;margin-right:15rem}.mx-64{margin-left:16rem;margin-right:16rem}.mx-72{margin-left:18rem;margin-right:18rem}.mx-80{margin-left:20rem;margin-right:20rem}.mx-96{margin-left:24rem;margin-right:24rem}.mx-auto{margin-left:auto;margin-right:auto}.mx-px{margin-left:1px;margin-right:1px}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.-mx-0{margin-left:0;margin-right:0}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.-mx-12{margin-left:-3rem;margin-right:-3rem}.-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.-mx-16{margin-left:-4rem;margin-right:-4rem}.-mx-20{margin-left:-5rem;margin-right:-5rem}.-mx-24{margin-left:-6rem;margin-right:-6rem}.-mx-28{margin-left:-7rem;margin-right:-7rem}.-mx-32{margin-left:-8rem;margin-right:-8rem}.-mx-36{margin-left:-9rem;margin-right:-9rem}.-mx-40{margin-left:-10rem;margin-right:-10rem}.-mx-44{margin-left:-11rem;margin-right:-11rem}.-mx-48{margin-left:-12rem;margin-right:-12rem}.-mx-52{margin-left:-13rem;margin-right:-13rem}.-mx-56{margin-left:-14rem;margin-right:-14rem}.-mx-60{margin-left:-15rem;margin-right:-15rem}.-mx-64{margin-left:-16rem;margin-right:-16rem}.-mx-72{margin-left:-18rem;margin-right:-18rem}.-mx-80{margin-left:-20rem;margin-right:-20rem}.-mx-96{margin-left:-24rem;margin-right:-24rem}.-mx-px{margin-left:-1px;margin-right:-1px}.-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-7{margin-top:1.75rem;margin-bottom:1.75rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-9{margin-top:2.25rem;margin-bottom:2.25rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-11{margin-top:2.75rem;margin-bottom:2.75rem}.my-12{margin-top:3rem;margin-bottom:3rem}.my-14{margin-top:3.5rem;margin-bottom:3.5rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-20{margin-top:5rem;margin-bottom:5rem}.my-24{margin-top:6rem;margin-bottom:6rem}.my-28{margin-top:7rem;margin-bottom:7rem}.my-32{margin-top:8rem;margin-bottom:8rem}.my-36{margin-top:9rem;margin-bottom:9rem}.my-40{margin-top:10rem;margin-bottom:10rem}.my-44{margin-top:11rem;margin-bottom:11rem}.my-48{margin-top:12rem;margin-bottom:12rem}.my-52{margin-top:13rem;margin-bottom:13rem}.my-56{margin-top:14rem;margin-bottom:14rem}.my-60{margin-top:15rem;margin-bottom:15rem}.my-64{margin-top:16rem;margin-bottom:16rem}.my-72{margin-top:18rem;margin-bottom:18rem}.my-80{margin-top:20rem;margin-bottom:20rem}.my-96{margin-top:24rem;margin-bottom:24rem}.my-auto{margin-top:auto;margin-bottom:auto}.my-px{margin-top:1px;margin-bottom:1px}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.-my-0{margin-top:0;margin-bottom:0}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.-my-8{margin-top:-2rem;margin-bottom:-2rem}.-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.-my-12{margin-top:-3rem;margin-bottom:-3rem}.-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.-my-16{margin-top:-4rem;margin-bottom:-4rem}.-my-20{margin-top:-5rem;margin-bottom:-5rem}.-my-24{margin-top:-6rem;margin-bottom:-6rem}.-my-28{margin-top:-7rem;margin-bottom:-7rem}.-my-32{margin-top:-8rem;margin-bottom:-8rem}.-my-36{margin-top:-9rem;margin-bottom:-9rem}.-my-40{margin-top:-10rem;margin-bottom:-10rem}.-my-44{margin-top:-11rem;margin-bottom:-11rem}.-my-48{margin-top:-12rem;margin-bottom:-12rem}.-my-52{margin-top:-13rem;margin-bottom:-13rem}.-my-56{margin-top:-14rem;margin-bottom:-14rem}.-my-60{margin-top:-15rem;margin-bottom:-15rem}.-my-64{margin-top:-16rem;margin-bottom:-16rem}.-my-72{margin-top:-18rem;margin-bottom:-18rem}.-my-80{margin-top:-20rem;margin-bottom:-20rem}.-my-96{margin-top:-24rem;margin-bottom:-24rem}.-my-px{margin-top:-1px;margin-bottom:-1px}.-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.mt-9{margin-top:2.25rem}.mt-10{margin-top:2.5rem}.mt-11{margin-top:2.75rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}.mt-20{margin-top:5rem}.mt-24{margin-top:6rem}.mt-28{margin-top:7rem}.mt-32{margin-top:8rem}.mt-36{margin-top:9rem}.mt-40{margin-top:10rem}.mt-44{margin-top:11rem}.mt-48{margin-top:12rem}.mt-52{margin-top:13rem}.mt-56{margin-top:14rem}.mt-60{margin-top:15rem}.mt-64{margin-top:16rem}.mt-72{margin-top:18rem}.mt-80{margin-top:20rem}.mt-96{margin-top:24rem}.mt-auto{margin-top:auto}.mt-px{margin-top:1px}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mt-2\.5{margin-top:.625rem}.mt-3\.5{margin-top:.875rem}.-mt-0{margin-top:0}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-4{margin-top:-1rem}.-mt-5{margin-top:-1.25rem}.-mt-6{margin-top:-1.5rem}.-mt-7{margin-top:-1.75rem}.-mt-8{margin-top:-2rem}.-mt-9{margin-top:-2.25rem}.-mt-10{margin-top:-2.5rem}.-mt-11{margin-top:-2.75rem}.-mt-12{margin-top:-3rem}.-mt-14{margin-top:-3.5rem}.-mt-16{margin-top:-4rem}.-mt-20{margin-top:-5rem}.-mt-24{margin-top:-6rem}.-mt-28{margin-top:-7rem}.-mt-32{margin-top:-8rem}.-mt-36{margin-top:-9rem}.-mt-40{margin-top:-10rem}.-mt-44{margin-top:-11rem}.-mt-48{margin-top:-12rem}.-mt-52{margin-top:-13rem}.-mt-56{margin-top:-14rem}.-mt-60{margin-top:-15rem}.-mt-64{margin-top:-16rem}.-mt-72{margin-top:-18rem}.-mt-80{margin-top:-20rem}.-mt-96{margin-top:-24rem}.-mt-px{margin-top:-1px}.-mt-0\.5{margin-top:-.125rem}.-mt-1\.5{margin-top:-.375rem}.-mt-2\.5{margin-top:-.625rem}.-mt-3\.5{margin-top:-.875rem}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-6{margin-right:1.5rem}.mr-7{margin-right:1.75rem}.mr-8{margin-right:2rem}.mr-9{margin-right:2.25rem}.mr-10{margin-right:2.5rem}.mr-11{margin-right:2.75rem}.mr-12{margin-right:3rem}.mr-14{margin-right:3.5rem}.mr-16{margin-right:4rem}.mr-20{margin-right:5rem}.mr-24{margin-right:6rem}.mr-28{margin-right:7rem}.mr-32{margin-right:8rem}.mr-36{margin-right:9rem}.mr-40{margin-right:10rem}.mr-44{margin-right:11rem}.mr-48{margin-right:12rem}.mr-52{margin-right:13rem}.mr-56{margin-right:14rem}.mr-60{margin-right:15rem}.mr-64{margin-right:16rem}.mr-72{margin-right:18rem}.mr-80{margin-right:20rem}.mr-96{margin-right:24rem}.mr-auto{margin-right:auto}.mr-px{margin-right:1px}.mr-0\.5{margin-right:.125rem}.mr-1\.5{margin-right:.375rem}.mr-2\.5{margin-right:.625rem}.mr-3\.5{margin-right:.875rem}.-mr-0{margin-right:0}.-mr-1{margin-right:-.25rem}.-mr-2{margin-right:-.5rem}.-mr-3{margin-right:-.75rem}.-mr-4{margin-right:-1rem}.-mr-5{margin-right:-1.25rem}.-mr-6{margin-right:-1.5rem}.-mr-7{margin-right:-1.75rem}.-mr-8{margin-right:-2rem}.-mr-9{margin-right:-2.25rem}.-mr-10{margin-right:-2.5rem}.-mr-11{margin-right:-2.75rem}.-mr-12{margin-right:-3rem}.-mr-14{margin-right:-3.5rem}.-mr-16{margin-right:-4rem}.-mr-20{margin-right:-5rem}.-mr-24{margin-right:-6rem}.-mr-28{margin-right:-7rem}.-mr-32{margin-right:-8rem}.-mr-36{margin-right:-9rem}.-mr-40{margin-right:-10rem}.-mr-44{margin-right:-11rem}.-mr-48{margin-right:-12rem}.-mr-52{margin-right:-13rem}.-mr-56{margin-right:-14rem}.-mr-60{margin-right:-15rem}.-mr-64{margin-right:-16rem}.-mr-72{margin-right:-18rem}.-mr-80{margin-right:-20rem}.-mr-96{margin-right:-24rem}.-mr-px{margin-right:-1px}.-mr-0\.5{margin-right:-.125rem}.-mr-1\.5{margin-right:-.375rem}.-mr-2\.5{margin-right:-.625rem}.-mr-3\.5{margin-right:-.875rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.mb-8{margin-bottom:2rem}.mb-9{margin-bottom:2.25rem}.mb-10{margin-bottom:2.5rem}.mb-11{margin-bottom:2.75rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-16{margin-bottom:4rem}.mb-20{margin-bottom:5rem}.mb-24{margin-bottom:6rem}.mb-28{margin-bottom:7rem}.mb-32{margin-bottom:8rem}.mb-36{margin-bottom:9rem}.mb-40{margin-bottom:10rem}.mb-44{margin-bottom:11rem}.mb-48{margin-bottom:12rem}.mb-52{margin-bottom:13rem}.mb-56{margin-bottom:14rem}.mb-60{margin-bottom:15rem}.mb-64{margin-bottom:16rem}.mb-72{margin-bottom:18rem}.mb-80{margin-bottom:20rem}.mb-96{margin-bottom:24rem}.mb-auto{margin-bottom:auto}.mb-px{margin-bottom:1px}.mb-0\.5{margin-bottom:.125rem}.mb-1\.5{margin-bottom:.375rem}.mb-2\.5{margin-bottom:.625rem}.mb-3\.5{margin-bottom:.875rem}.-mb-0{margin-bottom:0}.-mb-1{margin-bottom:-.25rem}.-mb-2{margin-bottom:-.5rem}.-mb-3{margin-bottom:-.75rem}.-mb-4{margin-bottom:-1rem}.-mb-5{margin-bottom:-1.25rem}.-mb-6{margin-bottom:-1.5rem}.-mb-7{margin-bottom:-1.75rem}.-mb-8{margin-bottom:-2rem}.-mb-9{margin-bottom:-2.25rem}.-mb-10{margin-bottom:-2.5rem}.-mb-11{margin-bottom:-2.75rem}.-mb-12{margin-bottom:-3rem}.-mb-14{margin-bottom:-3.5rem}.-mb-16{margin-bottom:-4rem}.-mb-20{margin-bottom:-5rem}.-mb-24{margin-bottom:-6rem}.-mb-28{margin-bottom:-7rem}.-mb-32{margin-bottom:-8rem}.-mb-36{margin-bottom:-9rem}.-mb-40{margin-bottom:-10rem}.-mb-44{margin-bottom:-11rem}.-mb-48{margin-bottom:-12rem}.-mb-52{margin-bottom:-13rem}.-mb-56{margin-bottom:-14rem}.-mb-60{margin-bottom:-15rem}.-mb-64{margin-bottom:-16rem}.-mb-72{margin-bottom:-18rem}.-mb-80{margin-bottom:-20rem}.-mb-96{margin-bottom:-24rem}.-mb-px{margin-bottom:-1px}.-mb-0\.5{margin-bottom:-.125rem}.-mb-1\.5{margin-bottom:-.375rem}.-mb-2\.5{margin-bottom:-.625rem}.-mb-3\.5{margin-bottom:-.875rem}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-10{margin-left:2.5rem}.ml-11{margin-left:2.75rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.ml-16{margin-left:4rem}.ml-20{margin-left:5rem}.ml-24{margin-left:6rem}.ml-28{margin-left:7rem}.ml-32{margin-left:8rem}.ml-36{margin-left:9rem}.ml-40{margin-left:10rem}.ml-44{margin-left:11rem}.ml-48{margin-left:12rem}.ml-52{margin-left:13rem}.ml-56{margin-left:14rem}.ml-60{margin-left:15rem}.ml-64{margin-left:16rem}.ml-72{margin-left:18rem}.ml-80{margin-left:20rem}.ml-96{margin-left:24rem}.ml-auto{margin-left:auto}.ml-px{margin-left:1px}.ml-0\.5{margin-left:.125rem}.ml-1\.5{margin-left:.375rem}.ml-2\.5{margin-left:.625rem}.ml-3\.5{margin-left:.875rem}.-ml-0{margin-left:0}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.-ml-3{margin-left:-.75rem}.-ml-4{margin-left:-1rem}.-ml-5{margin-left:-1.25rem}.-ml-6{margin-left:-1.5rem}.-ml-7{margin-left:-1.75rem}.-ml-8{margin-left:-2rem}.-ml-9{margin-left:-2.25rem}.-ml-10{margin-left:-2.5rem}.-ml-11{margin-left:-2.75rem}.-ml-12{margin-left:-3rem}.-ml-14{margin-left:-3.5rem}.-ml-16{margin-left:-4rem}.-ml-20{margin-left:-5rem}.-ml-24{margin-left:-6rem}.-ml-28{margin-left:-7rem}.-ml-32{margin-left:-8rem}.-ml-36{margin-left:-9rem}.-ml-40{margin-left:-10rem}.-ml-44{margin-left:-11rem}.-ml-48{margin-left:-12rem}.-ml-52{margin-left:-13rem}.-ml-56{margin-left:-14rem}.-ml-60{margin-left:-15rem}.-ml-64{margin-left:-16rem}.-ml-72{margin-left:-18rem}.-ml-80{margin-left:-20rem}.-ml-96{margin-left:-24rem}.-ml-px{margin-left:-1px}.-ml-0\.5{margin-left:-.125rem}.-ml-1\.5{margin-left:-.375rem}.-ml-2\.5{margin-left:-.625rem}.-ml-3\.5{margin-left:-.875rem}.box-border{box-sizing:border-box}.box-content{box-sizing:initial}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.inline-table{display:inline-table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row-group{display:table-row-group}.table-row{display:table-row}.flow-root{display:flow-root}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.h-0{height:0}.h-1{height:.25rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-32{height:8rem}.h-36{height:9rem}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-52{height:13rem}.h-56{height:14rem}.h-60{height:15rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-96{height:24rem}.h-auto{height:auto}.h-px{height:1px}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-2\/3{height:66.666667%}.h-1\/4{height:25%}.h-2\/4{height:50%}.h-3\/4{height:75%}.h-1\/5{height:20%}.h-2\/5{height:40%}.h-3\/5{height:60%}.h-4\/5{height:80%}.h-1\/6{height:16.666667%}.h-2\/6{height:33.333333%}.h-3\/6{height:50%}.h-4\/6{height:66.666667%}.h-5\/6{height:83.333333%}.h-full{height:100%}.h-screen{height:100vh}.max-h-0{max-height:0}.max-h-1{max-height:.25rem}.max-h-2{max-height:.5rem}.max-h-3{max-height:.75rem}.max-h-4{max-height:1rem}.max-h-5{max-height:1.25rem}.max-h-6{max-height:1.5rem}.max-h-7{max-height:1.75rem}.max-h-8{max-height:2rem}.max-h-9{max-height:2.25rem}.max-h-10{max-height:2.5rem}.max-h-11{max-height:2.75rem}.max-h-12{max-height:3rem}.max-h-14{max-height:3.5rem}.max-h-16{max-height:4rem}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-28{max-height:7rem}.max-h-32{max-height:8rem}.max-h-36{max-height:9rem}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-px{max-height:1px}.max-h-0\.5{max-height:.125rem}.max-h-1\.5{max-height:.375rem}.max-h-2\.5{max-height:.625rem}.max-h-3\.5{max-height:.875rem}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-0{width:0}.w-1{width:.25rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-36{width:9rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-52{width:13rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-72{width:18rem}.w-80{width:20rem}.w-96{width:24rem}.w-auto{width:auto}.w-px{width:1px}.w-0\.5{width:.125rem}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-3\.5{width:.875rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-6\/12{width:50%}.w-7\/12{width:58.333333%}.w-8\/12{width:66.666667%}.w-9\/12{width:75%}.w-10\/12{width:83.333333%}.w-11\/12{width:91.666667%}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.max-w-0{max-width:0}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.max-w-prose{max-width:65ch}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.max-w-screen-2xl{max-width:1536px}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.flex-grow-0{flex-grow:0}.flex-grow{flex-grow:1}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:initial}.origin-center{transform-origin:center}.origin-top{transform-origin:top}.origin-top-right{transform-origin:top right}.origin-right{transform-origin:right}.origin-bottom-right{transform-origin:bottom right}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:bottom left}.origin-left{transform-origin:left}.origin-top-left{transform-origin:top left}.transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform,.transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-none{transform:none}.translate-x-0{--tw-translate-x:0px}.translate-x-1{--tw-translate-x:0.25rem}.translate-x-2{--tw-translate-x:0.5rem}.translate-x-3{--tw-translate-x:0.75rem}.translate-x-4{--tw-translate-x:1rem}.translate-x-5{--tw-translate-x:1.25rem}.translate-x-6{--tw-translate-x:1.5rem}.translate-x-7{--tw-translate-x:1.75rem}.translate-x-8{--tw-translate-x:2rem}.translate-x-9{--tw-translate-x:2.25rem}.translate-x-10{--tw-translate-x:2.5rem}.translate-x-11{--tw-translate-x:2.75rem}.translate-x-12{--tw-translate-x:3rem}.translate-x-14{--tw-translate-x:3.5rem}.translate-x-16{--tw-translate-x:4rem}.translate-x-20{--tw-translate-x:5rem}.translate-x-24{--tw-translate-x:6rem}.translate-x-28{--tw-translate-x:7rem}.translate-x-32{--tw-translate-x:8rem}.translate-x-36{--tw-translate-x:9rem}.translate-x-40{--tw-translate-x:10rem}.translate-x-44{--tw-translate-x:11rem}.translate-x-48{--tw-translate-x:12rem}.translate-x-52{--tw-translate-x:13rem}.translate-x-56{--tw-translate-x:14rem}.translate-x-60{--tw-translate-x:15rem}.translate-x-64{--tw-translate-x:16rem}.translate-x-72{--tw-translate-x:18rem}.translate-x-80{--tw-translate-x:20rem}.translate-x-96{--tw-translate-x:24rem}.translate-x-px{--tw-translate-x:1px}.translate-x-0\.5{--tw-translate-x:0.125rem}.translate-x-1\.5{--tw-translate-x:0.375rem}.translate-x-2\.5{--tw-translate-x:0.625rem}.translate-x-3\.5{--tw-translate-x:0.875rem}.-translate-x-0{--tw-translate-x:0px}.-translate-x-1{--tw-translate-x:-0.25rem}.-translate-x-2{--tw-translate-x:-0.5rem}.-translate-x-3{--tw-translate-x:-0.75rem}.-translate-x-4{--tw-translate-x:-1rem}.-translate-x-5{--tw-translate-x:-1.25rem}.-translate-x-6{--tw-translate-x:-1.5rem}.-translate-x-7{--tw-translate-x:-1.75rem}.-translate-x-8{--tw-translate-x:-2rem}.-translate-x-9{--tw-translate-x:-2.25rem}.-translate-x-10{--tw-translate-x:-2.5rem}.-translate-x-11{--tw-translate-x:-2.75rem}.-translate-x-12{--tw-translate-x:-3rem}.-translate-x-14{--tw-translate-x:-3.5rem}.-translate-x-16{--tw-translate-x:-4rem}.-translate-x-20{--tw-translate-x:-5rem}.-translate-x-24{--tw-translate-x:-6rem}.-translate-x-28{--tw-translate-x:-7rem}.-translate-x-32{--tw-translate-x:-8rem}.-translate-x-36{--tw-translate-x:-9rem}.-translate-x-40{--tw-translate-x:-10rem}.-translate-x-44{--tw-translate-x:-11rem}.-translate-x-48{--tw-translate-x:-12rem}.-translate-x-52{--tw-translate-x:-13rem}.-translate-x-56{--tw-translate-x:-14rem}.-translate-x-60{--tw-translate-x:-15rem}.-translate-x-64{--tw-translate-x:-16rem}.-translate-x-72{--tw-translate-x:-18rem}.-translate-x-80{--tw-translate-x:-20rem}.-translate-x-96{--tw-translate-x:-24rem}.-translate-x-px{--tw-translate-x:-1px}.-translate-x-0\.5{--tw-translate-x:-0.125rem}.-translate-x-1\.5{--tw-translate-x:-0.375rem}.-translate-x-2\.5{--tw-translate-x:-0.625rem}.-translate-x-3\.5{--tw-translate-x:-0.875rem}.translate-x-1\/2{--tw-translate-x:50%}.translate-x-1\/3{--tw-translate-x:33.333333%}.translate-x-2\/3{--tw-translate-x:66.666667%}.translate-x-1\/4{--tw-translate-x:25%}.translate-x-2\/4{--tw-translate-x:50%}.translate-x-3\/4{--tw-translate-x:75%}.translate-x-full{--tw-translate-x:100%}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/3{--tw-translate-x:-33.333333%}.-translate-x-2\/3{--tw-translate-x:-66.666667%}.-translate-x-1\/4{--tw-translate-x:-25%}.-translate-x-2\/4{--tw-translate-x:-50%}.-translate-x-3\/4{--tw-translate-x:-75%}.-translate-x-full{--tw-translate-x:-100%}.translate-y-0{--tw-translate-y:0px}.translate-y-1{--tw-translate-y:0.25rem}.translate-y-2{--tw-translate-y:0.5rem}.translate-y-3{--tw-translate-y:0.75rem}.translate-y-4{--tw-translate-y:1rem}.translate-y-5{--tw-translate-y:1.25rem}.translate-y-6{--tw-translate-y:1.5rem}.translate-y-7{--tw-translate-y:1.75rem}.translate-y-8{--tw-translate-y:2rem}.translate-y-9{--tw-translate-y:2.25rem}.translate-y-10{--tw-translate-y:2.5rem}.translate-y-11{--tw-translate-y:2.75rem}.translate-y-12{--tw-translate-y:3rem}.translate-y-14{--tw-translate-y:3.5rem}.translate-y-16{--tw-translate-y:4rem}.translate-y-20{--tw-translate-y:5rem}.translate-y-24{--tw-translate-y:6rem}.translate-y-28{--tw-translate-y:7rem}.translate-y-32{--tw-translate-y:8rem}.translate-y-36{--tw-translate-y:9rem}.translate-y-40{--tw-translate-y:10rem}.translate-y-44{--tw-translate-y:11rem}.translate-y-48{--tw-translate-y:12rem}.translate-y-52{--tw-translate-y:13rem}.translate-y-56{--tw-translate-y:14rem}.translate-y-60{--tw-translate-y:15rem}.translate-y-64{--tw-translate-y:16rem}.translate-y-72{--tw-translate-y:18rem}.translate-y-80{--tw-translate-y:20rem}.translate-y-96{--tw-translate-y:24rem}.translate-y-px{--tw-translate-y:1px}.translate-y-0\.5{--tw-translate-y:0.125rem}.translate-y-1\.5{--tw-translate-y:0.375rem}.translate-y-2\.5{--tw-translate-y:0.625rem}.translate-y-3\.5{--tw-translate-y:0.875rem}.-translate-y-0{--tw-translate-y:0px}.-translate-y-1{--tw-translate-y:-0.25rem}.-translate-y-2{--tw-translate-y:-0.5rem}.-translate-y-3{--tw-translate-y:-0.75rem}.-translate-y-4{--tw-translate-y:-1rem}.-translate-y-5{--tw-translate-y:-1.25rem}.-translate-y-6{--tw-translate-y:-1.5rem}.-translate-y-7{--tw-translate-y:-1.75rem}.-translate-y-8{--tw-translate-y:-2rem}.-translate-y-9{--tw-translate-y:-2.25rem}.-translate-y-10{--tw-translate-y:-2.5rem}.-translate-y-11{--tw-translate-y:-2.75rem}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-14{--tw-translate-y:-3.5rem}.-translate-y-16{--tw-translate-y:-4rem}.-translate-y-20{--tw-translate-y:-5rem}.-translate-y-24{--tw-translate-y:-6rem}.-translate-y-28{--tw-translate-y:-7rem}.-translate-y-32{--tw-translate-y:-8rem}.-translate-y-36{--tw-translate-y:-9rem}.-translate-y-40{--tw-translate-y:-10rem}.-translate-y-44{--tw-translate-y:-11rem}.-translate-y-48{--tw-translate-y:-12rem}.-translate-y-52{--tw-translate-y:-13rem}.-translate-y-56{--tw-translate-y:-14rem}.-translate-y-60{--tw-translate-y:-15rem}.-translate-y-64{--tw-translate-y:-16rem}.-translate-y-72{--tw-translate-y:-18rem}.-translate-y-80{--tw-translate-y:-20rem}.-translate-y-96{--tw-translate-y:-24rem}.-translate-y-px{--tw-translate-y:-1px}.-translate-y-0\.5{--tw-translate-y:-0.125rem}.-translate-y-1\.5{--tw-translate-y:-0.375rem}.-translate-y-2\.5{--tw-translate-y:-0.625rem}.-translate-y-3\.5{--tw-translate-y:-0.875rem}.translate-y-1\/2{--tw-translate-y:50%}.translate-y-1\/3{--tw-translate-y:33.333333%}.translate-y-2\/3{--tw-translate-y:66.666667%}.translate-y-1\/4{--tw-translate-y:25%}.translate-y-2\/4{--tw-translate-y:50%}.translate-y-3\/4{--tw-translate-y:75%}.translate-y-full{--tw-translate-y:100%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/3{--tw-translate-y:-33.333333%}.-translate-y-2\/3{--tw-translate-y:-66.666667%}.-translate-y-1\/4{--tw-translate-y:-25%}.-translate-y-2\/4{--tw-translate-y:-50%}.-translate-y-3\/4{--tw-translate-y:-75%}.-translate-y-full{--tw-translate-y:-100%}.hover\:translate-x-0:hover{--tw-translate-x:0px}.hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.hover\:translate-x-4:hover{--tw-translate-x:1rem}.hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.hover\:translate-x-8:hover{--tw-translate-x:2rem}.hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.hover\:translate-x-12:hover{--tw-translate-x:3rem}.hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.hover\:translate-x-16:hover{--tw-translate-x:4rem}.hover\:translate-x-20:hover{--tw-translate-x:5rem}.hover\:translate-x-24:hover{--tw-translate-x:6rem}.hover\:translate-x-28:hover{--tw-translate-x:7rem}.hover\:translate-x-32:hover{--tw-translate-x:8rem}.hover\:translate-x-36:hover{--tw-translate-x:9rem}.hover\:translate-x-40:hover{--tw-translate-x:10rem}.hover\:translate-x-44:hover{--tw-translate-x:11rem}.hover\:translate-x-48:hover{--tw-translate-x:12rem}.hover\:translate-x-52:hover{--tw-translate-x:13rem}.hover\:translate-x-56:hover{--tw-translate-x:14rem}.hover\:translate-x-60:hover{--tw-translate-x:15rem}.hover\:translate-x-64:hover{--tw-translate-x:16rem}.hover\:translate-x-72:hover{--tw-translate-x:18rem}.hover\:translate-x-80:hover{--tw-translate-x:20rem}.hover\:translate-x-96:hover{--tw-translate-x:24rem}.hover\:translate-x-px:hover{--tw-translate-x:1px}.hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.hover\:-translate-x-0:hover{--tw-translate-x:0px}.hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.hover\:-translate-x-px:hover{--tw-translate-x:-1px}.hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.hover\:translate-x-full:hover{--tw-translate-x:100%}.hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.hover\:-translate-x-full:hover{--tw-translate-x:-100%}.hover\:translate-y-0:hover{--tw-translate-y:0px}.hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.hover\:translate-y-4:hover{--tw-translate-y:1rem}.hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.hover\:translate-y-8:hover{--tw-translate-y:2rem}.hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.hover\:translate-y-12:hover{--tw-translate-y:3rem}.hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.hover\:translate-y-16:hover{--tw-translate-y:4rem}.hover\:translate-y-20:hover{--tw-translate-y:5rem}.hover\:translate-y-24:hover{--tw-translate-y:6rem}.hover\:translate-y-28:hover{--tw-translate-y:7rem}.hover\:translate-y-32:hover{--tw-translate-y:8rem}.hover\:translate-y-36:hover{--tw-translate-y:9rem}.hover\:translate-y-40:hover{--tw-translate-y:10rem}.hover\:translate-y-44:hover{--tw-translate-y:11rem}.hover\:translate-y-48:hover{--tw-translate-y:12rem}.hover\:translate-y-52:hover{--tw-translate-y:13rem}.hover\:translate-y-56:hover{--tw-translate-y:14rem}.hover\:translate-y-60:hover{--tw-translate-y:15rem}.hover\:translate-y-64:hover{--tw-translate-y:16rem}.hover\:translate-y-72:hover{--tw-translate-y:18rem}.hover\:translate-y-80:hover{--tw-translate-y:20rem}.hover\:translate-y-96:hover{--tw-translate-y:24rem}.hover\:translate-y-px:hover{--tw-translate-y:1px}.hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.hover\:-translate-y-0:hover{--tw-translate-y:0px}.hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.hover\:-translate-y-px:hover{--tw-translate-y:-1px}.hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.hover\:translate-y-full:hover{--tw-translate-y:100%}.hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.hover\:-translate-y-full:hover{--tw-translate-y:-100%}.focus\:translate-x-0:focus{--tw-translate-x:0px}.focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.focus\:translate-x-4:focus{--tw-translate-x:1rem}.focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.focus\:translate-x-8:focus{--tw-translate-x:2rem}.focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.focus\:translate-x-12:focus{--tw-translate-x:3rem}.focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.focus\:translate-x-16:focus{--tw-translate-x:4rem}.focus\:translate-x-20:focus{--tw-translate-x:5rem}.focus\:translate-x-24:focus{--tw-translate-x:6rem}.focus\:translate-x-28:focus{--tw-translate-x:7rem}.focus\:translate-x-32:focus{--tw-translate-x:8rem}.focus\:translate-x-36:focus{--tw-translate-x:9rem}.focus\:translate-x-40:focus{--tw-translate-x:10rem}.focus\:translate-x-44:focus{--tw-translate-x:11rem}.focus\:translate-x-48:focus{--tw-translate-x:12rem}.focus\:translate-x-52:focus{--tw-translate-x:13rem}.focus\:translate-x-56:focus{--tw-translate-x:14rem}.focus\:translate-x-60:focus{--tw-translate-x:15rem}.focus\:translate-x-64:focus{--tw-translate-x:16rem}.focus\:translate-x-72:focus{--tw-translate-x:18rem}.focus\:translate-x-80:focus{--tw-translate-x:20rem}.focus\:translate-x-96:focus{--tw-translate-x:24rem}.focus\:translate-x-px:focus{--tw-translate-x:1px}.focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.focus\:-translate-x-0:focus{--tw-translate-x:0px}.focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.focus\:-translate-x-px:focus{--tw-translate-x:-1px}.focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.focus\:translate-x-full:focus{--tw-translate-x:100%}.focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.focus\:-translate-x-full:focus{--tw-translate-x:-100%}.focus\:translate-y-0:focus{--tw-translate-y:0px}.focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.focus\:translate-y-4:focus{--tw-translate-y:1rem}.focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.focus\:translate-y-8:focus{--tw-translate-y:2rem}.focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.focus\:translate-y-12:focus{--tw-translate-y:3rem}.focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.focus\:translate-y-16:focus{--tw-translate-y:4rem}.focus\:translate-y-20:focus{--tw-translate-y:5rem}.focus\:translate-y-24:focus{--tw-translate-y:6rem}.focus\:translate-y-28:focus{--tw-translate-y:7rem}.focus\:translate-y-32:focus{--tw-translate-y:8rem}.focus\:translate-y-36:focus{--tw-translate-y:9rem}.focus\:translate-y-40:focus{--tw-translate-y:10rem}.focus\:translate-y-44:focus{--tw-translate-y:11rem}.focus\:translate-y-48:focus{--tw-translate-y:12rem}.focus\:translate-y-52:focus{--tw-translate-y:13rem}.focus\:translate-y-56:focus{--tw-translate-y:14rem}.focus\:translate-y-60:focus{--tw-translate-y:15rem}.focus\:translate-y-64:focus{--tw-translate-y:16rem}.focus\:translate-y-72:focus{--tw-translate-y:18rem}.focus\:translate-y-80:focus{--tw-translate-y:20rem}.focus\:translate-y-96:focus{--tw-translate-y:24rem}.focus\:translate-y-px:focus{--tw-translate-y:1px}.focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.focus\:-translate-y-0:focus{--tw-translate-y:0px}.focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.focus\:-translate-y-px:focus{--tw-translate-y:-1px}.focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.focus\:translate-y-full:focus{--tw-translate-y:100%}.focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.focus\:-translate-y-full:focus{--tw-translate-y:-100%}.rotate-0{--tw-rotate:0deg}.rotate-1{--tw-rotate:1deg}.rotate-2{--tw-rotate:2deg}.rotate-3{--tw-rotate:3deg}.rotate-6{--tw-rotate:6deg}.rotate-12{--tw-rotate:12deg}.rotate-45{--tw-rotate:45deg}.rotate-90{--tw-rotate:90deg}.rotate-180{--tw-rotate:180deg}.-rotate-180{--tw-rotate:-180deg}.-rotate-90{--tw-rotate:-90deg}.-rotate-45{--tw-rotate:-45deg}.-rotate-12{--tw-rotate:-12deg}.-rotate-6{--tw-rotate:-6deg}.-rotate-3{--tw-rotate:-3deg}.-rotate-2{--tw-rotate:-2deg}.-rotate-1{--tw-rotate:-1deg}.hover\:rotate-0:hover{--tw-rotate:0deg}.hover\:rotate-1:hover{--tw-rotate:1deg}.hover\:rotate-2:hover{--tw-rotate:2deg}.hover\:rotate-3:hover{--tw-rotate:3deg}.hover\:rotate-6:hover{--tw-rotate:6deg}.hover\:rotate-12:hover{--tw-rotate:12deg}.hover\:rotate-45:hover{--tw-rotate:45deg}.hover\:rotate-90:hover{--tw-rotate:90deg}.hover\:rotate-180:hover{--tw-rotate:180deg}.hover\:-rotate-180:hover{--tw-rotate:-180deg}.hover\:-rotate-90:hover{--tw-rotate:-90deg}.hover\:-rotate-45:hover{--tw-rotate:-45deg}.hover\:-rotate-12:hover{--tw-rotate:-12deg}.hover\:-rotate-6:hover{--tw-rotate:-6deg}.hover\:-rotate-3:hover{--tw-rotate:-3deg}.hover\:-rotate-2:hover{--tw-rotate:-2deg}.hover\:-rotate-1:hover{--tw-rotate:-1deg}.focus\:rotate-0:focus{--tw-rotate:0deg}.focus\:rotate-1:focus{--tw-rotate:1deg}.focus\:rotate-2:focus{--tw-rotate:2deg}.focus\:rotate-3:focus{--tw-rotate:3deg}.focus\:rotate-6:focus{--tw-rotate:6deg}.focus\:rotate-12:focus{--tw-rotate:12deg}.focus\:rotate-45:focus{--tw-rotate:45deg}.focus\:rotate-90:focus{--tw-rotate:90deg}.focus\:rotate-180:focus{--tw-rotate:180deg}.focus\:-rotate-180:focus{--tw-rotate:-180deg}.focus\:-rotate-90:focus{--tw-rotate:-90deg}.focus\:-rotate-45:focus{--tw-rotate:-45deg}.focus\:-rotate-12:focus{--tw-rotate:-12deg}.focus\:-rotate-6:focus{--tw-rotate:-6deg}.focus\:-rotate-3:focus{--tw-rotate:-3deg}.focus\:-rotate-2:focus{--tw-rotate:-2deg}.focus\:-rotate-1:focus{--tw-rotate:-1deg}.skew-x-0{--tw-skew-x:0deg}.skew-x-1{--tw-skew-x:1deg}.skew-x-2{--tw-skew-x:2deg}.skew-x-3{--tw-skew-x:3deg}.skew-x-6{--tw-skew-x:6deg}.skew-x-12{--tw-skew-x:12deg}.-skew-x-12{--tw-skew-x:-12deg}.-skew-x-6{--tw-skew-x:-6deg}.-skew-x-3{--tw-skew-x:-3deg}.-skew-x-2{--tw-skew-x:-2deg}.-skew-x-1{--tw-skew-x:-1deg}.skew-y-0{--tw-skew-y:0deg}.skew-y-1{--tw-skew-y:1deg}.skew-y-2{--tw-skew-y:2deg}.skew-y-3{--tw-skew-y:3deg}.skew-y-6{--tw-skew-y:6deg}.skew-y-12{--tw-skew-y:12deg}.-skew-y-12{--tw-skew-y:-12deg}.-skew-y-6{--tw-skew-y:-6deg}.-skew-y-3{--tw-skew-y:-3deg}.-skew-y-2{--tw-skew-y:-2deg}.-skew-y-1{--tw-skew-y:-1deg}.hover\:skew-x-0:hover{--tw-skew-x:0deg}.hover\:skew-x-1:hover{--tw-skew-x:1deg}.hover\:skew-x-2:hover{--tw-skew-x:2deg}.hover\:skew-x-3:hover{--tw-skew-x:3deg}.hover\:skew-x-6:hover{--tw-skew-x:6deg}.hover\:skew-x-12:hover{--tw-skew-x:12deg}.hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.hover\:skew-y-0:hover{--tw-skew-y:0deg}.hover\:skew-y-1:hover{--tw-skew-y:1deg}.hover\:skew-y-2:hover{--tw-skew-y:2deg}.hover\:skew-y-3:hover{--tw-skew-y:3deg}.hover\:skew-y-6:hover{--tw-skew-y:6deg}.hover\:skew-y-12:hover{--tw-skew-y:12deg}.hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.focus\:skew-x-0:focus{--tw-skew-x:0deg}.focus\:skew-x-1:focus{--tw-skew-x:1deg}.focus\:skew-x-2:focus{--tw-skew-x:2deg}.focus\:skew-x-3:focus{--tw-skew-x:3deg}.focus\:skew-x-6:focus{--tw-skew-x:6deg}.focus\:skew-x-12:focus{--tw-skew-x:12deg}.focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.focus\:skew-y-0:focus{--tw-skew-y:0deg}.focus\:skew-y-1:focus{--tw-skew-y:1deg}.focus\:skew-y-2:focus{--tw-skew-y:2deg}.focus\:skew-y-3:focus{--tw-skew-y:3deg}.focus\:skew-y-6:focus{--tw-skew-y:6deg}.focus\:skew-y-12:focus{--tw-skew-y:12deg}.focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.scale-x-0{--tw-scale-x:0}.scale-x-50{--tw-scale-x:.5}.scale-x-75{--tw-scale-x:.75}.scale-x-90{--tw-scale-x:.9}.scale-x-95{--tw-scale-x:.95}.scale-x-100{--tw-scale-x:1}.scale-x-105{--tw-scale-x:1.05}.scale-x-110{--tw-scale-x:1.1}.scale-x-125{--tw-scale-x:1.25}.scale-x-150{--tw-scale-x:1.5}.scale-y-0{--tw-scale-y:0}.scale-y-50{--tw-scale-y:.5}.scale-y-75{--tw-scale-y:.75}.scale-y-90{--tw-scale-y:.9}.scale-y-95{--tw-scale-y:.95}.scale-y-100{--tw-scale-y:1}.scale-y-105{--tw-scale-y:1.05}.scale-y-110{--tw-scale-y:1.1}.scale-y-125{--tw-scale-y:1.25}.scale-y-150{--tw-scale-y:1.5}.hover\:scale-x-0:hover{--tw-scale-x:0}.hover\:scale-x-50:hover{--tw-scale-x:.5}.hover\:scale-x-75:hover{--tw-scale-x:.75}.hover\:scale-x-90:hover{--tw-scale-x:.9}.hover\:scale-x-95:hover{--tw-scale-x:.95}.hover\:scale-x-100:hover{--tw-scale-x:1}.hover\:scale-x-105:hover{--tw-scale-x:1.05}.hover\:scale-x-110:hover{--tw-scale-x:1.1}.hover\:scale-x-125:hover{--tw-scale-x:1.25}.hover\:scale-x-150:hover{--tw-scale-x:1.5}.hover\:scale-y-0:hover{--tw-scale-y:0}.hover\:scale-y-50:hover{--tw-scale-y:.5}.hover\:scale-y-75:hover{--tw-scale-y:.75}.hover\:scale-y-90:hover{--tw-scale-y:.9}.hover\:scale-y-95:hover{--tw-scale-y:.95}.hover\:scale-y-100:hover{--tw-scale-y:1}.hover\:scale-y-105:hover{--tw-scale-y:1.05}.hover\:scale-y-110:hover{--tw-scale-y:1.1}.hover\:scale-y-125:hover{--tw-scale-y:1.25}.hover\:scale-y-150:hover{--tw-scale-y:1.5}.focus\:scale-x-0:focus{--tw-scale-x:0}.focus\:scale-x-50:focus{--tw-scale-x:.5}.focus\:scale-x-75:focus{--tw-scale-x:.75}.focus\:scale-x-90:focus{--tw-scale-x:.9}.focus\:scale-x-95:focus{--tw-scale-x:.95}.focus\:scale-x-100:focus{--tw-scale-x:1}.focus\:scale-x-105:focus{--tw-scale-x:1.05}.focus\:scale-x-110:focus{--tw-scale-x:1.1}.focus\:scale-x-125:focus{--tw-scale-x:1.25}.focus\:scale-x-150:focus{--tw-scale-x:1.5}.focus\:scale-y-0:focus{--tw-scale-y:0}.focus\:scale-y-50:focus{--tw-scale-y:.5}.focus\:scale-y-75:focus{--tw-scale-y:.75}.focus\:scale-y-90:focus{--tw-scale-y:.9}.focus\:scale-y-95:focus{--tw-scale-y:.95}.focus\:scale-y-100:focus{--tw-scale-y:1}.focus\:scale-y-105:focus{--tw-scale-y:1.05}.focus\:scale-y-110:focus{--tw-scale-y:1.1}.focus\:scale-y-125:focus{--tw-scale-y:1.25}.focus\:scale-y-150:focus{--tw-scale-y:1.5}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-none{-webkit-animation:none;animation:none}.animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.resize-none{resize:none}.resize-y{resize:vertical}.resize-x{resize:horizontal}.resize{resize:both}.list-inside{list-style-position:inside}.list-outside{list-style-position:outside}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.auto-cols-auto{grid-auto-columns:auto}.auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.grid-flow-row{grid-auto-flow:row}.grid-flow-col{grid-auto-flow:column}.grid-flow-row-dense{grid-auto-flow:row dense}.grid-flow-col-dense{grid-auto-flow:column dense}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid-rows-none{grid-template-rows:none}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-end{place-content:end}.place-content-between{place-content:space-between}.place-content-around{place-content:space-around}.place-content-evenly{place-content:space-evenly}.place-content-stretch{place-content:stretch}.place-items-start{place-items:start}.place-items-end{place-items:end}.place-items-center{place-items:center}.place-items-stretch{place-items:stretch}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-items-start{justify-items:start}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.justify-items-stretch{justify-items:stretch}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-7{gap:1.75rem}.gap-8{gap:2rem}.gap-9{gap:2.25rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-12{gap:3rem}.gap-14{gap:3.5rem}.gap-16{gap:4rem}.gap-20{gap:5rem}.gap-24{gap:6rem}.gap-28{gap:7rem}.gap-32{gap:8rem}.gap-36{gap:9rem}.gap-40{gap:10rem}.gap-44{gap:11rem}.gap-48{gap:12rem}.gap-52{gap:13rem}.gap-56{gap:14rem}.gap-60{gap:15rem}.gap-64{gap:16rem}.gap-72{gap:18rem}.gap-80{gap:20rem}.gap-96{gap:24rem}.gap-px{gap:1px}.gap-0\.5{gap:.125rem}.gap-1\.5{gap:.375rem}.gap-2\.5{gap:.625rem}.gap-3\.5{gap:.875rem}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.gap-x-px{-moz-column-gap:1px;column-gap:1px}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-y-0{row-gap:0}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-5{row-gap:1.25rem}.gap-y-6{row-gap:1.5rem}.gap-y-7{row-gap:1.75rem}.gap-y-8{row-gap:2rem}.gap-y-9{row-gap:2.25rem}.gap-y-10{row-gap:2.5rem}.gap-y-11{row-gap:2.75rem}.gap-y-12{row-gap:3rem}.gap-y-14{row-gap:3.5rem}.gap-y-16{row-gap:4rem}.gap-y-20{row-gap:5rem}.gap-y-24{row-gap:6rem}.gap-y-28{row-gap:7rem}.gap-y-32{row-gap:8rem}.gap-y-36{row-gap:9rem}.gap-y-40{row-gap:10rem}.gap-y-44{row-gap:11rem}.gap-y-48{row-gap:12rem}.gap-y-52{row-gap:13rem}.gap-y-56{row-gap:14rem}.gap-y-60{row-gap:15rem}.gap-y-64{row-gap:16rem}.gap-y-72{row-gap:18rem}.gap-y-80{row-gap:20rem}.gap-y-96{row-gap:24rem}.gap-y-px{row-gap:1px}.gap-y-0\.5{row-gap:.125rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-3\.5{row-gap:.875rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.divide-double>:not([hidden])~:not([hidden]){border-style:double}.divide-none>:not([hidden])~:not([hidden]){border-style:none}.divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.place-self-auto{place-self:auto}.place-self-start{place-self:start}.place-self-end{place-self:end}.place-self-center{place-self:center}.place-self-stretch{place-self:stretch}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.justify-self-auto{justify-self:auto}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.justify-self-stretch{justify-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.overscroll-y-auto{overscroll-behavior-y:auto}.overscroll-y-contain{overscroll-behavior-y:contain}.overscroll-y-none{overscroll-behavior-y:none}.overscroll-x-auto{overscroll-behavior-x:auto}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-x-none{overscroll-behavior-x:none}.truncate{overflow:hidden;white-space:nowrap}.overflow-ellipsis,.truncate{text-overflow:ellipsis}.overflow-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-tl-none{border-top-left-radius:0}.rounded-tl-sm{border-top-left-radius:.125rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-tl-md{border-top-left-radius:.375rem}.rounded-tl-lg{border-top-left-radius:.5rem}.rounded-tl-xl{border-top-left-radius:.75rem}.rounded-tl-2xl{border-top-left-radius:1rem}.rounded-tl-3xl{border-top-left-radius:1.5rem}.rounded-tl-full{border-top-left-radius:9999px}.rounded-tr-none{border-top-right-radius:0}.rounded-tr-sm{border-top-right-radius:.125rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-tr-md{border-top-right-radius:.375rem}.rounded-tr-lg{border-top-right-radius:.5rem}.rounded-tr-xl{border-top-right-radius:.75rem}.rounded-tr-2xl{border-top-right-radius:1rem}.rounded-tr-3xl{border-top-right-radius:1.5rem}.rounded-tr-full{border-top-right-radius:9999px}.rounded-br-none{border-bottom-right-radius:0}.rounded-br-sm{border-bottom-right-radius:.125rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-md{border-bottom-right-radius:.375rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-br-xl{border-bottom-right-radius:.75rem}.rounded-br-2xl{border-bottom-right-radius:1rem}.rounded-br-3xl{border-bottom-right-radius:1.5rem}.rounded-br-full{border-bottom-right-radius:9999px}.rounded-bl-none{border-bottom-left-radius:0}.rounded-bl-sm{border-bottom-left-radius:.125rem}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-md{border-bottom-left-radius:.375rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-bl-xl{border-bottom-left-radius:.75rem}.rounded-bl-2xl{border-bottom-left-radius:1rem}.rounded-bl-3xl{border-bottom-left-radius:1.5rem}.rounded-bl-full{border-bottom-left-radius:9999px}.border-0{border-width:0}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-t-0{border-top-width:0}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-t-8{border-top-width:8px}.border-t{border-top-width:1px}.border-r-0{border-right-width:0}.border-r-2{border-right-width:2px}.border-r-4{border-right-width:4px}.border-r-8{border-right-width:8px}.border-r{border-right-width:1px}.border-b-0{border-bottom-width:0}.border-b-2{border-bottom-width:2px}.border-b-4{border-bottom-width:4px}.border-b-8{border-bottom-width:8px}.border-b{border-bottom-width:1px}.border-l-0{border-left-width:0}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-l-8{border-left-width:8px}.border-l{border-left-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-none{border-style:none}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .group-hover\:border-transparent{border-color:transparent}.group:hover .group-hover\:border-current{border-color:currentColor}.group:hover .group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.focus-within\:border-transparent:focus-within{border-color:transparent}.focus-within\:border-current:focus-within{border-color:currentColor}.focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-current:hover{border-color:currentColor}.hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.focus\:border-transparent:focus{border-color:transparent}.focus\:border-current:focus{border-color:currentColor}.focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.border-opacity-0{--tw-border-opacity:0}.border-opacity-5{--tw-border-opacity:0.05}.border-opacity-10{--tw-border-opacity:0.1}.border-opacity-20{--tw-border-opacity:0.2}.border-opacity-25{--tw-border-opacity:0.25}.border-opacity-30{--tw-border-opacity:0.3}.border-opacity-40{--tw-border-opacity:0.4}.border-opacity-50{--tw-border-opacity:0.5}.border-opacity-60{--tw-border-opacity:0.6}.border-opacity-70{--tw-border-opacity:0.7}.border-opacity-75{--tw-border-opacity:0.75}.border-opacity-80{--tw-border-opacity:0.8}.border-opacity-90{--tw-border-opacity:0.9}.border-opacity-95{--tw-border-opacity:0.95}.border-opacity-100{--tw-border-opacity:1}.group:hover .group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .group-hover\:border-opacity-100{--tw-border-opacity:1}.focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.hover\:border-opacity-0:hover{--tw-border-opacity:0}.hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.hover\:border-opacity-100:hover{--tw-border-opacity:1}.focus\:border-opacity-0:focus{--tw-border-opacity:0}.focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.focus\:border-opacity-100:focus{--tw-border-opacity:1}.bg-transparent{background-color:initial}.bg-current{background-color:currentColor}.bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-transparent{background-color:initial}.group:hover .group-hover\:bg-current{background-color:currentColor}.group:hover .group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.focus-within\:bg-transparent:focus-within{background-color:initial}.focus-within\:bg-current:focus-within{background-color:currentColor}.focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.hover\:bg-transparent:hover{background-color:initial}.hover\:bg-current:hover{background-color:currentColor}.hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.focus\:bg-transparent:focus{background-color:initial}.focus\:bg-current:focus{background-color:currentColor}.focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.bg-opacity-0{--tw-bg-opacity:0}.bg-opacity-5{--tw-bg-opacity:0.05}.bg-opacity-10{--tw-bg-opacity:0.1}.bg-opacity-20{--tw-bg-opacity:0.2}.bg-opacity-25{--tw-bg-opacity:0.25}.bg-opacity-30{--tw-bg-opacity:0.3}.bg-opacity-40{--tw-bg-opacity:0.4}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-opacity-60{--tw-bg-opacity:0.6}.bg-opacity-70{--tw-bg-opacity:0.7}.bg-opacity-75{--tw-bg-opacity:0.75}.bg-opacity-80{--tw-bg-opacity:0.8}.bg-opacity-90{--tw-bg-opacity:0.9}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-opacity-100{--tw-bg-opacity:1}.group:hover .group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .group-hover\:bg-opacity-100{--tw-bg-opacity:1}.focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.bg-none{background-image:none}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.to-transparent{--tw-gradient-to:transparent}.to-current{--tw-gradient-to:currentColor}.to-black{--tw-gradient-to:#000}.to-white{--tw-gradient-to:#fff}.to-gray-50{--tw-gradient-to:#f9fafb}.to-gray-100{--tw-gradient-to:#f3f4f6}.to-gray-200{--tw-gradient-to:#e5e7eb}.to-gray-300{--tw-gradient-to:#d1d5db}.to-gray-400{--tw-gradient-to:#9ca3af}.to-gray-500{--tw-gradient-to:#6b7280}.to-gray-600{--tw-gradient-to:#4b5563}.to-gray-700{--tw-gradient-to:#374151}.to-gray-800{--tw-gradient-to:#1f2937}.to-gray-900{--tw-gradient-to:#111827}.to-red-50{--tw-gradient-to:#fef2f2}.to-red-100{--tw-gradient-to:#fee2e2}.to-red-200{--tw-gradient-to:#fecaca}.to-red-300{--tw-gradient-to:#fca5a5}.to-red-400{--tw-gradient-to:#f87171}.to-red-500{--tw-gradient-to:#ef4444}.to-red-600{--tw-gradient-to:#dc2626}.to-red-700{--tw-gradient-to:#b91c1c}.to-red-800{--tw-gradient-to:#991b1b}.to-red-900{--tw-gradient-to:#7f1d1d}.to-yellow-50{--tw-gradient-to:#fffbeb}.to-yellow-100{--tw-gradient-to:#fef3c7}.to-yellow-200{--tw-gradient-to:#fde68a}.to-yellow-300{--tw-gradient-to:#fcd34d}.to-yellow-400{--tw-gradient-to:#fbbf24}.to-yellow-500{--tw-gradient-to:#f59e0b}.to-yellow-600{--tw-gradient-to:#d97706}.to-yellow-700{--tw-gradient-to:#b45309}.to-yellow-800{--tw-gradient-to:#92400e}.to-yellow-900{--tw-gradient-to:#78350f}.to-green-50{--tw-gradient-to:#ecfdf5}.to-green-100{--tw-gradient-to:#d1fae5}.to-green-200{--tw-gradient-to:#a7f3d0}.to-green-300{--tw-gradient-to:#6ee7b7}.to-green-400{--tw-gradient-to:#34d399}.to-green-500{--tw-gradient-to:#10b981}.to-green-600{--tw-gradient-to:#059669}.to-green-700{--tw-gradient-to:#047857}.to-green-800{--tw-gradient-to:#065f46}.to-green-900{--tw-gradient-to:#064e3b}.to-blue-50{--tw-gradient-to:#eff6ff}.to-blue-100{--tw-gradient-to:#dbeafe}.to-blue-200{--tw-gradient-to:#bfdbfe}.to-blue-300{--tw-gradient-to:#93c5fd}.to-blue-400{--tw-gradient-to:#60a5fa}.to-blue-500{--tw-gradient-to:#3b82f6}.to-blue-600{--tw-gradient-to:#2563eb}.to-blue-700{--tw-gradient-to:#1d4ed8}.to-blue-800{--tw-gradient-to:#1e40af}.to-blue-900{--tw-gradient-to:#1e3a8a}.to-indigo-50{--tw-gradient-to:#eef2ff}.to-indigo-100{--tw-gradient-to:#e0e7ff}.to-indigo-200{--tw-gradient-to:#c7d2fe}.to-indigo-300{--tw-gradient-to:#a5b4fc}.to-indigo-400{--tw-gradient-to:#818cf8}.to-indigo-500{--tw-gradient-to:#6366f1}.to-indigo-600{--tw-gradient-to:#4f46e5}.to-indigo-700{--tw-gradient-to:#4338ca}.to-indigo-800{--tw-gradient-to:#3730a3}.to-indigo-900{--tw-gradient-to:#312e81}.to-purple-50{--tw-gradient-to:#f5f3ff}.to-purple-100{--tw-gradient-to:#ede9fe}.to-purple-200{--tw-gradient-to:#ddd6fe}.to-purple-300{--tw-gradient-to:#c4b5fd}.to-purple-400{--tw-gradient-to:#a78bfa}.to-purple-500{--tw-gradient-to:#8b5cf6}.to-purple-600{--tw-gradient-to:#7c3aed}.to-purple-700{--tw-gradient-to:#6d28d9}.to-purple-800{--tw-gradient-to:#5b21b6}.to-purple-900{--tw-gradient-to:#4c1d95}.to-pink-50{--tw-gradient-to:#fdf2f8}.to-pink-100{--tw-gradient-to:#fce7f3}.to-pink-200{--tw-gradient-to:#fbcfe8}.to-pink-300{--tw-gradient-to:#f9a8d4}.to-pink-400{--tw-gradient-to:#f472b6}.to-pink-500{--tw-gradient-to:#ec4899}.to-pink-600{--tw-gradient-to:#db2777}.to-pink-700{--tw-gradient-to:#be185d}.to-pink-800{--tw-gradient-to:#9d174d}.to-pink-900{--tw-gradient-to:#831843}.hover\:to-transparent:hover{--tw-gradient-to:transparent}.hover\:to-current:hover{--tw-gradient-to:currentColor}.hover\:to-black:hover{--tw-gradient-to:#000}.hover\:to-white:hover{--tw-gradient-to:#fff}.hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.hover\:to-gray-700:hover{--tw-gradient-to:#374151}.hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.hover\:to-gray-900:hover{--tw-gradient-to:#111827}.hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.hover\:to-red-400:hover{--tw-gradient-to:#f87171}.hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.hover\:to-green-400:hover{--tw-gradient-to:#34d399}.hover\:to-green-500:hover{--tw-gradient-to:#10b981}.hover\:to-green-600:hover{--tw-gradient-to:#059669}.hover\:to-green-700:hover{--tw-gradient-to:#047857}.hover\:to-green-800:hover{--tw-gradient-to:#065f46}.hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.hover\:to-pink-900:hover{--tw-gradient-to:#831843}.focus\:to-transparent:focus{--tw-gradient-to:transparent}.focus\:to-current:focus{--tw-gradient-to:currentColor}.focus\:to-black:focus{--tw-gradient-to:#000}.focus\:to-white:focus{--tw-gradient-to:#fff}.focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.focus\:to-gray-700:focus{--tw-gradient-to:#374151}.focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.focus\:to-gray-900:focus{--tw-gradient-to:#111827}.focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.focus\:to-red-400:focus{--tw-gradient-to:#f87171}.focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.focus\:to-green-400:focus{--tw-gradient-to:#34d399}.focus\:to-green-500:focus{--tw-gradient-to:#10b981}.focus\:to-green-600:focus{--tw-gradient-to:#059669}.focus\:to-green-700:focus{--tw-gradient-to:#047857}.focus\:to-green-800:focus{--tw-gradient-to:#065f46}.focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.focus\:to-pink-900:focus{--tw-gradient-to:#831843}.decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.bg-clip-border{background-clip:initial}.bg-clip-padding{background-clip:padding-box}.bg-clip-content{background-clip:content-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-bottom{background-position:bottom}.bg-center{background-position:50%}.bg-left{background-position:0}.bg-left-bottom{background-position:0 100%}.bg-left-top{background-position:0 0}.bg-right{background-position:100%}.bg-right-bottom{background-position:100% 100%}.bg-right-top{background-position:100% 0}.bg-top{background-position:top}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-origin-border{background-origin:border-box}.bg-origin-padding{background-origin:initial}.bg-origin-content{background-origin:content-box}.fill-current{fill:currentColor}.stroke-current{stroke:currentColor}.stroke-0{stroke-width:0}.stroke-1{stroke-width:1}.stroke-2{stroke-width:2}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-bottom{-o-object-position:bottom;object-position:bottom}.object-center{-o-object-position:center;object-position:center}.object-left{-o-object-position:left;object-position:left}.object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.object-left-top{-o-object-position:left top;object-position:left top}.object-right{-o-object-position:right;object-position:right}.object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.object-right-top{-o-object-position:right top;object-position:right top}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-9{padding:2.25rem}.p-10{padding:2.5rem}.p-11{padding:2.75rem}.p-12{padding:3rem}.p-14{padding:3.5rem}.p-16{padding:4rem}.p-20{padding:5rem}.p-24{padding:6rem}.p-28{padding:7rem}.p-32{padding:8rem}.p-36{padding:9rem}.p-40{padding:10rem}.p-44{padding:11rem}.p-48{padding:12rem}.p-52{padding:13rem}.p-56{padding:14rem}.p-60{padding:15rem}.p-64{padding:16rem}.p-72{padding:18rem}.p-80{padding:20rem}.p-96{padding:24rem}.p-px{padding:1px}.p-0\.5{padding:.125rem}.p-1\.5{padding:.375rem}.p-2\.5{padding:.625rem}.p-3\.5{padding:.875rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-11{padding-left:2.75rem;padding-right:2.75rem}.px-12{padding-left:3rem;padding-right:3rem}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-16{padding-left:4rem;padding-right:4rem}.px-20{padding-left:5rem;padding-right:5rem}.px-24{padding-left:6rem;padding-right:6rem}.px-28{padding-left:7rem;padding-right:7rem}.px-32{padding-left:8rem;padding-right:8rem}.px-36{padding-left:9rem;padding-right:9rem}.px-40{padding-left:10rem;padding-right:10rem}.px-44{padding-left:11rem;padding-right:11rem}.px-48{padding-left:12rem;padding-right:12rem}.px-52{padding-left:13rem;padding-right:13rem}.px-56{padding-left:14rem;padding-right:14rem}.px-60{padding-left:15rem;padding-right:15rem}.px-64{padding-left:16rem;padding-right:16rem}.px-72{padding-left:18rem;padding-right:18rem}.px-80{padding-left:20rem;padding-right:20rem}.px-96{padding-left:24rem;padding-right:24rem}.px-px{padding-left:1px;padding-right:1px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-9{padding-top:2.25rem;padding-bottom:2.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-11{padding-top:2.75rem;padding-bottom:2.75rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-28{padding-top:7rem;padding-bottom:7rem}.py-32{padding-top:8rem;padding-bottom:8rem}.py-36{padding-top:9rem;padding-bottom:9rem}.py-40{padding-top:10rem;padding-bottom:10rem}.py-44{padding-top:11rem;padding-bottom:11rem}.py-48{padding-top:12rem;padding-bottom:12rem}.py-52{padding-top:13rem;padding-bottom:13rem}.py-56{padding-top:14rem;padding-bottom:14rem}.py-60{padding-top:15rem;padding-bottom:15rem}.py-64{padding-top:16rem;padding-bottom:16rem}.py-72{padding-top:18rem;padding-bottom:18rem}.py-80{padding-top:20rem;padding-bottom:20rem}.py-96{padding-top:24rem;padding-bottom:24rem}.py-px{padding-top:1px;padding-bottom:1px}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pt-9{padding-top:2.25rem}.pt-10{padding-top:2.5rem}.pt-11{padding-top:2.75rem}.pt-12{padding-top:3rem}.pt-14{padding-top:3.5rem}.pt-16{padding-top:4rem}.pt-20{padding-top:5rem}.pt-24{padding-top:6rem}.pt-28{padding-top:7rem}.pt-32{padding-top:8rem}.pt-36{padding-top:9rem}.pt-40{padding-top:10rem}.pt-44{padding-top:11rem}.pt-48{padding-top:12rem}.pt-52{padding-top:13rem}.pt-56{padding-top:14rem}.pt-60{padding-top:15rem}.pt-64{padding-top:16rem}.pt-72{padding-top:18rem}.pt-80{padding-top:20rem}.pt-96{padding-top:24rem}.pt-px{padding-top:1px}.pt-0\.5{padding-top:.125rem}.pt-1\.5{padding-top:.375rem}.pt-2\.5{padding-top:.625rem}.pt-3\.5{padding-top:.875rem}.pr-0{padding-right:0}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pr-10{padding-right:2.5rem}.pr-11{padding-right:2.75rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-16{padding-right:4rem}.pr-20{padding-right:5rem}.pr-24{padding-right:6rem}.pr-28{padding-right:7rem}.pr-32{padding-right:8rem}.pr-36{padding-right:9rem}.pr-40{padding-right:10rem}.pr-44{padding-right:11rem}.pr-48{padding-right:12rem}.pr-52{padding-right:13rem}.pr-56{padding-right:14rem}.pr-60{padding-right:15rem}.pr-64{padding-right:16rem}.pr-72{padding-right:18rem}.pr-80{padding-right:20rem}.pr-96{padding-right:24rem}.pr-px{padding-right:1px}.pr-0\.5{padding-right:.125rem}.pr-1\.5{padding-right:.375rem}.pr-2\.5{padding-right:.625rem}.pr-3\.5{padding-right:.875rem}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-7{padding-bottom:1.75rem}.pb-8{padding-bottom:2rem}.pb-9{padding-bottom:2.25rem}.pb-10{padding-bottom:2.5rem}.pb-11{padding-bottom:2.75rem}.pb-12{padding-bottom:3rem}.pb-14{padding-bottom:3.5rem}.pb-16{padding-bottom:4rem}.pb-20{padding-bottom:5rem}.pb-24{padding-bottom:6rem}.pb-28{padding-bottom:7rem}.pb-32{padding-bottom:8rem}.pb-36{padding-bottom:9rem}.pb-40{padding-bottom:10rem}.pb-44{padding-bottom:11rem}.pb-48{padding-bottom:12rem}.pb-52{padding-bottom:13rem}.pb-56{padding-bottom:14rem}.pb-60{padding-bottom:15rem}.pb-64{padding-bottom:16rem}.pb-72{padding-bottom:18rem}.pb-80{padding-bottom:20rem}.pb-96{padding-bottom:24rem}.pb-px{padding-bottom:1px}.pb-0\.5{padding-bottom:.125rem}.pb-1\.5{padding-bottom:.375rem}.pb-2\.5{padding-bottom:.625rem}.pb-3\.5{padding-bottom:.875rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-12{padding-left:3rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-20{padding-left:5rem}.pl-24{padding-left:6rem}.pl-28{padding-left:7rem}.pl-32{padding-left:8rem}.pl-36{padding-left:9rem}.pl-40{padding-left:10rem}.pl-44{padding-left:11rem}.pl-48{padding-left:12rem}.pl-52{padding-left:13rem}.pl-56{padding-left:14rem}.pl-60{padding-left:15rem}.pl-64{padding-left:16rem}.pl-72{padding-left:18rem}.pl-80{padding-left:20rem}.pl-96{padding-left:24rem}.pl-px{padding-left:1px}.pl-0\.5{padding-left:.125rem}.pl-1\.5{padding-left:.375rem}.pl-2\.5{padding-left:.625rem}.pl-3\.5{padding-left:.875rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-baseline{vertical-align:initial}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.align-text-top{vertical-align:text-top}.align-text-bottom{vertical-align:text-bottom}.font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-xs{font-size:.75rem;line-height:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-7xl{font-size:4.5rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.font-thin{font-weight:100}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.not-italic{font-style:normal}.diagonal-fractions,.lining-nums,.oldstyle-nums,.ordinal,.proportional-nums,.slashed-zero,.stacked-fractions,.tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.normal-nums{font-variant-numeric:normal}.ordinal{--tw-ordinal:ordinal}.slashed-zero{--tw-slashed-zero:slashed-zero}.lining-nums{--tw-numeric-figure:lining-nums}.oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.proportional-nums{--tw-numeric-spacing:proportional-nums}.tabular-nums{--tw-numeric-spacing:tabular-nums}.diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.stacked-fractions{--tw-numeric-fraction:stacked-fractions}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.tracking-tighter{letter-spacing:-.05em}.tracking-tight{letter-spacing:-.025em}.tracking-normal{letter-spacing:0}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-transparent{color:transparent}.text-current{color:currentColor}.text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .group-hover\:text-transparent{color:transparent}.group:hover .group-hover\:text-current{color:currentColor}.group:hover .group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.focus-within\:text-transparent:focus-within{color:transparent}.focus-within\:text-current:focus-within{color:currentColor}.focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.hover\:text-transparent:hover{color:transparent}.hover\:text-current:hover{color:currentColor}.hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.focus\:text-transparent:focus{color:transparent}.focus\:text-current:focus{color:currentColor}.focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.text-opacity-0{--tw-text-opacity:0}.text-opacity-5{--tw-text-opacity:0.05}.text-opacity-10{--tw-text-opacity:0.1}.text-opacity-20{--tw-text-opacity:0.2}.text-opacity-25{--tw-text-opacity:0.25}.text-opacity-30{--tw-text-opacity:0.3}.text-opacity-40{--tw-text-opacity:0.4}.text-opacity-50{--tw-text-opacity:0.5}.text-opacity-60{--tw-text-opacity:0.6}.text-opacity-70{--tw-text-opacity:0.7}.text-opacity-75{--tw-text-opacity:0.75}.text-opacity-80{--tw-text-opacity:0.8}.text-opacity-90{--tw-text-opacity:0.9}.text-opacity-95{--tw-text-opacity:0.95}.text-opacity-100{--tw-text-opacity:1}.group:hover .group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .group-hover\:text-opacity-100{--tw-text-opacity:1}.focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.hover\:text-opacity-0:hover{--tw-text-opacity:0}.hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.hover\:text-opacity-100:hover{--tw-text-opacity:1}.focus\:text-opacity-0:focus{--tw-text-opacity:0}.focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.focus\:text-opacity-100:focus{--tw-text-opacity:1}.underline{text-decoration:underline}.line-through{text-decoration:line-through}.no-underline{text-decoration:none}.group:hover .group-hover\:underline{text-decoration:underline}.group:hover .group-hover\:line-through{text-decoration:line-through}.group:hover .group-hover\:no-underline{text-decoration:none}.focus-within\:underline:focus-within{text-decoration:underline}.focus-within\:line-through:focus-within{text-decoration:line-through}.focus-within\:no-underline:focus-within{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.hover\:line-through:hover{text-decoration:line-through}.hover\:no-underline:hover{text-decoration:none}.focus\:underline:focus{text-decoration:underline}.focus\:line-through:focus{text-decoration:line-through}.focus\:no-underline:focus{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.placeholder-transparent::-moz-placeholder{color:transparent}.placeholder-transparent:-ms-input-placeholder{color:transparent}.placeholder-transparent::placeholder{color:transparent}.placeholder-current::-moz-placeholder{color:currentColor}.placeholder-current:-ms-input-placeholder{color:currentColor}.placeholder-current::placeholder{color:currentColor}.placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.focus\:placeholder-transparent:focus::placeholder{color:transparent}.focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.focus\:placeholder-current:focus::placeholder{color:currentColor}.focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.caret-transparent{caret-color:transparent}.caret-current{caret-color:currentColor}.caret-black{caret-color:#000}.caret-white{caret-color:#fff}.caret-gray-50{caret-color:#f9fafb}.caret-gray-100{caret-color:#f3f4f6}.caret-gray-200{caret-color:#e5e7eb}.caret-gray-300{caret-color:#d1d5db}.caret-gray-400{caret-color:#9ca3af}.caret-gray-500{caret-color:#6b7280}.caret-gray-600{caret-color:#4b5563}.caret-gray-700{caret-color:#374151}.caret-gray-800{caret-color:#1f2937}.caret-gray-900{caret-color:#111827}.caret-red-50{caret-color:#fef2f2}.caret-red-100{caret-color:#fee2e2}.caret-red-200{caret-color:#fecaca}.caret-red-300{caret-color:#fca5a5}.caret-red-400{caret-color:#f87171}.caret-red-500{caret-color:#ef4444}.caret-red-600{caret-color:#dc2626}.caret-red-700{caret-color:#b91c1c}.caret-red-800{caret-color:#991b1b}.caret-red-900{caret-color:#7f1d1d}.caret-yellow-50{caret-color:#fffbeb}.caret-yellow-100{caret-color:#fef3c7}.caret-yellow-200{caret-color:#fde68a}.caret-yellow-300{caret-color:#fcd34d}.caret-yellow-400{caret-color:#fbbf24}.caret-yellow-500{caret-color:#f59e0b}.caret-yellow-600{caret-color:#d97706}.caret-yellow-700{caret-color:#b45309}.caret-yellow-800{caret-color:#92400e}.caret-yellow-900{caret-color:#78350f}.caret-green-50{caret-color:#ecfdf5}.caret-green-100{caret-color:#d1fae5}.caret-green-200{caret-color:#a7f3d0}.caret-green-300{caret-color:#6ee7b7}.caret-green-400{caret-color:#34d399}.caret-green-500{caret-color:#10b981}.caret-green-600{caret-color:#059669}.caret-green-700{caret-color:#047857}.caret-green-800{caret-color:#065f46}.caret-green-900{caret-color:#064e3b}.caret-blue-50{caret-color:#eff6ff}.caret-blue-100{caret-color:#dbeafe}.caret-blue-200{caret-color:#bfdbfe}.caret-blue-300{caret-color:#93c5fd}.caret-blue-400{caret-color:#60a5fa}.caret-blue-500{caret-color:#3b82f6}.caret-blue-600{caret-color:#2563eb}.caret-blue-700{caret-color:#1d4ed8}.caret-blue-800{caret-color:#1e40af}.caret-blue-900{caret-color:#1e3a8a}.caret-indigo-50{caret-color:#eef2ff}.caret-indigo-100{caret-color:#e0e7ff}.caret-indigo-200{caret-color:#c7d2fe}.caret-indigo-300{caret-color:#a5b4fc}.caret-indigo-400{caret-color:#818cf8}.caret-indigo-500{caret-color:#6366f1}.caret-indigo-600{caret-color:#4f46e5}.caret-indigo-700{caret-color:#4338ca}.caret-indigo-800{caret-color:#3730a3}.caret-indigo-900{caret-color:#312e81}.caret-purple-50{caret-color:#f5f3ff}.caret-purple-100{caret-color:#ede9fe}.caret-purple-200{caret-color:#ddd6fe}.caret-purple-300{caret-color:#c4b5fd}.caret-purple-400{caret-color:#a78bfa}.caret-purple-500{caret-color:#8b5cf6}.caret-purple-600{caret-color:#7c3aed}.caret-purple-700{caret-color:#6d28d9}.caret-purple-800{caret-color:#5b21b6}.caret-purple-900{caret-color:#4c1d95}.caret-pink-50{caret-color:#fdf2f8}.caret-pink-100{caret-color:#fce7f3}.caret-pink-200{caret-color:#fbcfe8}.caret-pink-300{caret-color:#f9a8d4}.caret-pink-400{caret-color:#f472b6}.caret-pink-500{caret-color:#ec4899}.caret-pink-600{caret-color:#db2777}.caret-pink-700{caret-color:#be185d}.caret-pink-800{caret-color:#9d174d}.caret-pink-900{caret-color:#831843}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.group:hover .group-hover\:opacity-0{opacity:0}.group:hover .group-hover\:opacity-5{opacity:.05}.group:hover .group-hover\:opacity-10{opacity:.1}.group:hover .group-hover\:opacity-20{opacity:.2}.group:hover .group-hover\:opacity-25{opacity:.25}.group:hover .group-hover\:opacity-30{opacity:.3}.group:hover .group-hover\:opacity-40{opacity:.4}.group:hover .group-hover\:opacity-50{opacity:.5}.group:hover .group-hover\:opacity-60{opacity:.6}.group:hover .group-hover\:opacity-70{opacity:.7}.group:hover .group-hover\:opacity-75{opacity:.75}.group:hover .group-hover\:opacity-80{opacity:.8}.group:hover .group-hover\:opacity-90{opacity:.9}.group:hover .group-hover\:opacity-95{opacity:.95}.group:hover .group-hover\:opacity-100{opacity:1}.focus-within\:opacity-0:focus-within{opacity:0}.focus-within\:opacity-5:focus-within{opacity:.05}.focus-within\:opacity-10:focus-within{opacity:.1}.focus-within\:opacity-20:focus-within{opacity:.2}.focus-within\:opacity-25:focus-within{opacity:.25}.focus-within\:opacity-30:focus-within{opacity:.3}.focus-within\:opacity-40:focus-within{opacity:.4}.focus-within\:opacity-50:focus-within{opacity:.5}.focus-within\:opacity-60:focus-within{opacity:.6}.focus-within\:opacity-70:focus-within{opacity:.7}.focus-within\:opacity-75:focus-within{opacity:.75}.focus-within\:opacity-80:focus-within{opacity:.8}.focus-within\:opacity-90:focus-within{opacity:.9}.focus-within\:opacity-95:focus-within{opacity:.95}.focus-within\:opacity-100:focus-within{opacity:1}.hover\:opacity-0:hover{opacity:0}.hover\:opacity-5:hover{opacity:.05}.hover\:opacity-10:hover{opacity:.1}.hover\:opacity-20:hover{opacity:.2}.hover\:opacity-25:hover{opacity:.25}.hover\:opacity-30:hover{opacity:.3}.hover\:opacity-40:hover{opacity:.4}.hover\:opacity-50:hover{opacity:.5}.hover\:opacity-60:hover{opacity:.6}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-95:hover{opacity:.95}.hover\:opacity-100:hover{opacity:1}.focus\:opacity-0:focus{opacity:0}.focus\:opacity-5:focus{opacity:.05}.focus\:opacity-10:focus{opacity:.1}.focus\:opacity-20:focus{opacity:.2}.focus\:opacity-25:focus{opacity:.25}.focus\:opacity-30:focus{opacity:.3}.focus\:opacity-40:focus{opacity:.4}.focus\:opacity-50:focus{opacity:.5}.focus\:opacity-60:focus{opacity:.6}.focus\:opacity-70:focus{opacity:.7}.focus\:opacity-75:focus{opacity:.75}.focus\:opacity-80:focus{opacity:.8}.focus\:opacity-90:focus{opacity:.9}.focus\:opacity-95:focus{opacity:.95}.focus\:opacity-100:focus{opacity:1}.bg-blend-normal{background-blend-mode:normal}.bg-blend-multiply{background-blend-mode:multiply}.bg-blend-screen{background-blend-mode:screen}.bg-blend-overlay{background-blend-mode:overlay}.bg-blend-darken{background-blend-mode:darken}.bg-blend-lighten{background-blend-mode:lighten}.bg-blend-color-dodge{background-blend-mode:color-dodge}.bg-blend-color-burn{background-blend-mode:color-burn}.bg-blend-hard-light{background-blend-mode:hard-light}.bg-blend-soft-light{background-blend-mode:soft-light}.bg-blend-difference{background-blend-mode:difference}.bg-blend-exclusion{background-blend-mode:exclusion}.bg-blend-hue{background-blend-mode:hue}.bg-blend-saturation{background-blend-mode:saturation}.bg-blend-color{background-blend-mode:color}.bg-blend-luminosity{background-blend-mode:luminosity}.mix-blend-normal{mix-blend-mode:normal}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-screen{mix-blend-mode:screen}.mix-blend-overlay{mix-blend-mode:overlay}.mix-blend-darken{mix-blend-mode:darken}.mix-blend-lighten{mix-blend-mode:lighten}.mix-blend-color-dodge{mix-blend-mode:color-dodge}.mix-blend-color-burn{mix-blend-mode:color-burn}.mix-blend-hard-light{mix-blend-mode:hard-light}.mix-blend-soft-light{mix-blend-mode:soft-light}.mix-blend-difference{mix-blend-mode:difference}.mix-blend-exclusion{mix-blend-mode:exclusion}.mix-blend-hue{mix-blend-mode:hue}.mix-blend-saturation{mix-blend-mode:saturation}.mix-blend-color{mix-blend-mode:color}.mix-blend-luminosity{mix-blend-mode:luminosity}*,:after,:before{--tw-shadow:0 0 #0000}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.shadow-inner,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000}.group:hover .group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .group-hover\:shadow,.group:hover .group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .group-hover\:shadow-lg,.group:hover .group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .group-hover\:shadow-2xl,.group:hover .group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .group-hover\:shadow-inner,.group:hover .group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:shadow-none{--tw-shadow:0 0 #0000}.focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.hover\:shadow-sm:hover,.hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.hover\:shadow-lg:hover,.hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.hover\:shadow-2xl:hover,.hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.hover\:shadow-inner:hover,.hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.focus\:shadow-sm:focus,.focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.focus\:shadow-lg:focus,.focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.focus\:shadow-2xl:focus,.focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.focus\:shadow-inner:focus,.focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline-white{outline:2px dotted #fff;outline-offset:2px}.outline-black{outline:2px dotted #000;outline-offset:2px}.focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}*,:after,:before{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus,.focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-8:focus,.focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-inset{--tw-ring-inset:inset}.focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.focus\:ring-inset:focus{--tw-ring-inset:inset}.ring-transparent{--tw-ring-color:transparent}.ring-current{--tw-ring-color:currentColor}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.focus\:ring-transparent:focus{--tw-ring-color:transparent}.focus\:ring-current:focus{--tw-ring-color:currentColor}.focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.ring-opacity-0{--tw-ring-opacity:0}.ring-opacity-5{--tw-ring-opacity:0.05}.ring-opacity-10{--tw-ring-opacity:0.1}.ring-opacity-20{--tw-ring-opacity:0.2}.ring-opacity-25{--tw-ring-opacity:0.25}.ring-opacity-30{--tw-ring-opacity:0.3}.ring-opacity-40{--tw-ring-opacity:0.4}.ring-opacity-50{--tw-ring-opacity:0.5}.ring-opacity-60{--tw-ring-opacity:0.6}.ring-opacity-70{--tw-ring-opacity:0.7}.ring-opacity-75{--tw-ring-opacity:0.75}.ring-opacity-80{--tw-ring-opacity:0.8}.ring-opacity-90{--tw-ring-opacity:0.9}.ring-opacity-95{--tw-ring-opacity:0.95}.ring-opacity-100{--tw-ring-opacity:1}.focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.ring-offset-0{--tw-ring-offset-width:0px}.ring-offset-1{--tw-ring-offset-width:1px}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-4{--tw-ring-offset-width:4px}.ring-offset-8{--tw-ring-offset-width:8px}.focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.ring-offset-transparent{--tw-ring-offset-color:transparent}.ring-offset-current{--tw-ring-offset-color:currentColor}.ring-offset-black{--tw-ring-offset-color:#000}.ring-offset-white{--tw-ring-offset-color:#fff}.ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.ring-offset-gray-700{--tw-ring-offset-color:#374151}.ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.ring-offset-gray-900{--tw-ring-offset-color:#111827}.ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.ring-offset-red-200{--tw-ring-offset-color:#fecaca}.ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.ring-offset-red-400{--tw-ring-offset-color:#f87171}.ring-offset-red-500{--tw-ring-offset-color:#ef4444}.ring-offset-red-600{--tw-ring-offset-color:#dc2626}.ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.ring-offset-red-800{--tw-ring-offset-color:#991b1b}.ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.ring-offset-green-400{--tw-ring-offset-color:#34d399}.ring-offset-green-500{--tw-ring-offset-color:#10b981}.ring-offset-green-600{--tw-ring-offset-color:#059669}.ring-offset-green-700{--tw-ring-offset-color:#047857}.ring-offset-green-800{--tw-ring-offset-color:#065f46}.ring-offset-green-900{--tw-ring-offset-color:#064e3b}.ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.ring-offset-pink-600{--tw-ring-offset-color:#db2777}.ring-offset-pink-700{--tw-ring-offset-color:#be185d}.ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.ring-offset-pink-900{--tw-ring-offset-color:#831843}.focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter-none{filter:none}.blur-0,.blur-none{--tw-blur:blur(0)}.blur-sm{--tw-blur:blur(4px)}.blur{--tw-blur:blur(8px)}.blur-md{--tw-blur:blur(12px)}.blur-lg{--tw-blur:blur(16px)}.blur-xl{--tw-blur:blur(24px)}.blur-2xl{--tw-blur:blur(40px)}.blur-3xl{--tw-blur:blur(64px)}.brightness-0{--tw-brightness:brightness(0)}.brightness-50{--tw-brightness:brightness(.5)}.brightness-75{--tw-brightness:brightness(.75)}.brightness-90{--tw-brightness:brightness(.9)}.brightness-95{--tw-brightness:brightness(.95)}.brightness-100{--tw-brightness:brightness(1)}.brightness-105{--tw-brightness:brightness(1.05)}.brightness-110{--tw-brightness:brightness(1.1)}.brightness-125{--tw-brightness:brightness(1.25)}.brightness-150{--tw-brightness:brightness(1.5)}.brightness-200{--tw-brightness:brightness(2)}.contrast-0{--tw-contrast:contrast(0)}.contrast-50{--tw-contrast:contrast(.5)}.contrast-75{--tw-contrast:contrast(.75)}.contrast-100{--tw-contrast:contrast(1)}.contrast-125{--tw-contrast:contrast(1.25)}.contrast-150{--tw-contrast:contrast(1.5)}.contrast-200{--tw-contrast:contrast(2)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.grayscale-0{--tw-grayscale:grayscale(0)}.grayscale{--tw-grayscale:grayscale(100%)}.hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.invert-0{--tw-invert:invert(0)}.invert{--tw-invert:invert(100%)}.saturate-0{--tw-saturate:saturate(0)}.saturate-50{--tw-saturate:saturate(.5)}.saturate-100{--tw-saturate:saturate(1)}.saturate-150{--tw-saturate:saturate(1.5)}.saturate-200{--tw-saturate:saturate(2)}.sepia-0{--tw-sepia:sepia(0)}.sepia{--tw-sepia:sepia(100%)}.backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.backdrop-blur-0,.backdrop-blur-none{--tw-backdrop-blur:blur(0)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.backdrop-invert-0{--tw-backdrop-invert:invert(0)}.backdrop-invert{--tw-backdrop-invert:invert(100%)}.backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.transition-none{transition-property:none}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:.15s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.duration-1000{transition-duration:1s}.ease-linear{transition-timing-function:linear}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.content-none{content:none}@media (min-width:640px){.sm\:container{width:100%}@media (min-width:640px){.sm\:container{max-width:640px}}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}@media (min-width:1536px){.sm\:container{max-width:1536px}}.sm\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:pointer-events-none{pointer-events:none}.sm\:pointer-events-auto{pointer-events:auto}.sm\:visible{visibility:visible}.sm\:invisible{visibility:hidden}.sm\:static{position:static}.sm\:fixed{position:fixed}.sm\:absolute{position:absolute}.sm\:relative{position:relative}.sm\:sticky{position:-webkit-sticky;position:sticky}.sm\:inset-0{top:0;right:0;bottom:0;left:0}.sm\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.sm\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.sm\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.sm\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.sm\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.sm\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.sm\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.sm\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.sm\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.sm\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.sm\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.sm\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.sm\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.sm\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.sm\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.sm\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.sm\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.sm\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.sm\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.sm\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.sm\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.sm\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.sm\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.sm\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.sm\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.sm\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.sm\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.sm\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.sm\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.sm\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.sm\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.sm\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.sm\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.sm\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.sm\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.sm\:-inset-0{top:0;right:0;bottom:0;left:0}.sm\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.sm\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.sm\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.sm\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.sm\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.sm\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.sm\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.sm\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.sm\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.sm\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.sm\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.sm\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.sm\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.sm\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.sm\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.sm\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.sm\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.sm\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.sm\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.sm\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.sm\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.sm\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.sm\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.sm\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.sm\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.sm\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.sm\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.sm\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.sm\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.sm\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.sm\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.sm\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.sm\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.sm\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.sm\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.sm\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.sm\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.sm\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.sm\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.sm\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.sm\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.sm\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.sm\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.sm\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.sm\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.sm\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.sm\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.sm\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.sm\:inset-x-0{left:0;right:0}.sm\:inset-x-1{left:.25rem;right:.25rem}.sm\:inset-x-2{left:.5rem;right:.5rem}.sm\:inset-x-3{left:.75rem;right:.75rem}.sm\:inset-x-4{left:1rem;right:1rem}.sm\:inset-x-5{left:1.25rem;right:1.25rem}.sm\:inset-x-6{left:1.5rem;right:1.5rem}.sm\:inset-x-7{left:1.75rem;right:1.75rem}.sm\:inset-x-8{left:2rem;right:2rem}.sm\:inset-x-9{left:2.25rem;right:2.25rem}.sm\:inset-x-10{left:2.5rem;right:2.5rem}.sm\:inset-x-11{left:2.75rem;right:2.75rem}.sm\:inset-x-12{left:3rem;right:3rem}.sm\:inset-x-14{left:3.5rem;right:3.5rem}.sm\:inset-x-16{left:4rem;right:4rem}.sm\:inset-x-20{left:5rem;right:5rem}.sm\:inset-x-24{left:6rem;right:6rem}.sm\:inset-x-28{left:7rem;right:7rem}.sm\:inset-x-32{left:8rem;right:8rem}.sm\:inset-x-36{left:9rem;right:9rem}.sm\:inset-x-40{left:10rem;right:10rem}.sm\:inset-x-44{left:11rem;right:11rem}.sm\:inset-x-48{left:12rem;right:12rem}.sm\:inset-x-52{left:13rem;right:13rem}.sm\:inset-x-56{left:14rem;right:14rem}.sm\:inset-x-60{left:15rem;right:15rem}.sm\:inset-x-64{left:16rem;right:16rem}.sm\:inset-x-72{left:18rem;right:18rem}.sm\:inset-x-80{left:20rem;right:20rem}.sm\:inset-x-96{left:24rem;right:24rem}.sm\:inset-x-auto{left:auto;right:auto}.sm\:inset-x-px{left:1px;right:1px}.sm\:inset-x-0\.5{left:.125rem;right:.125rem}.sm\:inset-x-1\.5{left:.375rem;right:.375rem}.sm\:inset-x-2\.5{left:.625rem;right:.625rem}.sm\:inset-x-3\.5{left:.875rem;right:.875rem}.sm\:-inset-x-0{left:0;right:0}.sm\:-inset-x-1{left:-.25rem;right:-.25rem}.sm\:-inset-x-2{left:-.5rem;right:-.5rem}.sm\:-inset-x-3{left:-.75rem;right:-.75rem}.sm\:-inset-x-4{left:-1rem;right:-1rem}.sm\:-inset-x-5{left:-1.25rem;right:-1.25rem}.sm\:-inset-x-6{left:-1.5rem;right:-1.5rem}.sm\:-inset-x-7{left:-1.75rem;right:-1.75rem}.sm\:-inset-x-8{left:-2rem;right:-2rem}.sm\:-inset-x-9{left:-2.25rem;right:-2.25rem}.sm\:-inset-x-10{left:-2.5rem;right:-2.5rem}.sm\:-inset-x-11{left:-2.75rem;right:-2.75rem}.sm\:-inset-x-12{left:-3rem;right:-3rem}.sm\:-inset-x-14{left:-3.5rem;right:-3.5rem}.sm\:-inset-x-16{left:-4rem;right:-4rem}.sm\:-inset-x-20{left:-5rem;right:-5rem}.sm\:-inset-x-24{left:-6rem;right:-6rem}.sm\:-inset-x-28{left:-7rem;right:-7rem}.sm\:-inset-x-32{left:-8rem;right:-8rem}.sm\:-inset-x-36{left:-9rem;right:-9rem}.sm\:-inset-x-40{left:-10rem;right:-10rem}.sm\:-inset-x-44{left:-11rem;right:-11rem}.sm\:-inset-x-48{left:-12rem;right:-12rem}.sm\:-inset-x-52{left:-13rem;right:-13rem}.sm\:-inset-x-56{left:-14rem;right:-14rem}.sm\:-inset-x-60{left:-15rem;right:-15rem}.sm\:-inset-x-64{left:-16rem;right:-16rem}.sm\:-inset-x-72{left:-18rem;right:-18rem}.sm\:-inset-x-80{left:-20rem;right:-20rem}.sm\:-inset-x-96{left:-24rem;right:-24rem}.sm\:-inset-x-px{left:-1px;right:-1px}.sm\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.sm\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.sm\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.sm\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.sm\:inset-x-1\/2{left:50%;right:50%}.sm\:inset-x-1\/3{left:33.333333%;right:33.333333%}.sm\:inset-x-2\/3{left:66.666667%;right:66.666667%}.sm\:inset-x-1\/4{left:25%;right:25%}.sm\:inset-x-2\/4{left:50%;right:50%}.sm\:inset-x-3\/4{left:75%;right:75%}.sm\:inset-x-full{left:100%;right:100%}.sm\:-inset-x-1\/2{left:-50%;right:-50%}.sm\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.sm\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.sm\:-inset-x-1\/4{left:-25%;right:-25%}.sm\:-inset-x-2\/4{left:-50%;right:-50%}.sm\:-inset-x-3\/4{left:-75%;right:-75%}.sm\:-inset-x-full{left:-100%;right:-100%}.sm\:inset-y-0{top:0;bottom:0}.sm\:inset-y-1{top:.25rem;bottom:.25rem}.sm\:inset-y-2{top:.5rem;bottom:.5rem}.sm\:inset-y-3{top:.75rem;bottom:.75rem}.sm\:inset-y-4{top:1rem;bottom:1rem}.sm\:inset-y-5{top:1.25rem;bottom:1.25rem}.sm\:inset-y-6{top:1.5rem;bottom:1.5rem}.sm\:inset-y-7{top:1.75rem;bottom:1.75rem}.sm\:inset-y-8{top:2rem;bottom:2rem}.sm\:inset-y-9{top:2.25rem;bottom:2.25rem}.sm\:inset-y-10{top:2.5rem;bottom:2.5rem}.sm\:inset-y-11{top:2.75rem;bottom:2.75rem}.sm\:inset-y-12{top:3rem;bottom:3rem}.sm\:inset-y-14{top:3.5rem;bottom:3.5rem}.sm\:inset-y-16{top:4rem;bottom:4rem}.sm\:inset-y-20{top:5rem;bottom:5rem}.sm\:inset-y-24{top:6rem;bottom:6rem}.sm\:inset-y-28{top:7rem;bottom:7rem}.sm\:inset-y-32{top:8rem;bottom:8rem}.sm\:inset-y-36{top:9rem;bottom:9rem}.sm\:inset-y-40{top:10rem;bottom:10rem}.sm\:inset-y-44{top:11rem;bottom:11rem}.sm\:inset-y-48{top:12rem;bottom:12rem}.sm\:inset-y-52{top:13rem;bottom:13rem}.sm\:inset-y-56{top:14rem;bottom:14rem}.sm\:inset-y-60{top:15rem;bottom:15rem}.sm\:inset-y-64{top:16rem;bottom:16rem}.sm\:inset-y-72{top:18rem;bottom:18rem}.sm\:inset-y-80{top:20rem;bottom:20rem}.sm\:inset-y-96{top:24rem;bottom:24rem}.sm\:inset-y-auto{top:auto;bottom:auto}.sm\:inset-y-px{top:1px;bottom:1px}.sm\:inset-y-0\.5{top:.125rem;bottom:.125rem}.sm\:inset-y-1\.5{top:.375rem;bottom:.375rem}.sm\:inset-y-2\.5{top:.625rem;bottom:.625rem}.sm\:inset-y-3\.5{top:.875rem;bottom:.875rem}.sm\:-inset-y-0{top:0;bottom:0}.sm\:-inset-y-1{top:-.25rem;bottom:-.25rem}.sm\:-inset-y-2{top:-.5rem;bottom:-.5rem}.sm\:-inset-y-3{top:-.75rem;bottom:-.75rem}.sm\:-inset-y-4{top:-1rem;bottom:-1rem}.sm\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.sm\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.sm\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.sm\:-inset-y-8{top:-2rem;bottom:-2rem}.sm\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.sm\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.sm\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.sm\:-inset-y-12{top:-3rem;bottom:-3rem}.sm\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.sm\:-inset-y-16{top:-4rem;bottom:-4rem}.sm\:-inset-y-20{top:-5rem;bottom:-5rem}.sm\:-inset-y-24{top:-6rem;bottom:-6rem}.sm\:-inset-y-28{top:-7rem;bottom:-7rem}.sm\:-inset-y-32{top:-8rem;bottom:-8rem}.sm\:-inset-y-36{top:-9rem;bottom:-9rem}.sm\:-inset-y-40{top:-10rem;bottom:-10rem}.sm\:-inset-y-44{top:-11rem;bottom:-11rem}.sm\:-inset-y-48{top:-12rem;bottom:-12rem}.sm\:-inset-y-52{top:-13rem;bottom:-13rem}.sm\:-inset-y-56{top:-14rem;bottom:-14rem}.sm\:-inset-y-60{top:-15rem;bottom:-15rem}.sm\:-inset-y-64{top:-16rem;bottom:-16rem}.sm\:-inset-y-72{top:-18rem;bottom:-18rem}.sm\:-inset-y-80{top:-20rem;bottom:-20rem}.sm\:-inset-y-96{top:-24rem;bottom:-24rem}.sm\:-inset-y-px{top:-1px;bottom:-1px}.sm\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.sm\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.sm\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.sm\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.sm\:inset-y-1\/2{top:50%;bottom:50%}.sm\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.sm\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.sm\:inset-y-1\/4{top:25%;bottom:25%}.sm\:inset-y-2\/4{top:50%;bottom:50%}.sm\:inset-y-3\/4{top:75%;bottom:75%}.sm\:inset-y-full{top:100%;bottom:100%}.sm\:-inset-y-1\/2{top:-50%;bottom:-50%}.sm\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.sm\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.sm\:-inset-y-1\/4{top:-25%;bottom:-25%}.sm\:-inset-y-2\/4{top:-50%;bottom:-50%}.sm\:-inset-y-3\/4{top:-75%;bottom:-75%}.sm\:-inset-y-full{top:-100%;bottom:-100%}.sm\:top-0{top:0}.sm\:top-1{top:.25rem}.sm\:top-2{top:.5rem}.sm\:top-3{top:.75rem}.sm\:top-4{top:1rem}.sm\:top-5{top:1.25rem}.sm\:top-6{top:1.5rem}.sm\:top-7{top:1.75rem}.sm\:top-8{top:2rem}.sm\:top-9{top:2.25rem}.sm\:top-10{top:2.5rem}.sm\:top-11{top:2.75rem}.sm\:top-12{top:3rem}.sm\:top-14{top:3.5rem}.sm\:top-16{top:4rem}.sm\:top-20{top:5rem}.sm\:top-24{top:6rem}.sm\:top-28{top:7rem}.sm\:top-32{top:8rem}.sm\:top-36{top:9rem}.sm\:top-40{top:10rem}.sm\:top-44{top:11rem}.sm\:top-48{top:12rem}.sm\:top-52{top:13rem}.sm\:top-56{top:14rem}.sm\:top-60{top:15rem}.sm\:top-64{top:16rem}.sm\:top-72{top:18rem}.sm\:top-80{top:20rem}.sm\:top-96{top:24rem}.sm\:top-auto{top:auto}.sm\:top-px{top:1px}.sm\:top-0\.5{top:.125rem}.sm\:top-1\.5{top:.375rem}.sm\:top-2\.5{top:.625rem}.sm\:top-3\.5{top:.875rem}.sm\:-top-0{top:0}.sm\:-top-1{top:-.25rem}.sm\:-top-2{top:-.5rem}.sm\:-top-3{top:-.75rem}.sm\:-top-4{top:-1rem}.sm\:-top-5{top:-1.25rem}.sm\:-top-6{top:-1.5rem}.sm\:-top-7{top:-1.75rem}.sm\:-top-8{top:-2rem}.sm\:-top-9{top:-2.25rem}.sm\:-top-10{top:-2.5rem}.sm\:-top-11{top:-2.75rem}.sm\:-top-12{top:-3rem}.sm\:-top-14{top:-3.5rem}.sm\:-top-16{top:-4rem}.sm\:-top-20{top:-5rem}.sm\:-top-24{top:-6rem}.sm\:-top-28{top:-7rem}.sm\:-top-32{top:-8rem}.sm\:-top-36{top:-9rem}.sm\:-top-40{top:-10rem}.sm\:-top-44{top:-11rem}.sm\:-top-48{top:-12rem}.sm\:-top-52{top:-13rem}.sm\:-top-56{top:-14rem}.sm\:-top-60{top:-15rem}.sm\:-top-64{top:-16rem}.sm\:-top-72{top:-18rem}.sm\:-top-80{top:-20rem}.sm\:-top-96{top:-24rem}.sm\:-top-px{top:-1px}.sm\:-top-0\.5{top:-.125rem}.sm\:-top-1\.5{top:-.375rem}.sm\:-top-2\.5{top:-.625rem}.sm\:-top-3\.5{top:-.875rem}.sm\:top-1\/2{top:50%}.sm\:top-1\/3{top:33.333333%}.sm\:top-2\/3{top:66.666667%}.sm\:top-1\/4{top:25%}.sm\:top-2\/4{top:50%}.sm\:top-3\/4{top:75%}.sm\:top-full{top:100%}.sm\:-top-1\/2{top:-50%}.sm\:-top-1\/3{top:-33.333333%}.sm\:-top-2\/3{top:-66.666667%}.sm\:-top-1\/4{top:-25%}.sm\:-top-2\/4{top:-50%}.sm\:-top-3\/4{top:-75%}.sm\:-top-full{top:-100%}.sm\:right-0{right:0}.sm\:right-1{right:.25rem}.sm\:right-2{right:.5rem}.sm\:right-3{right:.75rem}.sm\:right-4{right:1rem}.sm\:right-5{right:1.25rem}.sm\:right-6{right:1.5rem}.sm\:right-7{right:1.75rem}.sm\:right-8{right:2rem}.sm\:right-9{right:2.25rem}.sm\:right-10{right:2.5rem}.sm\:right-11{right:2.75rem}.sm\:right-12{right:3rem}.sm\:right-14{right:3.5rem}.sm\:right-16{right:4rem}.sm\:right-20{right:5rem}.sm\:right-24{right:6rem}.sm\:right-28{right:7rem}.sm\:right-32{right:8rem}.sm\:right-36{right:9rem}.sm\:right-40{right:10rem}.sm\:right-44{right:11rem}.sm\:right-48{right:12rem}.sm\:right-52{right:13rem}.sm\:right-56{right:14rem}.sm\:right-60{right:15rem}.sm\:right-64{right:16rem}.sm\:right-72{right:18rem}.sm\:right-80{right:20rem}.sm\:right-96{right:24rem}.sm\:right-auto{right:auto}.sm\:right-px{right:1px}.sm\:right-0\.5{right:.125rem}.sm\:right-1\.5{right:.375rem}.sm\:right-2\.5{right:.625rem}.sm\:right-3\.5{right:.875rem}.sm\:-right-0{right:0}.sm\:-right-1{right:-.25rem}.sm\:-right-2{right:-.5rem}.sm\:-right-3{right:-.75rem}.sm\:-right-4{right:-1rem}.sm\:-right-5{right:-1.25rem}.sm\:-right-6{right:-1.5rem}.sm\:-right-7{right:-1.75rem}.sm\:-right-8{right:-2rem}.sm\:-right-9{right:-2.25rem}.sm\:-right-10{right:-2.5rem}.sm\:-right-11{right:-2.75rem}.sm\:-right-12{right:-3rem}.sm\:-right-14{right:-3.5rem}.sm\:-right-16{right:-4rem}.sm\:-right-20{right:-5rem}.sm\:-right-24{right:-6rem}.sm\:-right-28{right:-7rem}.sm\:-right-32{right:-8rem}.sm\:-right-36{right:-9rem}.sm\:-right-40{right:-10rem}.sm\:-right-44{right:-11rem}.sm\:-right-48{right:-12rem}.sm\:-right-52{right:-13rem}.sm\:-right-56{right:-14rem}.sm\:-right-60{right:-15rem}.sm\:-right-64{right:-16rem}.sm\:-right-72{right:-18rem}.sm\:-right-80{right:-20rem}.sm\:-right-96{right:-24rem}.sm\:-right-px{right:-1px}.sm\:-right-0\.5{right:-.125rem}.sm\:-right-1\.5{right:-.375rem}.sm\:-right-2\.5{right:-.625rem}.sm\:-right-3\.5{right:-.875rem}.sm\:right-1\/2{right:50%}.sm\:right-1\/3{right:33.333333%}.sm\:right-2\/3{right:66.666667%}.sm\:right-1\/4{right:25%}.sm\:right-2\/4{right:50%}.sm\:right-3\/4{right:75%}.sm\:right-full{right:100%}.sm\:-right-1\/2{right:-50%}.sm\:-right-1\/3{right:-33.333333%}.sm\:-right-2\/3{right:-66.666667%}.sm\:-right-1\/4{right:-25%}.sm\:-right-2\/4{right:-50%}.sm\:-right-3\/4{right:-75%}.sm\:-right-full{right:-100%}.sm\:bottom-0{bottom:0}.sm\:bottom-1{bottom:.25rem}.sm\:bottom-2{bottom:.5rem}.sm\:bottom-3{bottom:.75rem}.sm\:bottom-4{bottom:1rem}.sm\:bottom-5{bottom:1.25rem}.sm\:bottom-6{bottom:1.5rem}.sm\:bottom-7{bottom:1.75rem}.sm\:bottom-8{bottom:2rem}.sm\:bottom-9{bottom:2.25rem}.sm\:bottom-10{bottom:2.5rem}.sm\:bottom-11{bottom:2.75rem}.sm\:bottom-12{bottom:3rem}.sm\:bottom-14{bottom:3.5rem}.sm\:bottom-16{bottom:4rem}.sm\:bottom-20{bottom:5rem}.sm\:bottom-24{bottom:6rem}.sm\:bottom-28{bottom:7rem}.sm\:bottom-32{bottom:8rem}.sm\:bottom-36{bottom:9rem}.sm\:bottom-40{bottom:10rem}.sm\:bottom-44{bottom:11rem}.sm\:bottom-48{bottom:12rem}.sm\:bottom-52{bottom:13rem}.sm\:bottom-56{bottom:14rem}.sm\:bottom-60{bottom:15rem}.sm\:bottom-64{bottom:16rem}.sm\:bottom-72{bottom:18rem}.sm\:bottom-80{bottom:20rem}.sm\:bottom-96{bottom:24rem}.sm\:bottom-auto{bottom:auto}.sm\:bottom-px{bottom:1px}.sm\:bottom-0\.5{bottom:.125rem}.sm\:bottom-1\.5{bottom:.375rem}.sm\:bottom-2\.5{bottom:.625rem}.sm\:bottom-3\.5{bottom:.875rem}.sm\:-bottom-0{bottom:0}.sm\:-bottom-1{bottom:-.25rem}.sm\:-bottom-2{bottom:-.5rem}.sm\:-bottom-3{bottom:-.75rem}.sm\:-bottom-4{bottom:-1rem}.sm\:-bottom-5{bottom:-1.25rem}.sm\:-bottom-6{bottom:-1.5rem}.sm\:-bottom-7{bottom:-1.75rem}.sm\:-bottom-8{bottom:-2rem}.sm\:-bottom-9{bottom:-2.25rem}.sm\:-bottom-10{bottom:-2.5rem}.sm\:-bottom-11{bottom:-2.75rem}.sm\:-bottom-12{bottom:-3rem}.sm\:-bottom-14{bottom:-3.5rem}.sm\:-bottom-16{bottom:-4rem}.sm\:-bottom-20{bottom:-5rem}.sm\:-bottom-24{bottom:-6rem}.sm\:-bottom-28{bottom:-7rem}.sm\:-bottom-32{bottom:-8rem}.sm\:-bottom-36{bottom:-9rem}.sm\:-bottom-40{bottom:-10rem}.sm\:-bottom-44{bottom:-11rem}.sm\:-bottom-48{bottom:-12rem}.sm\:-bottom-52{bottom:-13rem}.sm\:-bottom-56{bottom:-14rem}.sm\:-bottom-60{bottom:-15rem}.sm\:-bottom-64{bottom:-16rem}.sm\:-bottom-72{bottom:-18rem}.sm\:-bottom-80{bottom:-20rem}.sm\:-bottom-96{bottom:-24rem}.sm\:-bottom-px{bottom:-1px}.sm\:-bottom-0\.5{bottom:-.125rem}.sm\:-bottom-1\.5{bottom:-.375rem}.sm\:-bottom-2\.5{bottom:-.625rem}.sm\:-bottom-3\.5{bottom:-.875rem}.sm\:bottom-1\/2{bottom:50%}.sm\:bottom-1\/3{bottom:33.333333%}.sm\:bottom-2\/3{bottom:66.666667%}.sm\:bottom-1\/4{bottom:25%}.sm\:bottom-2\/4{bottom:50%}.sm\:bottom-3\/4{bottom:75%}.sm\:bottom-full{bottom:100%}.sm\:-bottom-1\/2{bottom:-50%}.sm\:-bottom-1\/3{bottom:-33.333333%}.sm\:-bottom-2\/3{bottom:-66.666667%}.sm\:-bottom-1\/4{bottom:-25%}.sm\:-bottom-2\/4{bottom:-50%}.sm\:-bottom-3\/4{bottom:-75%}.sm\:-bottom-full{bottom:-100%}.sm\:left-0{left:0}.sm\:left-1{left:.25rem}.sm\:left-2{left:.5rem}.sm\:left-3{left:.75rem}.sm\:left-4{left:1rem}.sm\:left-5{left:1.25rem}.sm\:left-6{left:1.5rem}.sm\:left-7{left:1.75rem}.sm\:left-8{left:2rem}.sm\:left-9{left:2.25rem}.sm\:left-10{left:2.5rem}.sm\:left-11{left:2.75rem}.sm\:left-12{left:3rem}.sm\:left-14{left:3.5rem}.sm\:left-16{left:4rem}.sm\:left-20{left:5rem}.sm\:left-24{left:6rem}.sm\:left-28{left:7rem}.sm\:left-32{left:8rem}.sm\:left-36{left:9rem}.sm\:left-40{left:10rem}.sm\:left-44{left:11rem}.sm\:left-48{left:12rem}.sm\:left-52{left:13rem}.sm\:left-56{left:14rem}.sm\:left-60{left:15rem}.sm\:left-64{left:16rem}.sm\:left-72{left:18rem}.sm\:left-80{left:20rem}.sm\:left-96{left:24rem}.sm\:left-auto{left:auto}.sm\:left-px{left:1px}.sm\:left-0\.5{left:.125rem}.sm\:left-1\.5{left:.375rem}.sm\:left-2\.5{left:.625rem}.sm\:left-3\.5{left:.875rem}.sm\:-left-0{left:0}.sm\:-left-1{left:-.25rem}.sm\:-left-2{left:-.5rem}.sm\:-left-3{left:-.75rem}.sm\:-left-4{left:-1rem}.sm\:-left-5{left:-1.25rem}.sm\:-left-6{left:-1.5rem}.sm\:-left-7{left:-1.75rem}.sm\:-left-8{left:-2rem}.sm\:-left-9{left:-2.25rem}.sm\:-left-10{left:-2.5rem}.sm\:-left-11{left:-2.75rem}.sm\:-left-12{left:-3rem}.sm\:-left-14{left:-3.5rem}.sm\:-left-16{left:-4rem}.sm\:-left-20{left:-5rem}.sm\:-left-24{left:-6rem}.sm\:-left-28{left:-7rem}.sm\:-left-32{left:-8rem}.sm\:-left-36{left:-9rem}.sm\:-left-40{left:-10rem}.sm\:-left-44{left:-11rem}.sm\:-left-48{left:-12rem}.sm\:-left-52{left:-13rem}.sm\:-left-56{left:-14rem}.sm\:-left-60{left:-15rem}.sm\:-left-64{left:-16rem}.sm\:-left-72{left:-18rem}.sm\:-left-80{left:-20rem}.sm\:-left-96{left:-24rem}.sm\:-left-px{left:-1px}.sm\:-left-0\.5{left:-.125rem}.sm\:-left-1\.5{left:-.375rem}.sm\:-left-2\.5{left:-.625rem}.sm\:-left-3\.5{left:-.875rem}.sm\:left-1\/2{left:50%}.sm\:left-1\/3{left:33.333333%}.sm\:left-2\/3{left:66.666667%}.sm\:left-1\/4{left:25%}.sm\:left-2\/4{left:50%}.sm\:left-3\/4{left:75%}.sm\:left-full{left:100%}.sm\:-left-1\/2{left:-50%}.sm\:-left-1\/3{left:-33.333333%}.sm\:-left-2\/3{left:-66.666667%}.sm\:-left-1\/4{left:-25%}.sm\:-left-2\/4{left:-50%}.sm\:-left-3\/4{left:-75%}.sm\:-left-full{left:-100%}.sm\:isolate{isolation:isolate}.sm\:isolation-auto{isolation:auto}.sm\:z-0{z-index:0}.sm\:z-10{z-index:10}.sm\:z-20{z-index:20}.sm\:z-30{z-index:30}.sm\:z-40{z-index:40}.sm\:z-50{z-index:50}.sm\:z-auto{z-index:auto}.sm\:focus-within\:z-0:focus-within{z-index:0}.sm\:focus-within\:z-10:focus-within{z-index:10}.sm\:focus-within\:z-20:focus-within{z-index:20}.sm\:focus-within\:z-30:focus-within{z-index:30}.sm\:focus-within\:z-40:focus-within{z-index:40}.sm\:focus-within\:z-50:focus-within{z-index:50}.sm\:focus-within\:z-auto:focus-within{z-index:auto}.sm\:focus\:z-0:focus{z-index:0}.sm\:focus\:z-10:focus{z-index:10}.sm\:focus\:z-20:focus{z-index:20}.sm\:focus\:z-30:focus{z-index:30}.sm\:focus\:z-40:focus{z-index:40}.sm\:focus\:z-50:focus{z-index:50}.sm\:focus\:z-auto:focus{z-index:auto}.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:order-3{order:3}.sm\:order-4{order:4}.sm\:order-5{order:5}.sm\:order-6{order:6}.sm\:order-7{order:7}.sm\:order-8{order:8}.sm\:order-9{order:9}.sm\:order-10{order:10}.sm\:order-11{order:11}.sm\:order-12{order:12}.sm\:order-first{order:-9999}.sm\:order-last{order:9999}.sm\:order-none{order:0}.sm\:col-auto{grid-column:auto}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:col-start-1{grid-column-start:1}.sm\:col-start-2{grid-column-start:2}.sm\:col-start-3{grid-column-start:3}.sm\:col-start-4{grid-column-start:4}.sm\:col-start-5{grid-column-start:5}.sm\:col-start-6{grid-column-start:6}.sm\:col-start-7{grid-column-start:7}.sm\:col-start-8{grid-column-start:8}.sm\:col-start-9{grid-column-start:9}.sm\:col-start-10{grid-column-start:10}.sm\:col-start-11{grid-column-start:11}.sm\:col-start-12{grid-column-start:12}.sm\:col-start-13{grid-column-start:13}.sm\:col-start-auto{grid-column-start:auto}.sm\:col-end-1{grid-column-end:1}.sm\:col-end-2{grid-column-end:2}.sm\:col-end-3{grid-column-end:3}.sm\:col-end-4{grid-column-end:4}.sm\:col-end-5{grid-column-end:5}.sm\:col-end-6{grid-column-end:6}.sm\:col-end-7{grid-column-end:7}.sm\:col-end-8{grid-column-end:8}.sm\:col-end-9{grid-column-end:9}.sm\:col-end-10{grid-column-end:10}.sm\:col-end-11{grid-column-end:11}.sm\:col-end-12{grid-column-end:12}.sm\:col-end-13{grid-column-end:13}.sm\:col-end-auto{grid-column-end:auto}.sm\:row-auto{grid-row:auto}.sm\:row-span-1{grid-row:span 1/span 1}.sm\:row-span-2{grid-row:span 2/span 2}.sm\:row-span-3{grid-row:span 3/span 3}.sm\:row-span-4{grid-row:span 4/span 4}.sm\:row-span-5{grid-row:span 5/span 5}.sm\:row-span-6{grid-row:span 6/span 6}.sm\:row-span-full{grid-row:1/-1}.sm\:row-start-1{grid-row-start:1}.sm\:row-start-2{grid-row-start:2}.sm\:row-start-3{grid-row-start:3}.sm\:row-start-4{grid-row-start:4}.sm\:row-start-5{grid-row-start:5}.sm\:row-start-6{grid-row-start:6}.sm\:row-start-7{grid-row-start:7}.sm\:row-start-auto{grid-row-start:auto}.sm\:row-end-1{grid-row-end:1}.sm\:row-end-2{grid-row-end:2}.sm\:row-end-3{grid-row-end:3}.sm\:row-end-4{grid-row-end:4}.sm\:row-end-5{grid-row-end:5}.sm\:row-end-6{grid-row-end:6}.sm\:row-end-7{grid-row-end:7}.sm\:row-end-auto{grid-row-end:auto}.sm\:float-right{float:right}.sm\:float-left{float:left}.sm\:float-none{float:none}.sm\:clear-left{clear:left}.sm\:clear-right{clear:right}.sm\:clear-both{clear:both}.sm\:clear-none{clear:none}.sm\:m-0{margin:0}.sm\:m-1{margin:.25rem}.sm\:m-2{margin:.5rem}.sm\:m-3{margin:.75rem}.sm\:m-4{margin:1rem}.sm\:m-5{margin:1.25rem}.sm\:m-6{margin:1.5rem}.sm\:m-7{margin:1.75rem}.sm\:m-8{margin:2rem}.sm\:m-9{margin:2.25rem}.sm\:m-10{margin:2.5rem}.sm\:m-11{margin:2.75rem}.sm\:m-12{margin:3rem}.sm\:m-14{margin:3.5rem}.sm\:m-16{margin:4rem}.sm\:m-20{margin:5rem}.sm\:m-24{margin:6rem}.sm\:m-28{margin:7rem}.sm\:m-32{margin:8rem}.sm\:m-36{margin:9rem}.sm\:m-40{margin:10rem}.sm\:m-44{margin:11rem}.sm\:m-48{margin:12rem}.sm\:m-52{margin:13rem}.sm\:m-56{margin:14rem}.sm\:m-60{margin:15rem}.sm\:m-64{margin:16rem}.sm\:m-72{margin:18rem}.sm\:m-80{margin:20rem}.sm\:m-96{margin:24rem}.sm\:m-auto{margin:auto}.sm\:m-px{margin:1px}.sm\:m-0\.5{margin:.125rem}.sm\:m-1\.5{margin:.375rem}.sm\:m-2\.5{margin:.625rem}.sm\:m-3\.5{margin:.875rem}.sm\:-m-0{margin:0}.sm\:-m-1{margin:-.25rem}.sm\:-m-2{margin:-.5rem}.sm\:-m-3{margin:-.75rem}.sm\:-m-4{margin:-1rem}.sm\:-m-5{margin:-1.25rem}.sm\:-m-6{margin:-1.5rem}.sm\:-m-7{margin:-1.75rem}.sm\:-m-8{margin:-2rem}.sm\:-m-9{margin:-2.25rem}.sm\:-m-10{margin:-2.5rem}.sm\:-m-11{margin:-2.75rem}.sm\:-m-12{margin:-3rem}.sm\:-m-14{margin:-3.5rem}.sm\:-m-16{margin:-4rem}.sm\:-m-20{margin:-5rem}.sm\:-m-24{margin:-6rem}.sm\:-m-28{margin:-7rem}.sm\:-m-32{margin:-8rem}.sm\:-m-36{margin:-9rem}.sm\:-m-40{margin:-10rem}.sm\:-m-44{margin:-11rem}.sm\:-m-48{margin:-12rem}.sm\:-m-52{margin:-13rem}.sm\:-m-56{margin:-14rem}.sm\:-m-60{margin:-15rem}.sm\:-m-64{margin:-16rem}.sm\:-m-72{margin:-18rem}.sm\:-m-80{margin:-20rem}.sm\:-m-96{margin:-24rem}.sm\:-m-px{margin:-1px}.sm\:-m-0\.5{margin:-.125rem}.sm\:-m-1\.5{margin:-.375rem}.sm\:-m-2\.5{margin:-.625rem}.sm\:-m-3\.5{margin:-.875rem}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:mx-1{margin-left:.25rem;margin-right:.25rem}.sm\:mx-2{margin-left:.5rem;margin-right:.5rem}.sm\:mx-3{margin-left:.75rem;margin-right:.75rem}.sm\:mx-4{margin-left:1rem;margin-right:1rem}.sm\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.sm\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.sm\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.sm\:mx-8{margin-left:2rem;margin-right:2rem}.sm\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.sm\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.sm\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.sm\:mx-12{margin-left:3rem;margin-right:3rem}.sm\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.sm\:mx-16{margin-left:4rem;margin-right:4rem}.sm\:mx-20{margin-left:5rem;margin-right:5rem}.sm\:mx-24{margin-left:6rem;margin-right:6rem}.sm\:mx-28{margin-left:7rem;margin-right:7rem}.sm\:mx-32{margin-left:8rem;margin-right:8rem}.sm\:mx-36{margin-left:9rem;margin-right:9rem}.sm\:mx-40{margin-left:10rem;margin-right:10rem}.sm\:mx-44{margin-left:11rem;margin-right:11rem}.sm\:mx-48{margin-left:12rem;margin-right:12rem}.sm\:mx-52{margin-left:13rem;margin-right:13rem}.sm\:mx-56{margin-left:14rem;margin-right:14rem}.sm\:mx-60{margin-left:15rem;margin-right:15rem}.sm\:mx-64{margin-left:16rem;margin-right:16rem}.sm\:mx-72{margin-left:18rem;margin-right:18rem}.sm\:mx-80{margin-left:20rem;margin-right:20rem}.sm\:mx-96{margin-left:24rem;margin-right:24rem}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mx-px{margin-left:1px;margin-right:1px}.sm\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.sm\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.sm\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.sm\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.sm\:-mx-0{margin-left:0;margin-right:0}.sm\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.sm\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.sm\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.sm\:-mx-4{margin-left:-1rem;margin-right:-1rem}.sm\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.sm\:-mx-8{margin-left:-2rem;margin-right:-2rem}.sm\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.sm\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.sm\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.sm\:-mx-12{margin-left:-3rem;margin-right:-3rem}.sm\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.sm\:-mx-16{margin-left:-4rem;margin-right:-4rem}.sm\:-mx-20{margin-left:-5rem;margin-right:-5rem}.sm\:-mx-24{margin-left:-6rem;margin-right:-6rem}.sm\:-mx-28{margin-left:-7rem;margin-right:-7rem}.sm\:-mx-32{margin-left:-8rem;margin-right:-8rem}.sm\:-mx-36{margin-left:-9rem;margin-right:-9rem}.sm\:-mx-40{margin-left:-10rem;margin-right:-10rem}.sm\:-mx-44{margin-left:-11rem;margin-right:-11rem}.sm\:-mx-48{margin-left:-12rem;margin-right:-12rem}.sm\:-mx-52{margin-left:-13rem;margin-right:-13rem}.sm\:-mx-56{margin-left:-14rem;margin-right:-14rem}.sm\:-mx-60{margin-left:-15rem;margin-right:-15rem}.sm\:-mx-64{margin-left:-16rem;margin-right:-16rem}.sm\:-mx-72{margin-left:-18rem;margin-right:-18rem}.sm\:-mx-80{margin-left:-20rem;margin-right:-20rem}.sm\:-mx-96{margin-left:-24rem;margin-right:-24rem}.sm\:-mx-px{margin-left:-1px;margin-right:-1px}.sm\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.sm\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.sm\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.sm\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:my-1{margin-top:.25rem;margin-bottom:.25rem}.sm\:my-2{margin-top:.5rem;margin-bottom:.5rem}.sm\:my-3{margin-top:.75rem;margin-bottom:.75rem}.sm\:my-4{margin-top:1rem;margin-bottom:1rem}.sm\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.sm\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.sm\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.sm\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.sm\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.sm\:my-16{margin-top:4rem;margin-bottom:4rem}.sm\:my-20{margin-top:5rem;margin-bottom:5rem}.sm\:my-24{margin-top:6rem;margin-bottom:6rem}.sm\:my-28{margin-top:7rem;margin-bottom:7rem}.sm\:my-32{margin-top:8rem;margin-bottom:8rem}.sm\:my-36{margin-top:9rem;margin-bottom:9rem}.sm\:my-40{margin-top:10rem;margin-bottom:10rem}.sm\:my-44{margin-top:11rem;margin-bottom:11rem}.sm\:my-48{margin-top:12rem;margin-bottom:12rem}.sm\:my-52{margin-top:13rem;margin-bottom:13rem}.sm\:my-56{margin-top:14rem;margin-bottom:14rem}.sm\:my-60{margin-top:15rem;margin-bottom:15rem}.sm\:my-64{margin-top:16rem;margin-bottom:16rem}.sm\:my-72{margin-top:18rem;margin-bottom:18rem}.sm\:my-80{margin-top:20rem;margin-bottom:20rem}.sm\:my-96{margin-top:24rem;margin-bottom:24rem}.sm\:my-auto{margin-top:auto;margin-bottom:auto}.sm\:my-px{margin-top:1px;margin-bottom:1px}.sm\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.sm\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.sm\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.sm\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.sm\:-my-0{margin-top:0;margin-bottom:0}.sm\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.sm\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.sm\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.sm\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.sm\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.sm\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.sm\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.sm\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.sm\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.sm\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.sm\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.sm\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.sm\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.sm\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.sm\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.sm\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.sm\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.sm\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.sm\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.sm\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.sm\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.sm\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.sm\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.sm\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.sm\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.sm\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.sm\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.sm\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.sm\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.sm\:-my-px{margin-top:-1px;margin-bottom:-1px}.sm\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.sm\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.sm\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.sm\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.sm\:mt-0{margin-top:0}.sm\:mt-1{margin-top:.25rem}.sm\:mt-2{margin-top:.5rem}.sm\:mt-3{margin-top:.75rem}.sm\:mt-4{margin-top:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:mt-6{margin-top:1.5rem}.sm\:mt-7{margin-top:1.75rem}.sm\:mt-8{margin-top:2rem}.sm\:mt-9{margin-top:2.25rem}.sm\:mt-10{margin-top:2.5rem}.sm\:mt-11{margin-top:2.75rem}.sm\:mt-12{margin-top:3rem}.sm\:mt-14{margin-top:3.5rem}.sm\:mt-16{margin-top:4rem}.sm\:mt-20{margin-top:5rem}.sm\:mt-24{margin-top:6rem}.sm\:mt-28{margin-top:7rem}.sm\:mt-32{margin-top:8rem}.sm\:mt-36{margin-top:9rem}.sm\:mt-40{margin-top:10rem}.sm\:mt-44{margin-top:11rem}.sm\:mt-48{margin-top:12rem}.sm\:mt-52{margin-top:13rem}.sm\:mt-56{margin-top:14rem}.sm\:mt-60{margin-top:15rem}.sm\:mt-64{margin-top:16rem}.sm\:mt-72{margin-top:18rem}.sm\:mt-80{margin-top:20rem}.sm\:mt-96{margin-top:24rem}.sm\:mt-auto{margin-top:auto}.sm\:mt-px{margin-top:1px}.sm\:mt-0\.5{margin-top:.125rem}.sm\:mt-1\.5{margin-top:.375rem}.sm\:mt-2\.5{margin-top:.625rem}.sm\:mt-3\.5{margin-top:.875rem}.sm\:-mt-0{margin-top:0}.sm\:-mt-1{margin-top:-.25rem}.sm\:-mt-2{margin-top:-.5rem}.sm\:-mt-3{margin-top:-.75rem}.sm\:-mt-4{margin-top:-1rem}.sm\:-mt-5{margin-top:-1.25rem}.sm\:-mt-6{margin-top:-1.5rem}.sm\:-mt-7{margin-top:-1.75rem}.sm\:-mt-8{margin-top:-2rem}.sm\:-mt-9{margin-top:-2.25rem}.sm\:-mt-10{margin-top:-2.5rem}.sm\:-mt-11{margin-top:-2.75rem}.sm\:-mt-12{margin-top:-3rem}.sm\:-mt-14{margin-top:-3.5rem}.sm\:-mt-16{margin-top:-4rem}.sm\:-mt-20{margin-top:-5rem}.sm\:-mt-24{margin-top:-6rem}.sm\:-mt-28{margin-top:-7rem}.sm\:-mt-32{margin-top:-8rem}.sm\:-mt-36{margin-top:-9rem}.sm\:-mt-40{margin-top:-10rem}.sm\:-mt-44{margin-top:-11rem}.sm\:-mt-48{margin-top:-12rem}.sm\:-mt-52{margin-top:-13rem}.sm\:-mt-56{margin-top:-14rem}.sm\:-mt-60{margin-top:-15rem}.sm\:-mt-64{margin-top:-16rem}.sm\:-mt-72{margin-top:-18rem}.sm\:-mt-80{margin-top:-20rem}.sm\:-mt-96{margin-top:-24rem}.sm\:-mt-px{margin-top:-1px}.sm\:-mt-0\.5{margin-top:-.125rem}.sm\:-mt-1\.5{margin-top:-.375rem}.sm\:-mt-2\.5{margin-top:-.625rem}.sm\:-mt-3\.5{margin-top:-.875rem}.sm\:mr-0{margin-right:0}.sm\:mr-1{margin-right:.25rem}.sm\:mr-2{margin-right:.5rem}.sm\:mr-3{margin-right:.75rem}.sm\:mr-4{margin-right:1rem}.sm\:mr-5{margin-right:1.25rem}.sm\:mr-6{margin-right:1.5rem}.sm\:mr-7{margin-right:1.75rem}.sm\:mr-8{margin-right:2rem}.sm\:mr-9{margin-right:2.25rem}.sm\:mr-10{margin-right:2.5rem}.sm\:mr-11{margin-right:2.75rem}.sm\:mr-12{margin-right:3rem}.sm\:mr-14{margin-right:3.5rem}.sm\:mr-16{margin-right:4rem}.sm\:mr-20{margin-right:5rem}.sm\:mr-24{margin-right:6rem}.sm\:mr-28{margin-right:7rem}.sm\:mr-32{margin-right:8rem}.sm\:mr-36{margin-right:9rem}.sm\:mr-40{margin-right:10rem}.sm\:mr-44{margin-right:11rem}.sm\:mr-48{margin-right:12rem}.sm\:mr-52{margin-right:13rem}.sm\:mr-56{margin-right:14rem}.sm\:mr-60{margin-right:15rem}.sm\:mr-64{margin-right:16rem}.sm\:mr-72{margin-right:18rem}.sm\:mr-80{margin-right:20rem}.sm\:mr-96{margin-right:24rem}.sm\:mr-auto{margin-right:auto}.sm\:mr-px{margin-right:1px}.sm\:mr-0\.5{margin-right:.125rem}.sm\:mr-1\.5{margin-right:.375rem}.sm\:mr-2\.5{margin-right:.625rem}.sm\:mr-3\.5{margin-right:.875rem}.sm\:-mr-0{margin-right:0}.sm\:-mr-1{margin-right:-.25rem}.sm\:-mr-2{margin-right:-.5rem}.sm\:-mr-3{margin-right:-.75rem}.sm\:-mr-4{margin-right:-1rem}.sm\:-mr-5{margin-right:-1.25rem}.sm\:-mr-6{margin-right:-1.5rem}.sm\:-mr-7{margin-right:-1.75rem}.sm\:-mr-8{margin-right:-2rem}.sm\:-mr-9{margin-right:-2.25rem}.sm\:-mr-10{margin-right:-2.5rem}.sm\:-mr-11{margin-right:-2.75rem}.sm\:-mr-12{margin-right:-3rem}.sm\:-mr-14{margin-right:-3.5rem}.sm\:-mr-16{margin-right:-4rem}.sm\:-mr-20{margin-right:-5rem}.sm\:-mr-24{margin-right:-6rem}.sm\:-mr-28{margin-right:-7rem}.sm\:-mr-32{margin-right:-8rem}.sm\:-mr-36{margin-right:-9rem}.sm\:-mr-40{margin-right:-10rem}.sm\:-mr-44{margin-right:-11rem}.sm\:-mr-48{margin-right:-12rem}.sm\:-mr-52{margin-right:-13rem}.sm\:-mr-56{margin-right:-14rem}.sm\:-mr-60{margin-right:-15rem}.sm\:-mr-64{margin-right:-16rem}.sm\:-mr-72{margin-right:-18rem}.sm\:-mr-80{margin-right:-20rem}.sm\:-mr-96{margin-right:-24rem}.sm\:-mr-px{margin-right:-1px}.sm\:-mr-0\.5{margin-right:-.125rem}.sm\:-mr-1\.5{margin-right:-.375rem}.sm\:-mr-2\.5{margin-right:-.625rem}.sm\:-mr-3\.5{margin-right:-.875rem}.sm\:mb-0{margin-bottom:0}.sm\:mb-1{margin-bottom:.25rem}.sm\:mb-2{margin-bottom:.5rem}.sm\:mb-3{margin-bottom:.75rem}.sm\:mb-4{margin-bottom:1rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:mb-7{margin-bottom:1.75rem}.sm\:mb-8{margin-bottom:2rem}.sm\:mb-9{margin-bottom:2.25rem}.sm\:mb-10{margin-bottom:2.5rem}.sm\:mb-11{margin-bottom:2.75rem}.sm\:mb-12{margin-bottom:3rem}.sm\:mb-14{margin-bottom:3.5rem}.sm\:mb-16{margin-bottom:4rem}.sm\:mb-20{margin-bottom:5rem}.sm\:mb-24{margin-bottom:6rem}.sm\:mb-28{margin-bottom:7rem}.sm\:mb-32{margin-bottom:8rem}.sm\:mb-36{margin-bottom:9rem}.sm\:mb-40{margin-bottom:10rem}.sm\:mb-44{margin-bottom:11rem}.sm\:mb-48{margin-bottom:12rem}.sm\:mb-52{margin-bottom:13rem}.sm\:mb-56{margin-bottom:14rem}.sm\:mb-60{margin-bottom:15rem}.sm\:mb-64{margin-bottom:16rem}.sm\:mb-72{margin-bottom:18rem}.sm\:mb-80{margin-bottom:20rem}.sm\:mb-96{margin-bottom:24rem}.sm\:mb-auto{margin-bottom:auto}.sm\:mb-px{margin-bottom:1px}.sm\:mb-0\.5{margin-bottom:.125rem}.sm\:mb-1\.5{margin-bottom:.375rem}.sm\:mb-2\.5{margin-bottom:.625rem}.sm\:mb-3\.5{margin-bottom:.875rem}.sm\:-mb-0{margin-bottom:0}.sm\:-mb-1{margin-bottom:-.25rem}.sm\:-mb-2{margin-bottom:-.5rem}.sm\:-mb-3{margin-bottom:-.75rem}.sm\:-mb-4{margin-bottom:-1rem}.sm\:-mb-5{margin-bottom:-1.25rem}.sm\:-mb-6{margin-bottom:-1.5rem}.sm\:-mb-7{margin-bottom:-1.75rem}.sm\:-mb-8{margin-bottom:-2rem}.sm\:-mb-9{margin-bottom:-2.25rem}.sm\:-mb-10{margin-bottom:-2.5rem}.sm\:-mb-11{margin-bottom:-2.75rem}.sm\:-mb-12{margin-bottom:-3rem}.sm\:-mb-14{margin-bottom:-3.5rem}.sm\:-mb-16{margin-bottom:-4rem}.sm\:-mb-20{margin-bottom:-5rem}.sm\:-mb-24{margin-bottom:-6rem}.sm\:-mb-28{margin-bottom:-7rem}.sm\:-mb-32{margin-bottom:-8rem}.sm\:-mb-36{margin-bottom:-9rem}.sm\:-mb-40{margin-bottom:-10rem}.sm\:-mb-44{margin-bottom:-11rem}.sm\:-mb-48{margin-bottom:-12rem}.sm\:-mb-52{margin-bottom:-13rem}.sm\:-mb-56{margin-bottom:-14rem}.sm\:-mb-60{margin-bottom:-15rem}.sm\:-mb-64{margin-bottom:-16rem}.sm\:-mb-72{margin-bottom:-18rem}.sm\:-mb-80{margin-bottom:-20rem}.sm\:-mb-96{margin-bottom:-24rem}.sm\:-mb-px{margin-bottom:-1px}.sm\:-mb-0\.5{margin-bottom:-.125rem}.sm\:-mb-1\.5{margin-bottom:-.375rem}.sm\:-mb-2\.5{margin-bottom:-.625rem}.sm\:-mb-3\.5{margin-bottom:-.875rem}.sm\:ml-0{margin-left:0}.sm\:ml-1{margin-left:.25rem}.sm\:ml-2{margin-left:.5rem}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:ml-5{margin-left:1.25rem}.sm\:ml-6{margin-left:1.5rem}.sm\:ml-7{margin-left:1.75rem}.sm\:ml-8{margin-left:2rem}.sm\:ml-9{margin-left:2.25rem}.sm\:ml-10{margin-left:2.5rem}.sm\:ml-11{margin-left:2.75rem}.sm\:ml-12{margin-left:3rem}.sm\:ml-14{margin-left:3.5rem}.sm\:ml-16{margin-left:4rem}.sm\:ml-20{margin-left:5rem}.sm\:ml-24{margin-left:6rem}.sm\:ml-28{margin-left:7rem}.sm\:ml-32{margin-left:8rem}.sm\:ml-36{margin-left:9rem}.sm\:ml-40{margin-left:10rem}.sm\:ml-44{margin-left:11rem}.sm\:ml-48{margin-left:12rem}.sm\:ml-52{margin-left:13rem}.sm\:ml-56{margin-left:14rem}.sm\:ml-60{margin-left:15rem}.sm\:ml-64{margin-left:16rem}.sm\:ml-72{margin-left:18rem}.sm\:ml-80{margin-left:20rem}.sm\:ml-96{margin-left:24rem}.sm\:ml-auto{margin-left:auto}.sm\:ml-px{margin-left:1px}.sm\:ml-0\.5{margin-left:.125rem}.sm\:ml-1\.5{margin-left:.375rem}.sm\:ml-2\.5{margin-left:.625rem}.sm\:ml-3\.5{margin-left:.875rem}.sm\:-ml-0{margin-left:0}.sm\:-ml-1{margin-left:-.25rem}.sm\:-ml-2{margin-left:-.5rem}.sm\:-ml-3{margin-left:-.75rem}.sm\:-ml-4{margin-left:-1rem}.sm\:-ml-5{margin-left:-1.25rem}.sm\:-ml-6{margin-left:-1.5rem}.sm\:-ml-7{margin-left:-1.75rem}.sm\:-ml-8{margin-left:-2rem}.sm\:-ml-9{margin-left:-2.25rem}.sm\:-ml-10{margin-left:-2.5rem}.sm\:-ml-11{margin-left:-2.75rem}.sm\:-ml-12{margin-left:-3rem}.sm\:-ml-14{margin-left:-3.5rem}.sm\:-ml-16{margin-left:-4rem}.sm\:-ml-20{margin-left:-5rem}.sm\:-ml-24{margin-left:-6rem}.sm\:-ml-28{margin-left:-7rem}.sm\:-ml-32{margin-left:-8rem}.sm\:-ml-36{margin-left:-9rem}.sm\:-ml-40{margin-left:-10rem}.sm\:-ml-44{margin-left:-11rem}.sm\:-ml-48{margin-left:-12rem}.sm\:-ml-52{margin-left:-13rem}.sm\:-ml-56{margin-left:-14rem}.sm\:-ml-60{margin-left:-15rem}.sm\:-ml-64{margin-left:-16rem}.sm\:-ml-72{margin-left:-18rem}.sm\:-ml-80{margin-left:-20rem}.sm\:-ml-96{margin-left:-24rem}.sm\:-ml-px{margin-left:-1px}.sm\:-ml-0\.5{margin-left:-.125rem}.sm\:-ml-1\.5{margin-left:-.375rem}.sm\:-ml-2\.5{margin-left:-.625rem}.sm\:-ml-3\.5{margin-left:-.875rem}.sm\:box-border{box-sizing:border-box}.sm\:box-content{box-sizing:initial}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:table{display:table}.sm\:inline-table{display:inline-table}.sm\:table-caption{display:table-caption}.sm\:table-cell{display:table-cell}.sm\:table-column{display:table-column}.sm\:table-column-group{display:table-column-group}.sm\:table-footer-group{display:table-footer-group}.sm\:table-header-group{display:table-header-group}.sm\:table-row-group{display:table-row-group}.sm\:table-row{display:table-row}.sm\:flow-root{display:flow-root}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:contents{display:contents}.sm\:list-item{display:list-item}.sm\:hidden{display:none}.sm\:h-0{height:0}.sm\:h-1{height:.25rem}.sm\:h-2{height:.5rem}.sm\:h-3{height:.75rem}.sm\:h-4{height:1rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-7{height:1.75rem}.sm\:h-8{height:2rem}.sm\:h-9{height:2.25rem}.sm\:h-10{height:2.5rem}.sm\:h-11{height:2.75rem}.sm\:h-12{height:3rem}.sm\:h-14{height:3.5rem}.sm\:h-16{height:4rem}.sm\:h-20{height:5rem}.sm\:h-24{height:6rem}.sm\:h-28{height:7rem}.sm\:h-32{height:8rem}.sm\:h-36{height:9rem}.sm\:h-40{height:10rem}.sm\:h-44{height:11rem}.sm\:h-48{height:12rem}.sm\:h-52{height:13rem}.sm\:h-56{height:14rem}.sm\:h-60{height:15rem}.sm\:h-64{height:16rem}.sm\:h-72{height:18rem}.sm\:h-80{height:20rem}.sm\:h-96{height:24rem}.sm\:h-auto{height:auto}.sm\:h-px{height:1px}.sm\:h-0\.5{height:.125rem}.sm\:h-1\.5{height:.375rem}.sm\:h-2\.5{height:.625rem}.sm\:h-3\.5{height:.875rem}.sm\:h-1\/2{height:50%}.sm\:h-1\/3{height:33.333333%}.sm\:h-2\/3{height:66.666667%}.sm\:h-1\/4{height:25%}.sm\:h-2\/4{height:50%}.sm\:h-3\/4{height:75%}.sm\:h-1\/5{height:20%}.sm\:h-2\/5{height:40%}.sm\:h-3\/5{height:60%}.sm\:h-4\/5{height:80%}.sm\:h-1\/6{height:16.666667%}.sm\:h-2\/6{height:33.333333%}.sm\:h-3\/6{height:50%}.sm\:h-4\/6{height:66.666667%}.sm\:h-5\/6{height:83.333333%}.sm\:h-full{height:100%}.sm\:h-screen{height:100vh}.sm\:max-h-0{max-height:0}.sm\:max-h-1{max-height:.25rem}.sm\:max-h-2{max-height:.5rem}.sm\:max-h-3{max-height:.75rem}.sm\:max-h-4{max-height:1rem}.sm\:max-h-5{max-height:1.25rem}.sm\:max-h-6{max-height:1.5rem}.sm\:max-h-7{max-height:1.75rem}.sm\:max-h-8{max-height:2rem}.sm\:max-h-9{max-height:2.25rem}.sm\:max-h-10{max-height:2.5rem}.sm\:max-h-11{max-height:2.75rem}.sm\:max-h-12{max-height:3rem}.sm\:max-h-14{max-height:3.5rem}.sm\:max-h-16{max-height:4rem}.sm\:max-h-20{max-height:5rem}.sm\:max-h-24{max-height:6rem}.sm\:max-h-28{max-height:7rem}.sm\:max-h-32{max-height:8rem}.sm\:max-h-36{max-height:9rem}.sm\:max-h-40{max-height:10rem}.sm\:max-h-44{max-height:11rem}.sm\:max-h-48{max-height:12rem}.sm\:max-h-52{max-height:13rem}.sm\:max-h-56{max-height:14rem}.sm\:max-h-60{max-height:15rem}.sm\:max-h-64{max-height:16rem}.sm\:max-h-72{max-height:18rem}.sm\:max-h-80{max-height:20rem}.sm\:max-h-96{max-height:24rem}.sm\:max-h-px{max-height:1px}.sm\:max-h-0\.5{max-height:.125rem}.sm\:max-h-1\.5{max-height:.375rem}.sm\:max-h-2\.5{max-height:.625rem}.sm\:max-h-3\.5{max-height:.875rem}.sm\:max-h-full{max-height:100%}.sm\:max-h-screen{max-height:100vh}.sm\:min-h-0{min-height:0}.sm\:min-h-full{min-height:100%}.sm\:min-h-screen{min-height:100vh}.sm\:w-0{width:0}.sm\:w-1{width:.25rem}.sm\:w-2{width:.5rem}.sm\:w-3{width:.75rem}.sm\:w-4{width:1rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-7{width:1.75rem}.sm\:w-8{width:2rem}.sm\:w-9{width:2.25rem}.sm\:w-10{width:2.5rem}.sm\:w-11{width:2.75rem}.sm\:w-12{width:3rem}.sm\:w-14{width:3.5rem}.sm\:w-16{width:4rem}.sm\:w-20{width:5rem}.sm\:w-24{width:6rem}.sm\:w-28{width:7rem}.sm\:w-32{width:8rem}.sm\:w-36{width:9rem}.sm\:w-40{width:10rem}.sm\:w-44{width:11rem}.sm\:w-48{width:12rem}.sm\:w-52{width:13rem}.sm\:w-56{width:14rem}.sm\:w-60{width:15rem}.sm\:w-64{width:16rem}.sm\:w-72{width:18rem}.sm\:w-80{width:20rem}.sm\:w-96{width:24rem}.sm\:w-auto{width:auto}.sm\:w-px{width:1px}.sm\:w-0\.5{width:.125rem}.sm\:w-1\.5{width:.375rem}.sm\:w-2\.5{width:.625rem}.sm\:w-3\.5{width:.875rem}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-1\/4{width:25%}.sm\:w-2\/4{width:50%}.sm\:w-3\/4{width:75%}.sm\:w-1\/5{width:20%}.sm\:w-2\/5{width:40%}.sm\:w-3\/5{width:60%}.sm\:w-4\/5{width:80%}.sm\:w-1\/6{width:16.666667%}.sm\:w-2\/6{width:33.333333%}.sm\:w-3\/6{width:50%}.sm\:w-4\/6{width:66.666667%}.sm\:w-5\/6{width:83.333333%}.sm\:w-1\/12{width:8.333333%}.sm\:w-2\/12{width:16.666667%}.sm\:w-3\/12{width:25%}.sm\:w-4\/12{width:33.333333%}.sm\:w-5\/12{width:41.666667%}.sm\:w-6\/12{width:50%}.sm\:w-7\/12{width:58.333333%}.sm\:w-8\/12{width:66.666667%}.sm\:w-9\/12{width:75%}.sm\:w-10\/12{width:83.333333%}.sm\:w-11\/12{width:91.666667%}.sm\:w-full{width:100%}.sm\:w-screen{width:100vw}.sm\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.sm\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.sm\:min-w-0{min-width:0}.sm\:min-w-full{min-width:100%}.sm\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.sm\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.sm\:max-w-0{max-width:0}.sm\:max-w-none{max-width:none}.sm\:max-w-xs{max-width:20rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-7xl{max-width:80rem}.sm\:max-w-full{max-width:100%}.sm\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.sm\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.sm\:max-w-prose{max-width:65ch}.sm\:max-w-screen-sm{max-width:640px}.sm\:max-w-screen-md{max-width:768px}.sm\:max-w-screen-lg{max-width:1024px}.sm\:max-w-screen-xl{max-width:1280px}.sm\:max-w-screen-2xl{max-width:1536px}.sm\:flex-1{flex:1 1 0%}.sm\:flex-auto{flex:1 1 auto}.sm\:flex-initial{flex:0 1 auto}.sm\:flex-none{flex:none}.sm\:flex-shrink-0{flex-shrink:0}.sm\:flex-shrink{flex-shrink:1}.sm\:flex-grow-0{flex-grow:0}.sm\:flex-grow{flex-grow:1}.sm\:table-auto{table-layout:auto}.sm\:table-fixed{table-layout:fixed}.sm\:border-collapse{border-collapse:collapse}.sm\:border-separate{border-collapse:initial}.sm\:origin-center{transform-origin:center}.sm\:origin-top{transform-origin:top}.sm\:origin-top-right{transform-origin:top right}.sm\:origin-right{transform-origin:right}.sm\:origin-bottom-right{transform-origin:bottom right}.sm\:origin-bottom{transform-origin:bottom}.sm\:origin-bottom-left{transform-origin:bottom left}.sm\:origin-left{transform-origin:left}.sm\:origin-top-left{transform-origin:top left}.sm\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:transform,.sm\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.sm\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:transform-none{transform:none}.sm\:translate-x-0{--tw-translate-x:0px}.sm\:translate-x-1{--tw-translate-x:0.25rem}.sm\:translate-x-2{--tw-translate-x:0.5rem}.sm\:translate-x-3{--tw-translate-x:0.75rem}.sm\:translate-x-4{--tw-translate-x:1rem}.sm\:translate-x-5{--tw-translate-x:1.25rem}.sm\:translate-x-6{--tw-translate-x:1.5rem}.sm\:translate-x-7{--tw-translate-x:1.75rem}.sm\:translate-x-8{--tw-translate-x:2rem}.sm\:translate-x-9{--tw-translate-x:2.25rem}.sm\:translate-x-10{--tw-translate-x:2.5rem}.sm\:translate-x-11{--tw-translate-x:2.75rem}.sm\:translate-x-12{--tw-translate-x:3rem}.sm\:translate-x-14{--tw-translate-x:3.5rem}.sm\:translate-x-16{--tw-translate-x:4rem}.sm\:translate-x-20{--tw-translate-x:5rem}.sm\:translate-x-24{--tw-translate-x:6rem}.sm\:translate-x-28{--tw-translate-x:7rem}.sm\:translate-x-32{--tw-translate-x:8rem}.sm\:translate-x-36{--tw-translate-x:9rem}.sm\:translate-x-40{--tw-translate-x:10rem}.sm\:translate-x-44{--tw-translate-x:11rem}.sm\:translate-x-48{--tw-translate-x:12rem}.sm\:translate-x-52{--tw-translate-x:13rem}.sm\:translate-x-56{--tw-translate-x:14rem}.sm\:translate-x-60{--tw-translate-x:15rem}.sm\:translate-x-64{--tw-translate-x:16rem}.sm\:translate-x-72{--tw-translate-x:18rem}.sm\:translate-x-80{--tw-translate-x:20rem}.sm\:translate-x-96{--tw-translate-x:24rem}.sm\:translate-x-px{--tw-translate-x:1px}.sm\:translate-x-0\.5{--tw-translate-x:0.125rem}.sm\:translate-x-1\.5{--tw-translate-x:0.375rem}.sm\:translate-x-2\.5{--tw-translate-x:0.625rem}.sm\:translate-x-3\.5{--tw-translate-x:0.875rem}.sm\:-translate-x-0{--tw-translate-x:0px}.sm\:-translate-x-1{--tw-translate-x:-0.25rem}.sm\:-translate-x-2{--tw-translate-x:-0.5rem}.sm\:-translate-x-3{--tw-translate-x:-0.75rem}.sm\:-translate-x-4{--tw-translate-x:-1rem}.sm\:-translate-x-5{--tw-translate-x:-1.25rem}.sm\:-translate-x-6{--tw-translate-x:-1.5rem}.sm\:-translate-x-7{--tw-translate-x:-1.75rem}.sm\:-translate-x-8{--tw-translate-x:-2rem}.sm\:-translate-x-9{--tw-translate-x:-2.25rem}.sm\:-translate-x-10{--tw-translate-x:-2.5rem}.sm\:-translate-x-11{--tw-translate-x:-2.75rem}.sm\:-translate-x-12{--tw-translate-x:-3rem}.sm\:-translate-x-14{--tw-translate-x:-3.5rem}.sm\:-translate-x-16{--tw-translate-x:-4rem}.sm\:-translate-x-20{--tw-translate-x:-5rem}.sm\:-translate-x-24{--tw-translate-x:-6rem}.sm\:-translate-x-28{--tw-translate-x:-7rem}.sm\:-translate-x-32{--tw-translate-x:-8rem}.sm\:-translate-x-36{--tw-translate-x:-9rem}.sm\:-translate-x-40{--tw-translate-x:-10rem}.sm\:-translate-x-44{--tw-translate-x:-11rem}.sm\:-translate-x-48{--tw-translate-x:-12rem}.sm\:-translate-x-52{--tw-translate-x:-13rem}.sm\:-translate-x-56{--tw-translate-x:-14rem}.sm\:-translate-x-60{--tw-translate-x:-15rem}.sm\:-translate-x-64{--tw-translate-x:-16rem}.sm\:-translate-x-72{--tw-translate-x:-18rem}.sm\:-translate-x-80{--tw-translate-x:-20rem}.sm\:-translate-x-96{--tw-translate-x:-24rem}.sm\:-translate-x-px{--tw-translate-x:-1px}.sm\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.sm\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.sm\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.sm\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.sm\:translate-x-1\/2{--tw-translate-x:50%}.sm\:translate-x-1\/3{--tw-translate-x:33.333333%}.sm\:translate-x-2\/3{--tw-translate-x:66.666667%}.sm\:translate-x-1\/4{--tw-translate-x:25%}.sm\:translate-x-2\/4{--tw-translate-x:50%}.sm\:translate-x-3\/4{--tw-translate-x:75%}.sm\:translate-x-full{--tw-translate-x:100%}.sm\:-translate-x-1\/2{--tw-translate-x:-50%}.sm\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.sm\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.sm\:-translate-x-1\/4{--tw-translate-x:-25%}.sm\:-translate-x-2\/4{--tw-translate-x:-50%}.sm\:-translate-x-3\/4{--tw-translate-x:-75%}.sm\:-translate-x-full{--tw-translate-x:-100%}.sm\:translate-y-0{--tw-translate-y:0px}.sm\:translate-y-1{--tw-translate-y:0.25rem}.sm\:translate-y-2{--tw-translate-y:0.5rem}.sm\:translate-y-3{--tw-translate-y:0.75rem}.sm\:translate-y-4{--tw-translate-y:1rem}.sm\:translate-y-5{--tw-translate-y:1.25rem}.sm\:translate-y-6{--tw-translate-y:1.5rem}.sm\:translate-y-7{--tw-translate-y:1.75rem}.sm\:translate-y-8{--tw-translate-y:2rem}.sm\:translate-y-9{--tw-translate-y:2.25rem}.sm\:translate-y-10{--tw-translate-y:2.5rem}.sm\:translate-y-11{--tw-translate-y:2.75rem}.sm\:translate-y-12{--tw-translate-y:3rem}.sm\:translate-y-14{--tw-translate-y:3.5rem}.sm\:translate-y-16{--tw-translate-y:4rem}.sm\:translate-y-20{--tw-translate-y:5rem}.sm\:translate-y-24{--tw-translate-y:6rem}.sm\:translate-y-28{--tw-translate-y:7rem}.sm\:translate-y-32{--tw-translate-y:8rem}.sm\:translate-y-36{--tw-translate-y:9rem}.sm\:translate-y-40{--tw-translate-y:10rem}.sm\:translate-y-44{--tw-translate-y:11rem}.sm\:translate-y-48{--tw-translate-y:12rem}.sm\:translate-y-52{--tw-translate-y:13rem}.sm\:translate-y-56{--tw-translate-y:14rem}.sm\:translate-y-60{--tw-translate-y:15rem}.sm\:translate-y-64{--tw-translate-y:16rem}.sm\:translate-y-72{--tw-translate-y:18rem}.sm\:translate-y-80{--tw-translate-y:20rem}.sm\:translate-y-96{--tw-translate-y:24rem}.sm\:translate-y-px{--tw-translate-y:1px}.sm\:translate-y-0\.5{--tw-translate-y:0.125rem}.sm\:translate-y-1\.5{--tw-translate-y:0.375rem}.sm\:translate-y-2\.5{--tw-translate-y:0.625rem}.sm\:translate-y-3\.5{--tw-translate-y:0.875rem}.sm\:-translate-y-0{--tw-translate-y:0px}.sm\:-translate-y-1{--tw-translate-y:-0.25rem}.sm\:-translate-y-2{--tw-translate-y:-0.5rem}.sm\:-translate-y-3{--tw-translate-y:-0.75rem}.sm\:-translate-y-4{--tw-translate-y:-1rem}.sm\:-translate-y-5{--tw-translate-y:-1.25rem}.sm\:-translate-y-6{--tw-translate-y:-1.5rem}.sm\:-translate-y-7{--tw-translate-y:-1.75rem}.sm\:-translate-y-8{--tw-translate-y:-2rem}.sm\:-translate-y-9{--tw-translate-y:-2.25rem}.sm\:-translate-y-10{--tw-translate-y:-2.5rem}.sm\:-translate-y-11{--tw-translate-y:-2.75rem}.sm\:-translate-y-12{--tw-translate-y:-3rem}.sm\:-translate-y-14{--tw-translate-y:-3.5rem}.sm\:-translate-y-16{--tw-translate-y:-4rem}.sm\:-translate-y-20{--tw-translate-y:-5rem}.sm\:-translate-y-24{--tw-translate-y:-6rem}.sm\:-translate-y-28{--tw-translate-y:-7rem}.sm\:-translate-y-32{--tw-translate-y:-8rem}.sm\:-translate-y-36{--tw-translate-y:-9rem}.sm\:-translate-y-40{--tw-translate-y:-10rem}.sm\:-translate-y-44{--tw-translate-y:-11rem}.sm\:-translate-y-48{--tw-translate-y:-12rem}.sm\:-translate-y-52{--tw-translate-y:-13rem}.sm\:-translate-y-56{--tw-translate-y:-14rem}.sm\:-translate-y-60{--tw-translate-y:-15rem}.sm\:-translate-y-64{--tw-translate-y:-16rem}.sm\:-translate-y-72{--tw-translate-y:-18rem}.sm\:-translate-y-80{--tw-translate-y:-20rem}.sm\:-translate-y-96{--tw-translate-y:-24rem}.sm\:-translate-y-px{--tw-translate-y:-1px}.sm\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.sm\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.sm\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.sm\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.sm\:translate-y-1\/2{--tw-translate-y:50%}.sm\:translate-y-1\/3{--tw-translate-y:33.333333%}.sm\:translate-y-2\/3{--tw-translate-y:66.666667%}.sm\:translate-y-1\/4{--tw-translate-y:25%}.sm\:translate-y-2\/4{--tw-translate-y:50%}.sm\:translate-y-3\/4{--tw-translate-y:75%}.sm\:translate-y-full{--tw-translate-y:100%}.sm\:-translate-y-1\/2{--tw-translate-y:-50%}.sm\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.sm\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.sm\:-translate-y-1\/4{--tw-translate-y:-25%}.sm\:-translate-y-2\/4{--tw-translate-y:-50%}.sm\:-translate-y-3\/4{--tw-translate-y:-75%}.sm\:-translate-y-full{--tw-translate-y:-100%}.sm\:hover\:translate-x-0:hover{--tw-translate-x:0px}.sm\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.sm\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.sm\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.sm\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.sm\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.sm\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.sm\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.sm\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.sm\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.sm\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.sm\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.sm\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.sm\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.sm\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.sm\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.sm\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.sm\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.sm\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.sm\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.sm\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.sm\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.sm\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.sm\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.sm\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.sm\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.sm\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.sm\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.sm\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.sm\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.sm\:hover\:translate-x-px:hover{--tw-translate-x:1px}.sm\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.sm\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.sm\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.sm\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.sm\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.sm\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.sm\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.sm\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.sm\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.sm\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.sm\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.sm\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.sm\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.sm\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.sm\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.sm\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.sm\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.sm\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.sm\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.sm\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.sm\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.sm\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.sm\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.sm\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.sm\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.sm\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.sm\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.sm\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.sm\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.sm\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.sm\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.sm\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.sm\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.sm\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.sm\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.sm\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.sm\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.sm\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.sm\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.sm\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.sm\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.sm\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.sm\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.sm\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.sm\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.sm\:hover\:translate-x-full:hover{--tw-translate-x:100%}.sm\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.sm\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.sm\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.sm\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.sm\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.sm\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.sm\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.sm\:hover\:translate-y-0:hover{--tw-translate-y:0px}.sm\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.sm\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.sm\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.sm\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.sm\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.sm\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.sm\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.sm\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.sm\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.sm\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.sm\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.sm\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.sm\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.sm\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.sm\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.sm\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.sm\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.sm\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.sm\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.sm\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.sm\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.sm\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.sm\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.sm\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.sm\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.sm\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.sm\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.sm\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.sm\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.sm\:hover\:translate-y-px:hover{--tw-translate-y:1px}.sm\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.sm\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.sm\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.sm\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.sm\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.sm\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.sm\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.sm\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.sm\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.sm\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.sm\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.sm\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.sm\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.sm\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.sm\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.sm\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.sm\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.sm\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.sm\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.sm\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.sm\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.sm\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.sm\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.sm\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.sm\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.sm\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.sm\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.sm\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.sm\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.sm\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.sm\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.sm\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.sm\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.sm\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.sm\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.sm\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.sm\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.sm\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.sm\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.sm\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.sm\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.sm\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.sm\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.sm\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.sm\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.sm\:hover\:translate-y-full:hover{--tw-translate-y:100%}.sm\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.sm\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.sm\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.sm\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.sm\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.sm\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.sm\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.sm\:focus\:translate-x-0:focus{--tw-translate-x:0px}.sm\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.sm\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.sm\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.sm\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.sm\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.sm\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.sm\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.sm\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.sm\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.sm\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.sm\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.sm\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.sm\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.sm\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.sm\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.sm\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.sm\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.sm\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.sm\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.sm\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.sm\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.sm\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.sm\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.sm\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.sm\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.sm\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.sm\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.sm\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.sm\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.sm\:focus\:translate-x-px:focus{--tw-translate-x:1px}.sm\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.sm\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.sm\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.sm\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.sm\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.sm\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.sm\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.sm\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.sm\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.sm\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.sm\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.sm\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.sm\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.sm\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.sm\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.sm\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.sm\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.sm\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.sm\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.sm\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.sm\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.sm\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.sm\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.sm\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.sm\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.sm\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.sm\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.sm\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.sm\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.sm\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.sm\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.sm\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.sm\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.sm\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.sm\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.sm\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.sm\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.sm\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.sm\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.sm\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.sm\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.sm\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.sm\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.sm\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.sm\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.sm\:focus\:translate-x-full:focus{--tw-translate-x:100%}.sm\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.sm\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.sm\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.sm\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.sm\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.sm\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.sm\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.sm\:focus\:translate-y-0:focus{--tw-translate-y:0px}.sm\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.sm\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.sm\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.sm\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.sm\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.sm\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.sm\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.sm\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.sm\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.sm\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.sm\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.sm\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.sm\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.sm\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.sm\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.sm\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.sm\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.sm\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.sm\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.sm\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.sm\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.sm\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.sm\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.sm\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.sm\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.sm\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.sm\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.sm\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.sm\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.sm\:focus\:translate-y-px:focus{--tw-translate-y:1px}.sm\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.sm\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.sm\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.sm\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.sm\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.sm\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.sm\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.sm\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.sm\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.sm\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.sm\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.sm\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.sm\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.sm\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.sm\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.sm\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.sm\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.sm\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.sm\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.sm\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.sm\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.sm\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.sm\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.sm\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.sm\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.sm\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.sm\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.sm\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.sm\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.sm\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.sm\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.sm\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.sm\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.sm\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.sm\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.sm\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.sm\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.sm\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.sm\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.sm\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.sm\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.sm\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.sm\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.sm\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.sm\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.sm\:focus\:translate-y-full:focus{--tw-translate-y:100%}.sm\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.sm\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.sm\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.sm\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.sm\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.sm\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.sm\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.sm\:rotate-0{--tw-rotate:0deg}.sm\:rotate-1{--tw-rotate:1deg}.sm\:rotate-2{--tw-rotate:2deg}.sm\:rotate-3{--tw-rotate:3deg}.sm\:rotate-6{--tw-rotate:6deg}.sm\:rotate-12{--tw-rotate:12deg}.sm\:rotate-45{--tw-rotate:45deg}.sm\:rotate-90{--tw-rotate:90deg}.sm\:rotate-180{--tw-rotate:180deg}.sm\:-rotate-180{--tw-rotate:-180deg}.sm\:-rotate-90{--tw-rotate:-90deg}.sm\:-rotate-45{--tw-rotate:-45deg}.sm\:-rotate-12{--tw-rotate:-12deg}.sm\:-rotate-6{--tw-rotate:-6deg}.sm\:-rotate-3{--tw-rotate:-3deg}.sm\:-rotate-2{--tw-rotate:-2deg}.sm\:-rotate-1{--tw-rotate:-1deg}.sm\:hover\:rotate-0:hover{--tw-rotate:0deg}.sm\:hover\:rotate-1:hover{--tw-rotate:1deg}.sm\:hover\:rotate-2:hover{--tw-rotate:2deg}.sm\:hover\:rotate-3:hover{--tw-rotate:3deg}.sm\:hover\:rotate-6:hover{--tw-rotate:6deg}.sm\:hover\:rotate-12:hover{--tw-rotate:12deg}.sm\:hover\:rotate-45:hover{--tw-rotate:45deg}.sm\:hover\:rotate-90:hover{--tw-rotate:90deg}.sm\:hover\:rotate-180:hover{--tw-rotate:180deg}.sm\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.sm\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.sm\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.sm\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.sm\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.sm\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.sm\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.sm\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.sm\:focus\:rotate-0:focus{--tw-rotate:0deg}.sm\:focus\:rotate-1:focus{--tw-rotate:1deg}.sm\:focus\:rotate-2:focus{--tw-rotate:2deg}.sm\:focus\:rotate-3:focus{--tw-rotate:3deg}.sm\:focus\:rotate-6:focus{--tw-rotate:6deg}.sm\:focus\:rotate-12:focus{--tw-rotate:12deg}.sm\:focus\:rotate-45:focus{--tw-rotate:45deg}.sm\:focus\:rotate-90:focus{--tw-rotate:90deg}.sm\:focus\:rotate-180:focus{--tw-rotate:180deg}.sm\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.sm\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.sm\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.sm\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.sm\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.sm\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.sm\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.sm\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.sm\:skew-x-0{--tw-skew-x:0deg}.sm\:skew-x-1{--tw-skew-x:1deg}.sm\:skew-x-2{--tw-skew-x:2deg}.sm\:skew-x-3{--tw-skew-x:3deg}.sm\:skew-x-6{--tw-skew-x:6deg}.sm\:skew-x-12{--tw-skew-x:12deg}.sm\:-skew-x-12{--tw-skew-x:-12deg}.sm\:-skew-x-6{--tw-skew-x:-6deg}.sm\:-skew-x-3{--tw-skew-x:-3deg}.sm\:-skew-x-2{--tw-skew-x:-2deg}.sm\:-skew-x-1{--tw-skew-x:-1deg}.sm\:skew-y-0{--tw-skew-y:0deg}.sm\:skew-y-1{--tw-skew-y:1deg}.sm\:skew-y-2{--tw-skew-y:2deg}.sm\:skew-y-3{--tw-skew-y:3deg}.sm\:skew-y-6{--tw-skew-y:6deg}.sm\:skew-y-12{--tw-skew-y:12deg}.sm\:-skew-y-12{--tw-skew-y:-12deg}.sm\:-skew-y-6{--tw-skew-y:-6deg}.sm\:-skew-y-3{--tw-skew-y:-3deg}.sm\:-skew-y-2{--tw-skew-y:-2deg}.sm\:-skew-y-1{--tw-skew-y:-1deg}.sm\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.sm\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.sm\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.sm\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.sm\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.sm\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.sm\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.sm\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.sm\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.sm\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.sm\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.sm\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.sm\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.sm\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.sm\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.sm\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.sm\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.sm\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.sm\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.sm\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.sm\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.sm\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.sm\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.sm\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.sm\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.sm\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.sm\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.sm\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.sm\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.sm\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.sm\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.sm\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.sm\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.sm\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.sm\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.sm\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.sm\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.sm\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.sm\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.sm\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.sm\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.sm\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.sm\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.sm\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.sm\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.sm\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.sm\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.sm\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.sm\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.sm\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.sm\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.sm\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.sm\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.sm\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.sm\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.sm\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.sm\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.sm\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.sm\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.sm\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.sm\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.sm\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.sm\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.sm\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.sm\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.sm\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.sm\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.sm\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.sm\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.sm\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.sm\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.sm\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.sm\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.sm\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.sm\:scale-x-0{--tw-scale-x:0}.sm\:scale-x-50{--tw-scale-x:.5}.sm\:scale-x-75{--tw-scale-x:.75}.sm\:scale-x-90{--tw-scale-x:.9}.sm\:scale-x-95{--tw-scale-x:.95}.sm\:scale-x-100{--tw-scale-x:1}.sm\:scale-x-105{--tw-scale-x:1.05}.sm\:scale-x-110{--tw-scale-x:1.1}.sm\:scale-x-125{--tw-scale-x:1.25}.sm\:scale-x-150{--tw-scale-x:1.5}.sm\:scale-y-0{--tw-scale-y:0}.sm\:scale-y-50{--tw-scale-y:.5}.sm\:scale-y-75{--tw-scale-y:.75}.sm\:scale-y-90{--tw-scale-y:.9}.sm\:scale-y-95{--tw-scale-y:.95}.sm\:scale-y-100{--tw-scale-y:1}.sm\:scale-y-105{--tw-scale-y:1.05}.sm\:scale-y-110{--tw-scale-y:1.1}.sm\:scale-y-125{--tw-scale-y:1.25}.sm\:scale-y-150{--tw-scale-y:1.5}.sm\:hover\:scale-x-0:hover{--tw-scale-x:0}.sm\:hover\:scale-x-50:hover{--tw-scale-x:.5}.sm\:hover\:scale-x-75:hover{--tw-scale-x:.75}.sm\:hover\:scale-x-90:hover{--tw-scale-x:.9}.sm\:hover\:scale-x-95:hover{--tw-scale-x:.95}.sm\:hover\:scale-x-100:hover{--tw-scale-x:1}.sm\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.sm\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.sm\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.sm\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.sm\:hover\:scale-y-0:hover{--tw-scale-y:0}.sm\:hover\:scale-y-50:hover{--tw-scale-y:.5}.sm\:hover\:scale-y-75:hover{--tw-scale-y:.75}.sm\:hover\:scale-y-90:hover{--tw-scale-y:.9}.sm\:hover\:scale-y-95:hover{--tw-scale-y:.95}.sm\:hover\:scale-y-100:hover{--tw-scale-y:1}.sm\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.sm\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.sm\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.sm\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.sm\:focus\:scale-x-0:focus{--tw-scale-x:0}.sm\:focus\:scale-x-50:focus{--tw-scale-x:.5}.sm\:focus\:scale-x-75:focus{--tw-scale-x:.75}.sm\:focus\:scale-x-90:focus{--tw-scale-x:.9}.sm\:focus\:scale-x-95:focus{--tw-scale-x:.95}.sm\:focus\:scale-x-100:focus{--tw-scale-x:1}.sm\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.sm\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.sm\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.sm\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.sm\:focus\:scale-y-0:focus{--tw-scale-y:0}.sm\:focus\:scale-y-50:focus{--tw-scale-y:.5}.sm\:focus\:scale-y-75:focus{--tw-scale-y:.75}.sm\:focus\:scale-y-90:focus{--tw-scale-y:.9}.sm\:focus\:scale-y-95:focus{--tw-scale-y:.95}.sm\:focus\:scale-y-100:focus{--tw-scale-y:1}.sm\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.sm\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.sm\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.sm\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.sm\:animate-none{-webkit-animation:none;animation:none}.sm\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.sm\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.sm\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.sm\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.sm\:cursor-auto{cursor:auto}.sm\:cursor-default{cursor:default}.sm\:cursor-pointer{cursor:pointer}.sm\:cursor-wait{cursor:wait}.sm\:cursor-text{cursor:text}.sm\:cursor-move{cursor:move}.sm\:cursor-help{cursor:help}.sm\:cursor-not-allowed{cursor:not-allowed}.sm\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sm\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.sm\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.sm\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.sm\:resize-none{resize:none}.sm\:resize-y{resize:vertical}.sm\:resize-x{resize:horizontal}.sm\:resize{resize:both}.sm\:list-inside{list-style-position:inside}.sm\:list-outside{list-style-position:outside}.sm\:list-none{list-style-type:none}.sm\:list-disc{list-style-type:disc}.sm\:list-decimal{list-style-type:decimal}.sm\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.sm\:auto-cols-auto{grid-auto-columns:auto}.sm\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.sm\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.sm\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.sm\:grid-flow-row{grid-auto-flow:row}.sm\:grid-flow-col{grid-auto-flow:column}.sm\:grid-flow-row-dense{grid-auto-flow:row dense}.sm\:grid-flow-col-dense{grid-auto-flow:column dense}.sm\:auto-rows-auto{grid-auto-rows:auto}.sm\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.sm\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.sm\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.sm\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.sm\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.sm\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.sm\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.sm\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.sm\:grid-rows-none{grid-template-rows:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-col{flex-direction:column}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:flex-wrap{flex-wrap:wrap}.sm\:flex-wrap-reverse{flex-wrap:wrap-reverse}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:place-content-center{place-content:center}.sm\:place-content-start{place-content:start}.sm\:place-content-end{place-content:end}.sm\:place-content-between{place-content:space-between}.sm\:place-content-around{place-content:space-around}.sm\:place-content-evenly{place-content:space-evenly}.sm\:place-content-stretch{place-content:stretch}.sm\:place-items-start{place-items:start}.sm\:place-items-end{place-items:end}.sm\:place-items-center{place-items:center}.sm\:place-items-stretch{place-items:stretch}.sm\:content-center{align-content:center}.sm\:content-start{align-content:flex-start}.sm\:content-end{align-content:flex-end}.sm\:content-between{align-content:space-between}.sm\:content-around{align-content:space-around}.sm\:content-evenly{align-content:space-evenly}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:items-baseline{align-items:baseline}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-around{justify-content:space-around}.sm\:justify-evenly{justify-content:space-evenly}.sm\:justify-items-start{justify-items:start}.sm\:justify-items-end{justify-items:end}.sm\:justify-items-center{justify-items:center}.sm\:justify-items-stretch{justify-items:stretch}.sm\:gap-0{gap:0}.sm\:gap-1{gap:.25rem}.sm\:gap-2{gap:.5rem}.sm\:gap-3{gap:.75rem}.sm\:gap-4{gap:1rem}.sm\:gap-5{gap:1.25rem}.sm\:gap-6{gap:1.5rem}.sm\:gap-7{gap:1.75rem}.sm\:gap-8{gap:2rem}.sm\:gap-9{gap:2.25rem}.sm\:gap-10{gap:2.5rem}.sm\:gap-11{gap:2.75rem}.sm\:gap-12{gap:3rem}.sm\:gap-14{gap:3.5rem}.sm\:gap-16{gap:4rem}.sm\:gap-20{gap:5rem}.sm\:gap-24{gap:6rem}.sm\:gap-28{gap:7rem}.sm\:gap-32{gap:8rem}.sm\:gap-36{gap:9rem}.sm\:gap-40{gap:10rem}.sm\:gap-44{gap:11rem}.sm\:gap-48{gap:12rem}.sm\:gap-52{gap:13rem}.sm\:gap-56{gap:14rem}.sm\:gap-60{gap:15rem}.sm\:gap-64{gap:16rem}.sm\:gap-72{gap:18rem}.sm\:gap-80{gap:20rem}.sm\:gap-96{gap:24rem}.sm\:gap-px{gap:1px}.sm\:gap-0\.5{gap:.125rem}.sm\:gap-1\.5{gap:.375rem}.sm\:gap-2\.5{gap:.625rem}.sm\:gap-3\.5{gap:.875rem}.sm\:gap-x-0{-moz-column-gap:0;column-gap:0}.sm\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.sm\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.sm\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.sm\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.sm\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.sm\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.sm\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.sm\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.sm\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.sm\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.sm\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.sm\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.sm\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.sm\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.sm\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.sm\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.sm\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.sm\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.sm\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.sm\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.sm\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.sm\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.sm\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.sm\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.sm\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.sm\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.sm\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.sm\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.sm\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.sm\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.sm\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.sm\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.sm\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.sm\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.sm\:gap-y-0{row-gap:0}.sm\:gap-y-1{row-gap:.25rem}.sm\:gap-y-2{row-gap:.5rem}.sm\:gap-y-3{row-gap:.75rem}.sm\:gap-y-4{row-gap:1rem}.sm\:gap-y-5{row-gap:1.25rem}.sm\:gap-y-6{row-gap:1.5rem}.sm\:gap-y-7{row-gap:1.75rem}.sm\:gap-y-8{row-gap:2rem}.sm\:gap-y-9{row-gap:2.25rem}.sm\:gap-y-10{row-gap:2.5rem}.sm\:gap-y-11{row-gap:2.75rem}.sm\:gap-y-12{row-gap:3rem}.sm\:gap-y-14{row-gap:3.5rem}.sm\:gap-y-16{row-gap:4rem}.sm\:gap-y-20{row-gap:5rem}.sm\:gap-y-24{row-gap:6rem}.sm\:gap-y-28{row-gap:7rem}.sm\:gap-y-32{row-gap:8rem}.sm\:gap-y-36{row-gap:9rem}.sm\:gap-y-40{row-gap:10rem}.sm\:gap-y-44{row-gap:11rem}.sm\:gap-y-48{row-gap:12rem}.sm\:gap-y-52{row-gap:13rem}.sm\:gap-y-56{row-gap:14rem}.sm\:gap-y-60{row-gap:15rem}.sm\:gap-y-64{row-gap:16rem}.sm\:gap-y-72{row-gap:18rem}.sm\:gap-y-80{row-gap:20rem}.sm\:gap-y-96{row-gap:24rem}.sm\:gap-y-px{row-gap:1px}.sm\:gap-y-0\.5{row-gap:.125rem}.sm\:gap-y-1\.5{row-gap:.375rem}.sm\:gap-y-2\.5{row-gap:.625rem}.sm\:gap-y-3\.5{row-gap:.875rem}.sm\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.sm\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.sm\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.sm\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.sm\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.sm\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.sm\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.sm\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.sm\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.sm\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.sm\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.sm\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.sm\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.sm\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.sm\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.sm\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.sm\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.sm\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.sm\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.sm\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.sm\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.sm\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.sm\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.sm\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.sm\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.sm\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.sm\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.sm\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.sm\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.sm\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.sm\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.sm\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.sm\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.sm\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.sm\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.sm\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.sm\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.sm\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.sm\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.sm\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.sm\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.sm\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.sm\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.sm\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.sm\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.sm\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.sm\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.sm\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.sm\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.sm\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.sm\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.sm\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.sm\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.sm\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.sm\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.sm\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.sm\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.sm\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.sm\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.sm\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.sm\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.sm\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.sm\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.sm\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.sm\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.sm\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.sm\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.sm\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.sm\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.sm\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.sm\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.sm\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.sm\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.sm\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.sm\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.sm\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.sm\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.sm\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.sm\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.sm\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.sm\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.sm\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.sm\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.sm\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.sm\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.sm\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.sm\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.sm\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.sm\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.sm\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.sm\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.sm\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.sm\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.sm\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.sm\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.sm\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.sm\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.sm\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.sm\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.sm\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.sm\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.sm\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.sm\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.sm\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.sm\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.sm\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.sm\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.sm\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.sm\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.sm\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.sm\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.sm\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.sm\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.sm\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.sm\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.sm\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.sm\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.sm\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.sm\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.sm\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.sm\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.sm\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.sm\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.sm\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.sm\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.sm\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.sm\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.sm\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.sm\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.sm\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.sm\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.sm\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.sm\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.sm\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.sm\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.sm\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.sm\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.sm\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.sm\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.sm\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.sm\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.sm\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.sm\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.sm\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.sm\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.sm\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.sm\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.sm\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.sm\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.sm\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.sm\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.sm\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.sm\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.sm\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.sm\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.sm\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.sm\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.sm\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.sm\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.sm\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.sm\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.sm\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.sm\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.sm\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.sm\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.sm\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.sm\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.sm\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.sm\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.sm\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.sm\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.sm\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.sm\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.sm\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.sm\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.sm\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.sm\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.sm\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.sm\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.sm\:place-self-auto{place-self:auto}.sm\:place-self-start{place-self:start}.sm\:place-self-end{place-self:end}.sm\:place-self-center{place-self:center}.sm\:place-self-stretch{place-self:stretch}.sm\:self-auto{align-self:auto}.sm\:self-start{align-self:flex-start}.sm\:self-end{align-self:flex-end}.sm\:self-center{align-self:center}.sm\:self-stretch{align-self:stretch}.sm\:self-baseline{align-self:baseline}.sm\:justify-self-auto{justify-self:auto}.sm\:justify-self-start{justify-self:start}.sm\:justify-self-end{justify-self:end}.sm\:justify-self-center{justify-self:center}.sm\:justify-self-stretch{justify-self:stretch}.sm\:overflow-auto{overflow:auto}.sm\:overflow-hidden{overflow:hidden}.sm\:overflow-visible{overflow:visible}.sm\:overflow-scroll{overflow:scroll}.sm\:overflow-x-auto{overflow-x:auto}.sm\:overflow-y-auto{overflow-y:auto}.sm\:overflow-x-hidden{overflow-x:hidden}.sm\:overflow-y-hidden{overflow-y:hidden}.sm\:overflow-x-visible{overflow-x:visible}.sm\:overflow-y-visible{overflow-y:visible}.sm\:overflow-x-scroll{overflow-x:scroll}.sm\:overflow-y-scroll{overflow-y:scroll}.sm\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.sm\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.sm\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.sm\:overscroll-y-auto{overscroll-behavior-y:auto}.sm\:overscroll-y-contain{overscroll-behavior-y:contain}.sm\:overscroll-y-none{overscroll-behavior-y:none}.sm\:overscroll-x-auto{overscroll-behavior-x:auto}.sm\:overscroll-x-contain{overscroll-behavior-x:contain}.sm\:overscroll-x-none{overscroll-behavior-x:none}.sm\:truncate{overflow:hidden;white-space:nowrap}.sm\:overflow-ellipsis,.sm\:truncate{text-overflow:ellipsis}.sm\:overflow-clip{text-overflow:clip}.sm\:whitespace-normal{white-space:normal}.sm\:whitespace-nowrap{white-space:nowrap}.sm\:whitespace-pre{white-space:pre}.sm\:whitespace-pre-line{white-space:pre-line}.sm\:whitespace-pre-wrap{white-space:pre-wrap}.sm\:break-normal{overflow-wrap:normal;word-break:normal}.sm\:break-words{overflow-wrap:break-word}.sm\:break-all{word-break:break-all}.sm\:rounded-none{border-radius:0}.sm\:rounded-sm{border-radius:.125rem}.sm\:rounded{border-radius:.25rem}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:rounded-2xl{border-radius:1rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:rounded-full{border-radius:9999px}.sm\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.sm\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.sm\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.sm\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.sm\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.sm\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.sm\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.sm\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.sm\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.sm\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.sm\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.sm\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.sm\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.sm\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.sm\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.sm\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.sm\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.sm\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.sm\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.sm\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.sm\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-tl-none{border-top-left-radius:0}.sm\:rounded-tl-sm{border-top-left-radius:.125rem}.sm\:rounded-tl{border-top-left-radius:.25rem}.sm\:rounded-tl-md{border-top-left-radius:.375rem}.sm\:rounded-tl-lg{border-top-left-radius:.5rem}.sm\:rounded-tl-xl{border-top-left-radius:.75rem}.sm\:rounded-tl-2xl{border-top-left-radius:1rem}.sm\:rounded-tl-3xl{border-top-left-radius:1.5rem}.sm\:rounded-tl-full{border-top-left-radius:9999px}.sm\:rounded-tr-none{border-top-right-radius:0}.sm\:rounded-tr-sm{border-top-right-radius:.125rem}.sm\:rounded-tr{border-top-right-radius:.25rem}.sm\:rounded-tr-md{border-top-right-radius:.375rem}.sm\:rounded-tr-lg{border-top-right-radius:.5rem}.sm\:rounded-tr-xl{border-top-right-radius:.75rem}.sm\:rounded-tr-2xl{border-top-right-radius:1rem}.sm\:rounded-tr-3xl{border-top-right-radius:1.5rem}.sm\:rounded-tr-full{border-top-right-radius:9999px}.sm\:rounded-br-none{border-bottom-right-radius:0}.sm\:rounded-br-sm{border-bottom-right-radius:.125rem}.sm\:rounded-br{border-bottom-right-radius:.25rem}.sm\:rounded-br-md{border-bottom-right-radius:.375rem}.sm\:rounded-br-lg{border-bottom-right-radius:.5rem}.sm\:rounded-br-xl{border-bottom-right-radius:.75rem}.sm\:rounded-br-2xl{border-bottom-right-radius:1rem}.sm\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.sm\:rounded-br-full{border-bottom-right-radius:9999px}.sm\:rounded-bl-none{border-bottom-left-radius:0}.sm\:rounded-bl-sm{border-bottom-left-radius:.125rem}.sm\:rounded-bl{border-bottom-left-radius:.25rem}.sm\:rounded-bl-md{border-bottom-left-radius:.375rem}.sm\:rounded-bl-lg{border-bottom-left-radius:.5rem}.sm\:rounded-bl-xl{border-bottom-left-radius:.75rem}.sm\:rounded-bl-2xl{border-bottom-left-radius:1rem}.sm\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.sm\:rounded-bl-full{border-bottom-left-radius:9999px}.sm\:border-0{border-width:0}.sm\:border-2{border-width:2px}.sm\:border-4{border-width:4px}.sm\:border-8{border-width:8px}.sm\:border{border-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:border-t-2{border-top-width:2px}.sm\:border-t-4{border-top-width:4px}.sm\:border-t-8{border-top-width:8px}.sm\:border-t{border-top-width:1px}.sm\:border-r-0{border-right-width:0}.sm\:border-r-2{border-right-width:2px}.sm\:border-r-4{border-right-width:4px}.sm\:border-r-8{border-right-width:8px}.sm\:border-r{border-right-width:1px}.sm\:border-b-0{border-bottom-width:0}.sm\:border-b-2{border-bottom-width:2px}.sm\:border-b-4{border-bottom-width:4px}.sm\:border-b-8{border-bottom-width:8px}.sm\:border-b{border-bottom-width:1px}.sm\:border-l-0{border-left-width:0}.sm\:border-l-2{border-left-width:2px}.sm\:border-l-4{border-left-width:4px}.sm\:border-l-8{border-left-width:8px}.sm\:border-l{border-left-width:1px}.sm\:border-solid{border-style:solid}.sm\:border-dashed{border-style:dashed}.sm\:border-dotted{border-style:dotted}.sm\:border-double{border-style:double}.sm\:border-none{border-style:none}.sm\:border-transparent{border-color:transparent}.sm\:border-current{border-color:currentColor}.sm\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-transparent{border-color:transparent}.group:hover .sm\:group-hover\:border-current{border-color:currentColor}.group:hover .sm\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .sm\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:focus-within\:border-transparent:focus-within{border-color:transparent}.sm\:focus-within\:border-current:focus-within{border-color:currentColor}.sm\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:hover\:border-transparent:hover{border-color:transparent}.sm\:hover\:border-current:hover{border-color:currentColor}.sm\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:focus\:border-transparent:focus{border-color:transparent}.sm\:focus\:border-current:focus{border-color:currentColor}.sm\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.sm\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.sm\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.sm\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.sm\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.sm\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.sm\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.sm\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.sm\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.sm\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.sm\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.sm\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.sm\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.sm\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.sm\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.sm\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.sm\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.sm\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.sm\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.sm\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.sm\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.sm\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.sm\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.sm\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.sm\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.sm\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.sm\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.sm\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.sm\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.sm\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.sm\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.sm\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.sm\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.sm\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.sm\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.sm\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.sm\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.sm\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.sm\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.sm\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.sm\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.sm\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.sm\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.sm\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.sm\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.sm\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.sm\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.sm\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.sm\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.sm\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.sm\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.sm\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.sm\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.sm\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.sm\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.sm\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.sm\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.sm\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.sm\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.sm\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.sm\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.sm\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.sm\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.sm\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.sm\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.sm\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.sm\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.sm\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.sm\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.sm\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.sm\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.sm\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.sm\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.sm\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.sm\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.sm\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.sm\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.sm\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.sm\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.sm\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.sm\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.sm\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.sm\:border-opacity-0{--tw-border-opacity:0}.sm\:border-opacity-5{--tw-border-opacity:0.05}.sm\:border-opacity-10{--tw-border-opacity:0.1}.sm\:border-opacity-20{--tw-border-opacity:0.2}.sm\:border-opacity-25{--tw-border-opacity:0.25}.sm\:border-opacity-30{--tw-border-opacity:0.3}.sm\:border-opacity-40{--tw-border-opacity:0.4}.sm\:border-opacity-50{--tw-border-opacity:0.5}.sm\:border-opacity-60{--tw-border-opacity:0.6}.sm\:border-opacity-70{--tw-border-opacity:0.7}.sm\:border-opacity-75{--tw-border-opacity:0.75}.sm\:border-opacity-80{--tw-border-opacity:0.8}.sm\:border-opacity-90{--tw-border-opacity:0.9}.sm\:border-opacity-95{--tw-border-opacity:0.95}.sm\:border-opacity-100{--tw-border-opacity:1}.group:hover .sm\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .sm\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .sm\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .sm\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .sm\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .sm\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .sm\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .sm\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .sm\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .sm\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .sm\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .sm\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .sm\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .sm\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .sm\:group-hover\:border-opacity-100{--tw-border-opacity:1}.sm\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.sm\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.sm\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.sm\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.sm\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.sm\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.sm\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.sm\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.sm\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.sm\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.sm\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.sm\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.sm\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.sm\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.sm\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.sm\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.sm\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.sm\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.sm\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.sm\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.sm\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.sm\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.sm\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.sm\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.sm\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.sm\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.sm\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.sm\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.sm\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.sm\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.sm\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.sm\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.sm\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.sm\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.sm\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.sm\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.sm\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.sm\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.sm\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.sm\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.sm\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.sm\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.sm\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.sm\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.sm\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.sm\:bg-transparent{background-color:initial}.sm\:bg-current{background-color:currentColor}.sm\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-transparent{background-color:initial}.group:hover .sm\:group-hover\:bg-current{background-color:currentColor}.group:hover .sm\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .sm\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:focus-within\:bg-transparent:focus-within{background-color:initial}.sm\:focus-within\:bg-current:focus-within{background-color:currentColor}.sm\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:hover\:bg-transparent:hover{background-color:initial}.sm\:hover\:bg-current:hover{background-color:currentColor}.sm\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:focus\:bg-transparent:focus{background-color:initial}.sm\:focus\:bg-current:focus{background-color:currentColor}.sm\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.sm\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.sm\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.sm\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.sm\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.sm\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.sm\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.sm\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.sm\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.sm\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.sm\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.sm\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.sm\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.sm\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.sm\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.sm\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.sm\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.sm\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.sm\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.sm\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.sm\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.sm\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.sm\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.sm\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.sm\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.sm\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.sm\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.sm\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.sm\:bg-opacity-0{--tw-bg-opacity:0}.sm\:bg-opacity-5{--tw-bg-opacity:0.05}.sm\:bg-opacity-10{--tw-bg-opacity:0.1}.sm\:bg-opacity-20{--tw-bg-opacity:0.2}.sm\:bg-opacity-25{--tw-bg-opacity:0.25}.sm\:bg-opacity-30{--tw-bg-opacity:0.3}.sm\:bg-opacity-40{--tw-bg-opacity:0.4}.sm\:bg-opacity-50{--tw-bg-opacity:0.5}.sm\:bg-opacity-60{--tw-bg-opacity:0.6}.sm\:bg-opacity-70{--tw-bg-opacity:0.7}.sm\:bg-opacity-75{--tw-bg-opacity:0.75}.sm\:bg-opacity-80{--tw-bg-opacity:0.8}.sm\:bg-opacity-90{--tw-bg-opacity:0.9}.sm\:bg-opacity-95{--tw-bg-opacity:0.95}.sm\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .sm\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .sm\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .sm\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .sm\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .sm\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .sm\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .sm\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .sm\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .sm\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .sm\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .sm\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .sm\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .sm\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .sm\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .sm\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.sm\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.sm\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.sm\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.sm\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.sm\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.sm\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.sm\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.sm\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.sm\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.sm\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.sm\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.sm\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.sm\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.sm\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.sm\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.sm\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.sm\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.sm\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.sm\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.sm\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.sm\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.sm\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.sm\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.sm\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.sm\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.sm\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.sm\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.sm\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.sm\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.sm\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.sm\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.sm\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.sm\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.sm\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.sm\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.sm\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.sm\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.sm\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.sm\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.sm\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.sm\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.sm\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.sm\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.sm\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.sm\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.sm\:bg-none{background-image:none}.sm\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.sm\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.sm\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.sm\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.sm\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.sm\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.sm\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.sm\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.sm\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.sm\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.sm\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.sm\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.sm\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.sm\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.sm\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.sm\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.sm\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.sm\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.sm\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.sm\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.sm\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.sm\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.sm\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.sm\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.sm\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.sm\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.sm\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.sm\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.sm\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.sm\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.sm\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.sm\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.sm\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.sm\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.sm\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.sm\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.sm\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.sm\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.sm\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.sm\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.sm\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.sm\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.sm\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.sm\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.sm\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.sm\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.sm\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.sm\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.sm\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.sm\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.sm\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.sm\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.sm\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.sm\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.sm\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.sm\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.sm\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.sm\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.sm\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.sm\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.sm\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.sm\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.sm\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.sm\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.sm\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.sm\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.sm\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.sm\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.sm\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.sm\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.sm\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.sm\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.sm\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.sm\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.sm\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.sm\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.sm\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.sm\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.sm\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.sm\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.sm\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.sm\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.sm\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.sm\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.sm\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.sm\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.sm\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.sm\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.sm\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.sm\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.sm\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.sm\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.sm\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.sm\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.sm\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.sm\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.sm\:to-transparent{--tw-gradient-to:transparent}.sm\:to-current{--tw-gradient-to:currentColor}.sm\:to-black{--tw-gradient-to:#000}.sm\:to-white{--tw-gradient-to:#fff}.sm\:to-gray-50{--tw-gradient-to:#f9fafb}.sm\:to-gray-100{--tw-gradient-to:#f3f4f6}.sm\:to-gray-200{--tw-gradient-to:#e5e7eb}.sm\:to-gray-300{--tw-gradient-to:#d1d5db}.sm\:to-gray-400{--tw-gradient-to:#9ca3af}.sm\:to-gray-500{--tw-gradient-to:#6b7280}.sm\:to-gray-600{--tw-gradient-to:#4b5563}.sm\:to-gray-700{--tw-gradient-to:#374151}.sm\:to-gray-800{--tw-gradient-to:#1f2937}.sm\:to-gray-900{--tw-gradient-to:#111827}.sm\:to-red-50{--tw-gradient-to:#fef2f2}.sm\:to-red-100{--tw-gradient-to:#fee2e2}.sm\:to-red-200{--tw-gradient-to:#fecaca}.sm\:to-red-300{--tw-gradient-to:#fca5a5}.sm\:to-red-400{--tw-gradient-to:#f87171}.sm\:to-red-500{--tw-gradient-to:#ef4444}.sm\:to-red-600{--tw-gradient-to:#dc2626}.sm\:to-red-700{--tw-gradient-to:#b91c1c}.sm\:to-red-800{--tw-gradient-to:#991b1b}.sm\:to-red-900{--tw-gradient-to:#7f1d1d}.sm\:to-yellow-50{--tw-gradient-to:#fffbeb}.sm\:to-yellow-100{--tw-gradient-to:#fef3c7}.sm\:to-yellow-200{--tw-gradient-to:#fde68a}.sm\:to-yellow-300{--tw-gradient-to:#fcd34d}.sm\:to-yellow-400{--tw-gradient-to:#fbbf24}.sm\:to-yellow-500{--tw-gradient-to:#f59e0b}.sm\:to-yellow-600{--tw-gradient-to:#d97706}.sm\:to-yellow-700{--tw-gradient-to:#b45309}.sm\:to-yellow-800{--tw-gradient-to:#92400e}.sm\:to-yellow-900{--tw-gradient-to:#78350f}.sm\:to-green-50{--tw-gradient-to:#ecfdf5}.sm\:to-green-100{--tw-gradient-to:#d1fae5}.sm\:to-green-200{--tw-gradient-to:#a7f3d0}.sm\:to-green-300{--tw-gradient-to:#6ee7b7}.sm\:to-green-400{--tw-gradient-to:#34d399}.sm\:to-green-500{--tw-gradient-to:#10b981}.sm\:to-green-600{--tw-gradient-to:#059669}.sm\:to-green-700{--tw-gradient-to:#047857}.sm\:to-green-800{--tw-gradient-to:#065f46}.sm\:to-green-900{--tw-gradient-to:#064e3b}.sm\:to-blue-50{--tw-gradient-to:#eff6ff}.sm\:to-blue-100{--tw-gradient-to:#dbeafe}.sm\:to-blue-200{--tw-gradient-to:#bfdbfe}.sm\:to-blue-300{--tw-gradient-to:#93c5fd}.sm\:to-blue-400{--tw-gradient-to:#60a5fa}.sm\:to-blue-500{--tw-gradient-to:#3b82f6}.sm\:to-blue-600{--tw-gradient-to:#2563eb}.sm\:to-blue-700{--tw-gradient-to:#1d4ed8}.sm\:to-blue-800{--tw-gradient-to:#1e40af}.sm\:to-blue-900{--tw-gradient-to:#1e3a8a}.sm\:to-indigo-50{--tw-gradient-to:#eef2ff}.sm\:to-indigo-100{--tw-gradient-to:#e0e7ff}.sm\:to-indigo-200{--tw-gradient-to:#c7d2fe}.sm\:to-indigo-300{--tw-gradient-to:#a5b4fc}.sm\:to-indigo-400{--tw-gradient-to:#818cf8}.sm\:to-indigo-500{--tw-gradient-to:#6366f1}.sm\:to-indigo-600{--tw-gradient-to:#4f46e5}.sm\:to-indigo-700{--tw-gradient-to:#4338ca}.sm\:to-indigo-800{--tw-gradient-to:#3730a3}.sm\:to-indigo-900{--tw-gradient-to:#312e81}.sm\:to-purple-50{--tw-gradient-to:#f5f3ff}.sm\:to-purple-100{--tw-gradient-to:#ede9fe}.sm\:to-purple-200{--tw-gradient-to:#ddd6fe}.sm\:to-purple-300{--tw-gradient-to:#c4b5fd}.sm\:to-purple-400{--tw-gradient-to:#a78bfa}.sm\:to-purple-500{--tw-gradient-to:#8b5cf6}.sm\:to-purple-600{--tw-gradient-to:#7c3aed}.sm\:to-purple-700{--tw-gradient-to:#6d28d9}.sm\:to-purple-800{--tw-gradient-to:#5b21b6}.sm\:to-purple-900{--tw-gradient-to:#4c1d95}.sm\:to-pink-50{--tw-gradient-to:#fdf2f8}.sm\:to-pink-100{--tw-gradient-to:#fce7f3}.sm\:to-pink-200{--tw-gradient-to:#fbcfe8}.sm\:to-pink-300{--tw-gradient-to:#f9a8d4}.sm\:to-pink-400{--tw-gradient-to:#f472b6}.sm\:to-pink-500{--tw-gradient-to:#ec4899}.sm\:to-pink-600{--tw-gradient-to:#db2777}.sm\:to-pink-700{--tw-gradient-to:#be185d}.sm\:to-pink-800{--tw-gradient-to:#9d174d}.sm\:to-pink-900{--tw-gradient-to:#831843}.sm\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.sm\:hover\:to-current:hover{--tw-gradient-to:currentColor}.sm\:hover\:to-black:hover{--tw-gradient-to:#000}.sm\:hover\:to-white:hover{--tw-gradient-to:#fff}.sm\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.sm\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.sm\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.sm\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.sm\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.sm\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.sm\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.sm\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.sm\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.sm\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.sm\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.sm\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.sm\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.sm\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.sm\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.sm\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.sm\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.sm\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.sm\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.sm\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.sm\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.sm\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.sm\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.sm\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.sm\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.sm\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.sm\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.sm\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.sm\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.sm\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.sm\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.sm\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.sm\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.sm\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.sm\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.sm\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.sm\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.sm\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.sm\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.sm\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.sm\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.sm\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.sm\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.sm\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.sm\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.sm\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.sm\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.sm\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.sm\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.sm\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.sm\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.sm\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.sm\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.sm\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.sm\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.sm\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.sm\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.sm\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.sm\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.sm\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.sm\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.sm\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.sm\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.sm\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.sm\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.sm\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.sm\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.sm\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.sm\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.sm\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.sm\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.sm\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.sm\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.sm\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.sm\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.sm\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.sm\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.sm\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.sm\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.sm\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.sm\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.sm\:focus\:to-current:focus{--tw-gradient-to:currentColor}.sm\:focus\:to-black:focus{--tw-gradient-to:#000}.sm\:focus\:to-white:focus{--tw-gradient-to:#fff}.sm\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.sm\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.sm\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.sm\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.sm\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.sm\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.sm\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.sm\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.sm\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.sm\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.sm\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.sm\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.sm\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.sm\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.sm\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.sm\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.sm\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.sm\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.sm\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.sm\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.sm\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.sm\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.sm\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.sm\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.sm\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.sm\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.sm\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.sm\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.sm\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.sm\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.sm\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.sm\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.sm\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.sm\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.sm\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.sm\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.sm\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.sm\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.sm\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.sm\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.sm\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.sm\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.sm\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.sm\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.sm\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.sm\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.sm\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.sm\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.sm\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.sm\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.sm\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.sm\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.sm\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.sm\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.sm\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.sm\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.sm\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.sm\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.sm\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.sm\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.sm\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.sm\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.sm\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.sm\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.sm\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.sm\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.sm\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.sm\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.sm\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.sm\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.sm\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.sm\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.sm\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.sm\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.sm\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.sm\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.sm\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.sm\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.sm\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.sm\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.sm\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.sm\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.sm\:bg-auto{background-size:auto}.sm\:bg-cover{background-size:cover}.sm\:bg-contain{background-size:contain}.sm\:bg-fixed{background-attachment:fixed}.sm\:bg-local{background-attachment:local}.sm\:bg-scroll{background-attachment:scroll}.sm\:bg-clip-border{background-clip:initial}.sm\:bg-clip-padding{background-clip:padding-box}.sm\:bg-clip-content{background-clip:content-box}.sm\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.sm\:bg-bottom{background-position:bottom}.sm\:bg-center{background-position:50%}.sm\:bg-left{background-position:0}.sm\:bg-left-bottom{background-position:0 100%}.sm\:bg-left-top{background-position:0 0}.sm\:bg-right{background-position:100%}.sm\:bg-right-bottom{background-position:100% 100%}.sm\:bg-right-top{background-position:100% 0}.sm\:bg-top{background-position:top}.sm\:bg-repeat{background-repeat:repeat}.sm\:bg-no-repeat{background-repeat:no-repeat}.sm\:bg-repeat-x{background-repeat:repeat-x}.sm\:bg-repeat-y{background-repeat:repeat-y}.sm\:bg-repeat-round{background-repeat:round}.sm\:bg-repeat-space{background-repeat:space}.sm\:bg-origin-border{background-origin:border-box}.sm\:bg-origin-padding{background-origin:initial}.sm\:bg-origin-content{background-origin:content-box}.sm\:fill-current{fill:currentColor}.sm\:stroke-current{stroke:currentColor}.sm\:stroke-0{stroke-width:0}.sm\:stroke-1{stroke-width:1}.sm\:stroke-2{stroke-width:2}.sm\:object-contain{-o-object-fit:contain;object-fit:contain}.sm\:object-cover{-o-object-fit:cover;object-fit:cover}.sm\:object-fill{-o-object-fit:fill;object-fit:fill}.sm\:object-none{-o-object-fit:none;object-fit:none}.sm\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.sm\:object-bottom{-o-object-position:bottom;object-position:bottom}.sm\:object-center{-o-object-position:center;object-position:center}.sm\:object-left{-o-object-position:left;object-position:left}.sm\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.sm\:object-left-top{-o-object-position:left top;object-position:left top}.sm\:object-right{-o-object-position:right;object-position:right}.sm\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.sm\:object-right-top{-o-object-position:right top;object-position:right top}.sm\:object-top{-o-object-position:top;object-position:top}.sm\:p-0{padding:0}.sm\:p-1{padding:.25rem}.sm\:p-2{padding:.5rem}.sm\:p-3{padding:.75rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:p-7{padding:1.75rem}.sm\:p-8{padding:2rem}.sm\:p-9{padding:2.25rem}.sm\:p-10{padding:2.5rem}.sm\:p-11{padding:2.75rem}.sm\:p-12{padding:3rem}.sm\:p-14{padding:3.5rem}.sm\:p-16{padding:4rem}.sm\:p-20{padding:5rem}.sm\:p-24{padding:6rem}.sm\:p-28{padding:7rem}.sm\:p-32{padding:8rem}.sm\:p-36{padding:9rem}.sm\:p-40{padding:10rem}.sm\:p-44{padding:11rem}.sm\:p-48{padding:12rem}.sm\:p-52{padding:13rem}.sm\:p-56{padding:14rem}.sm\:p-60{padding:15rem}.sm\:p-64{padding:16rem}.sm\:p-72{padding:18rem}.sm\:p-80{padding:20rem}.sm\:p-96{padding:24rem}.sm\:p-px{padding:1px}.sm\:p-0\.5{padding:.125rem}.sm\:p-1\.5{padding:.375rem}.sm\:p-2\.5{padding:.625rem}.sm\:p-3\.5{padding:.875rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-1{padding-left:.25rem;padding-right:.25rem}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-7{padding-left:1.75rem;padding-right:1.75rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:px-9{padding-left:2.25rem;padding-right:2.25rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:px-11{padding-left:2.75rem;padding-right:2.75rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:px-14{padding-left:3.5rem;padding-right:3.5rem}.sm\:px-16{padding-left:4rem;padding-right:4rem}.sm\:px-20{padding-left:5rem;padding-right:5rem}.sm\:px-24{padding-left:6rem;padding-right:6rem}.sm\:px-28{padding-left:7rem;padding-right:7rem}.sm\:px-32{padding-left:8rem;padding-right:8rem}.sm\:px-36{padding-left:9rem;padding-right:9rem}.sm\:px-40{padding-left:10rem;padding-right:10rem}.sm\:px-44{padding-left:11rem;padding-right:11rem}.sm\:px-48{padding-left:12rem;padding-right:12rem}.sm\:px-52{padding-left:13rem;padding-right:13rem}.sm\:px-56{padding-left:14rem;padding-right:14rem}.sm\:px-60{padding-left:15rem;padding-right:15rem}.sm\:px-64{padding-left:16rem;padding-right:16rem}.sm\:px-72{padding-left:18rem;padding-right:18rem}.sm\:px-80{padding-left:20rem;padding-right:20rem}.sm\:px-96{padding-left:24rem;padding-right:24rem}.sm\:px-px{padding-left:1px;padding-right:1px}.sm\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.sm\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.sm\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.sm\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:py-1{padding-top:.25rem;padding-bottom:.25rem}.sm\:py-2{padding-top:.5rem;padding-bottom:.5rem}.sm\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\:py-4{padding-top:1rem;padding-bottom:1rem}.sm\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.sm\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.sm\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:py-20{padding-top:5rem;padding-bottom:5rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-32{padding-top:8rem;padding-bottom:8rem}.sm\:py-36{padding-top:9rem;padding-bottom:9rem}.sm\:py-40{padding-top:10rem;padding-bottom:10rem}.sm\:py-44{padding-top:11rem;padding-bottom:11rem}.sm\:py-48{padding-top:12rem;padding-bottom:12rem}.sm\:py-52{padding-top:13rem;padding-bottom:13rem}.sm\:py-56{padding-top:14rem;padding-bottom:14rem}.sm\:py-60{padding-top:15rem;padding-bottom:15rem}.sm\:py-64{padding-top:16rem;padding-bottom:16rem}.sm\:py-72{padding-top:18rem;padding-bottom:18rem}.sm\:py-80{padding-top:20rem;padding-bottom:20rem}.sm\:py-96{padding-top:24rem;padding-bottom:24rem}.sm\:py-px{padding-top:1px;padding-bottom:1px}.sm\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.sm\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.sm\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.sm\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.sm\:pt-0{padding-top:0}.sm\:pt-1{padding-top:.25rem}.sm\:pt-2{padding-top:.5rem}.sm\:pt-3{padding-top:.75rem}.sm\:pt-4{padding-top:1rem}.sm\:pt-5{padding-top:1.25rem}.sm\:pt-6{padding-top:1.5rem}.sm\:pt-7{padding-top:1.75rem}.sm\:pt-8{padding-top:2rem}.sm\:pt-9{padding-top:2.25rem}.sm\:pt-10{padding-top:2.5rem}.sm\:pt-11{padding-top:2.75rem}.sm\:pt-12{padding-top:3rem}.sm\:pt-14{padding-top:3.5rem}.sm\:pt-16{padding-top:4rem}.sm\:pt-20{padding-top:5rem}.sm\:pt-24{padding-top:6rem}.sm\:pt-28{padding-top:7rem}.sm\:pt-32{padding-top:8rem}.sm\:pt-36{padding-top:9rem}.sm\:pt-40{padding-top:10rem}.sm\:pt-44{padding-top:11rem}.sm\:pt-48{padding-top:12rem}.sm\:pt-52{padding-top:13rem}.sm\:pt-56{padding-top:14rem}.sm\:pt-60{padding-top:15rem}.sm\:pt-64{padding-top:16rem}.sm\:pt-72{padding-top:18rem}.sm\:pt-80{padding-top:20rem}.sm\:pt-96{padding-top:24rem}.sm\:pt-px{padding-top:1px}.sm\:pt-0\.5{padding-top:.125rem}.sm\:pt-1\.5{padding-top:.375rem}.sm\:pt-2\.5{padding-top:.625rem}.sm\:pt-3\.5{padding-top:.875rem}.sm\:pr-0{padding-right:0}.sm\:pr-1{padding-right:.25rem}.sm\:pr-2{padding-right:.5rem}.sm\:pr-3{padding-right:.75rem}.sm\:pr-4{padding-right:1rem}.sm\:pr-5{padding-right:1.25rem}.sm\:pr-6{padding-right:1.5rem}.sm\:pr-7{padding-right:1.75rem}.sm\:pr-8{padding-right:2rem}.sm\:pr-9{padding-right:2.25rem}.sm\:pr-10{padding-right:2.5rem}.sm\:pr-11{padding-right:2.75rem}.sm\:pr-12{padding-right:3rem}.sm\:pr-14{padding-right:3.5rem}.sm\:pr-16{padding-right:4rem}.sm\:pr-20{padding-right:5rem}.sm\:pr-24{padding-right:6rem}.sm\:pr-28{padding-right:7rem}.sm\:pr-32{padding-right:8rem}.sm\:pr-36{padding-right:9rem}.sm\:pr-40{padding-right:10rem}.sm\:pr-44{padding-right:11rem}.sm\:pr-48{padding-right:12rem}.sm\:pr-52{padding-right:13rem}.sm\:pr-56{padding-right:14rem}.sm\:pr-60{padding-right:15rem}.sm\:pr-64{padding-right:16rem}.sm\:pr-72{padding-right:18rem}.sm\:pr-80{padding-right:20rem}.sm\:pr-96{padding-right:24rem}.sm\:pr-px{padding-right:1px}.sm\:pr-0\.5{padding-right:.125rem}.sm\:pr-1\.5{padding-right:.375rem}.sm\:pr-2\.5{padding-right:.625rem}.sm\:pr-3\.5{padding-right:.875rem}.sm\:pb-0{padding-bottom:0}.sm\:pb-1{padding-bottom:.25rem}.sm\:pb-2{padding-bottom:.5rem}.sm\:pb-3{padding-bottom:.75rem}.sm\:pb-4{padding-bottom:1rem}.sm\:pb-5{padding-bottom:1.25rem}.sm\:pb-6{padding-bottom:1.5rem}.sm\:pb-7{padding-bottom:1.75rem}.sm\:pb-8{padding-bottom:2rem}.sm\:pb-9{padding-bottom:2.25rem}.sm\:pb-10{padding-bottom:2.5rem}.sm\:pb-11{padding-bottom:2.75rem}.sm\:pb-12{padding-bottom:3rem}.sm\:pb-14{padding-bottom:3.5rem}.sm\:pb-16{padding-bottom:4rem}.sm\:pb-20{padding-bottom:5rem}.sm\:pb-24{padding-bottom:6rem}.sm\:pb-28{padding-bottom:7rem}.sm\:pb-32{padding-bottom:8rem}.sm\:pb-36{padding-bottom:9rem}.sm\:pb-40{padding-bottom:10rem}.sm\:pb-44{padding-bottom:11rem}.sm\:pb-48{padding-bottom:12rem}.sm\:pb-52{padding-bottom:13rem}.sm\:pb-56{padding-bottom:14rem}.sm\:pb-60{padding-bottom:15rem}.sm\:pb-64{padding-bottom:16rem}.sm\:pb-72{padding-bottom:18rem}.sm\:pb-80{padding-bottom:20rem}.sm\:pb-96{padding-bottom:24rem}.sm\:pb-px{padding-bottom:1px}.sm\:pb-0\.5{padding-bottom:.125rem}.sm\:pb-1\.5{padding-bottom:.375rem}.sm\:pb-2\.5{padding-bottom:.625rem}.sm\:pb-3\.5{padding-bottom:.875rem}.sm\:pl-0{padding-left:0}.sm\:pl-1{padding-left:.25rem}.sm\:pl-2{padding-left:.5rem}.sm\:pl-3{padding-left:.75rem}.sm\:pl-4{padding-left:1rem}.sm\:pl-5{padding-left:1.25rem}.sm\:pl-6{padding-left:1.5rem}.sm\:pl-7{padding-left:1.75rem}.sm\:pl-8{padding-left:2rem}.sm\:pl-9{padding-left:2.25rem}.sm\:pl-10{padding-left:2.5rem}.sm\:pl-11{padding-left:2.75rem}.sm\:pl-12{padding-left:3rem}.sm\:pl-14{padding-left:3.5rem}.sm\:pl-16{padding-left:4rem}.sm\:pl-20{padding-left:5rem}.sm\:pl-24{padding-left:6rem}.sm\:pl-28{padding-left:7rem}.sm\:pl-32{padding-left:8rem}.sm\:pl-36{padding-left:9rem}.sm\:pl-40{padding-left:10rem}.sm\:pl-44{padding-left:11rem}.sm\:pl-48{padding-left:12rem}.sm\:pl-52{padding-left:13rem}.sm\:pl-56{padding-left:14rem}.sm\:pl-60{padding-left:15rem}.sm\:pl-64{padding-left:16rem}.sm\:pl-72{padding-left:18rem}.sm\:pl-80{padding-left:20rem}.sm\:pl-96{padding-left:24rem}.sm\:pl-px{padding-left:1px}.sm\:pl-0\.5{padding-left:.125rem}.sm\:pl-1\.5{padding-left:.375rem}.sm\:pl-2\.5{padding-left:.625rem}.sm\:pl-3\.5{padding-left:.875rem}.sm\:text-left{text-align:left}.sm\:text-center{text-align:center}.sm\:text-right{text-align:right}.sm\:text-justify{text-align:justify}.sm\:align-baseline{vertical-align:initial}.sm\:align-top{vertical-align:top}.sm\:align-middle{vertical-align:middle}.sm\:align-bottom{vertical-align:bottom}.sm\:align-text-top{vertical-align:text-top}.sm\:align-text-bottom{vertical-align:text-bottom}.sm\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.sm\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.sm\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.sm\:text-xs{font-size:.75rem;line-height:1rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-6xl{font-size:3.75rem;line-height:1}.sm\:text-7xl{font-size:4.5rem;line-height:1}.sm\:text-8xl{font-size:6rem;line-height:1}.sm\:text-9xl{font-size:8rem;line-height:1}.sm\:font-thin{font-weight:100}.sm\:font-extralight{font-weight:200}.sm\:font-light{font-weight:300}.sm\:font-normal{font-weight:400}.sm\:font-medium{font-weight:500}.sm\:font-semibold{font-weight:600}.sm\:font-bold{font-weight:700}.sm\:font-extrabold{font-weight:800}.sm\:font-black{font-weight:900}.sm\:uppercase{text-transform:uppercase}.sm\:lowercase{text-transform:lowercase}.sm\:capitalize{text-transform:capitalize}.sm\:normal-case{text-transform:none}.sm\:italic{font-style:italic}.sm\:not-italic{font-style:normal}.sm\:diagonal-fractions,.sm\:lining-nums,.sm\:oldstyle-nums,.sm\:ordinal,.sm\:proportional-nums,.sm\:slashed-zero,.sm\:stacked-fractions,.sm\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.sm\:normal-nums{font-variant-numeric:normal}.sm\:ordinal{--tw-ordinal:ordinal}.sm\:slashed-zero{--tw-slashed-zero:slashed-zero}.sm\:lining-nums{--tw-numeric-figure:lining-nums}.sm\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.sm\:proportional-nums{--tw-numeric-spacing:proportional-nums}.sm\:tabular-nums{--tw-numeric-spacing:tabular-nums}.sm\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.sm\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.sm\:leading-3{line-height:.75rem}.sm\:leading-4{line-height:1rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-8{line-height:2rem}.sm\:leading-9{line-height:2.25rem}.sm\:leading-10{line-height:2.5rem}.sm\:leading-none{line-height:1}.sm\:leading-tight{line-height:1.25}.sm\:leading-snug{line-height:1.375}.sm\:leading-normal{line-height:1.5}.sm\:leading-relaxed{line-height:1.625}.sm\:leading-loose{line-height:2}.sm\:tracking-tighter{letter-spacing:-.05em}.sm\:tracking-tight{letter-spacing:-.025em}.sm\:tracking-normal{letter-spacing:0}.sm\:tracking-wide{letter-spacing:.025em}.sm\:tracking-wider{letter-spacing:.05em}.sm\:tracking-widest{letter-spacing:.1em}.sm\:text-transparent{color:transparent}.sm\:text-current{color:currentColor}.sm\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-transparent{color:transparent}.group:hover .sm\:group-hover\:text-current{color:currentColor}.group:hover .sm\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .sm\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:focus-within\:text-transparent:focus-within{color:transparent}.sm\:focus-within\:text-current:focus-within{color:currentColor}.sm\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:hover\:text-transparent:hover{color:transparent}.sm\:hover\:text-current:hover{color:currentColor}.sm\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:focus\:text-transparent:focus{color:transparent}.sm\:focus\:text-current:focus{color:currentColor}.sm\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.sm\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.sm\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.sm\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.sm\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.sm\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.sm\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.sm\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.sm\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.sm\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.sm\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.sm\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.sm\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.sm\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.sm\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.sm\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.sm\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.sm\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.sm\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.sm\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.sm\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.sm\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.sm\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.sm\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.sm\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.sm\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.sm\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.sm\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.sm\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.sm\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.sm\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.sm\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.sm\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.sm\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.sm\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.sm\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.sm\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.sm\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.sm\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.sm\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.sm\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.sm\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.sm\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.sm\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.sm\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.sm\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.sm\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.sm\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.sm\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.sm\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.sm\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.sm\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.sm\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.sm\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.sm\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.sm\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.sm\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.sm\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.sm\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.sm\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.sm\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.sm\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.sm\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.sm\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.sm\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.sm\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.sm\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.sm\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.sm\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.sm\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.sm\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.sm\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.sm\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.sm\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.sm\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.sm\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.sm\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.sm\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.sm\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.sm\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.sm\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.sm\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.sm\:text-opacity-0{--tw-text-opacity:0}.sm\:text-opacity-5{--tw-text-opacity:0.05}.sm\:text-opacity-10{--tw-text-opacity:0.1}.sm\:text-opacity-20{--tw-text-opacity:0.2}.sm\:text-opacity-25{--tw-text-opacity:0.25}.sm\:text-opacity-30{--tw-text-opacity:0.3}.sm\:text-opacity-40{--tw-text-opacity:0.4}.sm\:text-opacity-50{--tw-text-opacity:0.5}.sm\:text-opacity-60{--tw-text-opacity:0.6}.sm\:text-opacity-70{--tw-text-opacity:0.7}.sm\:text-opacity-75{--tw-text-opacity:0.75}.sm\:text-opacity-80{--tw-text-opacity:0.8}.sm\:text-opacity-90{--tw-text-opacity:0.9}.sm\:text-opacity-95{--tw-text-opacity:0.95}.sm\:text-opacity-100{--tw-text-opacity:1}.group:hover .sm\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .sm\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .sm\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .sm\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .sm\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .sm\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .sm\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .sm\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .sm\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .sm\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .sm\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .sm\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .sm\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .sm\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .sm\:group-hover\:text-opacity-100{--tw-text-opacity:1}.sm\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.sm\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.sm\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.sm\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.sm\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.sm\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.sm\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.sm\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.sm\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.sm\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.sm\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.sm\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.sm\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.sm\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.sm\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.sm\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.sm\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.sm\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.sm\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.sm\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.sm\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.sm\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.sm\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.sm\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.sm\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.sm\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.sm\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.sm\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.sm\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.sm\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.sm\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.sm\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.sm\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.sm\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.sm\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.sm\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.sm\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.sm\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.sm\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.sm\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.sm\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.sm\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.sm\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.sm\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.sm\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.sm\:underline{text-decoration:underline}.sm\:line-through{text-decoration:line-through}.sm\:no-underline{text-decoration:none}.group:hover .sm\:group-hover\:underline{text-decoration:underline}.group:hover .sm\:group-hover\:line-through{text-decoration:line-through}.group:hover .sm\:group-hover\:no-underline{text-decoration:none}.sm\:focus-within\:underline:focus-within{text-decoration:underline}.sm\:focus-within\:line-through:focus-within{text-decoration:line-through}.sm\:focus-within\:no-underline:focus-within{text-decoration:none}.sm\:hover\:underline:hover{text-decoration:underline}.sm\:hover\:line-through:hover{text-decoration:line-through}.sm\:hover\:no-underline:hover{text-decoration:none}.sm\:focus\:underline:focus{text-decoration:underline}.sm\:focus\:line-through:focus{text-decoration:line-through}.sm\:focus\:no-underline:focus{text-decoration:none}.sm\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sm\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.sm\:placeholder-transparent::-moz-placeholder{color:transparent}.sm\:placeholder-transparent:-ms-input-placeholder{color:transparent}.sm\:placeholder-transparent::placeholder{color:transparent}.sm\:placeholder-current::-moz-placeholder{color:currentColor}.sm\:placeholder-current:-ms-input-placeholder{color:currentColor}.sm\:placeholder-current::placeholder{color:currentColor}.sm\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.sm\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus::placeholder{color:currentColor}.sm\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.sm\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.sm\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.sm\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.sm\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.sm\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.sm\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.sm\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.sm\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.sm\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.sm\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.sm\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.sm\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.sm\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.sm\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.sm\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.sm\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.sm\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.sm\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.sm\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.sm\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.sm\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.sm\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.sm\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.sm\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.sm\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.sm\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.sm\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.sm\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.sm\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.sm\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.sm\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.sm\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.sm\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.sm\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.sm\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.sm\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.sm\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.sm\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.sm\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.sm\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.sm\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.sm\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.sm\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.sm\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.sm\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.sm\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.sm\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.sm\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.sm\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.sm\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.sm\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.sm\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.sm\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.sm\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.sm\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.sm\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.sm\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.sm\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.sm\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.sm\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.sm\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.sm\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.sm\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.sm\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.sm\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.sm\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.sm\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.sm\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.sm\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.sm\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.sm\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.sm\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.sm\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.sm\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.sm\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.sm\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.sm\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.sm\:opacity-0{opacity:0}.sm\:opacity-5{opacity:.05}.sm\:opacity-10{opacity:.1}.sm\:opacity-20{opacity:.2}.sm\:opacity-25{opacity:.25}.sm\:opacity-30{opacity:.3}.sm\:opacity-40{opacity:.4}.sm\:opacity-50{opacity:.5}.sm\:opacity-60{opacity:.6}.sm\:opacity-70{opacity:.7}.sm\:opacity-75{opacity:.75}.sm\:opacity-80{opacity:.8}.sm\:opacity-90{opacity:.9}.sm\:opacity-95{opacity:.95}.sm\:opacity-100{opacity:1}.group:hover .sm\:group-hover\:opacity-0{opacity:0}.group:hover .sm\:group-hover\:opacity-5{opacity:.05}.group:hover .sm\:group-hover\:opacity-10{opacity:.1}.group:hover .sm\:group-hover\:opacity-20{opacity:.2}.group:hover .sm\:group-hover\:opacity-25{opacity:.25}.group:hover .sm\:group-hover\:opacity-30{opacity:.3}.group:hover .sm\:group-hover\:opacity-40{opacity:.4}.group:hover .sm\:group-hover\:opacity-50{opacity:.5}.group:hover .sm\:group-hover\:opacity-60{opacity:.6}.group:hover .sm\:group-hover\:opacity-70{opacity:.7}.group:hover .sm\:group-hover\:opacity-75{opacity:.75}.group:hover .sm\:group-hover\:opacity-80{opacity:.8}.group:hover .sm\:group-hover\:opacity-90{opacity:.9}.group:hover .sm\:group-hover\:opacity-95{opacity:.95}.group:hover .sm\:group-hover\:opacity-100{opacity:1}.sm\:focus-within\:opacity-0:focus-within{opacity:0}.sm\:focus-within\:opacity-5:focus-within{opacity:.05}.sm\:focus-within\:opacity-10:focus-within{opacity:.1}.sm\:focus-within\:opacity-20:focus-within{opacity:.2}.sm\:focus-within\:opacity-25:focus-within{opacity:.25}.sm\:focus-within\:opacity-30:focus-within{opacity:.3}.sm\:focus-within\:opacity-40:focus-within{opacity:.4}.sm\:focus-within\:opacity-50:focus-within{opacity:.5}.sm\:focus-within\:opacity-60:focus-within{opacity:.6}.sm\:focus-within\:opacity-70:focus-within{opacity:.7}.sm\:focus-within\:opacity-75:focus-within{opacity:.75}.sm\:focus-within\:opacity-80:focus-within{opacity:.8}.sm\:focus-within\:opacity-90:focus-within{opacity:.9}.sm\:focus-within\:opacity-95:focus-within{opacity:.95}.sm\:focus-within\:opacity-100:focus-within{opacity:1}.sm\:hover\:opacity-0:hover{opacity:0}.sm\:hover\:opacity-5:hover{opacity:.05}.sm\:hover\:opacity-10:hover{opacity:.1}.sm\:hover\:opacity-20:hover{opacity:.2}.sm\:hover\:opacity-25:hover{opacity:.25}.sm\:hover\:opacity-30:hover{opacity:.3}.sm\:hover\:opacity-40:hover{opacity:.4}.sm\:hover\:opacity-50:hover{opacity:.5}.sm\:hover\:opacity-60:hover{opacity:.6}.sm\:hover\:opacity-70:hover{opacity:.7}.sm\:hover\:opacity-75:hover{opacity:.75}.sm\:hover\:opacity-80:hover{opacity:.8}.sm\:hover\:opacity-90:hover{opacity:.9}.sm\:hover\:opacity-95:hover{opacity:.95}.sm\:hover\:opacity-100:hover{opacity:1}.sm\:focus\:opacity-0:focus{opacity:0}.sm\:focus\:opacity-5:focus{opacity:.05}.sm\:focus\:opacity-10:focus{opacity:.1}.sm\:focus\:opacity-20:focus{opacity:.2}.sm\:focus\:opacity-25:focus{opacity:.25}.sm\:focus\:opacity-30:focus{opacity:.3}.sm\:focus\:opacity-40:focus{opacity:.4}.sm\:focus\:opacity-50:focus{opacity:.5}.sm\:focus\:opacity-60:focus{opacity:.6}.sm\:focus\:opacity-70:focus{opacity:.7}.sm\:focus\:opacity-75:focus{opacity:.75}.sm\:focus\:opacity-80:focus{opacity:.8}.sm\:focus\:opacity-90:focus{opacity:.9}.sm\:focus\:opacity-95:focus{opacity:.95}.sm\:focus\:opacity-100:focus{opacity:1}.sm\:bg-blend-normal{background-blend-mode:normal}.sm\:bg-blend-multiply{background-blend-mode:multiply}.sm\:bg-blend-screen{background-blend-mode:screen}.sm\:bg-blend-overlay{background-blend-mode:overlay}.sm\:bg-blend-darken{background-blend-mode:darken}.sm\:bg-blend-lighten{background-blend-mode:lighten}.sm\:bg-blend-color-dodge{background-blend-mode:color-dodge}.sm\:bg-blend-color-burn{background-blend-mode:color-burn}.sm\:bg-blend-hard-light{background-blend-mode:hard-light}.sm\:bg-blend-soft-light{background-blend-mode:soft-light}.sm\:bg-blend-difference{background-blend-mode:difference}.sm\:bg-blend-exclusion{background-blend-mode:exclusion}.sm\:bg-blend-hue{background-blend-mode:hue}.sm\:bg-blend-saturation{background-blend-mode:saturation}.sm\:bg-blend-color{background-blend-mode:color}.sm\:bg-blend-luminosity{background-blend-mode:luminosity}.sm\:mix-blend-normal{mix-blend-mode:normal}.sm\:mix-blend-multiply{mix-blend-mode:multiply}.sm\:mix-blend-screen{mix-blend-mode:screen}.sm\:mix-blend-overlay{mix-blend-mode:overlay}.sm\:mix-blend-darken{mix-blend-mode:darken}.sm\:mix-blend-lighten{mix-blend-mode:lighten}.sm\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.sm\:mix-blend-color-burn{mix-blend-mode:color-burn}.sm\:mix-blend-hard-light{mix-blend-mode:hard-light}.sm\:mix-blend-soft-light{mix-blend-mode:soft-light}.sm\:mix-blend-difference{mix-blend-mode:difference}.sm\:mix-blend-exclusion{mix-blend-mode:exclusion}.sm\:mix-blend-hue{mix-blend-mode:hue}.sm\:mix-blend-saturation{mix-blend-mode:saturation}.sm\:mix-blend-color{mix-blend-mode:color}.sm\:mix-blend-luminosity{mix-blend-mode:luminosity}.sm\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.sm\:shadow,.sm\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.sm\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.sm\:shadow-lg,.sm\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.sm\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.sm\:shadow-2xl,.sm\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.sm\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.sm\:shadow-inner,.sm\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .sm\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .sm\:group-hover\:shadow,.group:hover .sm\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .sm\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .sm\:group-hover\:shadow-lg,.group:hover .sm\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .sm\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .sm\:group-hover\:shadow-2xl,.group:hover .sm\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .sm\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .sm\:group-hover\:shadow-inner,.group:hover .sm\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .sm\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.sm\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.sm\:hover\:shadow-sm:hover,.sm\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.sm\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.sm\:hover\:shadow-lg:hover,.sm\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.sm\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.sm\:hover\:shadow-2xl:hover,.sm\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.sm\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.sm\:hover\:shadow-inner:hover,.sm\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.sm\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.sm\:focus\:shadow-sm:focus,.sm\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.sm\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.sm\:focus\:shadow-lg:focus,.sm\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.sm\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.sm\:focus\:shadow-2xl:focus,.sm\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.sm\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.sm\:focus\:shadow-inner:focus,.sm\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.sm\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.sm\:outline-none{outline:2px solid transparent;outline-offset:2px}.sm\:outline-white{outline:2px dotted #fff;outline-offset:2px}.sm\:outline-black{outline:2px dotted #000;outline-offset:2px}.sm\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.sm\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.sm\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.sm\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.sm\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.sm\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.sm\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-0,.sm\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-2,.sm\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring,.sm\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-0:focus,.sm\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-2:focus,.sm\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:focus\:ring-8:focus,.sm\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.sm\:ring-inset{--tw-ring-inset:inset}.sm\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.sm\:focus\:ring-inset:focus{--tw-ring-inset:inset}.sm\:ring-transparent{--tw-ring-color:transparent}.sm\:ring-current{--tw-ring-color:currentColor}.sm\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.sm\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.sm\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.sm\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.sm\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.sm\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.sm\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.sm\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.sm\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.sm\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.sm\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.sm\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.sm\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.sm\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.sm\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.sm\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.sm\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.sm\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.sm\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.sm\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.sm\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.sm\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.sm\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.sm\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.sm\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.sm\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.sm\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.sm\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.sm\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.sm\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.sm\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.sm\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.sm\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.sm\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.sm\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.sm\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.sm\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.sm\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.sm\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.sm\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.sm\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.sm\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.sm\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.sm\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.sm\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.sm\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.sm\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.sm\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.sm\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.sm\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.sm\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.sm\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.sm\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.sm\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.sm\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.sm\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.sm\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.sm\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.sm\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.sm\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.sm\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.sm\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.sm\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.sm\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.sm\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.sm\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.sm\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.sm\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.sm\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.sm\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.sm\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.sm\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.sm\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.sm\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.sm\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.sm\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.sm\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.sm\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.sm\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.sm\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.sm\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.sm\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.sm\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.sm\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.sm\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.sm\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.sm\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.sm\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.sm\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.sm\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.sm\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.sm\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.sm\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.sm\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.sm\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.sm\:focus\:ring-current:focus{--tw-ring-color:currentColor}.sm\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.sm\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.sm\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.sm\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.sm\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.sm\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.sm\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.sm\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.sm\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.sm\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.sm\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.sm\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.sm\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.sm\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.sm\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.sm\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.sm\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.sm\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.sm\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.sm\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.sm\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.sm\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.sm\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.sm\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.sm\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.sm\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.sm\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.sm\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.sm\:ring-opacity-0{--tw-ring-opacity:0}.sm\:ring-opacity-5{--tw-ring-opacity:0.05}.sm\:ring-opacity-10{--tw-ring-opacity:0.1}.sm\:ring-opacity-20{--tw-ring-opacity:0.2}.sm\:ring-opacity-25{--tw-ring-opacity:0.25}.sm\:ring-opacity-30{--tw-ring-opacity:0.3}.sm\:ring-opacity-40{--tw-ring-opacity:0.4}.sm\:ring-opacity-50{--tw-ring-opacity:0.5}.sm\:ring-opacity-60{--tw-ring-opacity:0.6}.sm\:ring-opacity-70{--tw-ring-opacity:0.7}.sm\:ring-opacity-75{--tw-ring-opacity:0.75}.sm\:ring-opacity-80{--tw-ring-opacity:0.8}.sm\:ring-opacity-90{--tw-ring-opacity:0.9}.sm\:ring-opacity-95{--tw-ring-opacity:0.95}.sm\:ring-opacity-100{--tw-ring-opacity:1}.sm\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.sm\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.sm\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.sm\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.sm\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.sm\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.sm\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.sm\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.sm\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.sm\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.sm\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.sm\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.sm\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.sm\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.sm\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.sm\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.sm\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.sm\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.sm\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.sm\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.sm\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.sm\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.sm\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.sm\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.sm\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.sm\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.sm\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.sm\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.sm\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.sm\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.sm\:ring-offset-0{--tw-ring-offset-width:0px}.sm\:ring-offset-1{--tw-ring-offset-width:1px}.sm\:ring-offset-2{--tw-ring-offset-width:2px}.sm\:ring-offset-4{--tw-ring-offset-width:4px}.sm\:ring-offset-8{--tw-ring-offset-width:8px}.sm\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.sm\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.sm\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.sm\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.sm\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.sm\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.sm\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.sm\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.sm\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.sm\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.sm\:ring-offset-transparent{--tw-ring-offset-color:transparent}.sm\:ring-offset-current{--tw-ring-offset-color:currentColor}.sm\:ring-offset-black{--tw-ring-offset-color:#000}.sm\:ring-offset-white{--tw-ring-offset-color:#fff}.sm\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.sm\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.sm\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.sm\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.sm\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.sm\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.sm\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.sm\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.sm\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.sm\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.sm\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.sm\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.sm\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.sm\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.sm\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.sm\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.sm\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.sm\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.sm\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.sm\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.sm\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.sm\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.sm\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.sm\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.sm\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.sm\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.sm\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.sm\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.sm\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.sm\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.sm\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.sm\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.sm\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.sm\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.sm\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.sm\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.sm\:ring-offset-green-600{--tw-ring-offset-color:#059669}.sm\:ring-offset-green-700{--tw-ring-offset-color:#047857}.sm\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.sm\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.sm\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.sm\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.sm\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.sm\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.sm\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.sm\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.sm\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.sm\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.sm\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.sm\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.sm\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.sm\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.sm\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.sm\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.sm\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.sm\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.sm\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.sm\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.sm\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.sm\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.sm\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.sm\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.sm\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.sm\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.sm\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.sm\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.sm\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.sm\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.sm\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.sm\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.sm\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.sm\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.sm\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.sm\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.sm\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.sm\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.sm\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.sm\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.sm\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.sm\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.sm\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.sm\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.sm\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.sm\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.sm\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.sm\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.sm\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.sm\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.sm\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.sm\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.sm\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.sm\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.sm\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.sm\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.sm\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.sm\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.sm\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.sm\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.sm\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.sm\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.sm\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.sm\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.sm\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.sm\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.sm\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.sm\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.sm\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.sm\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.sm\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.sm\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.sm\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.sm\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.sm\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.sm\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.sm\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.sm\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.sm\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.sm\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.sm\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.sm\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.sm\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.sm\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.sm\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.sm\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.sm\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.sm\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.sm\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.sm\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.sm\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.sm\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.sm\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.sm\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.sm\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.sm\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.sm\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.sm\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.sm\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.sm\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.sm\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.sm\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.sm\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.sm\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.sm\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.sm\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.sm\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.sm\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.sm\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.sm\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.sm\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.sm\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.sm\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.sm\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.sm\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.sm\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.sm\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.sm\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.sm\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.sm\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.sm\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.sm\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.sm\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.sm\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.sm\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.sm\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.sm\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.sm\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.sm\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.sm\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.sm\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.sm\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.sm\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.sm\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.sm\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.sm\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.sm\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.sm\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.sm\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.sm\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.sm\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.sm\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.sm\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.sm\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.sm\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.sm\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.sm\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.sm\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.sm\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.sm\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.sm\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.sm\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.sm\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.sm\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.sm\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.sm\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.sm\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.sm\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.sm\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.sm\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.sm\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.sm\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.sm\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.sm\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.sm\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.sm\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.sm\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.sm\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.sm\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.sm\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.sm\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.sm\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.sm\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.sm\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.sm\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.sm\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.sm\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.sm\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.sm\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.sm\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.sm\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.sm\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.sm\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.sm\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.sm\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.sm\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.sm\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.sm\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.sm\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.sm\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.sm\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.sm\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.sm\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.sm\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.sm\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.sm\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.sm\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.sm\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.sm\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.sm\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.sm\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.sm\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.sm\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.sm\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.sm\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.sm\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.sm\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.sm\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.sm\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.sm\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.sm\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.sm\:filter-none{filter:none}.sm\:blur-0,.sm\:blur-none{--tw-blur:blur(0)}.sm\:blur-sm{--tw-blur:blur(4px)}.sm\:blur{--tw-blur:blur(8px)}.sm\:blur-md{--tw-blur:blur(12px)}.sm\:blur-lg{--tw-blur:blur(16px)}.sm\:blur-xl{--tw-blur:blur(24px)}.sm\:blur-2xl{--tw-blur:blur(40px)}.sm\:blur-3xl{--tw-blur:blur(64px)}.sm\:brightness-0{--tw-brightness:brightness(0)}.sm\:brightness-50{--tw-brightness:brightness(.5)}.sm\:brightness-75{--tw-brightness:brightness(.75)}.sm\:brightness-90{--tw-brightness:brightness(.9)}.sm\:brightness-95{--tw-brightness:brightness(.95)}.sm\:brightness-100{--tw-brightness:brightness(1)}.sm\:brightness-105{--tw-brightness:brightness(1.05)}.sm\:brightness-110{--tw-brightness:brightness(1.1)}.sm\:brightness-125{--tw-brightness:brightness(1.25)}.sm\:brightness-150{--tw-brightness:brightness(1.5)}.sm\:brightness-200{--tw-brightness:brightness(2)}.sm\:contrast-0{--tw-contrast:contrast(0)}.sm\:contrast-50{--tw-contrast:contrast(.5)}.sm\:contrast-75{--tw-contrast:contrast(.75)}.sm\:contrast-100{--tw-contrast:contrast(1)}.sm\:contrast-125{--tw-contrast:contrast(1.25)}.sm\:contrast-150{--tw-contrast:contrast(1.5)}.sm\:contrast-200{--tw-contrast:contrast(2)}.sm\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.sm\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.sm\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.sm\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.sm\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.sm\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.sm\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.sm\:grayscale-0{--tw-grayscale:grayscale(0)}.sm\:grayscale{--tw-grayscale:grayscale(100%)}.sm\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.sm\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.sm\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.sm\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.sm\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.sm\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.sm\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.sm\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.sm\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.sm\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.sm\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.sm\:invert-0{--tw-invert:invert(0)}.sm\:invert{--tw-invert:invert(100%)}.sm\:saturate-0{--tw-saturate:saturate(0)}.sm\:saturate-50{--tw-saturate:saturate(.5)}.sm\:saturate-100{--tw-saturate:saturate(1)}.sm\:saturate-150{--tw-saturate:saturate(1.5)}.sm\:saturate-200{--tw-saturate:saturate(2)}.sm\:sepia-0{--tw-sepia:sepia(0)}.sm\:sepia{--tw-sepia:sepia(100%)}.sm\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.sm\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.sm\:backdrop-blur-0,.sm\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.sm\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.sm\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.sm\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.sm\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.sm\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.sm\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.sm\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.sm\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.sm\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.sm\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.sm\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.sm\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.sm\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.sm\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.sm\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.sm\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.sm\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.sm\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.sm\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.sm\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.sm\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.sm\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.sm\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.sm\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.sm\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.sm\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.sm\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.sm\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.sm\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.sm\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.sm\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.sm\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.sm\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.sm\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.sm\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.sm\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.sm\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.sm\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.sm\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.sm\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.sm\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.sm\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.sm\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.sm\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.sm\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.sm\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.sm\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.sm\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.sm\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.sm\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.sm\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.sm\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.sm\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.sm\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.sm\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.sm\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.sm\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.sm\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.sm\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.sm\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.sm\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.sm\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.sm\:transition-none{transition-property:none}.sm\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sm\:delay-75{transition-delay:75ms}.sm\:delay-100{transition-delay:.1s}.sm\:delay-150{transition-delay:.15s}.sm\:delay-200{transition-delay:.2s}.sm\:delay-300{transition-delay:.3s}.sm\:delay-500{transition-delay:.5s}.sm\:delay-700{transition-delay:.7s}.sm\:delay-1000{transition-delay:1s}.sm\:duration-75{transition-duration:75ms}.sm\:duration-100{transition-duration:.1s}.sm\:duration-150{transition-duration:.15s}.sm\:duration-200{transition-duration:.2s}.sm\:duration-300{transition-duration:.3s}.sm\:duration-500{transition-duration:.5s}.sm\:duration-700{transition-duration:.7s}.sm\:duration-1000{transition-duration:1s}.sm\:ease-linear{transition-timing-function:linear}.sm\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.sm\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.sm\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}@media (min-width:1536px){.md\:container{max-width:1536px}}.md\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:pointer-events-none{pointer-events:none}.md\:pointer-events-auto{pointer-events:auto}.md\:visible{visibility:visible}.md\:invisible{visibility:hidden}.md\:static{position:static}.md\:fixed{position:fixed}.md\:absolute{position:absolute}.md\:relative{position:relative}.md\:sticky{position:-webkit-sticky;position:sticky}.md\:inset-0{top:0;right:0;bottom:0;left:0}.md\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.md\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.md\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.md\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.md\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.md\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.md\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.md\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.md\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.md\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.md\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.md\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.md\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.md\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.md\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.md\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.md\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.md\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.md\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.md\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.md\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.md\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.md\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.md\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.md\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.md\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.md\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.md\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.md\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.md\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.md\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.md\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.md\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.md\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.md\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.md\:-inset-0{top:0;right:0;bottom:0;left:0}.md\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.md\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.md\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.md\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.md\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.md\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.md\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.md\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.md\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.md\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.md\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.md\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.md\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.md\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.md\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.md\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.md\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.md\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.md\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.md\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.md\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.md\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.md\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.md\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.md\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.md\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.md\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.md\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.md\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.md\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.md\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.md\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.md\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.md\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.md\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.md\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.md\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.md\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.md\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.md\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.md\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.md\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.md\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.md\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.md\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.md\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.md\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.md\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.md\:inset-x-0{left:0;right:0}.md\:inset-x-1{left:.25rem;right:.25rem}.md\:inset-x-2{left:.5rem;right:.5rem}.md\:inset-x-3{left:.75rem;right:.75rem}.md\:inset-x-4{left:1rem;right:1rem}.md\:inset-x-5{left:1.25rem;right:1.25rem}.md\:inset-x-6{left:1.5rem;right:1.5rem}.md\:inset-x-7{left:1.75rem;right:1.75rem}.md\:inset-x-8{left:2rem;right:2rem}.md\:inset-x-9{left:2.25rem;right:2.25rem}.md\:inset-x-10{left:2.5rem;right:2.5rem}.md\:inset-x-11{left:2.75rem;right:2.75rem}.md\:inset-x-12{left:3rem;right:3rem}.md\:inset-x-14{left:3.5rem;right:3.5rem}.md\:inset-x-16{left:4rem;right:4rem}.md\:inset-x-20{left:5rem;right:5rem}.md\:inset-x-24{left:6rem;right:6rem}.md\:inset-x-28{left:7rem;right:7rem}.md\:inset-x-32{left:8rem;right:8rem}.md\:inset-x-36{left:9rem;right:9rem}.md\:inset-x-40{left:10rem;right:10rem}.md\:inset-x-44{left:11rem;right:11rem}.md\:inset-x-48{left:12rem;right:12rem}.md\:inset-x-52{left:13rem;right:13rem}.md\:inset-x-56{left:14rem;right:14rem}.md\:inset-x-60{left:15rem;right:15rem}.md\:inset-x-64{left:16rem;right:16rem}.md\:inset-x-72{left:18rem;right:18rem}.md\:inset-x-80{left:20rem;right:20rem}.md\:inset-x-96{left:24rem;right:24rem}.md\:inset-x-auto{left:auto;right:auto}.md\:inset-x-px{left:1px;right:1px}.md\:inset-x-0\.5{left:.125rem;right:.125rem}.md\:inset-x-1\.5{left:.375rem;right:.375rem}.md\:inset-x-2\.5{left:.625rem;right:.625rem}.md\:inset-x-3\.5{left:.875rem;right:.875rem}.md\:-inset-x-0{left:0;right:0}.md\:-inset-x-1{left:-.25rem;right:-.25rem}.md\:-inset-x-2{left:-.5rem;right:-.5rem}.md\:-inset-x-3{left:-.75rem;right:-.75rem}.md\:-inset-x-4{left:-1rem;right:-1rem}.md\:-inset-x-5{left:-1.25rem;right:-1.25rem}.md\:-inset-x-6{left:-1.5rem;right:-1.5rem}.md\:-inset-x-7{left:-1.75rem;right:-1.75rem}.md\:-inset-x-8{left:-2rem;right:-2rem}.md\:-inset-x-9{left:-2.25rem;right:-2.25rem}.md\:-inset-x-10{left:-2.5rem;right:-2.5rem}.md\:-inset-x-11{left:-2.75rem;right:-2.75rem}.md\:-inset-x-12{left:-3rem;right:-3rem}.md\:-inset-x-14{left:-3.5rem;right:-3.5rem}.md\:-inset-x-16{left:-4rem;right:-4rem}.md\:-inset-x-20{left:-5rem;right:-5rem}.md\:-inset-x-24{left:-6rem;right:-6rem}.md\:-inset-x-28{left:-7rem;right:-7rem}.md\:-inset-x-32{left:-8rem;right:-8rem}.md\:-inset-x-36{left:-9rem;right:-9rem}.md\:-inset-x-40{left:-10rem;right:-10rem}.md\:-inset-x-44{left:-11rem;right:-11rem}.md\:-inset-x-48{left:-12rem;right:-12rem}.md\:-inset-x-52{left:-13rem;right:-13rem}.md\:-inset-x-56{left:-14rem;right:-14rem}.md\:-inset-x-60{left:-15rem;right:-15rem}.md\:-inset-x-64{left:-16rem;right:-16rem}.md\:-inset-x-72{left:-18rem;right:-18rem}.md\:-inset-x-80{left:-20rem;right:-20rem}.md\:-inset-x-96{left:-24rem;right:-24rem}.md\:-inset-x-px{left:-1px;right:-1px}.md\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.md\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.md\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.md\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.md\:inset-x-1\/2{left:50%;right:50%}.md\:inset-x-1\/3{left:33.333333%;right:33.333333%}.md\:inset-x-2\/3{left:66.666667%;right:66.666667%}.md\:inset-x-1\/4{left:25%;right:25%}.md\:inset-x-2\/4{left:50%;right:50%}.md\:inset-x-3\/4{left:75%;right:75%}.md\:inset-x-full{left:100%;right:100%}.md\:-inset-x-1\/2{left:-50%;right:-50%}.md\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.md\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.md\:-inset-x-1\/4{left:-25%;right:-25%}.md\:-inset-x-2\/4{left:-50%;right:-50%}.md\:-inset-x-3\/4{left:-75%;right:-75%}.md\:-inset-x-full{left:-100%;right:-100%}.md\:inset-y-0{top:0;bottom:0}.md\:inset-y-1{top:.25rem;bottom:.25rem}.md\:inset-y-2{top:.5rem;bottom:.5rem}.md\:inset-y-3{top:.75rem;bottom:.75rem}.md\:inset-y-4{top:1rem;bottom:1rem}.md\:inset-y-5{top:1.25rem;bottom:1.25rem}.md\:inset-y-6{top:1.5rem;bottom:1.5rem}.md\:inset-y-7{top:1.75rem;bottom:1.75rem}.md\:inset-y-8{top:2rem;bottom:2rem}.md\:inset-y-9{top:2.25rem;bottom:2.25rem}.md\:inset-y-10{top:2.5rem;bottom:2.5rem}.md\:inset-y-11{top:2.75rem;bottom:2.75rem}.md\:inset-y-12{top:3rem;bottom:3rem}.md\:inset-y-14{top:3.5rem;bottom:3.5rem}.md\:inset-y-16{top:4rem;bottom:4rem}.md\:inset-y-20{top:5rem;bottom:5rem}.md\:inset-y-24{top:6rem;bottom:6rem}.md\:inset-y-28{top:7rem;bottom:7rem}.md\:inset-y-32{top:8rem;bottom:8rem}.md\:inset-y-36{top:9rem;bottom:9rem}.md\:inset-y-40{top:10rem;bottom:10rem}.md\:inset-y-44{top:11rem;bottom:11rem}.md\:inset-y-48{top:12rem;bottom:12rem}.md\:inset-y-52{top:13rem;bottom:13rem}.md\:inset-y-56{top:14rem;bottom:14rem}.md\:inset-y-60{top:15rem;bottom:15rem}.md\:inset-y-64{top:16rem;bottom:16rem}.md\:inset-y-72{top:18rem;bottom:18rem}.md\:inset-y-80{top:20rem;bottom:20rem}.md\:inset-y-96{top:24rem;bottom:24rem}.md\:inset-y-auto{top:auto;bottom:auto}.md\:inset-y-px{top:1px;bottom:1px}.md\:inset-y-0\.5{top:.125rem;bottom:.125rem}.md\:inset-y-1\.5{top:.375rem;bottom:.375rem}.md\:inset-y-2\.5{top:.625rem;bottom:.625rem}.md\:inset-y-3\.5{top:.875rem;bottom:.875rem}.md\:-inset-y-0{top:0;bottom:0}.md\:-inset-y-1{top:-.25rem;bottom:-.25rem}.md\:-inset-y-2{top:-.5rem;bottom:-.5rem}.md\:-inset-y-3{top:-.75rem;bottom:-.75rem}.md\:-inset-y-4{top:-1rem;bottom:-1rem}.md\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.md\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.md\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.md\:-inset-y-8{top:-2rem;bottom:-2rem}.md\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.md\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.md\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.md\:-inset-y-12{top:-3rem;bottom:-3rem}.md\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.md\:-inset-y-16{top:-4rem;bottom:-4rem}.md\:-inset-y-20{top:-5rem;bottom:-5rem}.md\:-inset-y-24{top:-6rem;bottom:-6rem}.md\:-inset-y-28{top:-7rem;bottom:-7rem}.md\:-inset-y-32{top:-8rem;bottom:-8rem}.md\:-inset-y-36{top:-9rem;bottom:-9rem}.md\:-inset-y-40{top:-10rem;bottom:-10rem}.md\:-inset-y-44{top:-11rem;bottom:-11rem}.md\:-inset-y-48{top:-12rem;bottom:-12rem}.md\:-inset-y-52{top:-13rem;bottom:-13rem}.md\:-inset-y-56{top:-14rem;bottom:-14rem}.md\:-inset-y-60{top:-15rem;bottom:-15rem}.md\:-inset-y-64{top:-16rem;bottom:-16rem}.md\:-inset-y-72{top:-18rem;bottom:-18rem}.md\:-inset-y-80{top:-20rem;bottom:-20rem}.md\:-inset-y-96{top:-24rem;bottom:-24rem}.md\:-inset-y-px{top:-1px;bottom:-1px}.md\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.md\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.md\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.md\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.md\:inset-y-1\/2{top:50%;bottom:50%}.md\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.md\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.md\:inset-y-1\/4{top:25%;bottom:25%}.md\:inset-y-2\/4{top:50%;bottom:50%}.md\:inset-y-3\/4{top:75%;bottom:75%}.md\:inset-y-full{top:100%;bottom:100%}.md\:-inset-y-1\/2{top:-50%;bottom:-50%}.md\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.md\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.md\:-inset-y-1\/4{top:-25%;bottom:-25%}.md\:-inset-y-2\/4{top:-50%;bottom:-50%}.md\:-inset-y-3\/4{top:-75%;bottom:-75%}.md\:-inset-y-full{top:-100%;bottom:-100%}.md\:top-0{top:0}.md\:top-1{top:.25rem}.md\:top-2{top:.5rem}.md\:top-3{top:.75rem}.md\:top-4{top:1rem}.md\:top-5{top:1.25rem}.md\:top-6{top:1.5rem}.md\:top-7{top:1.75rem}.md\:top-8{top:2rem}.md\:top-9{top:2.25rem}.md\:top-10{top:2.5rem}.md\:top-11{top:2.75rem}.md\:top-12{top:3rem}.md\:top-14{top:3.5rem}.md\:top-16{top:4rem}.md\:top-20{top:5rem}.md\:top-24{top:6rem}.md\:top-28{top:7rem}.md\:top-32{top:8rem}.md\:top-36{top:9rem}.md\:top-40{top:10rem}.md\:top-44{top:11rem}.md\:top-48{top:12rem}.md\:top-52{top:13rem}.md\:top-56{top:14rem}.md\:top-60{top:15rem}.md\:top-64{top:16rem}.md\:top-72{top:18rem}.md\:top-80{top:20rem}.md\:top-96{top:24rem}.md\:top-auto{top:auto}.md\:top-px{top:1px}.md\:top-0\.5{top:.125rem}.md\:top-1\.5{top:.375rem}.md\:top-2\.5{top:.625rem}.md\:top-3\.5{top:.875rem}.md\:-top-0{top:0}.md\:-top-1{top:-.25rem}.md\:-top-2{top:-.5rem}.md\:-top-3{top:-.75rem}.md\:-top-4{top:-1rem}.md\:-top-5{top:-1.25rem}.md\:-top-6{top:-1.5rem}.md\:-top-7{top:-1.75rem}.md\:-top-8{top:-2rem}.md\:-top-9{top:-2.25rem}.md\:-top-10{top:-2.5rem}.md\:-top-11{top:-2.75rem}.md\:-top-12{top:-3rem}.md\:-top-14{top:-3.5rem}.md\:-top-16{top:-4rem}.md\:-top-20{top:-5rem}.md\:-top-24{top:-6rem}.md\:-top-28{top:-7rem}.md\:-top-32{top:-8rem}.md\:-top-36{top:-9rem}.md\:-top-40{top:-10rem}.md\:-top-44{top:-11rem}.md\:-top-48{top:-12rem}.md\:-top-52{top:-13rem}.md\:-top-56{top:-14rem}.md\:-top-60{top:-15rem}.md\:-top-64{top:-16rem}.md\:-top-72{top:-18rem}.md\:-top-80{top:-20rem}.md\:-top-96{top:-24rem}.md\:-top-px{top:-1px}.md\:-top-0\.5{top:-.125rem}.md\:-top-1\.5{top:-.375rem}.md\:-top-2\.5{top:-.625rem}.md\:-top-3\.5{top:-.875rem}.md\:top-1\/2{top:50%}.md\:top-1\/3{top:33.333333%}.md\:top-2\/3{top:66.666667%}.md\:top-1\/4{top:25%}.md\:top-2\/4{top:50%}.md\:top-3\/4{top:75%}.md\:top-full{top:100%}.md\:-top-1\/2{top:-50%}.md\:-top-1\/3{top:-33.333333%}.md\:-top-2\/3{top:-66.666667%}.md\:-top-1\/4{top:-25%}.md\:-top-2\/4{top:-50%}.md\:-top-3\/4{top:-75%}.md\:-top-full{top:-100%}.md\:right-0{right:0}.md\:right-1{right:.25rem}.md\:right-2{right:.5rem}.md\:right-3{right:.75rem}.md\:right-4{right:1rem}.md\:right-5{right:1.25rem}.md\:right-6{right:1.5rem}.md\:right-7{right:1.75rem}.md\:right-8{right:2rem}.md\:right-9{right:2.25rem}.md\:right-10{right:2.5rem}.md\:right-11{right:2.75rem}.md\:right-12{right:3rem}.md\:right-14{right:3.5rem}.md\:right-16{right:4rem}.md\:right-20{right:5rem}.md\:right-24{right:6rem}.md\:right-28{right:7rem}.md\:right-32{right:8rem}.md\:right-36{right:9rem}.md\:right-40{right:10rem}.md\:right-44{right:11rem}.md\:right-48{right:12rem}.md\:right-52{right:13rem}.md\:right-56{right:14rem}.md\:right-60{right:15rem}.md\:right-64{right:16rem}.md\:right-72{right:18rem}.md\:right-80{right:20rem}.md\:right-96{right:24rem}.md\:right-auto{right:auto}.md\:right-px{right:1px}.md\:right-0\.5{right:.125rem}.md\:right-1\.5{right:.375rem}.md\:right-2\.5{right:.625rem}.md\:right-3\.5{right:.875rem}.md\:-right-0{right:0}.md\:-right-1{right:-.25rem}.md\:-right-2{right:-.5rem}.md\:-right-3{right:-.75rem}.md\:-right-4{right:-1rem}.md\:-right-5{right:-1.25rem}.md\:-right-6{right:-1.5rem}.md\:-right-7{right:-1.75rem}.md\:-right-8{right:-2rem}.md\:-right-9{right:-2.25rem}.md\:-right-10{right:-2.5rem}.md\:-right-11{right:-2.75rem}.md\:-right-12{right:-3rem}.md\:-right-14{right:-3.5rem}.md\:-right-16{right:-4rem}.md\:-right-20{right:-5rem}.md\:-right-24{right:-6rem}.md\:-right-28{right:-7rem}.md\:-right-32{right:-8rem}.md\:-right-36{right:-9rem}.md\:-right-40{right:-10rem}.md\:-right-44{right:-11rem}.md\:-right-48{right:-12rem}.md\:-right-52{right:-13rem}.md\:-right-56{right:-14rem}.md\:-right-60{right:-15rem}.md\:-right-64{right:-16rem}.md\:-right-72{right:-18rem}.md\:-right-80{right:-20rem}.md\:-right-96{right:-24rem}.md\:-right-px{right:-1px}.md\:-right-0\.5{right:-.125rem}.md\:-right-1\.5{right:-.375rem}.md\:-right-2\.5{right:-.625rem}.md\:-right-3\.5{right:-.875rem}.md\:right-1\/2{right:50%}.md\:right-1\/3{right:33.333333%}.md\:right-2\/3{right:66.666667%}.md\:right-1\/4{right:25%}.md\:right-2\/4{right:50%}.md\:right-3\/4{right:75%}.md\:right-full{right:100%}.md\:-right-1\/2{right:-50%}.md\:-right-1\/3{right:-33.333333%}.md\:-right-2\/3{right:-66.666667%}.md\:-right-1\/4{right:-25%}.md\:-right-2\/4{right:-50%}.md\:-right-3\/4{right:-75%}.md\:-right-full{right:-100%}.md\:bottom-0{bottom:0}.md\:bottom-1{bottom:.25rem}.md\:bottom-2{bottom:.5rem}.md\:bottom-3{bottom:.75rem}.md\:bottom-4{bottom:1rem}.md\:bottom-5{bottom:1.25rem}.md\:bottom-6{bottom:1.5rem}.md\:bottom-7{bottom:1.75rem}.md\:bottom-8{bottom:2rem}.md\:bottom-9{bottom:2.25rem}.md\:bottom-10{bottom:2.5rem}.md\:bottom-11{bottom:2.75rem}.md\:bottom-12{bottom:3rem}.md\:bottom-14{bottom:3.5rem}.md\:bottom-16{bottom:4rem}.md\:bottom-20{bottom:5rem}.md\:bottom-24{bottom:6rem}.md\:bottom-28{bottom:7rem}.md\:bottom-32{bottom:8rem}.md\:bottom-36{bottom:9rem}.md\:bottom-40{bottom:10rem}.md\:bottom-44{bottom:11rem}.md\:bottom-48{bottom:12rem}.md\:bottom-52{bottom:13rem}.md\:bottom-56{bottom:14rem}.md\:bottom-60{bottom:15rem}.md\:bottom-64{bottom:16rem}.md\:bottom-72{bottom:18rem}.md\:bottom-80{bottom:20rem}.md\:bottom-96{bottom:24rem}.md\:bottom-auto{bottom:auto}.md\:bottom-px{bottom:1px}.md\:bottom-0\.5{bottom:.125rem}.md\:bottom-1\.5{bottom:.375rem}.md\:bottom-2\.5{bottom:.625rem}.md\:bottom-3\.5{bottom:.875rem}.md\:-bottom-0{bottom:0}.md\:-bottom-1{bottom:-.25rem}.md\:-bottom-2{bottom:-.5rem}.md\:-bottom-3{bottom:-.75rem}.md\:-bottom-4{bottom:-1rem}.md\:-bottom-5{bottom:-1.25rem}.md\:-bottom-6{bottom:-1.5rem}.md\:-bottom-7{bottom:-1.75rem}.md\:-bottom-8{bottom:-2rem}.md\:-bottom-9{bottom:-2.25rem}.md\:-bottom-10{bottom:-2.5rem}.md\:-bottom-11{bottom:-2.75rem}.md\:-bottom-12{bottom:-3rem}.md\:-bottom-14{bottom:-3.5rem}.md\:-bottom-16{bottom:-4rem}.md\:-bottom-20{bottom:-5rem}.md\:-bottom-24{bottom:-6rem}.md\:-bottom-28{bottom:-7rem}.md\:-bottom-32{bottom:-8rem}.md\:-bottom-36{bottom:-9rem}.md\:-bottom-40{bottom:-10rem}.md\:-bottom-44{bottom:-11rem}.md\:-bottom-48{bottom:-12rem}.md\:-bottom-52{bottom:-13rem}.md\:-bottom-56{bottom:-14rem}.md\:-bottom-60{bottom:-15rem}.md\:-bottom-64{bottom:-16rem}.md\:-bottom-72{bottom:-18rem}.md\:-bottom-80{bottom:-20rem}.md\:-bottom-96{bottom:-24rem}.md\:-bottom-px{bottom:-1px}.md\:-bottom-0\.5{bottom:-.125rem}.md\:-bottom-1\.5{bottom:-.375rem}.md\:-bottom-2\.5{bottom:-.625rem}.md\:-bottom-3\.5{bottom:-.875rem}.md\:bottom-1\/2{bottom:50%}.md\:bottom-1\/3{bottom:33.333333%}.md\:bottom-2\/3{bottom:66.666667%}.md\:bottom-1\/4{bottom:25%}.md\:bottom-2\/4{bottom:50%}.md\:bottom-3\/4{bottom:75%}.md\:bottom-full{bottom:100%}.md\:-bottom-1\/2{bottom:-50%}.md\:-bottom-1\/3{bottom:-33.333333%}.md\:-bottom-2\/3{bottom:-66.666667%}.md\:-bottom-1\/4{bottom:-25%}.md\:-bottom-2\/4{bottom:-50%}.md\:-bottom-3\/4{bottom:-75%}.md\:-bottom-full{bottom:-100%}.md\:left-0{left:0}.md\:left-1{left:.25rem}.md\:left-2{left:.5rem}.md\:left-3{left:.75rem}.md\:left-4{left:1rem}.md\:left-5{left:1.25rem}.md\:left-6{left:1.5rem}.md\:left-7{left:1.75rem}.md\:left-8{left:2rem}.md\:left-9{left:2.25rem}.md\:left-10{left:2.5rem}.md\:left-11{left:2.75rem}.md\:left-12{left:3rem}.md\:left-14{left:3.5rem}.md\:left-16{left:4rem}.md\:left-20{left:5rem}.md\:left-24{left:6rem}.md\:left-28{left:7rem}.md\:left-32{left:8rem}.md\:left-36{left:9rem}.md\:left-40{left:10rem}.md\:left-44{left:11rem}.md\:left-48{left:12rem}.md\:left-52{left:13rem}.md\:left-56{left:14rem}.md\:left-60{left:15rem}.md\:left-64{left:16rem}.md\:left-72{left:18rem}.md\:left-80{left:20rem}.md\:left-96{left:24rem}.md\:left-auto{left:auto}.md\:left-px{left:1px}.md\:left-0\.5{left:.125rem}.md\:left-1\.5{left:.375rem}.md\:left-2\.5{left:.625rem}.md\:left-3\.5{left:.875rem}.md\:-left-0{left:0}.md\:-left-1{left:-.25rem}.md\:-left-2{left:-.5rem}.md\:-left-3{left:-.75rem}.md\:-left-4{left:-1rem}.md\:-left-5{left:-1.25rem}.md\:-left-6{left:-1.5rem}.md\:-left-7{left:-1.75rem}.md\:-left-8{left:-2rem}.md\:-left-9{left:-2.25rem}.md\:-left-10{left:-2.5rem}.md\:-left-11{left:-2.75rem}.md\:-left-12{left:-3rem}.md\:-left-14{left:-3.5rem}.md\:-left-16{left:-4rem}.md\:-left-20{left:-5rem}.md\:-left-24{left:-6rem}.md\:-left-28{left:-7rem}.md\:-left-32{left:-8rem}.md\:-left-36{left:-9rem}.md\:-left-40{left:-10rem}.md\:-left-44{left:-11rem}.md\:-left-48{left:-12rem}.md\:-left-52{left:-13rem}.md\:-left-56{left:-14rem}.md\:-left-60{left:-15rem}.md\:-left-64{left:-16rem}.md\:-left-72{left:-18rem}.md\:-left-80{left:-20rem}.md\:-left-96{left:-24rem}.md\:-left-px{left:-1px}.md\:-left-0\.5{left:-.125rem}.md\:-left-1\.5{left:-.375rem}.md\:-left-2\.5{left:-.625rem}.md\:-left-3\.5{left:-.875rem}.md\:left-1\/2{left:50%}.md\:left-1\/3{left:33.333333%}.md\:left-2\/3{left:66.666667%}.md\:left-1\/4{left:25%}.md\:left-2\/4{left:50%}.md\:left-3\/4{left:75%}.md\:left-full{left:100%}.md\:-left-1\/2{left:-50%}.md\:-left-1\/3{left:-33.333333%}.md\:-left-2\/3{left:-66.666667%}.md\:-left-1\/4{left:-25%}.md\:-left-2\/4{left:-50%}.md\:-left-3\/4{left:-75%}.md\:-left-full{left:-100%}.md\:isolate{isolation:isolate}.md\:isolation-auto{isolation:auto}.md\:z-0{z-index:0}.md\:z-10{z-index:10}.md\:z-20{z-index:20}.md\:z-30{z-index:30}.md\:z-40{z-index:40}.md\:z-50{z-index:50}.md\:z-auto{z-index:auto}.md\:focus-within\:z-0:focus-within{z-index:0}.md\:focus-within\:z-10:focus-within{z-index:10}.md\:focus-within\:z-20:focus-within{z-index:20}.md\:focus-within\:z-30:focus-within{z-index:30}.md\:focus-within\:z-40:focus-within{z-index:40}.md\:focus-within\:z-50:focus-within{z-index:50}.md\:focus-within\:z-auto:focus-within{z-index:auto}.md\:focus\:z-0:focus{z-index:0}.md\:focus\:z-10:focus{z-index:10}.md\:focus\:z-20:focus{z-index:20}.md\:focus\:z-30:focus{z-index:30}.md\:focus\:z-40:focus{z-index:40}.md\:focus\:z-50:focus{z-index:50}.md\:focus\:z-auto:focus{z-index:auto}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-4{order:4}.md\:order-5{order:5}.md\:order-6{order:6}.md\:order-7{order:7}.md\:order-8{order:8}.md\:order-9{order:9}.md\:order-10{order:10}.md\:order-11{order:11}.md\:order-12{order:12}.md\:order-first{order:-9999}.md\:order-last{order:9999}.md\:order-none{order:0}.md\:col-auto{grid-column:auto}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:col-start-1{grid-column-start:1}.md\:col-start-2{grid-column-start:2}.md\:col-start-3{grid-column-start:3}.md\:col-start-4{grid-column-start:4}.md\:col-start-5{grid-column-start:5}.md\:col-start-6{grid-column-start:6}.md\:col-start-7{grid-column-start:7}.md\:col-start-8{grid-column-start:8}.md\:col-start-9{grid-column-start:9}.md\:col-start-10{grid-column-start:10}.md\:col-start-11{grid-column-start:11}.md\:col-start-12{grid-column-start:12}.md\:col-start-13{grid-column-start:13}.md\:col-start-auto{grid-column-start:auto}.md\:col-end-1{grid-column-end:1}.md\:col-end-2{grid-column-end:2}.md\:col-end-3{grid-column-end:3}.md\:col-end-4{grid-column-end:4}.md\:col-end-5{grid-column-end:5}.md\:col-end-6{grid-column-end:6}.md\:col-end-7{grid-column-end:7}.md\:col-end-8{grid-column-end:8}.md\:col-end-9{grid-column-end:9}.md\:col-end-10{grid-column-end:10}.md\:col-end-11{grid-column-end:11}.md\:col-end-12{grid-column-end:12}.md\:col-end-13{grid-column-end:13}.md\:col-end-auto{grid-column-end:auto}.md\:row-auto{grid-row:auto}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-3{grid-row:span 3/span 3}.md\:row-span-4{grid-row:span 4/span 4}.md\:row-span-5{grid-row:span 5/span 5}.md\:row-span-6{grid-row:span 6/span 6}.md\:row-span-full{grid-row:1/-1}.md\:row-start-1{grid-row-start:1}.md\:row-start-2{grid-row-start:2}.md\:row-start-3{grid-row-start:3}.md\:row-start-4{grid-row-start:4}.md\:row-start-5{grid-row-start:5}.md\:row-start-6{grid-row-start:6}.md\:row-start-7{grid-row-start:7}.md\:row-start-auto{grid-row-start:auto}.md\:row-end-1{grid-row-end:1}.md\:row-end-2{grid-row-end:2}.md\:row-end-3{grid-row-end:3}.md\:row-end-4{grid-row-end:4}.md\:row-end-5{grid-row-end:5}.md\:row-end-6{grid-row-end:6}.md\:row-end-7{grid-row-end:7}.md\:row-end-auto{grid-row-end:auto}.md\:float-right{float:right}.md\:float-left{float:left}.md\:float-none{float:none}.md\:clear-left{clear:left}.md\:clear-right{clear:right}.md\:clear-both{clear:both}.md\:clear-none{clear:none}.md\:m-0{margin:0}.md\:m-1{margin:.25rem}.md\:m-2{margin:.5rem}.md\:m-3{margin:.75rem}.md\:m-4{margin:1rem}.md\:m-5{margin:1.25rem}.md\:m-6{margin:1.5rem}.md\:m-7{margin:1.75rem}.md\:m-8{margin:2rem}.md\:m-9{margin:2.25rem}.md\:m-10{margin:2.5rem}.md\:m-11{margin:2.75rem}.md\:m-12{margin:3rem}.md\:m-14{margin:3.5rem}.md\:m-16{margin:4rem}.md\:m-20{margin:5rem}.md\:m-24{margin:6rem}.md\:m-28{margin:7rem}.md\:m-32{margin:8rem}.md\:m-36{margin:9rem}.md\:m-40{margin:10rem}.md\:m-44{margin:11rem}.md\:m-48{margin:12rem}.md\:m-52{margin:13rem}.md\:m-56{margin:14rem}.md\:m-60{margin:15rem}.md\:m-64{margin:16rem}.md\:m-72{margin:18rem}.md\:m-80{margin:20rem}.md\:m-96{margin:24rem}.md\:m-auto{margin:auto}.md\:m-px{margin:1px}.md\:m-0\.5{margin:.125rem}.md\:m-1\.5{margin:.375rem}.md\:m-2\.5{margin:.625rem}.md\:m-3\.5{margin:.875rem}.md\:-m-0{margin:0}.md\:-m-1{margin:-.25rem}.md\:-m-2{margin:-.5rem}.md\:-m-3{margin:-.75rem}.md\:-m-4{margin:-1rem}.md\:-m-5{margin:-1.25rem}.md\:-m-6{margin:-1.5rem}.md\:-m-7{margin:-1.75rem}.md\:-m-8{margin:-2rem}.md\:-m-9{margin:-2.25rem}.md\:-m-10{margin:-2.5rem}.md\:-m-11{margin:-2.75rem}.md\:-m-12{margin:-3rem}.md\:-m-14{margin:-3.5rem}.md\:-m-16{margin:-4rem}.md\:-m-20{margin:-5rem}.md\:-m-24{margin:-6rem}.md\:-m-28{margin:-7rem}.md\:-m-32{margin:-8rem}.md\:-m-36{margin:-9rem}.md\:-m-40{margin:-10rem}.md\:-m-44{margin:-11rem}.md\:-m-48{margin:-12rem}.md\:-m-52{margin:-13rem}.md\:-m-56{margin:-14rem}.md\:-m-60{margin:-15rem}.md\:-m-64{margin:-16rem}.md\:-m-72{margin:-18rem}.md\:-m-80{margin:-20rem}.md\:-m-96{margin:-24rem}.md\:-m-px{margin:-1px}.md\:-m-0\.5{margin:-.125rem}.md\:-m-1\.5{margin:-.375rem}.md\:-m-2\.5{margin:-.625rem}.md\:-m-3\.5{margin:-.875rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:mx-1{margin-left:.25rem;margin-right:.25rem}.md\:mx-2{margin-left:.5rem;margin-right:.5rem}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:mx-4{margin-left:1rem;margin-right:1rem}.md\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.md\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.md\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.md\:mx-8{margin-left:2rem;margin-right:2rem}.md\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.md\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.md\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.md\:mx-12{margin-left:3rem;margin-right:3rem}.md\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.md\:mx-16{margin-left:4rem;margin-right:4rem}.md\:mx-20{margin-left:5rem;margin-right:5rem}.md\:mx-24{margin-left:6rem;margin-right:6rem}.md\:mx-28{margin-left:7rem;margin-right:7rem}.md\:mx-32{margin-left:8rem;margin-right:8rem}.md\:mx-36{margin-left:9rem;margin-right:9rem}.md\:mx-40{margin-left:10rem;margin-right:10rem}.md\:mx-44{margin-left:11rem;margin-right:11rem}.md\:mx-48{margin-left:12rem;margin-right:12rem}.md\:mx-52{margin-left:13rem;margin-right:13rem}.md\:mx-56{margin-left:14rem;margin-right:14rem}.md\:mx-60{margin-left:15rem;margin-right:15rem}.md\:mx-64{margin-left:16rem;margin-right:16rem}.md\:mx-72{margin-left:18rem;margin-right:18rem}.md\:mx-80{margin-left:20rem;margin-right:20rem}.md\:mx-96{margin-left:24rem;margin-right:24rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mx-px{margin-left:1px;margin-right:1px}.md\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.md\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.md\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.md\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.md\:-mx-0{margin-left:0;margin-right:0}.md\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.md\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.md\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.md\:-mx-4{margin-left:-1rem;margin-right:-1rem}.md\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.md\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.md\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.md\:-mx-8{margin-left:-2rem;margin-right:-2rem}.md\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.md\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.md\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.md\:-mx-12{margin-left:-3rem;margin-right:-3rem}.md\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.md\:-mx-16{margin-left:-4rem;margin-right:-4rem}.md\:-mx-20{margin-left:-5rem;margin-right:-5rem}.md\:-mx-24{margin-left:-6rem;margin-right:-6rem}.md\:-mx-28{margin-left:-7rem;margin-right:-7rem}.md\:-mx-32{margin-left:-8rem;margin-right:-8rem}.md\:-mx-36{margin-left:-9rem;margin-right:-9rem}.md\:-mx-40{margin-left:-10rem;margin-right:-10rem}.md\:-mx-44{margin-left:-11rem;margin-right:-11rem}.md\:-mx-48{margin-left:-12rem;margin-right:-12rem}.md\:-mx-52{margin-left:-13rem;margin-right:-13rem}.md\:-mx-56{margin-left:-14rem;margin-right:-14rem}.md\:-mx-60{margin-left:-15rem;margin-right:-15rem}.md\:-mx-64{margin-left:-16rem;margin-right:-16rem}.md\:-mx-72{margin-left:-18rem;margin-right:-18rem}.md\:-mx-80{margin-left:-20rem;margin-right:-20rem}.md\:-mx-96{margin-left:-24rem;margin-right:-24rem}.md\:-mx-px{margin-left:-1px;margin-right:-1px}.md\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.md\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.md\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.md\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.md\:my-0{margin-top:0;margin-bottom:0}.md\:my-1{margin-top:.25rem;margin-bottom:.25rem}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:my-3{margin-top:.75rem;margin-bottom:.75rem}.md\:my-4{margin-top:1rem;margin-bottom:1rem}.md\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.md\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.md\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.md\:my-8{margin-top:2rem;margin-bottom:2rem}.md\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.md\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.md\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.md\:my-12{margin-top:3rem;margin-bottom:3rem}.md\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.md\:my-16{margin-top:4rem;margin-bottom:4rem}.md\:my-20{margin-top:5rem;margin-bottom:5rem}.md\:my-24{margin-top:6rem;margin-bottom:6rem}.md\:my-28{margin-top:7rem;margin-bottom:7rem}.md\:my-32{margin-top:8rem;margin-bottom:8rem}.md\:my-36{margin-top:9rem;margin-bottom:9rem}.md\:my-40{margin-top:10rem;margin-bottom:10rem}.md\:my-44{margin-top:11rem;margin-bottom:11rem}.md\:my-48{margin-top:12rem;margin-bottom:12rem}.md\:my-52{margin-top:13rem;margin-bottom:13rem}.md\:my-56{margin-top:14rem;margin-bottom:14rem}.md\:my-60{margin-top:15rem;margin-bottom:15rem}.md\:my-64{margin-top:16rem;margin-bottom:16rem}.md\:my-72{margin-top:18rem;margin-bottom:18rem}.md\:my-80{margin-top:20rem;margin-bottom:20rem}.md\:my-96{margin-top:24rem;margin-bottom:24rem}.md\:my-auto{margin-top:auto;margin-bottom:auto}.md\:my-px{margin-top:1px;margin-bottom:1px}.md\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.md\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.md\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.md\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.md\:-my-0{margin-top:0;margin-bottom:0}.md\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.md\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.md\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.md\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.md\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.md\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.md\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.md\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.md\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.md\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.md\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.md\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.md\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.md\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.md\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.md\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.md\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.md\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.md\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.md\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.md\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.md\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.md\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.md\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.md\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.md\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.md\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.md\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.md\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.md\:-my-px{margin-top:-1px;margin-bottom:-1px}.md\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.md\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.md\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.md\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.md\:mt-0{margin-top:0}.md\:mt-1{margin-top:.25rem}.md\:mt-2{margin-top:.5rem}.md\:mt-3{margin-top:.75rem}.md\:mt-4{margin-top:1rem}.md\:mt-5{margin-top:1.25rem}.md\:mt-6{margin-top:1.5rem}.md\:mt-7{margin-top:1.75rem}.md\:mt-8{margin-top:2rem}.md\:mt-9{margin-top:2.25rem}.md\:mt-10{margin-top:2.5rem}.md\:mt-11{margin-top:2.75rem}.md\:mt-12{margin-top:3rem}.md\:mt-14{margin-top:3.5rem}.md\:mt-16{margin-top:4rem}.md\:mt-20{margin-top:5rem}.md\:mt-24{margin-top:6rem}.md\:mt-28{margin-top:7rem}.md\:mt-32{margin-top:8rem}.md\:mt-36{margin-top:9rem}.md\:mt-40{margin-top:10rem}.md\:mt-44{margin-top:11rem}.md\:mt-48{margin-top:12rem}.md\:mt-52{margin-top:13rem}.md\:mt-56{margin-top:14rem}.md\:mt-60{margin-top:15rem}.md\:mt-64{margin-top:16rem}.md\:mt-72{margin-top:18rem}.md\:mt-80{margin-top:20rem}.md\:mt-96{margin-top:24rem}.md\:mt-auto{margin-top:auto}.md\:mt-px{margin-top:1px}.md\:mt-0\.5{margin-top:.125rem}.md\:mt-1\.5{margin-top:.375rem}.md\:mt-2\.5{margin-top:.625rem}.md\:mt-3\.5{margin-top:.875rem}.md\:-mt-0{margin-top:0}.md\:-mt-1{margin-top:-.25rem}.md\:-mt-2{margin-top:-.5rem}.md\:-mt-3{margin-top:-.75rem}.md\:-mt-4{margin-top:-1rem}.md\:-mt-5{margin-top:-1.25rem}.md\:-mt-6{margin-top:-1.5rem}.md\:-mt-7{margin-top:-1.75rem}.md\:-mt-8{margin-top:-2rem}.md\:-mt-9{margin-top:-2.25rem}.md\:-mt-10{margin-top:-2.5rem}.md\:-mt-11{margin-top:-2.75rem}.md\:-mt-12{margin-top:-3rem}.md\:-mt-14{margin-top:-3.5rem}.md\:-mt-16{margin-top:-4rem}.md\:-mt-20{margin-top:-5rem}.md\:-mt-24{margin-top:-6rem}.md\:-mt-28{margin-top:-7rem}.md\:-mt-32{margin-top:-8rem}.md\:-mt-36{margin-top:-9rem}.md\:-mt-40{margin-top:-10rem}.md\:-mt-44{margin-top:-11rem}.md\:-mt-48{margin-top:-12rem}.md\:-mt-52{margin-top:-13rem}.md\:-mt-56{margin-top:-14rem}.md\:-mt-60{margin-top:-15rem}.md\:-mt-64{margin-top:-16rem}.md\:-mt-72{margin-top:-18rem}.md\:-mt-80{margin-top:-20rem}.md\:-mt-96{margin-top:-24rem}.md\:-mt-px{margin-top:-1px}.md\:-mt-0\.5{margin-top:-.125rem}.md\:-mt-1\.5{margin-top:-.375rem}.md\:-mt-2\.5{margin-top:-.625rem}.md\:-mt-3\.5{margin-top:-.875rem}.md\:mr-0{margin-right:0}.md\:mr-1{margin-right:.25rem}.md\:mr-2{margin-right:.5rem}.md\:mr-3{margin-right:.75rem}.md\:mr-4{margin-right:1rem}.md\:mr-5{margin-right:1.25rem}.md\:mr-6{margin-right:1.5rem}.md\:mr-7{margin-right:1.75rem}.md\:mr-8{margin-right:2rem}.md\:mr-9{margin-right:2.25rem}.md\:mr-10{margin-right:2.5rem}.md\:mr-11{margin-right:2.75rem}.md\:mr-12{margin-right:3rem}.md\:mr-14{margin-right:3.5rem}.md\:mr-16{margin-right:4rem}.md\:mr-20{margin-right:5rem}.md\:mr-24{margin-right:6rem}.md\:mr-28{margin-right:7rem}.md\:mr-32{margin-right:8rem}.md\:mr-36{margin-right:9rem}.md\:mr-40{margin-right:10rem}.md\:mr-44{margin-right:11rem}.md\:mr-48{margin-right:12rem}.md\:mr-52{margin-right:13rem}.md\:mr-56{margin-right:14rem}.md\:mr-60{margin-right:15rem}.md\:mr-64{margin-right:16rem}.md\:mr-72{margin-right:18rem}.md\:mr-80{margin-right:20rem}.md\:mr-96{margin-right:24rem}.md\:mr-auto{margin-right:auto}.md\:mr-px{margin-right:1px}.md\:mr-0\.5{margin-right:.125rem}.md\:mr-1\.5{margin-right:.375rem}.md\:mr-2\.5{margin-right:.625rem}.md\:mr-3\.5{margin-right:.875rem}.md\:-mr-0{margin-right:0}.md\:-mr-1{margin-right:-.25rem}.md\:-mr-2{margin-right:-.5rem}.md\:-mr-3{margin-right:-.75rem}.md\:-mr-4{margin-right:-1rem}.md\:-mr-5{margin-right:-1.25rem}.md\:-mr-6{margin-right:-1.5rem}.md\:-mr-7{margin-right:-1.75rem}.md\:-mr-8{margin-right:-2rem}.md\:-mr-9{margin-right:-2.25rem}.md\:-mr-10{margin-right:-2.5rem}.md\:-mr-11{margin-right:-2.75rem}.md\:-mr-12{margin-right:-3rem}.md\:-mr-14{margin-right:-3.5rem}.md\:-mr-16{margin-right:-4rem}.md\:-mr-20{margin-right:-5rem}.md\:-mr-24{margin-right:-6rem}.md\:-mr-28{margin-right:-7rem}.md\:-mr-32{margin-right:-8rem}.md\:-mr-36{margin-right:-9rem}.md\:-mr-40{margin-right:-10rem}.md\:-mr-44{margin-right:-11rem}.md\:-mr-48{margin-right:-12rem}.md\:-mr-52{margin-right:-13rem}.md\:-mr-56{margin-right:-14rem}.md\:-mr-60{margin-right:-15rem}.md\:-mr-64{margin-right:-16rem}.md\:-mr-72{margin-right:-18rem}.md\:-mr-80{margin-right:-20rem}.md\:-mr-96{margin-right:-24rem}.md\:-mr-px{margin-right:-1px}.md\:-mr-0\.5{margin-right:-.125rem}.md\:-mr-1\.5{margin-right:-.375rem}.md\:-mr-2\.5{margin-right:-.625rem}.md\:-mr-3\.5{margin-right:-.875rem}.md\:mb-0{margin-bottom:0}.md\:mb-1{margin-bottom:.25rem}.md\:mb-2{margin-bottom:.5rem}.md\:mb-3{margin-bottom:.75rem}.md\:mb-4{margin-bottom:1rem}.md\:mb-5{margin-bottom:1.25rem}.md\:mb-6{margin-bottom:1.5rem}.md\:mb-7{margin-bottom:1.75rem}.md\:mb-8{margin-bottom:2rem}.md\:mb-9{margin-bottom:2.25rem}.md\:mb-10{margin-bottom:2.5rem}.md\:mb-11{margin-bottom:2.75rem}.md\:mb-12{margin-bottom:3rem}.md\:mb-14{margin-bottom:3.5rem}.md\:mb-16{margin-bottom:4rem}.md\:mb-20{margin-bottom:5rem}.md\:mb-24{margin-bottom:6rem}.md\:mb-28{margin-bottom:7rem}.md\:mb-32{margin-bottom:8rem}.md\:mb-36{margin-bottom:9rem}.md\:mb-40{margin-bottom:10rem}.md\:mb-44{margin-bottom:11rem}.md\:mb-48{margin-bottom:12rem}.md\:mb-52{margin-bottom:13rem}.md\:mb-56{margin-bottom:14rem}.md\:mb-60{margin-bottom:15rem}.md\:mb-64{margin-bottom:16rem}.md\:mb-72{margin-bottom:18rem}.md\:mb-80{margin-bottom:20rem}.md\:mb-96{margin-bottom:24rem}.md\:mb-auto{margin-bottom:auto}.md\:mb-px{margin-bottom:1px}.md\:mb-0\.5{margin-bottom:.125rem}.md\:mb-1\.5{margin-bottom:.375rem}.md\:mb-2\.5{margin-bottom:.625rem}.md\:mb-3\.5{margin-bottom:.875rem}.md\:-mb-0{margin-bottom:0}.md\:-mb-1{margin-bottom:-.25rem}.md\:-mb-2{margin-bottom:-.5rem}.md\:-mb-3{margin-bottom:-.75rem}.md\:-mb-4{margin-bottom:-1rem}.md\:-mb-5{margin-bottom:-1.25rem}.md\:-mb-6{margin-bottom:-1.5rem}.md\:-mb-7{margin-bottom:-1.75rem}.md\:-mb-8{margin-bottom:-2rem}.md\:-mb-9{margin-bottom:-2.25rem}.md\:-mb-10{margin-bottom:-2.5rem}.md\:-mb-11{margin-bottom:-2.75rem}.md\:-mb-12{margin-bottom:-3rem}.md\:-mb-14{margin-bottom:-3.5rem}.md\:-mb-16{margin-bottom:-4rem}.md\:-mb-20{margin-bottom:-5rem}.md\:-mb-24{margin-bottom:-6rem}.md\:-mb-28{margin-bottom:-7rem}.md\:-mb-32{margin-bottom:-8rem}.md\:-mb-36{margin-bottom:-9rem}.md\:-mb-40{margin-bottom:-10rem}.md\:-mb-44{margin-bottom:-11rem}.md\:-mb-48{margin-bottom:-12rem}.md\:-mb-52{margin-bottom:-13rem}.md\:-mb-56{margin-bottom:-14rem}.md\:-mb-60{margin-bottom:-15rem}.md\:-mb-64{margin-bottom:-16rem}.md\:-mb-72{margin-bottom:-18rem}.md\:-mb-80{margin-bottom:-20rem}.md\:-mb-96{margin-bottom:-24rem}.md\:-mb-px{margin-bottom:-1px}.md\:-mb-0\.5{margin-bottom:-.125rem}.md\:-mb-1\.5{margin-bottom:-.375rem}.md\:-mb-2\.5{margin-bottom:-.625rem}.md\:-mb-3\.5{margin-bottom:-.875rem}.md\:ml-0{margin-left:0}.md\:ml-1{margin-left:.25rem}.md\:ml-2{margin-left:.5rem}.md\:ml-3{margin-left:.75rem}.md\:ml-4{margin-left:1rem}.md\:ml-5{margin-left:1.25rem}.md\:ml-6{margin-left:1.5rem}.md\:ml-7{margin-left:1.75rem}.md\:ml-8{margin-left:2rem}.md\:ml-9{margin-left:2.25rem}.md\:ml-10{margin-left:2.5rem}.md\:ml-11{margin-left:2.75rem}.md\:ml-12{margin-left:3rem}.md\:ml-14{margin-left:3.5rem}.md\:ml-16{margin-left:4rem}.md\:ml-20{margin-left:5rem}.md\:ml-24{margin-left:6rem}.md\:ml-28{margin-left:7rem}.md\:ml-32{margin-left:8rem}.md\:ml-36{margin-left:9rem}.md\:ml-40{margin-left:10rem}.md\:ml-44{margin-left:11rem}.md\:ml-48{margin-left:12rem}.md\:ml-52{margin-left:13rem}.md\:ml-56{margin-left:14rem}.md\:ml-60{margin-left:15rem}.md\:ml-64{margin-left:16rem}.md\:ml-72{margin-left:18rem}.md\:ml-80{margin-left:20rem}.md\:ml-96{margin-left:24rem}.md\:ml-auto{margin-left:auto}.md\:ml-px{margin-left:1px}.md\:ml-0\.5{margin-left:.125rem}.md\:ml-1\.5{margin-left:.375rem}.md\:ml-2\.5{margin-left:.625rem}.md\:ml-3\.5{margin-left:.875rem}.md\:-ml-0{margin-left:0}.md\:-ml-1{margin-left:-.25rem}.md\:-ml-2{margin-left:-.5rem}.md\:-ml-3{margin-left:-.75rem}.md\:-ml-4{margin-left:-1rem}.md\:-ml-5{margin-left:-1.25rem}.md\:-ml-6{margin-left:-1.5rem}.md\:-ml-7{margin-left:-1.75rem}.md\:-ml-8{margin-left:-2rem}.md\:-ml-9{margin-left:-2.25rem}.md\:-ml-10{margin-left:-2.5rem}.md\:-ml-11{margin-left:-2.75rem}.md\:-ml-12{margin-left:-3rem}.md\:-ml-14{margin-left:-3.5rem}.md\:-ml-16{margin-left:-4rem}.md\:-ml-20{margin-left:-5rem}.md\:-ml-24{margin-left:-6rem}.md\:-ml-28{margin-left:-7rem}.md\:-ml-32{margin-left:-8rem}.md\:-ml-36{margin-left:-9rem}.md\:-ml-40{margin-left:-10rem}.md\:-ml-44{margin-left:-11rem}.md\:-ml-48{margin-left:-12rem}.md\:-ml-52{margin-left:-13rem}.md\:-ml-56{margin-left:-14rem}.md\:-ml-60{margin-left:-15rem}.md\:-ml-64{margin-left:-16rem}.md\:-ml-72{margin-left:-18rem}.md\:-ml-80{margin-left:-20rem}.md\:-ml-96{margin-left:-24rem}.md\:-ml-px{margin-left:-1px}.md\:-ml-0\.5{margin-left:-.125rem}.md\:-ml-1\.5{margin-left:-.375rem}.md\:-ml-2\.5{margin-left:-.625rem}.md\:-ml-3\.5{margin-left:-.875rem}.md\:box-border{box-sizing:border-box}.md\:box-content{box-sizing:initial}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:table{display:table}.md\:inline-table{display:inline-table}.md\:table-caption{display:table-caption}.md\:table-cell{display:table-cell}.md\:table-column{display:table-column}.md\:table-column-group{display:table-column-group}.md\:table-footer-group{display:table-footer-group}.md\:table-header-group{display:table-header-group}.md\:table-row-group{display:table-row-group}.md\:table-row{display:table-row}.md\:flow-root{display:flow-root}.md\:grid{display:grid}.md\:inline-grid{display:inline-grid}.md\:contents{display:contents}.md\:list-item{display:list-item}.md\:hidden{display:none}.md\:h-0{height:0}.md\:h-1{height:.25rem}.md\:h-2{height:.5rem}.md\:h-3{height:.75rem}.md\:h-4{height:1rem}.md\:h-5{height:1.25rem}.md\:h-6{height:1.5rem}.md\:h-7{height:1.75rem}.md\:h-8{height:2rem}.md\:h-9{height:2.25rem}.md\:h-10{height:2.5rem}.md\:h-11{height:2.75rem}.md\:h-12{height:3rem}.md\:h-14{height:3.5rem}.md\:h-16{height:4rem}.md\:h-20{height:5rem}.md\:h-24{height:6rem}.md\:h-28{height:7rem}.md\:h-32{height:8rem}.md\:h-36{height:9rem}.md\:h-40{height:10rem}.md\:h-44{height:11rem}.md\:h-48{height:12rem}.md\:h-52{height:13rem}.md\:h-56{height:14rem}.md\:h-60{height:15rem}.md\:h-64{height:16rem}.md\:h-72{height:18rem}.md\:h-80{height:20rem}.md\:h-96{height:24rem}.md\:h-auto{height:auto}.md\:h-px{height:1px}.md\:h-0\.5{height:.125rem}.md\:h-1\.5{height:.375rem}.md\:h-2\.5{height:.625rem}.md\:h-3\.5{height:.875rem}.md\:h-1\/2{height:50%}.md\:h-1\/3{height:33.333333%}.md\:h-2\/3{height:66.666667%}.md\:h-1\/4{height:25%}.md\:h-2\/4{height:50%}.md\:h-3\/4{height:75%}.md\:h-1\/5{height:20%}.md\:h-2\/5{height:40%}.md\:h-3\/5{height:60%}.md\:h-4\/5{height:80%}.md\:h-1\/6{height:16.666667%}.md\:h-2\/6{height:33.333333%}.md\:h-3\/6{height:50%}.md\:h-4\/6{height:66.666667%}.md\:h-5\/6{height:83.333333%}.md\:h-full{height:100%}.md\:h-screen{height:100vh}.md\:max-h-0{max-height:0}.md\:max-h-1{max-height:.25rem}.md\:max-h-2{max-height:.5rem}.md\:max-h-3{max-height:.75rem}.md\:max-h-4{max-height:1rem}.md\:max-h-5{max-height:1.25rem}.md\:max-h-6{max-height:1.5rem}.md\:max-h-7{max-height:1.75rem}.md\:max-h-8{max-height:2rem}.md\:max-h-9{max-height:2.25rem}.md\:max-h-10{max-height:2.5rem}.md\:max-h-11{max-height:2.75rem}.md\:max-h-12{max-height:3rem}.md\:max-h-14{max-height:3.5rem}.md\:max-h-16{max-height:4rem}.md\:max-h-20{max-height:5rem}.md\:max-h-24{max-height:6rem}.md\:max-h-28{max-height:7rem}.md\:max-h-32{max-height:8rem}.md\:max-h-36{max-height:9rem}.md\:max-h-40{max-height:10rem}.md\:max-h-44{max-height:11rem}.md\:max-h-48{max-height:12rem}.md\:max-h-52{max-height:13rem}.md\:max-h-56{max-height:14rem}.md\:max-h-60{max-height:15rem}.md\:max-h-64{max-height:16rem}.md\:max-h-72{max-height:18rem}.md\:max-h-80{max-height:20rem}.md\:max-h-96{max-height:24rem}.md\:max-h-px{max-height:1px}.md\:max-h-0\.5{max-height:.125rem}.md\:max-h-1\.5{max-height:.375rem}.md\:max-h-2\.5{max-height:.625rem}.md\:max-h-3\.5{max-height:.875rem}.md\:max-h-full{max-height:100%}.md\:max-h-screen{max-height:100vh}.md\:min-h-0{min-height:0}.md\:min-h-full{min-height:100%}.md\:min-h-screen{min-height:100vh}.md\:w-0{width:0}.md\:w-1{width:.25rem}.md\:w-2{width:.5rem}.md\:w-3{width:.75rem}.md\:w-4{width:1rem}.md\:w-5{width:1.25rem}.md\:w-6{width:1.5rem}.md\:w-7{width:1.75rem}.md\:w-8{width:2rem}.md\:w-9{width:2.25rem}.md\:w-10{width:2.5rem}.md\:w-11{width:2.75rem}.md\:w-12{width:3rem}.md\:w-14{width:3.5rem}.md\:w-16{width:4rem}.md\:w-20{width:5rem}.md\:w-24{width:6rem}.md\:w-28{width:7rem}.md\:w-32{width:8rem}.md\:w-36{width:9rem}.md\:w-40{width:10rem}.md\:w-44{width:11rem}.md\:w-48{width:12rem}.md\:w-52{width:13rem}.md\:w-56{width:14rem}.md\:w-60{width:15rem}.md\:w-64{width:16rem}.md\:w-72{width:18rem}.md\:w-80{width:20rem}.md\:w-96{width:24rem}.md\:w-auto{width:auto}.md\:w-px{width:1px}.md\:w-0\.5{width:.125rem}.md\:w-1\.5{width:.375rem}.md\:w-2\.5{width:.625rem}.md\:w-3\.5{width:.875rem}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/4{width:25%}.md\:w-2\/4{width:50%}.md\:w-3\/4{width:75%}.md\:w-1\/5{width:20%}.md\:w-2\/5{width:40%}.md\:w-3\/5{width:60%}.md\:w-4\/5{width:80%}.md\:w-1\/6{width:16.666667%}.md\:w-2\/6{width:33.333333%}.md\:w-3\/6{width:50%}.md\:w-4\/6{width:66.666667%}.md\:w-5\/6{width:83.333333%}.md\:w-1\/12{width:8.333333%}.md\:w-2\/12{width:16.666667%}.md\:w-3\/12{width:25%}.md\:w-4\/12{width:33.333333%}.md\:w-5\/12{width:41.666667%}.md\:w-6\/12{width:50%}.md\:w-7\/12{width:58.333333%}.md\:w-8\/12{width:66.666667%}.md\:w-9\/12{width:75%}.md\:w-10\/12{width:83.333333%}.md\:w-11\/12{width:91.666667%}.md\:w-full{width:100%}.md\:w-screen{width:100vw}.md\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.md\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.md\:min-w-0{min-width:0}.md\:min-w-full{min-width:100%}.md\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.md\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.md\:max-w-0{max-width:0}.md\:max-w-none{max-width:none}.md\:max-w-xs{max-width:20rem}.md\:max-w-sm{max-width:24rem}.md\:max-w-md{max-width:28rem}.md\:max-w-lg{max-width:32rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-2xl{max-width:42rem}.md\:max-w-3xl{max-width:48rem}.md\:max-w-4xl{max-width:56rem}.md\:max-w-5xl{max-width:64rem}.md\:max-w-6xl{max-width:72rem}.md\:max-w-7xl{max-width:80rem}.md\:max-w-full{max-width:100%}.md\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.md\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.md\:max-w-prose{max-width:65ch}.md\:max-w-screen-sm{max-width:640px}.md\:max-w-screen-md{max-width:768px}.md\:max-w-screen-lg{max-width:1024px}.md\:max-w-screen-xl{max-width:1280px}.md\:max-w-screen-2xl{max-width:1536px}.md\:flex-1{flex:1 1 0%}.md\:flex-auto{flex:1 1 auto}.md\:flex-initial{flex:0 1 auto}.md\:flex-none{flex:none}.md\:flex-shrink-0{flex-shrink:0}.md\:flex-shrink{flex-shrink:1}.md\:flex-grow-0{flex-grow:0}.md\:flex-grow{flex-grow:1}.md\:table-auto{table-layout:auto}.md\:table-fixed{table-layout:fixed}.md\:border-collapse{border-collapse:collapse}.md\:border-separate{border-collapse:initial}.md\:origin-center{transform-origin:center}.md\:origin-top{transform-origin:top}.md\:origin-top-right{transform-origin:top right}.md\:origin-right{transform-origin:right}.md\:origin-bottom-right{transform-origin:bottom right}.md\:origin-bottom{transform-origin:bottom}.md\:origin-bottom-left{transform-origin:bottom left}.md\:origin-left{transform-origin:left}.md\:origin-top-left{transform-origin:top left}.md\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:transform,.md\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.md\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\:transform-none{transform:none}.md\:translate-x-0{--tw-translate-x:0px}.md\:translate-x-1{--tw-translate-x:0.25rem}.md\:translate-x-2{--tw-translate-x:0.5rem}.md\:translate-x-3{--tw-translate-x:0.75rem}.md\:translate-x-4{--tw-translate-x:1rem}.md\:translate-x-5{--tw-translate-x:1.25rem}.md\:translate-x-6{--tw-translate-x:1.5rem}.md\:translate-x-7{--tw-translate-x:1.75rem}.md\:translate-x-8{--tw-translate-x:2rem}.md\:translate-x-9{--tw-translate-x:2.25rem}.md\:translate-x-10{--tw-translate-x:2.5rem}.md\:translate-x-11{--tw-translate-x:2.75rem}.md\:translate-x-12{--tw-translate-x:3rem}.md\:translate-x-14{--tw-translate-x:3.5rem}.md\:translate-x-16{--tw-translate-x:4rem}.md\:translate-x-20{--tw-translate-x:5rem}.md\:translate-x-24{--tw-translate-x:6rem}.md\:translate-x-28{--tw-translate-x:7rem}.md\:translate-x-32{--tw-translate-x:8rem}.md\:translate-x-36{--tw-translate-x:9rem}.md\:translate-x-40{--tw-translate-x:10rem}.md\:translate-x-44{--tw-translate-x:11rem}.md\:translate-x-48{--tw-translate-x:12rem}.md\:translate-x-52{--tw-translate-x:13rem}.md\:translate-x-56{--tw-translate-x:14rem}.md\:translate-x-60{--tw-translate-x:15rem}.md\:translate-x-64{--tw-translate-x:16rem}.md\:translate-x-72{--tw-translate-x:18rem}.md\:translate-x-80{--tw-translate-x:20rem}.md\:translate-x-96{--tw-translate-x:24rem}.md\:translate-x-px{--tw-translate-x:1px}.md\:translate-x-0\.5{--tw-translate-x:0.125rem}.md\:translate-x-1\.5{--tw-translate-x:0.375rem}.md\:translate-x-2\.5{--tw-translate-x:0.625rem}.md\:translate-x-3\.5{--tw-translate-x:0.875rem}.md\:-translate-x-0{--tw-translate-x:0px}.md\:-translate-x-1{--tw-translate-x:-0.25rem}.md\:-translate-x-2{--tw-translate-x:-0.5rem}.md\:-translate-x-3{--tw-translate-x:-0.75rem}.md\:-translate-x-4{--tw-translate-x:-1rem}.md\:-translate-x-5{--tw-translate-x:-1.25rem}.md\:-translate-x-6{--tw-translate-x:-1.5rem}.md\:-translate-x-7{--tw-translate-x:-1.75rem}.md\:-translate-x-8{--tw-translate-x:-2rem}.md\:-translate-x-9{--tw-translate-x:-2.25rem}.md\:-translate-x-10{--tw-translate-x:-2.5rem}.md\:-translate-x-11{--tw-translate-x:-2.75rem}.md\:-translate-x-12{--tw-translate-x:-3rem}.md\:-translate-x-14{--tw-translate-x:-3.5rem}.md\:-translate-x-16{--tw-translate-x:-4rem}.md\:-translate-x-20{--tw-translate-x:-5rem}.md\:-translate-x-24{--tw-translate-x:-6rem}.md\:-translate-x-28{--tw-translate-x:-7rem}.md\:-translate-x-32{--tw-translate-x:-8rem}.md\:-translate-x-36{--tw-translate-x:-9rem}.md\:-translate-x-40{--tw-translate-x:-10rem}.md\:-translate-x-44{--tw-translate-x:-11rem}.md\:-translate-x-48{--tw-translate-x:-12rem}.md\:-translate-x-52{--tw-translate-x:-13rem}.md\:-translate-x-56{--tw-translate-x:-14rem}.md\:-translate-x-60{--tw-translate-x:-15rem}.md\:-translate-x-64{--tw-translate-x:-16rem}.md\:-translate-x-72{--tw-translate-x:-18rem}.md\:-translate-x-80{--tw-translate-x:-20rem}.md\:-translate-x-96{--tw-translate-x:-24rem}.md\:-translate-x-px{--tw-translate-x:-1px}.md\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.md\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.md\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.md\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.md\:translate-x-1\/2{--tw-translate-x:50%}.md\:translate-x-1\/3{--tw-translate-x:33.333333%}.md\:translate-x-2\/3{--tw-translate-x:66.666667%}.md\:translate-x-1\/4{--tw-translate-x:25%}.md\:translate-x-2\/4{--tw-translate-x:50%}.md\:translate-x-3\/4{--tw-translate-x:75%}.md\:translate-x-full{--tw-translate-x:100%}.md\:-translate-x-1\/2{--tw-translate-x:-50%}.md\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.md\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.md\:-translate-x-1\/4{--tw-translate-x:-25%}.md\:-translate-x-2\/4{--tw-translate-x:-50%}.md\:-translate-x-3\/4{--tw-translate-x:-75%}.md\:-translate-x-full{--tw-translate-x:-100%}.md\:translate-y-0{--tw-translate-y:0px}.md\:translate-y-1{--tw-translate-y:0.25rem}.md\:translate-y-2{--tw-translate-y:0.5rem}.md\:translate-y-3{--tw-translate-y:0.75rem}.md\:translate-y-4{--tw-translate-y:1rem}.md\:translate-y-5{--tw-translate-y:1.25rem}.md\:translate-y-6{--tw-translate-y:1.5rem}.md\:translate-y-7{--tw-translate-y:1.75rem}.md\:translate-y-8{--tw-translate-y:2rem}.md\:translate-y-9{--tw-translate-y:2.25rem}.md\:translate-y-10{--tw-translate-y:2.5rem}.md\:translate-y-11{--tw-translate-y:2.75rem}.md\:translate-y-12{--tw-translate-y:3rem}.md\:translate-y-14{--tw-translate-y:3.5rem}.md\:translate-y-16{--tw-translate-y:4rem}.md\:translate-y-20{--tw-translate-y:5rem}.md\:translate-y-24{--tw-translate-y:6rem}.md\:translate-y-28{--tw-translate-y:7rem}.md\:translate-y-32{--tw-translate-y:8rem}.md\:translate-y-36{--tw-translate-y:9rem}.md\:translate-y-40{--tw-translate-y:10rem}.md\:translate-y-44{--tw-translate-y:11rem}.md\:translate-y-48{--tw-translate-y:12rem}.md\:translate-y-52{--tw-translate-y:13rem}.md\:translate-y-56{--tw-translate-y:14rem}.md\:translate-y-60{--tw-translate-y:15rem}.md\:translate-y-64{--tw-translate-y:16rem}.md\:translate-y-72{--tw-translate-y:18rem}.md\:translate-y-80{--tw-translate-y:20rem}.md\:translate-y-96{--tw-translate-y:24rem}.md\:translate-y-px{--tw-translate-y:1px}.md\:translate-y-0\.5{--tw-translate-y:0.125rem}.md\:translate-y-1\.5{--tw-translate-y:0.375rem}.md\:translate-y-2\.5{--tw-translate-y:0.625rem}.md\:translate-y-3\.5{--tw-translate-y:0.875rem}.md\:-translate-y-0{--tw-translate-y:0px}.md\:-translate-y-1{--tw-translate-y:-0.25rem}.md\:-translate-y-2{--tw-translate-y:-0.5rem}.md\:-translate-y-3{--tw-translate-y:-0.75rem}.md\:-translate-y-4{--tw-translate-y:-1rem}.md\:-translate-y-5{--tw-translate-y:-1.25rem}.md\:-translate-y-6{--tw-translate-y:-1.5rem}.md\:-translate-y-7{--tw-translate-y:-1.75rem}.md\:-translate-y-8{--tw-translate-y:-2rem}.md\:-translate-y-9{--tw-translate-y:-2.25rem}.md\:-translate-y-10{--tw-translate-y:-2.5rem}.md\:-translate-y-11{--tw-translate-y:-2.75rem}.md\:-translate-y-12{--tw-translate-y:-3rem}.md\:-translate-y-14{--tw-translate-y:-3.5rem}.md\:-translate-y-16{--tw-translate-y:-4rem}.md\:-translate-y-20{--tw-translate-y:-5rem}.md\:-translate-y-24{--tw-translate-y:-6rem}.md\:-translate-y-28{--tw-translate-y:-7rem}.md\:-translate-y-32{--tw-translate-y:-8rem}.md\:-translate-y-36{--tw-translate-y:-9rem}.md\:-translate-y-40{--tw-translate-y:-10rem}.md\:-translate-y-44{--tw-translate-y:-11rem}.md\:-translate-y-48{--tw-translate-y:-12rem}.md\:-translate-y-52{--tw-translate-y:-13rem}.md\:-translate-y-56{--tw-translate-y:-14rem}.md\:-translate-y-60{--tw-translate-y:-15rem}.md\:-translate-y-64{--tw-translate-y:-16rem}.md\:-translate-y-72{--tw-translate-y:-18rem}.md\:-translate-y-80{--tw-translate-y:-20rem}.md\:-translate-y-96{--tw-translate-y:-24rem}.md\:-translate-y-px{--tw-translate-y:-1px}.md\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.md\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.md\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.md\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.md\:translate-y-1\/2{--tw-translate-y:50%}.md\:translate-y-1\/3{--tw-translate-y:33.333333%}.md\:translate-y-2\/3{--tw-translate-y:66.666667%}.md\:translate-y-1\/4{--tw-translate-y:25%}.md\:translate-y-2\/4{--tw-translate-y:50%}.md\:translate-y-3\/4{--tw-translate-y:75%}.md\:translate-y-full{--tw-translate-y:100%}.md\:-translate-y-1\/2{--tw-translate-y:-50%}.md\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.md\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.md\:-translate-y-1\/4{--tw-translate-y:-25%}.md\:-translate-y-2\/4{--tw-translate-y:-50%}.md\:-translate-y-3\/4{--tw-translate-y:-75%}.md\:-translate-y-full{--tw-translate-y:-100%}.md\:hover\:translate-x-0:hover{--tw-translate-x:0px}.md\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.md\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.md\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.md\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.md\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.md\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.md\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.md\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.md\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.md\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.md\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.md\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.md\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.md\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.md\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.md\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.md\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.md\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.md\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.md\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.md\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.md\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.md\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.md\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.md\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.md\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.md\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.md\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.md\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.md\:hover\:translate-x-px:hover{--tw-translate-x:1px}.md\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.md\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.md\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.md\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.md\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.md\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.md\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.md\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.md\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.md\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.md\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.md\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.md\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.md\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.md\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.md\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.md\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.md\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.md\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.md\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.md\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.md\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.md\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.md\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.md\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.md\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.md\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.md\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.md\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.md\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.md\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.md\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.md\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.md\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.md\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.md\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.md\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.md\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.md\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.md\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.md\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.md\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.md\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.md\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.md\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.md\:hover\:translate-x-full:hover{--tw-translate-x:100%}.md\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.md\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.md\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.md\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.md\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.md\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.md\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.md\:hover\:translate-y-0:hover{--tw-translate-y:0px}.md\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.md\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.md\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.md\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.md\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.md\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.md\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.md\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.md\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.md\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.md\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.md\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.md\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.md\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.md\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.md\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.md\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.md\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.md\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.md\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.md\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.md\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.md\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.md\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.md\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.md\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.md\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.md\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.md\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.md\:hover\:translate-y-px:hover{--tw-translate-y:1px}.md\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.md\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.md\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.md\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.md\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.md\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.md\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.md\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.md\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.md\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.md\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.md\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.md\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.md\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.md\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.md\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.md\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.md\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.md\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.md\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.md\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.md\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.md\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.md\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.md\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.md\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.md\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.md\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.md\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.md\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.md\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.md\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.md\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.md\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.md\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.md\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.md\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.md\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.md\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.md\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.md\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.md\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.md\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.md\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.md\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.md\:hover\:translate-y-full:hover{--tw-translate-y:100%}.md\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.md\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.md\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.md\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.md\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.md\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.md\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.md\:focus\:translate-x-0:focus{--tw-translate-x:0px}.md\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.md\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.md\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.md\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.md\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.md\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.md\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.md\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.md\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.md\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.md\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.md\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.md\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.md\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.md\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.md\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.md\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.md\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.md\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.md\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.md\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.md\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.md\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.md\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.md\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.md\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.md\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.md\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.md\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.md\:focus\:translate-x-px:focus{--tw-translate-x:1px}.md\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.md\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.md\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.md\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.md\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.md\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.md\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.md\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.md\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.md\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.md\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.md\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.md\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.md\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.md\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.md\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.md\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.md\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.md\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.md\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.md\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.md\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.md\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.md\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.md\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.md\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.md\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.md\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.md\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.md\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.md\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.md\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.md\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.md\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.md\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.md\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.md\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.md\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.md\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.md\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.md\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.md\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.md\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.md\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.md\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.md\:focus\:translate-x-full:focus{--tw-translate-x:100%}.md\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.md\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.md\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.md\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.md\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.md\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.md\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.md\:focus\:translate-y-0:focus{--tw-translate-y:0px}.md\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.md\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.md\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.md\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.md\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.md\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.md\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.md\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.md\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.md\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.md\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.md\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.md\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.md\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.md\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.md\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.md\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.md\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.md\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.md\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.md\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.md\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.md\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.md\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.md\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.md\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.md\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.md\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.md\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.md\:focus\:translate-y-px:focus{--tw-translate-y:1px}.md\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.md\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.md\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.md\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.md\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.md\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.md\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.md\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.md\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.md\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.md\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.md\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.md\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.md\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.md\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.md\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.md\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.md\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.md\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.md\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.md\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.md\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.md\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.md\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.md\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.md\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.md\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.md\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.md\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.md\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.md\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.md\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.md\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.md\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.md\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.md\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.md\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.md\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.md\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.md\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.md\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.md\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.md\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.md\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.md\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.md\:focus\:translate-y-full:focus{--tw-translate-y:100%}.md\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.md\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.md\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.md\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.md\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.md\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.md\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.md\:rotate-0{--tw-rotate:0deg}.md\:rotate-1{--tw-rotate:1deg}.md\:rotate-2{--tw-rotate:2deg}.md\:rotate-3{--tw-rotate:3deg}.md\:rotate-6{--tw-rotate:6deg}.md\:rotate-12{--tw-rotate:12deg}.md\:rotate-45{--tw-rotate:45deg}.md\:rotate-90{--tw-rotate:90deg}.md\:rotate-180{--tw-rotate:180deg}.md\:-rotate-180{--tw-rotate:-180deg}.md\:-rotate-90{--tw-rotate:-90deg}.md\:-rotate-45{--tw-rotate:-45deg}.md\:-rotate-12{--tw-rotate:-12deg}.md\:-rotate-6{--tw-rotate:-6deg}.md\:-rotate-3{--tw-rotate:-3deg}.md\:-rotate-2{--tw-rotate:-2deg}.md\:-rotate-1{--tw-rotate:-1deg}.md\:hover\:rotate-0:hover{--tw-rotate:0deg}.md\:hover\:rotate-1:hover{--tw-rotate:1deg}.md\:hover\:rotate-2:hover{--tw-rotate:2deg}.md\:hover\:rotate-3:hover{--tw-rotate:3deg}.md\:hover\:rotate-6:hover{--tw-rotate:6deg}.md\:hover\:rotate-12:hover{--tw-rotate:12deg}.md\:hover\:rotate-45:hover{--tw-rotate:45deg}.md\:hover\:rotate-90:hover{--tw-rotate:90deg}.md\:hover\:rotate-180:hover{--tw-rotate:180deg}.md\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.md\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.md\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.md\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.md\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.md\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.md\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.md\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.md\:focus\:rotate-0:focus{--tw-rotate:0deg}.md\:focus\:rotate-1:focus{--tw-rotate:1deg}.md\:focus\:rotate-2:focus{--tw-rotate:2deg}.md\:focus\:rotate-3:focus{--tw-rotate:3deg}.md\:focus\:rotate-6:focus{--tw-rotate:6deg}.md\:focus\:rotate-12:focus{--tw-rotate:12deg}.md\:focus\:rotate-45:focus{--tw-rotate:45deg}.md\:focus\:rotate-90:focus{--tw-rotate:90deg}.md\:focus\:rotate-180:focus{--tw-rotate:180deg}.md\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.md\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.md\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.md\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.md\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.md\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.md\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.md\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.md\:skew-x-0{--tw-skew-x:0deg}.md\:skew-x-1{--tw-skew-x:1deg}.md\:skew-x-2{--tw-skew-x:2deg}.md\:skew-x-3{--tw-skew-x:3deg}.md\:skew-x-6{--tw-skew-x:6deg}.md\:skew-x-12{--tw-skew-x:12deg}.md\:-skew-x-12{--tw-skew-x:-12deg}.md\:-skew-x-6{--tw-skew-x:-6deg}.md\:-skew-x-3{--tw-skew-x:-3deg}.md\:-skew-x-2{--tw-skew-x:-2deg}.md\:-skew-x-1{--tw-skew-x:-1deg}.md\:skew-y-0{--tw-skew-y:0deg}.md\:skew-y-1{--tw-skew-y:1deg}.md\:skew-y-2{--tw-skew-y:2deg}.md\:skew-y-3{--tw-skew-y:3deg}.md\:skew-y-6{--tw-skew-y:6deg}.md\:skew-y-12{--tw-skew-y:12deg}.md\:-skew-y-12{--tw-skew-y:-12deg}.md\:-skew-y-6{--tw-skew-y:-6deg}.md\:-skew-y-3{--tw-skew-y:-3deg}.md\:-skew-y-2{--tw-skew-y:-2deg}.md\:-skew-y-1{--tw-skew-y:-1deg}.md\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.md\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.md\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.md\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.md\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.md\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.md\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.md\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.md\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.md\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.md\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.md\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.md\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.md\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.md\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.md\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.md\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.md\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.md\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.md\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.md\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.md\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.md\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.md\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.md\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.md\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.md\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.md\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.md\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.md\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.md\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.md\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.md\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.md\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.md\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.md\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.md\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.md\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.md\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.md\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.md\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.md\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.md\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.md\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.md\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.md\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.md\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.md\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.md\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.md\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.md\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.md\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.md\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.md\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.md\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.md\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.md\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.md\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.md\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.md\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.md\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.md\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.md\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.md\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.md\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.md\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.md\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.md\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.md\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.md\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.md\:scale-x-0{--tw-scale-x:0}.md\:scale-x-50{--tw-scale-x:.5}.md\:scale-x-75{--tw-scale-x:.75}.md\:scale-x-90{--tw-scale-x:.9}.md\:scale-x-95{--tw-scale-x:.95}.md\:scale-x-100{--tw-scale-x:1}.md\:scale-x-105{--tw-scale-x:1.05}.md\:scale-x-110{--tw-scale-x:1.1}.md\:scale-x-125{--tw-scale-x:1.25}.md\:scale-x-150{--tw-scale-x:1.5}.md\:scale-y-0{--tw-scale-y:0}.md\:scale-y-50{--tw-scale-y:.5}.md\:scale-y-75{--tw-scale-y:.75}.md\:scale-y-90{--tw-scale-y:.9}.md\:scale-y-95{--tw-scale-y:.95}.md\:scale-y-100{--tw-scale-y:1}.md\:scale-y-105{--tw-scale-y:1.05}.md\:scale-y-110{--tw-scale-y:1.1}.md\:scale-y-125{--tw-scale-y:1.25}.md\:scale-y-150{--tw-scale-y:1.5}.md\:hover\:scale-x-0:hover{--tw-scale-x:0}.md\:hover\:scale-x-50:hover{--tw-scale-x:.5}.md\:hover\:scale-x-75:hover{--tw-scale-x:.75}.md\:hover\:scale-x-90:hover{--tw-scale-x:.9}.md\:hover\:scale-x-95:hover{--tw-scale-x:.95}.md\:hover\:scale-x-100:hover{--tw-scale-x:1}.md\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.md\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.md\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.md\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.md\:hover\:scale-y-0:hover{--tw-scale-y:0}.md\:hover\:scale-y-50:hover{--tw-scale-y:.5}.md\:hover\:scale-y-75:hover{--tw-scale-y:.75}.md\:hover\:scale-y-90:hover{--tw-scale-y:.9}.md\:hover\:scale-y-95:hover{--tw-scale-y:.95}.md\:hover\:scale-y-100:hover{--tw-scale-y:1}.md\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.md\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.md\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.md\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.md\:focus\:scale-x-0:focus{--tw-scale-x:0}.md\:focus\:scale-x-50:focus{--tw-scale-x:.5}.md\:focus\:scale-x-75:focus{--tw-scale-x:.75}.md\:focus\:scale-x-90:focus{--tw-scale-x:.9}.md\:focus\:scale-x-95:focus{--tw-scale-x:.95}.md\:focus\:scale-x-100:focus{--tw-scale-x:1}.md\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.md\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.md\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.md\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.md\:focus\:scale-y-0:focus{--tw-scale-y:0}.md\:focus\:scale-y-50:focus{--tw-scale-y:.5}.md\:focus\:scale-y-75:focus{--tw-scale-y:.75}.md\:focus\:scale-y-90:focus{--tw-scale-y:.9}.md\:focus\:scale-y-95:focus{--tw-scale-y:.95}.md\:focus\:scale-y-100:focus{--tw-scale-y:1}.md\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.md\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.md\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.md\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.md\:animate-none{-webkit-animation:none;animation:none}.md\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.md\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.md\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.md\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.md\:cursor-auto{cursor:auto}.md\:cursor-default{cursor:default}.md\:cursor-pointer{cursor:pointer}.md\:cursor-wait{cursor:wait}.md\:cursor-text{cursor:text}.md\:cursor-move{cursor:move}.md\:cursor-help{cursor:help}.md\:cursor-not-allowed{cursor:not-allowed}.md\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.md\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.md\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.md\:resize-none{resize:none}.md\:resize-y{resize:vertical}.md\:resize-x{resize:horizontal}.md\:resize{resize:both}.md\:list-inside{list-style-position:inside}.md\:list-outside{list-style-position:outside}.md\:list-none{list-style-type:none}.md\:list-disc{list-style-type:disc}.md\:list-decimal{list-style-type:decimal}.md\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.md\:auto-cols-auto{grid-auto-columns:auto}.md\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.md\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.md\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.md\:grid-flow-row{grid-auto-flow:row}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-flow-row-dense{grid-auto-flow:row dense}.md\:grid-flow-col-dense{grid-auto-flow:column dense}.md\:auto-rows-auto{grid-auto-rows:auto}.md\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.md\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.md\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.md\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.md\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.md\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.md\:grid-rows-none{grid-template-rows:none}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-col{flex-direction:column}.md\:flex-col-reverse{flex-direction:column-reverse}.md\:flex-wrap{flex-wrap:wrap}.md\:flex-wrap-reverse{flex-wrap:wrap-reverse}.md\:flex-nowrap{flex-wrap:nowrap}.md\:place-content-center{place-content:center}.md\:place-content-start{place-content:start}.md\:place-content-end{place-content:end}.md\:place-content-between{place-content:space-between}.md\:place-content-around{place-content:space-around}.md\:place-content-evenly{place-content:space-evenly}.md\:place-content-stretch{place-content:stretch}.md\:place-items-start{place-items:start}.md\:place-items-end{place-items:end}.md\:place-items-center{place-items:center}.md\:place-items-stretch{place-items:stretch}.md\:content-center{align-content:center}.md\:content-start{align-content:flex-start}.md\:content-end{align-content:flex-end}.md\:content-between{align-content:space-between}.md\:content-around{align-content:space-around}.md\:content-evenly{align-content:space-evenly}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:items-baseline{align-items:baseline}.md\:items-stretch{align-items:stretch}.md\:justify-start{justify-content:flex-start}.md\:justify-end{justify-content:flex-end}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:justify-around{justify-content:space-around}.md\:justify-evenly{justify-content:space-evenly}.md\:justify-items-start{justify-items:start}.md\:justify-items-end{justify-items:end}.md\:justify-items-center{justify-items:center}.md\:justify-items-stretch{justify-items:stretch}.md\:gap-0{gap:0}.md\:gap-1{gap:.25rem}.md\:gap-2{gap:.5rem}.md\:gap-3{gap:.75rem}.md\:gap-4{gap:1rem}.md\:gap-5{gap:1.25rem}.md\:gap-6{gap:1.5rem}.md\:gap-7{gap:1.75rem}.md\:gap-8{gap:2rem}.md\:gap-9{gap:2.25rem}.md\:gap-10{gap:2.5rem}.md\:gap-11{gap:2.75rem}.md\:gap-12{gap:3rem}.md\:gap-14{gap:3.5rem}.md\:gap-16{gap:4rem}.md\:gap-20{gap:5rem}.md\:gap-24{gap:6rem}.md\:gap-28{gap:7rem}.md\:gap-32{gap:8rem}.md\:gap-36{gap:9rem}.md\:gap-40{gap:10rem}.md\:gap-44{gap:11rem}.md\:gap-48{gap:12rem}.md\:gap-52{gap:13rem}.md\:gap-56{gap:14rem}.md\:gap-60{gap:15rem}.md\:gap-64{gap:16rem}.md\:gap-72{gap:18rem}.md\:gap-80{gap:20rem}.md\:gap-96{gap:24rem}.md\:gap-px{gap:1px}.md\:gap-0\.5{gap:.125rem}.md\:gap-1\.5{gap:.375rem}.md\:gap-2\.5{gap:.625rem}.md\:gap-3\.5{gap:.875rem}.md\:gap-x-0{-moz-column-gap:0;column-gap:0}.md\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.md\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.md\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.md\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.md\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.md\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.md\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.md\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.md\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.md\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.md\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.md\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.md\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.md\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.md\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.md\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.md\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.md\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.md\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.md\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.md\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.md\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.md\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.md\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.md\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.md\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.md\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.md\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.md\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.md\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.md\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.md\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.md\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.md\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.md\:gap-y-0{row-gap:0}.md\:gap-y-1{row-gap:.25rem}.md\:gap-y-2{row-gap:.5rem}.md\:gap-y-3{row-gap:.75rem}.md\:gap-y-4{row-gap:1rem}.md\:gap-y-5{row-gap:1.25rem}.md\:gap-y-6{row-gap:1.5rem}.md\:gap-y-7{row-gap:1.75rem}.md\:gap-y-8{row-gap:2rem}.md\:gap-y-9{row-gap:2.25rem}.md\:gap-y-10{row-gap:2.5rem}.md\:gap-y-11{row-gap:2.75rem}.md\:gap-y-12{row-gap:3rem}.md\:gap-y-14{row-gap:3.5rem}.md\:gap-y-16{row-gap:4rem}.md\:gap-y-20{row-gap:5rem}.md\:gap-y-24{row-gap:6rem}.md\:gap-y-28{row-gap:7rem}.md\:gap-y-32{row-gap:8rem}.md\:gap-y-36{row-gap:9rem}.md\:gap-y-40{row-gap:10rem}.md\:gap-y-44{row-gap:11rem}.md\:gap-y-48{row-gap:12rem}.md\:gap-y-52{row-gap:13rem}.md\:gap-y-56{row-gap:14rem}.md\:gap-y-60{row-gap:15rem}.md\:gap-y-64{row-gap:16rem}.md\:gap-y-72{row-gap:18rem}.md\:gap-y-80{row-gap:20rem}.md\:gap-y-96{row-gap:24rem}.md\:gap-y-px{row-gap:1px}.md\:gap-y-0\.5{row-gap:.125rem}.md\:gap-y-1\.5{row-gap:.375rem}.md\:gap-y-2\.5{row-gap:.625rem}.md\:gap-y-3\.5{row-gap:.875rem}.md\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.md\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.md\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.md\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.md\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.md\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.md\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.md\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.md\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.md\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.md\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.md\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.md\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.md\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.md\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.md\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.md\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.md\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.md\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.md\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.md\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.md\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.md\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.md\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.md\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.md\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.md\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.md\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.md\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.md\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.md\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.md\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.md\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.md\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.md\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.md\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.md\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.md\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.md\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.md\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.md\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.md\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.md\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.md\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.md\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.md\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.md\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.md\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.md\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.md\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.md\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.md\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.md\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.md\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.md\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.md\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.md\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.md\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.md\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.md\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.md\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.md\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.md\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.md\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.md\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.md\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.md\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.md\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.md\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.md\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.md\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.md\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.md\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.md\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.md\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.md\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.md\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.md\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.md\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.md\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.md\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.md\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.md\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.md\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.md\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.md\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.md\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.md\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.md\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.md\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.md\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.md\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.md\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.md\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.md\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.md\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.md\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.md\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.md\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.md\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.md\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.md\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.md\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.md\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.md\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.md\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.md\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.md\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.md\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.md\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.md\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.md\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.md\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.md\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.md\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.md\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.md\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.md\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.md\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.md\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.md\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.md\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.md\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.md\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.md\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.md\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.md\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.md\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.md\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.md\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.md\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.md\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.md\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.md\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.md\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.md\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.md\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.md\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.md\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.md\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.md\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.md\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.md\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.md\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.md\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.md\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.md\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.md\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.md\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.md\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.md\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.md\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.md\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.md\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.md\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.md\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.md\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.md\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.md\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.md\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.md\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.md\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.md\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.md\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.md\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.md\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.md\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.md\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.md\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.md\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.md\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.md\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.md\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.md\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.md\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.md\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.md\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.md\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.md\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.md\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.md\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.md\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.md\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.md\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.md\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.md\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.md\:place-self-auto{place-self:auto}.md\:place-self-start{place-self:start}.md\:place-self-end{place-self:end}.md\:place-self-center{place-self:center}.md\:place-self-stretch{place-self:stretch}.md\:self-auto{align-self:auto}.md\:self-start{align-self:flex-start}.md\:self-end{align-self:flex-end}.md\:self-center{align-self:center}.md\:self-stretch{align-self:stretch}.md\:self-baseline{align-self:baseline}.md\:justify-self-auto{justify-self:auto}.md\:justify-self-start{justify-self:start}.md\:justify-self-end{justify-self:end}.md\:justify-self-center{justify-self:center}.md\:justify-self-stretch{justify-self:stretch}.md\:overflow-auto{overflow:auto}.md\:overflow-hidden{overflow:hidden}.md\:overflow-visible{overflow:visible}.md\:overflow-scroll{overflow:scroll}.md\:overflow-x-auto{overflow-x:auto}.md\:overflow-y-auto{overflow-y:auto}.md\:overflow-x-hidden{overflow-x:hidden}.md\:overflow-y-hidden{overflow-y:hidden}.md\:overflow-x-visible{overflow-x:visible}.md\:overflow-y-visible{overflow-y:visible}.md\:overflow-x-scroll{overflow-x:scroll}.md\:overflow-y-scroll{overflow-y:scroll}.md\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.md\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.md\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.md\:overscroll-y-auto{overscroll-behavior-y:auto}.md\:overscroll-y-contain{overscroll-behavior-y:contain}.md\:overscroll-y-none{overscroll-behavior-y:none}.md\:overscroll-x-auto{overscroll-behavior-x:auto}.md\:overscroll-x-contain{overscroll-behavior-x:contain}.md\:overscroll-x-none{overscroll-behavior-x:none}.md\:truncate{overflow:hidden;white-space:nowrap}.md\:overflow-ellipsis,.md\:truncate{text-overflow:ellipsis}.md\:overflow-clip{text-overflow:clip}.md\:whitespace-normal{white-space:normal}.md\:whitespace-nowrap{white-space:nowrap}.md\:whitespace-pre{white-space:pre}.md\:whitespace-pre-line{white-space:pre-line}.md\:whitespace-pre-wrap{white-space:pre-wrap}.md\:break-normal{overflow-wrap:normal;word-break:normal}.md\:break-words{overflow-wrap:break-word}.md\:break-all{word-break:break-all}.md\:rounded-none{border-radius:0}.md\:rounded-sm{border-radius:.125rem}.md\:rounded{border-radius:.25rem}.md\:rounded-md{border-radius:.375rem}.md\:rounded-lg{border-radius:.5rem}.md\:rounded-xl{border-radius:.75rem}.md\:rounded-2xl{border-radius:1rem}.md\:rounded-3xl{border-radius:1.5rem}.md\:rounded-full{border-radius:9999px}.md\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.md\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.md\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.md\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.md\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.md\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.md\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.md\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.md\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.md\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.md\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.md\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.md\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.md\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.md\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.md\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.md\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.md\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.md\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.md\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.md\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-tl-none{border-top-left-radius:0}.md\:rounded-tl-sm{border-top-left-radius:.125rem}.md\:rounded-tl{border-top-left-radius:.25rem}.md\:rounded-tl-md{border-top-left-radius:.375rem}.md\:rounded-tl-lg{border-top-left-radius:.5rem}.md\:rounded-tl-xl{border-top-left-radius:.75rem}.md\:rounded-tl-2xl{border-top-left-radius:1rem}.md\:rounded-tl-3xl{border-top-left-radius:1.5rem}.md\:rounded-tl-full{border-top-left-radius:9999px}.md\:rounded-tr-none{border-top-right-radius:0}.md\:rounded-tr-sm{border-top-right-radius:.125rem}.md\:rounded-tr{border-top-right-radius:.25rem}.md\:rounded-tr-md{border-top-right-radius:.375rem}.md\:rounded-tr-lg{border-top-right-radius:.5rem}.md\:rounded-tr-xl{border-top-right-radius:.75rem}.md\:rounded-tr-2xl{border-top-right-radius:1rem}.md\:rounded-tr-3xl{border-top-right-radius:1.5rem}.md\:rounded-tr-full{border-top-right-radius:9999px}.md\:rounded-br-none{border-bottom-right-radius:0}.md\:rounded-br-sm{border-bottom-right-radius:.125rem}.md\:rounded-br{border-bottom-right-radius:.25rem}.md\:rounded-br-md{border-bottom-right-radius:.375rem}.md\:rounded-br-lg{border-bottom-right-radius:.5rem}.md\:rounded-br-xl{border-bottom-right-radius:.75rem}.md\:rounded-br-2xl{border-bottom-right-radius:1rem}.md\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.md\:rounded-br-full{border-bottom-right-radius:9999px}.md\:rounded-bl-none{border-bottom-left-radius:0}.md\:rounded-bl-sm{border-bottom-left-radius:.125rem}.md\:rounded-bl{border-bottom-left-radius:.25rem}.md\:rounded-bl-md{border-bottom-left-radius:.375rem}.md\:rounded-bl-lg{border-bottom-left-radius:.5rem}.md\:rounded-bl-xl{border-bottom-left-radius:.75rem}.md\:rounded-bl-2xl{border-bottom-left-radius:1rem}.md\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.md\:rounded-bl-full{border-bottom-left-radius:9999px}.md\:border-0{border-width:0}.md\:border-2{border-width:2px}.md\:border-4{border-width:4px}.md\:border-8{border-width:8px}.md\:border{border-width:1px}.md\:border-t-0{border-top-width:0}.md\:border-t-2{border-top-width:2px}.md\:border-t-4{border-top-width:4px}.md\:border-t-8{border-top-width:8px}.md\:border-t{border-top-width:1px}.md\:border-r-0{border-right-width:0}.md\:border-r-2{border-right-width:2px}.md\:border-r-4{border-right-width:4px}.md\:border-r-8{border-right-width:8px}.md\:border-r{border-right-width:1px}.md\:border-b-0{border-bottom-width:0}.md\:border-b-2{border-bottom-width:2px}.md\:border-b-4{border-bottom-width:4px}.md\:border-b-8{border-bottom-width:8px}.md\:border-b{border-bottom-width:1px}.md\:border-l-0{border-left-width:0}.md\:border-l-2{border-left-width:2px}.md\:border-l-4{border-left-width:4px}.md\:border-l-8{border-left-width:8px}.md\:border-l{border-left-width:1px}.md\:border-solid{border-style:solid}.md\:border-dashed{border-style:dashed}.md\:border-dotted{border-style:dotted}.md\:border-double{border-style:double}.md\:border-none{border-style:none}.md\:border-transparent{border-color:transparent}.md\:border-current{border-color:currentColor}.md\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-transparent{border-color:transparent}.group:hover .md\:group-hover\:border-current{border-color:currentColor}.group:hover .md\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .md\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:focus-within\:border-transparent:focus-within{border-color:transparent}.md\:focus-within\:border-current:focus-within{border-color:currentColor}.md\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:hover\:border-transparent:hover{border-color:transparent}.md\:hover\:border-current:hover{border-color:currentColor}.md\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:focus\:border-transparent:focus{border-color:transparent}.md\:focus\:border-current:focus{border-color:currentColor}.md\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.md\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.md\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.md\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.md\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.md\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.md\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.md\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.md\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.md\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.md\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.md\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.md\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.md\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.md\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.md\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.md\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.md\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.md\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.md\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.md\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.md\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.md\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.md\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.md\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.md\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.md\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.md\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.md\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.md\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.md\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.md\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.md\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.md\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.md\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.md\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.md\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.md\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.md\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.md\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.md\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.md\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.md\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.md\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.md\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.md\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.md\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.md\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.md\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.md\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.md\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.md\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.md\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.md\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.md\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.md\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.md\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.md\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.md\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.md\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.md\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.md\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.md\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.md\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.md\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.md\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.md\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.md\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.md\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.md\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.md\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.md\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.md\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.md\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.md\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.md\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.md\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.md\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.md\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.md\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.md\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.md\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.md\:border-opacity-0{--tw-border-opacity:0}.md\:border-opacity-5{--tw-border-opacity:0.05}.md\:border-opacity-10{--tw-border-opacity:0.1}.md\:border-opacity-20{--tw-border-opacity:0.2}.md\:border-opacity-25{--tw-border-opacity:0.25}.md\:border-opacity-30{--tw-border-opacity:0.3}.md\:border-opacity-40{--tw-border-opacity:0.4}.md\:border-opacity-50{--tw-border-opacity:0.5}.md\:border-opacity-60{--tw-border-opacity:0.6}.md\:border-opacity-70{--tw-border-opacity:0.7}.md\:border-opacity-75{--tw-border-opacity:0.75}.md\:border-opacity-80{--tw-border-opacity:0.8}.md\:border-opacity-90{--tw-border-opacity:0.9}.md\:border-opacity-95{--tw-border-opacity:0.95}.md\:border-opacity-100{--tw-border-opacity:1}.group:hover .md\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .md\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .md\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .md\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .md\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .md\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .md\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .md\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .md\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .md\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .md\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .md\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .md\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .md\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .md\:group-hover\:border-opacity-100{--tw-border-opacity:1}.md\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.md\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.md\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.md\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.md\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.md\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.md\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.md\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.md\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.md\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.md\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.md\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.md\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.md\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.md\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.md\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.md\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.md\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.md\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.md\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.md\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.md\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.md\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.md\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.md\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.md\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.md\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.md\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.md\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.md\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.md\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.md\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.md\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.md\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.md\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.md\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.md\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.md\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.md\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.md\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.md\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.md\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.md\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.md\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.md\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.md\:bg-transparent{background-color:initial}.md\:bg-current{background-color:currentColor}.md\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-transparent{background-color:initial}.group:hover .md\:group-hover\:bg-current{background-color:currentColor}.group:hover .md\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .md\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:focus-within\:bg-transparent:focus-within{background-color:initial}.md\:focus-within\:bg-current:focus-within{background-color:currentColor}.md\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:hover\:bg-transparent:hover{background-color:initial}.md\:hover\:bg-current:hover{background-color:currentColor}.md\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:focus\:bg-transparent:focus{background-color:initial}.md\:focus\:bg-current:focus{background-color:currentColor}.md\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.md\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.md\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.md\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.md\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.md\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.md\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.md\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.md\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.md\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.md\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.md\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.md\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.md\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.md\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.md\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.md\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.md\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.md\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.md\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.md\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.md\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.md\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.md\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.md\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.md\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.md\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.md\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.md\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.md\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.md\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.md\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.md\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.md\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.md\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.md\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.md\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.md\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.md\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.md\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.md\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.md\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.md\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.md\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.md\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.md\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.md\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.md\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.md\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.md\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.md\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.md\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.md\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.md\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.md\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.md\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.md\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.md\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.md\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.md\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.md\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.md\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.md\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.md\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.md\:bg-opacity-0{--tw-bg-opacity:0}.md\:bg-opacity-5{--tw-bg-opacity:0.05}.md\:bg-opacity-10{--tw-bg-opacity:0.1}.md\:bg-opacity-20{--tw-bg-opacity:0.2}.md\:bg-opacity-25{--tw-bg-opacity:0.25}.md\:bg-opacity-30{--tw-bg-opacity:0.3}.md\:bg-opacity-40{--tw-bg-opacity:0.4}.md\:bg-opacity-50{--tw-bg-opacity:0.5}.md\:bg-opacity-60{--tw-bg-opacity:0.6}.md\:bg-opacity-70{--tw-bg-opacity:0.7}.md\:bg-opacity-75{--tw-bg-opacity:0.75}.md\:bg-opacity-80{--tw-bg-opacity:0.8}.md\:bg-opacity-90{--tw-bg-opacity:0.9}.md\:bg-opacity-95{--tw-bg-opacity:0.95}.md\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .md\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .md\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .md\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .md\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .md\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .md\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .md\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .md\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .md\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .md\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .md\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .md\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .md\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .md\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .md\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.md\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.md\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.md\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.md\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.md\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.md\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.md\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.md\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.md\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.md\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.md\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.md\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.md\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.md\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.md\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.md\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.md\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.md\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.md\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.md\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.md\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.md\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.md\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.md\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.md\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.md\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.md\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.md\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.md\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.md\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.md\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.md\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.md\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.md\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.md\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.md\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.md\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.md\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.md\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.md\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.md\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.md\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.md\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.md\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.md\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.md\:bg-none{background-image:none}.md\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.md\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.md\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.md\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.md\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.md\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.md\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.md\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.md\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.md\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.md\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.md\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.md\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.md\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.md\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.md\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.md\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.md\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.md\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.md\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.md\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.md\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.md\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.md\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.md\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.md\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.md\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.md\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.md\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.md\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.md\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.md\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.md\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.md\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.md\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.md\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.md\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.md\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.md\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.md\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.md\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.md\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.md\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.md\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.md\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.md\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.md\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.md\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.md\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.md\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.md\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.md\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.md\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.md\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.md\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.md\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.md\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.md\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.md\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.md\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.md\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.md\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.md\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.md\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.md\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.md\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.md\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.md\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.md\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.md\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.md\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.md\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.md\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.md\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.md\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.md\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.md\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.md\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.md\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.md\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.md\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.md\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.md\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.md\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.md\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.md\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.md\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.md\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.md\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.md\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.md\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.md\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.md\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.md\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.md\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.md\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.md\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.md\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.md\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.md\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.md\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.md\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.md\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.md\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.md\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.md\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.md\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.md\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.md\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.md\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.md\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.md\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.md\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.md\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.md\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.md\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.md\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.md\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.md\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.md\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.md\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.md\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.md\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.md\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.md\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.md\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.md\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.md\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.md\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.md\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.md\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.md\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.md\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.md\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.md\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.md\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.md\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.md\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.md\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.md\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.md\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.md\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.md\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.md\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.md\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.md\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.md\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.md\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.md\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.md\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.md\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.md\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.md\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.md\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.md\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.md\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.md\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.md\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.md\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.md\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.md\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.md\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.md\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.md\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.md\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.md\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.md\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.md\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.md\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.md\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.md\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.md\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.md\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.md\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.md\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.md\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.md\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.md\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.md\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.md\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.md\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.md\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.md\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.md\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.md\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.md\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.md\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.md\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.md\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.md\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.md\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.md\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.md\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.md\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.md\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.md\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.md\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.md\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.md\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.md\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.md\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.md\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.md\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.md\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.md\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.md\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.md\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.md\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.md\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.md\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.md\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.md\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.md\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.md\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.md\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.md\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.md\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.md\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.md\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.md\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.md\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.md\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.md\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.md\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.md\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.md\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.md\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.md\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.md\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.md\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.md\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.md\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.md\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.md\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.md\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.md\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.md\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.md\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.md\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.md\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.md\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.md\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.md\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.md\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.md\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.md\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.md\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.md\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.md\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.md\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.md\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.md\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.md\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.md\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.md\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.md\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.md\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.md\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.md\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.md\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.md\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.md\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.md\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.md\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.md\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.md\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.md\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.md\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.md\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.md\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.md\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.md\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.md\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.md\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.md\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.md\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.md\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.md\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.md\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.md\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.md\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.md\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.md\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.md\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.md\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.md\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.md\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.md\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.md\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.md\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.md\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.md\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.md\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.md\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.md\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.md\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.md\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.md\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.md\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.md\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.md\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.md\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.md\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.md\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.md\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.md\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.md\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.md\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.md\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.md\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.md\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.md\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.md\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.md\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.md\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.md\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.md\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.md\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.md\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.md\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.md\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.md\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.md\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.md\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.md\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.md\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.md\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.md\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.md\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.md\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.md\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.md\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.md\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.md\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.md\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.md\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.md\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.md\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.md\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.md\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.md\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.md\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.md\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.md\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.md\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.md\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.md\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.md\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.md\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.md\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.md\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.md\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.md\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.md\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.md\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.md\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.md\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.md\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.md\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.md\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.md\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.md\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.md\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.md\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.md\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.md\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.md\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.md\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.md\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.md\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.md\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.md\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.md\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.md\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.md\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.md\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.md\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.md\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.md\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.md\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.md\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.md\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.md\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.md\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.md\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.md\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.md\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.md\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.md\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.md\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.md\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.md\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.md\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.md\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.md\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.md\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.md\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.md\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.md\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.md\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.md\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.md\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.md\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.md\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.md\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.md\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.md\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.md\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.md\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.md\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.md\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.md\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.md\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.md\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.md\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.md\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.md\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.md\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.md\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.md\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.md\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.md\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.md\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.md\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.md\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.md\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.md\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.md\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.md\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.md\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.md\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.md\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.md\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.md\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.md\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.md\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.md\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.md\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.md\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.md\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.md\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.md\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.md\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.md\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.md\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.md\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.md\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.md\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.md\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.md\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.md\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.md\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.md\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.md\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.md\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.md\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.md\:to-transparent{--tw-gradient-to:transparent}.md\:to-current{--tw-gradient-to:currentColor}.md\:to-black{--tw-gradient-to:#000}.md\:to-white{--tw-gradient-to:#fff}.md\:to-gray-50{--tw-gradient-to:#f9fafb}.md\:to-gray-100{--tw-gradient-to:#f3f4f6}.md\:to-gray-200{--tw-gradient-to:#e5e7eb}.md\:to-gray-300{--tw-gradient-to:#d1d5db}.md\:to-gray-400{--tw-gradient-to:#9ca3af}.md\:to-gray-500{--tw-gradient-to:#6b7280}.md\:to-gray-600{--tw-gradient-to:#4b5563}.md\:to-gray-700{--tw-gradient-to:#374151}.md\:to-gray-800{--tw-gradient-to:#1f2937}.md\:to-gray-900{--tw-gradient-to:#111827}.md\:to-red-50{--tw-gradient-to:#fef2f2}.md\:to-red-100{--tw-gradient-to:#fee2e2}.md\:to-red-200{--tw-gradient-to:#fecaca}.md\:to-red-300{--tw-gradient-to:#fca5a5}.md\:to-red-400{--tw-gradient-to:#f87171}.md\:to-red-500{--tw-gradient-to:#ef4444}.md\:to-red-600{--tw-gradient-to:#dc2626}.md\:to-red-700{--tw-gradient-to:#b91c1c}.md\:to-red-800{--tw-gradient-to:#991b1b}.md\:to-red-900{--tw-gradient-to:#7f1d1d}.md\:to-yellow-50{--tw-gradient-to:#fffbeb}.md\:to-yellow-100{--tw-gradient-to:#fef3c7}.md\:to-yellow-200{--tw-gradient-to:#fde68a}.md\:to-yellow-300{--tw-gradient-to:#fcd34d}.md\:to-yellow-400{--tw-gradient-to:#fbbf24}.md\:to-yellow-500{--tw-gradient-to:#f59e0b}.md\:to-yellow-600{--tw-gradient-to:#d97706}.md\:to-yellow-700{--tw-gradient-to:#b45309}.md\:to-yellow-800{--tw-gradient-to:#92400e}.md\:to-yellow-900{--tw-gradient-to:#78350f}.md\:to-green-50{--tw-gradient-to:#ecfdf5}.md\:to-green-100{--tw-gradient-to:#d1fae5}.md\:to-green-200{--tw-gradient-to:#a7f3d0}.md\:to-green-300{--tw-gradient-to:#6ee7b7}.md\:to-green-400{--tw-gradient-to:#34d399}.md\:to-green-500{--tw-gradient-to:#10b981}.md\:to-green-600{--tw-gradient-to:#059669}.md\:to-green-700{--tw-gradient-to:#047857}.md\:to-green-800{--tw-gradient-to:#065f46}.md\:to-green-900{--tw-gradient-to:#064e3b}.md\:to-blue-50{--tw-gradient-to:#eff6ff}.md\:to-blue-100{--tw-gradient-to:#dbeafe}.md\:to-blue-200{--tw-gradient-to:#bfdbfe}.md\:to-blue-300{--tw-gradient-to:#93c5fd}.md\:to-blue-400{--tw-gradient-to:#60a5fa}.md\:to-blue-500{--tw-gradient-to:#3b82f6}.md\:to-blue-600{--tw-gradient-to:#2563eb}.md\:to-blue-700{--tw-gradient-to:#1d4ed8}.md\:to-blue-800{--tw-gradient-to:#1e40af}.md\:to-blue-900{--tw-gradient-to:#1e3a8a}.md\:to-indigo-50{--tw-gradient-to:#eef2ff}.md\:to-indigo-100{--tw-gradient-to:#e0e7ff}.md\:to-indigo-200{--tw-gradient-to:#c7d2fe}.md\:to-indigo-300{--tw-gradient-to:#a5b4fc}.md\:to-indigo-400{--tw-gradient-to:#818cf8}.md\:to-indigo-500{--tw-gradient-to:#6366f1}.md\:to-indigo-600{--tw-gradient-to:#4f46e5}.md\:to-indigo-700{--tw-gradient-to:#4338ca}.md\:to-indigo-800{--tw-gradient-to:#3730a3}.md\:to-indigo-900{--tw-gradient-to:#312e81}.md\:to-purple-50{--tw-gradient-to:#f5f3ff}.md\:to-purple-100{--tw-gradient-to:#ede9fe}.md\:to-purple-200{--tw-gradient-to:#ddd6fe}.md\:to-purple-300{--tw-gradient-to:#c4b5fd}.md\:to-purple-400{--tw-gradient-to:#a78bfa}.md\:to-purple-500{--tw-gradient-to:#8b5cf6}.md\:to-purple-600{--tw-gradient-to:#7c3aed}.md\:to-purple-700{--tw-gradient-to:#6d28d9}.md\:to-purple-800{--tw-gradient-to:#5b21b6}.md\:to-purple-900{--tw-gradient-to:#4c1d95}.md\:to-pink-50{--tw-gradient-to:#fdf2f8}.md\:to-pink-100{--tw-gradient-to:#fce7f3}.md\:to-pink-200{--tw-gradient-to:#fbcfe8}.md\:to-pink-300{--tw-gradient-to:#f9a8d4}.md\:to-pink-400{--tw-gradient-to:#f472b6}.md\:to-pink-500{--tw-gradient-to:#ec4899}.md\:to-pink-600{--tw-gradient-to:#db2777}.md\:to-pink-700{--tw-gradient-to:#be185d}.md\:to-pink-800{--tw-gradient-to:#9d174d}.md\:to-pink-900{--tw-gradient-to:#831843}.md\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.md\:hover\:to-current:hover{--tw-gradient-to:currentColor}.md\:hover\:to-black:hover{--tw-gradient-to:#000}.md\:hover\:to-white:hover{--tw-gradient-to:#fff}.md\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.md\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.md\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.md\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.md\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.md\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.md\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.md\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.md\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.md\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.md\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.md\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.md\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.md\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.md\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.md\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.md\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.md\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.md\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.md\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.md\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.md\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.md\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.md\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.md\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.md\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.md\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.md\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.md\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.md\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.md\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.md\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.md\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.md\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.md\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.md\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.md\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.md\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.md\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.md\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.md\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.md\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.md\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.md\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.md\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.md\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.md\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.md\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.md\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.md\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.md\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.md\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.md\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.md\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.md\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.md\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.md\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.md\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.md\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.md\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.md\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.md\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.md\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.md\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.md\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.md\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.md\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.md\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.md\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.md\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.md\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.md\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.md\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.md\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.md\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.md\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.md\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.md\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.md\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.md\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.md\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.md\:focus\:to-current:focus{--tw-gradient-to:currentColor}.md\:focus\:to-black:focus{--tw-gradient-to:#000}.md\:focus\:to-white:focus{--tw-gradient-to:#fff}.md\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.md\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.md\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.md\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.md\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.md\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.md\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.md\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.md\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.md\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.md\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.md\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.md\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.md\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.md\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.md\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.md\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.md\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.md\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.md\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.md\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.md\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.md\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.md\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.md\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.md\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.md\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.md\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.md\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.md\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.md\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.md\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.md\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.md\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.md\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.md\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.md\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.md\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.md\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.md\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.md\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.md\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.md\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.md\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.md\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.md\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.md\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.md\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.md\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.md\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.md\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.md\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.md\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.md\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.md\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.md\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.md\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.md\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.md\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.md\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.md\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.md\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.md\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.md\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.md\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.md\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.md\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.md\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.md\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.md\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.md\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.md\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.md\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.md\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.md\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.md\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.md\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.md\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.md\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.md\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.md\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.md\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md\:bg-auto{background-size:auto}.md\:bg-cover{background-size:cover}.md\:bg-contain{background-size:contain}.md\:bg-fixed{background-attachment:fixed}.md\:bg-local{background-attachment:local}.md\:bg-scroll{background-attachment:scroll}.md\:bg-clip-border{background-clip:initial}.md\:bg-clip-padding{background-clip:padding-box}.md\:bg-clip-content{background-clip:content-box}.md\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.md\:bg-bottom{background-position:bottom}.md\:bg-center{background-position:50%}.md\:bg-left{background-position:0}.md\:bg-left-bottom{background-position:0 100%}.md\:bg-left-top{background-position:0 0}.md\:bg-right{background-position:100%}.md\:bg-right-bottom{background-position:100% 100%}.md\:bg-right-top{background-position:100% 0}.md\:bg-top{background-position:top}.md\:bg-repeat{background-repeat:repeat}.md\:bg-no-repeat{background-repeat:no-repeat}.md\:bg-repeat-x{background-repeat:repeat-x}.md\:bg-repeat-y{background-repeat:repeat-y}.md\:bg-repeat-round{background-repeat:round}.md\:bg-repeat-space{background-repeat:space}.md\:bg-origin-border{background-origin:border-box}.md\:bg-origin-padding{background-origin:initial}.md\:bg-origin-content{background-origin:content-box}.md\:fill-current{fill:currentColor}.md\:stroke-current{stroke:currentColor}.md\:stroke-0{stroke-width:0}.md\:stroke-1{stroke-width:1}.md\:stroke-2{stroke-width:2}.md\:object-contain{-o-object-fit:contain;object-fit:contain}.md\:object-cover{-o-object-fit:cover;object-fit:cover}.md\:object-fill{-o-object-fit:fill;object-fit:fill}.md\:object-none{-o-object-fit:none;object-fit:none}.md\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.md\:object-bottom{-o-object-position:bottom;object-position:bottom}.md\:object-center{-o-object-position:center;object-position:center}.md\:object-left{-o-object-position:left;object-position:left}.md\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.md\:object-left-top{-o-object-position:left top;object-position:left top}.md\:object-right{-o-object-position:right;object-position:right}.md\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.md\:object-right-top{-o-object-position:right top;object-position:right top}.md\:object-top{-o-object-position:top;object-position:top}.md\:p-0{padding:0}.md\:p-1{padding:.25rem}.md\:p-2{padding:.5rem}.md\:p-3{padding:.75rem}.md\:p-4{padding:1rem}.md\:p-5{padding:1.25rem}.md\:p-6{padding:1.5rem}.md\:p-7{padding:1.75rem}.md\:p-8{padding:2rem}.md\:p-9{padding:2.25rem}.md\:p-10{padding:2.5rem}.md\:p-11{padding:2.75rem}.md\:p-12{padding:3rem}.md\:p-14{padding:3.5rem}.md\:p-16{padding:4rem}.md\:p-20{padding:5rem}.md\:p-24{padding:6rem}.md\:p-28{padding:7rem}.md\:p-32{padding:8rem}.md\:p-36{padding:9rem}.md\:p-40{padding:10rem}.md\:p-44{padding:11rem}.md\:p-48{padding:12rem}.md\:p-52{padding:13rem}.md\:p-56{padding:14rem}.md\:p-60{padding:15rem}.md\:p-64{padding:16rem}.md\:p-72{padding:18rem}.md\:p-80{padding:20rem}.md\:p-96{padding:24rem}.md\:p-px{padding:1px}.md\:p-0\.5{padding:.125rem}.md\:p-1\.5{padding:.375rem}.md\:p-2\.5{padding:.625rem}.md\:p-3\.5{padding:.875rem}.md\:px-0{padding-left:0;padding-right:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:px-7{padding-left:1.75rem;padding-right:1.75rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:px-9{padding-left:2.25rem;padding-right:2.25rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:px-11{padding-left:2.75rem;padding-right:2.75rem}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:px-14{padding-left:3.5rem;padding-right:3.5rem}.md\:px-16{padding-left:4rem;padding-right:4rem}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:px-24{padding-left:6rem;padding-right:6rem}.md\:px-28{padding-left:7rem;padding-right:7rem}.md\:px-32{padding-left:8rem;padding-right:8rem}.md\:px-36{padding-left:9rem;padding-right:9rem}.md\:px-40{padding-left:10rem;padding-right:10rem}.md\:px-44{padding-left:11rem;padding-right:11rem}.md\:px-48{padding-left:12rem;padding-right:12rem}.md\:px-52{padding-left:13rem;padding-right:13rem}.md\:px-56{padding-left:14rem;padding-right:14rem}.md\:px-60{padding-left:15rem;padding-right:15rem}.md\:px-64{padding-left:16rem;padding-right:16rem}.md\:px-72{padding-left:18rem;padding-right:18rem}.md\:px-80{padding-left:20rem;padding-right:20rem}.md\:px-96{padding-left:24rem;padding-right:24rem}.md\:px-px{padding-left:1px;padding-right:1px}.md\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.md\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.md\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.md\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:py-1{padding-top:.25rem;padding-bottom:.25rem}.md\:py-2{padding-top:.5rem;padding-bottom:.5rem}.md\:py-3{padding-top:.75rem;padding-bottom:.75rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.md\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.md\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}.md\:py-24{padding-top:6rem;padding-bottom:6rem}.md\:py-28{padding-top:7rem;padding-bottom:7rem}.md\:py-32{padding-top:8rem;padding-bottom:8rem}.md\:py-36{padding-top:9rem;padding-bottom:9rem}.md\:py-40{padding-top:10rem;padding-bottom:10rem}.md\:py-44{padding-top:11rem;padding-bottom:11rem}.md\:py-48{padding-top:12rem;padding-bottom:12rem}.md\:py-52{padding-top:13rem;padding-bottom:13rem}.md\:py-56{padding-top:14rem;padding-bottom:14rem}.md\:py-60{padding-top:15rem;padding-bottom:15rem}.md\:py-64{padding-top:16rem;padding-bottom:16rem}.md\:py-72{padding-top:18rem;padding-bottom:18rem}.md\:py-80{padding-top:20rem;padding-bottom:20rem}.md\:py-96{padding-top:24rem;padding-bottom:24rem}.md\:py-px{padding-top:1px;padding-bottom:1px}.md\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.md\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.md\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.md\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.md\:pt-0{padding-top:0}.md\:pt-1{padding-top:.25rem}.md\:pt-2{padding-top:.5rem}.md\:pt-3{padding-top:.75rem}.md\:pt-4{padding-top:1rem}.md\:pt-5{padding-top:1.25rem}.md\:pt-6{padding-top:1.5rem}.md\:pt-7{padding-top:1.75rem}.md\:pt-8{padding-top:2rem}.md\:pt-9{padding-top:2.25rem}.md\:pt-10{padding-top:2.5rem}.md\:pt-11{padding-top:2.75rem}.md\:pt-12{padding-top:3rem}.md\:pt-14{padding-top:3.5rem}.md\:pt-16{padding-top:4rem}.md\:pt-20{padding-top:5rem}.md\:pt-24{padding-top:6rem}.md\:pt-28{padding-top:7rem}.md\:pt-32{padding-top:8rem}.md\:pt-36{padding-top:9rem}.md\:pt-40{padding-top:10rem}.md\:pt-44{padding-top:11rem}.md\:pt-48{padding-top:12rem}.md\:pt-52{padding-top:13rem}.md\:pt-56{padding-top:14rem}.md\:pt-60{padding-top:15rem}.md\:pt-64{padding-top:16rem}.md\:pt-72{padding-top:18rem}.md\:pt-80{padding-top:20rem}.md\:pt-96{padding-top:24rem}.md\:pt-px{padding-top:1px}.md\:pt-0\.5{padding-top:.125rem}.md\:pt-1\.5{padding-top:.375rem}.md\:pt-2\.5{padding-top:.625rem}.md\:pt-3\.5{padding-top:.875rem}.md\:pr-0{padding-right:0}.md\:pr-1{padding-right:.25rem}.md\:pr-2{padding-right:.5rem}.md\:pr-3{padding-right:.75rem}.md\:pr-4{padding-right:1rem}.md\:pr-5{padding-right:1.25rem}.md\:pr-6{padding-right:1.5rem}.md\:pr-7{padding-right:1.75rem}.md\:pr-8{padding-right:2rem}.md\:pr-9{padding-right:2.25rem}.md\:pr-10{padding-right:2.5rem}.md\:pr-11{padding-right:2.75rem}.md\:pr-12{padding-right:3rem}.md\:pr-14{padding-right:3.5rem}.md\:pr-16{padding-right:4rem}.md\:pr-20{padding-right:5rem}.md\:pr-24{padding-right:6rem}.md\:pr-28{padding-right:7rem}.md\:pr-32{padding-right:8rem}.md\:pr-36{padding-right:9rem}.md\:pr-40{padding-right:10rem}.md\:pr-44{padding-right:11rem}.md\:pr-48{padding-right:12rem}.md\:pr-52{padding-right:13rem}.md\:pr-56{padding-right:14rem}.md\:pr-60{padding-right:15rem}.md\:pr-64{padding-right:16rem}.md\:pr-72{padding-right:18rem}.md\:pr-80{padding-right:20rem}.md\:pr-96{padding-right:24rem}.md\:pr-px{padding-right:1px}.md\:pr-0\.5{padding-right:.125rem}.md\:pr-1\.5{padding-right:.375rem}.md\:pr-2\.5{padding-right:.625rem}.md\:pr-3\.5{padding-right:.875rem}.md\:pb-0{padding-bottom:0}.md\:pb-1{padding-bottom:.25rem}.md\:pb-2{padding-bottom:.5rem}.md\:pb-3{padding-bottom:.75rem}.md\:pb-4{padding-bottom:1rem}.md\:pb-5{padding-bottom:1.25rem}.md\:pb-6{padding-bottom:1.5rem}.md\:pb-7{padding-bottom:1.75rem}.md\:pb-8{padding-bottom:2rem}.md\:pb-9{padding-bottom:2.25rem}.md\:pb-10{padding-bottom:2.5rem}.md\:pb-11{padding-bottom:2.75rem}.md\:pb-12{padding-bottom:3rem}.md\:pb-14{padding-bottom:3.5rem}.md\:pb-16{padding-bottom:4rem}.md\:pb-20{padding-bottom:5rem}.md\:pb-24{padding-bottom:6rem}.md\:pb-28{padding-bottom:7rem}.md\:pb-32{padding-bottom:8rem}.md\:pb-36{padding-bottom:9rem}.md\:pb-40{padding-bottom:10rem}.md\:pb-44{padding-bottom:11rem}.md\:pb-48{padding-bottom:12rem}.md\:pb-52{padding-bottom:13rem}.md\:pb-56{padding-bottom:14rem}.md\:pb-60{padding-bottom:15rem}.md\:pb-64{padding-bottom:16rem}.md\:pb-72{padding-bottom:18rem}.md\:pb-80{padding-bottom:20rem}.md\:pb-96{padding-bottom:24rem}.md\:pb-px{padding-bottom:1px}.md\:pb-0\.5{padding-bottom:.125rem}.md\:pb-1\.5{padding-bottom:.375rem}.md\:pb-2\.5{padding-bottom:.625rem}.md\:pb-3\.5{padding-bottom:.875rem}.md\:pl-0{padding-left:0}.md\:pl-1{padding-left:.25rem}.md\:pl-2{padding-left:.5rem}.md\:pl-3{padding-left:.75rem}.md\:pl-4{padding-left:1rem}.md\:pl-5{padding-left:1.25rem}.md\:pl-6{padding-left:1.5rem}.md\:pl-7{padding-left:1.75rem}.md\:pl-8{padding-left:2rem}.md\:pl-9{padding-left:2.25rem}.md\:pl-10{padding-left:2.5rem}.md\:pl-11{padding-left:2.75rem}.md\:pl-12{padding-left:3rem}.md\:pl-14{padding-left:3.5rem}.md\:pl-16{padding-left:4rem}.md\:pl-20{padding-left:5rem}.md\:pl-24{padding-left:6rem}.md\:pl-28{padding-left:7rem}.md\:pl-32{padding-left:8rem}.md\:pl-36{padding-left:9rem}.md\:pl-40{padding-left:10rem}.md\:pl-44{padding-left:11rem}.md\:pl-48{padding-left:12rem}.md\:pl-52{padding-left:13rem}.md\:pl-56{padding-left:14rem}.md\:pl-60{padding-left:15rem}.md\:pl-64{padding-left:16rem}.md\:pl-72{padding-left:18rem}.md\:pl-80{padding-left:20rem}.md\:pl-96{padding-left:24rem}.md\:pl-px{padding-left:1px}.md\:pl-0\.5{padding-left:.125rem}.md\:pl-1\.5{padding-left:.375rem}.md\:pl-2\.5{padding-left:.625rem}.md\:pl-3\.5{padding-left:.875rem}.md\:text-left{text-align:left}.md\:text-center{text-align:center}.md\:text-right{text-align:right}.md\:text-justify{text-align:justify}.md\:align-baseline{vertical-align:initial}.md\:align-top{vertical-align:top}.md\:align-middle{vertical-align:middle}.md\:align-bottom{vertical-align:bottom}.md\:align-text-top{vertical-align:text-top}.md\:align-text-bottom{vertical-align:text-bottom}.md\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.md\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.md\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.md\:text-xs{font-size:.75rem;line-height:1rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-6xl{font-size:3.75rem;line-height:1}.md\:text-7xl{font-size:4.5rem;line-height:1}.md\:text-8xl{font-size:6rem;line-height:1}.md\:text-9xl{font-size:8rem;line-height:1}.md\:font-thin{font-weight:100}.md\:font-extralight{font-weight:200}.md\:font-light{font-weight:300}.md\:font-normal{font-weight:400}.md\:font-medium{font-weight:500}.md\:font-semibold{font-weight:600}.md\:font-bold{font-weight:700}.md\:font-extrabold{font-weight:800}.md\:font-black{font-weight:900}.md\:uppercase{text-transform:uppercase}.md\:lowercase{text-transform:lowercase}.md\:capitalize{text-transform:capitalize}.md\:normal-case{text-transform:none}.md\:italic{font-style:italic}.md\:not-italic{font-style:normal}.md\:diagonal-fractions,.md\:lining-nums,.md\:oldstyle-nums,.md\:ordinal,.md\:proportional-nums,.md\:slashed-zero,.md\:stacked-fractions,.md\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.md\:normal-nums{font-variant-numeric:normal}.md\:ordinal{--tw-ordinal:ordinal}.md\:slashed-zero{--tw-slashed-zero:slashed-zero}.md\:lining-nums{--tw-numeric-figure:lining-nums}.md\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.md\:proportional-nums{--tw-numeric-spacing:proportional-nums}.md\:tabular-nums{--tw-numeric-spacing:tabular-nums}.md\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.md\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.md\:leading-3{line-height:.75rem}.md\:leading-4{line-height:1rem}.md\:leading-5{line-height:1.25rem}.md\:leading-6{line-height:1.5rem}.md\:leading-7{line-height:1.75rem}.md\:leading-8{line-height:2rem}.md\:leading-9{line-height:2.25rem}.md\:leading-10{line-height:2.5rem}.md\:leading-none{line-height:1}.md\:leading-tight{line-height:1.25}.md\:leading-snug{line-height:1.375}.md\:leading-normal{line-height:1.5}.md\:leading-relaxed{line-height:1.625}.md\:leading-loose{line-height:2}.md\:tracking-tighter{letter-spacing:-.05em}.md\:tracking-tight{letter-spacing:-.025em}.md\:tracking-normal{letter-spacing:0}.md\:tracking-wide{letter-spacing:.025em}.md\:tracking-wider{letter-spacing:.05em}.md\:tracking-widest{letter-spacing:.1em}.md\:text-transparent{color:transparent}.md\:text-current{color:currentColor}.md\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-transparent{color:transparent}.group:hover .md\:group-hover\:text-current{color:currentColor}.group:hover .md\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .md\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:focus-within\:text-transparent:focus-within{color:transparent}.md\:focus-within\:text-current:focus-within{color:currentColor}.md\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:hover\:text-transparent:hover{color:transparent}.md\:hover\:text-current:hover{color:currentColor}.md\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:focus\:text-transparent:focus{color:transparent}.md\:focus\:text-current:focus{color:currentColor}.md\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.md\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.md\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.md\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.md\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.md\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.md\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.md\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.md\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.md\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.md\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.md\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.md\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.md\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.md\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.md\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.md\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.md\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.md\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.md\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.md\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.md\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.md\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.md\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.md\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.md\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.md\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.md\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.md\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.md\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.md\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.md\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.md\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.md\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.md\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.md\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.md\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.md\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.md\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.md\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.md\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.md\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.md\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.md\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.md\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.md\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.md\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.md\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.md\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.md\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.md\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.md\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.md\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.md\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.md\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.md\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.md\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.md\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.md\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.md\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.md\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.md\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.md\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.md\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.md\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.md\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.md\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.md\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.md\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.md\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.md\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.md\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.md\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.md\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.md\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.md\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.md\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.md\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.md\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.md\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.md\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.md\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.md\:text-opacity-0{--tw-text-opacity:0}.md\:text-opacity-5{--tw-text-opacity:0.05}.md\:text-opacity-10{--tw-text-opacity:0.1}.md\:text-opacity-20{--tw-text-opacity:0.2}.md\:text-opacity-25{--tw-text-opacity:0.25}.md\:text-opacity-30{--tw-text-opacity:0.3}.md\:text-opacity-40{--tw-text-opacity:0.4}.md\:text-opacity-50{--tw-text-opacity:0.5}.md\:text-opacity-60{--tw-text-opacity:0.6}.md\:text-opacity-70{--tw-text-opacity:0.7}.md\:text-opacity-75{--tw-text-opacity:0.75}.md\:text-opacity-80{--tw-text-opacity:0.8}.md\:text-opacity-90{--tw-text-opacity:0.9}.md\:text-opacity-95{--tw-text-opacity:0.95}.md\:text-opacity-100{--tw-text-opacity:1}.group:hover .md\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .md\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .md\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .md\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .md\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .md\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .md\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .md\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .md\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .md\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .md\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .md\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .md\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .md\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .md\:group-hover\:text-opacity-100{--tw-text-opacity:1}.md\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.md\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.md\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.md\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.md\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.md\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.md\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.md\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.md\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.md\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.md\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.md\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.md\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.md\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.md\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.md\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.md\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.md\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.md\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.md\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.md\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.md\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.md\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.md\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.md\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.md\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.md\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.md\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.md\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.md\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.md\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.md\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.md\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.md\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.md\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.md\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.md\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.md\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.md\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.md\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.md\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.md\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.md\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.md\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.md\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.md\:underline{text-decoration:underline}.md\:line-through{text-decoration:line-through}.md\:no-underline{text-decoration:none}.group:hover .md\:group-hover\:underline{text-decoration:underline}.group:hover .md\:group-hover\:line-through{text-decoration:line-through}.group:hover .md\:group-hover\:no-underline{text-decoration:none}.md\:focus-within\:underline:focus-within{text-decoration:underline}.md\:focus-within\:line-through:focus-within{text-decoration:line-through}.md\:focus-within\:no-underline:focus-within{text-decoration:none}.md\:hover\:underline:hover{text-decoration:underline}.md\:hover\:line-through:hover{text-decoration:line-through}.md\:hover\:no-underline:hover{text-decoration:none}.md\:focus\:underline:focus{text-decoration:underline}.md\:focus\:line-through:focus{text-decoration:line-through}.md\:focus\:no-underline:focus{text-decoration:none}.md\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.md\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.md\:placeholder-transparent::-moz-placeholder{color:transparent}.md\:placeholder-transparent:-ms-input-placeholder{color:transparent}.md\:placeholder-transparent::placeholder{color:transparent}.md\:placeholder-current::-moz-placeholder{color:currentColor}.md\:placeholder-current:-ms-input-placeholder{color:currentColor}.md\:placeholder-current::placeholder{color:currentColor}.md\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.md\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus::placeholder{color:currentColor}.md\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.md\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.md\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.md\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.md\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.md\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.md\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.md\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.md\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.md\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.md\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.md\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.md\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.md\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.md\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.md\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.md\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.md\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.md\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.md\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.md\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.md\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.md\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.md\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.md\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.md\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.md\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.md\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.md\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.md\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.md\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.md\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.md\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.md\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.md\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.md\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.md\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.md\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.md\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.md\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.md\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.md\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.md\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.md\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.md\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.md\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.md\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.md\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.md\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.md\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.md\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.md\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.md\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.md\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.md\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.md\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.md\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.md\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.md\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.md\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.md\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.md\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.md\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.md\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.md\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.md\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.md\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.md\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.md\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.md\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.md\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.md\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.md\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.md\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.md\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.md\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.md\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.md\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.md\:opacity-0{opacity:0}.md\:opacity-5{opacity:.05}.md\:opacity-10{opacity:.1}.md\:opacity-20{opacity:.2}.md\:opacity-25{opacity:.25}.md\:opacity-30{opacity:.3}.md\:opacity-40{opacity:.4}.md\:opacity-50{opacity:.5}.md\:opacity-60{opacity:.6}.md\:opacity-70{opacity:.7}.md\:opacity-75{opacity:.75}.md\:opacity-80{opacity:.8}.md\:opacity-90{opacity:.9}.md\:opacity-95{opacity:.95}.md\:opacity-100{opacity:1}.group:hover .md\:group-hover\:opacity-0{opacity:0}.group:hover .md\:group-hover\:opacity-5{opacity:.05}.group:hover .md\:group-hover\:opacity-10{opacity:.1}.group:hover .md\:group-hover\:opacity-20{opacity:.2}.group:hover .md\:group-hover\:opacity-25{opacity:.25}.group:hover .md\:group-hover\:opacity-30{opacity:.3}.group:hover .md\:group-hover\:opacity-40{opacity:.4}.group:hover .md\:group-hover\:opacity-50{opacity:.5}.group:hover .md\:group-hover\:opacity-60{opacity:.6}.group:hover .md\:group-hover\:opacity-70{opacity:.7}.group:hover .md\:group-hover\:opacity-75{opacity:.75}.group:hover .md\:group-hover\:opacity-80{opacity:.8}.group:hover .md\:group-hover\:opacity-90{opacity:.9}.group:hover .md\:group-hover\:opacity-95{opacity:.95}.group:hover .md\:group-hover\:opacity-100{opacity:1}.md\:focus-within\:opacity-0:focus-within{opacity:0}.md\:focus-within\:opacity-5:focus-within{opacity:.05}.md\:focus-within\:opacity-10:focus-within{opacity:.1}.md\:focus-within\:opacity-20:focus-within{opacity:.2}.md\:focus-within\:opacity-25:focus-within{opacity:.25}.md\:focus-within\:opacity-30:focus-within{opacity:.3}.md\:focus-within\:opacity-40:focus-within{opacity:.4}.md\:focus-within\:opacity-50:focus-within{opacity:.5}.md\:focus-within\:opacity-60:focus-within{opacity:.6}.md\:focus-within\:opacity-70:focus-within{opacity:.7}.md\:focus-within\:opacity-75:focus-within{opacity:.75}.md\:focus-within\:opacity-80:focus-within{opacity:.8}.md\:focus-within\:opacity-90:focus-within{opacity:.9}.md\:focus-within\:opacity-95:focus-within{opacity:.95}.md\:focus-within\:opacity-100:focus-within{opacity:1}.md\:hover\:opacity-0:hover{opacity:0}.md\:hover\:opacity-5:hover{opacity:.05}.md\:hover\:opacity-10:hover{opacity:.1}.md\:hover\:opacity-20:hover{opacity:.2}.md\:hover\:opacity-25:hover{opacity:.25}.md\:hover\:opacity-30:hover{opacity:.3}.md\:hover\:opacity-40:hover{opacity:.4}.md\:hover\:opacity-50:hover{opacity:.5}.md\:hover\:opacity-60:hover{opacity:.6}.md\:hover\:opacity-70:hover{opacity:.7}.md\:hover\:opacity-75:hover{opacity:.75}.md\:hover\:opacity-80:hover{opacity:.8}.md\:hover\:opacity-90:hover{opacity:.9}.md\:hover\:opacity-95:hover{opacity:.95}.md\:hover\:opacity-100:hover{opacity:1}.md\:focus\:opacity-0:focus{opacity:0}.md\:focus\:opacity-5:focus{opacity:.05}.md\:focus\:opacity-10:focus{opacity:.1}.md\:focus\:opacity-20:focus{opacity:.2}.md\:focus\:opacity-25:focus{opacity:.25}.md\:focus\:opacity-30:focus{opacity:.3}.md\:focus\:opacity-40:focus{opacity:.4}.md\:focus\:opacity-50:focus{opacity:.5}.md\:focus\:opacity-60:focus{opacity:.6}.md\:focus\:opacity-70:focus{opacity:.7}.md\:focus\:opacity-75:focus{opacity:.75}.md\:focus\:opacity-80:focus{opacity:.8}.md\:focus\:opacity-90:focus{opacity:.9}.md\:focus\:opacity-95:focus{opacity:.95}.md\:focus\:opacity-100:focus{opacity:1}.md\:bg-blend-normal{background-blend-mode:normal}.md\:bg-blend-multiply{background-blend-mode:multiply}.md\:bg-blend-screen{background-blend-mode:screen}.md\:bg-blend-overlay{background-blend-mode:overlay}.md\:bg-blend-darken{background-blend-mode:darken}.md\:bg-blend-lighten{background-blend-mode:lighten}.md\:bg-blend-color-dodge{background-blend-mode:color-dodge}.md\:bg-blend-color-burn{background-blend-mode:color-burn}.md\:bg-blend-hard-light{background-blend-mode:hard-light}.md\:bg-blend-soft-light{background-blend-mode:soft-light}.md\:bg-blend-difference{background-blend-mode:difference}.md\:bg-blend-exclusion{background-blend-mode:exclusion}.md\:bg-blend-hue{background-blend-mode:hue}.md\:bg-blend-saturation{background-blend-mode:saturation}.md\:bg-blend-color{background-blend-mode:color}.md\:bg-blend-luminosity{background-blend-mode:luminosity}.md\:mix-blend-normal{mix-blend-mode:normal}.md\:mix-blend-multiply{mix-blend-mode:multiply}.md\:mix-blend-screen{mix-blend-mode:screen}.md\:mix-blend-overlay{mix-blend-mode:overlay}.md\:mix-blend-darken{mix-blend-mode:darken}.md\:mix-blend-lighten{mix-blend-mode:lighten}.md\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.md\:mix-blend-color-burn{mix-blend-mode:color-burn}.md\:mix-blend-hard-light{mix-blend-mode:hard-light}.md\:mix-blend-soft-light{mix-blend-mode:soft-light}.md\:mix-blend-difference{mix-blend-mode:difference}.md\:mix-blend-exclusion{mix-blend-mode:exclusion}.md\:mix-blend-hue{mix-blend-mode:hue}.md\:mix-blend-saturation{mix-blend-mode:saturation}.md\:mix-blend-color{mix-blend-mode:color}.md\:mix-blend-luminosity{mix-blend-mode:luminosity}.md\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.md\:shadow,.md\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.md\:shadow-lg,.md\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.md\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.md\:shadow-2xl,.md\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.md\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.md\:shadow-inner,.md\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .md\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .md\:group-hover\:shadow,.group:hover .md\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .md\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .md\:group-hover\:shadow-lg,.group:hover .md\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .md\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .md\:group-hover\:shadow-2xl,.group:hover .md\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .md\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .md\:group-hover\:shadow-inner,.group:hover .md\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .md\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.md\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.md\:hover\:shadow-sm:hover,.md\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.md\:hover\:shadow-lg:hover,.md\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.md\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.md\:hover\:shadow-2xl:hover,.md\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.md\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.md\:hover\:shadow-inner:hover,.md\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.md\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.md\:focus\:shadow-sm:focus,.md\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.md\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.md\:focus\:shadow-lg:focus,.md\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.md\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.md\:focus\:shadow-2xl:focus,.md\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.md\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.md\:focus\:shadow-inner:focus,.md\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.md\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.md\:outline-none{outline:2px solid transparent;outline-offset:2px}.md\:outline-white{outline:2px dotted #fff;outline-offset:2px}.md\:outline-black{outline:2px dotted #000;outline-offset:2px}.md\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.md\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.md\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.md\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.md\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.md\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.md\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-0,.md\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-2,.md\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring,.md\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-0:focus,.md\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-2:focus,.md\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:focus\:ring-8:focus,.md\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.md\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.md\:ring-inset{--tw-ring-inset:inset}.md\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.md\:focus\:ring-inset:focus{--tw-ring-inset:inset}.md\:ring-transparent{--tw-ring-color:transparent}.md\:ring-current{--tw-ring-color:currentColor}.md\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.md\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.md\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.md\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.md\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.md\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.md\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.md\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.md\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.md\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.md\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.md\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.md\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.md\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.md\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.md\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.md\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.md\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.md\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.md\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.md\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.md\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.md\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.md\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.md\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.md\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.md\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.md\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.md\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.md\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.md\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.md\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.md\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.md\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.md\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.md\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.md\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.md\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.md\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.md\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.md\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.md\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.md\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.md\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.md\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.md\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.md\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.md\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.md\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.md\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.md\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.md\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.md\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.md\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.md\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.md\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.md\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.md\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.md\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.md\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.md\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.md\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.md\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.md\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.md\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.md\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.md\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.md\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.md\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.md\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.md\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.md\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.md\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.md\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.md\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.md\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.md\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.md\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.md\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.md\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.md\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.md\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.md\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.md\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.md\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.md\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.md\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.md\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.md\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.md\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.md\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.md\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.md\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.md\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.md\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.md\:focus\:ring-current:focus{--tw-ring-color:currentColor}.md\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.md\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.md\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.md\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.md\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.md\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.md\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.md\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.md\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.md\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.md\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.md\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.md\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.md\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.md\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.md\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.md\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.md\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.md\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.md\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.md\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.md\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.md\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.md\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.md\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.md\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.md\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.md\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.md\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.md\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.md\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.md\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.md\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.md\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.md\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.md\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.md\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.md\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.md\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.md\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.md\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.md\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.md\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.md\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.md\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.md\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.md\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.md\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.md\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.md\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.md\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.md\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.md\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.md\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.md\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.md\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.md\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.md\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.md\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.md\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.md\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.md\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.md\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.md\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.md\:ring-opacity-0{--tw-ring-opacity:0}.md\:ring-opacity-5{--tw-ring-opacity:0.05}.md\:ring-opacity-10{--tw-ring-opacity:0.1}.md\:ring-opacity-20{--tw-ring-opacity:0.2}.md\:ring-opacity-25{--tw-ring-opacity:0.25}.md\:ring-opacity-30{--tw-ring-opacity:0.3}.md\:ring-opacity-40{--tw-ring-opacity:0.4}.md\:ring-opacity-50{--tw-ring-opacity:0.5}.md\:ring-opacity-60{--tw-ring-opacity:0.6}.md\:ring-opacity-70{--tw-ring-opacity:0.7}.md\:ring-opacity-75{--tw-ring-opacity:0.75}.md\:ring-opacity-80{--tw-ring-opacity:0.8}.md\:ring-opacity-90{--tw-ring-opacity:0.9}.md\:ring-opacity-95{--tw-ring-opacity:0.95}.md\:ring-opacity-100{--tw-ring-opacity:1}.md\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.md\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.md\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.md\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.md\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.md\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.md\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.md\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.md\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.md\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.md\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.md\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.md\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.md\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.md\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.md\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.md\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.md\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.md\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.md\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.md\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.md\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.md\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.md\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.md\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.md\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.md\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.md\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.md\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.md\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.md\:ring-offset-0{--tw-ring-offset-width:0px}.md\:ring-offset-1{--tw-ring-offset-width:1px}.md\:ring-offset-2{--tw-ring-offset-width:2px}.md\:ring-offset-4{--tw-ring-offset-width:4px}.md\:ring-offset-8{--tw-ring-offset-width:8px}.md\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.md\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.md\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.md\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.md\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.md\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.md\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.md\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.md\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.md\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.md\:ring-offset-transparent{--tw-ring-offset-color:transparent}.md\:ring-offset-current{--tw-ring-offset-color:currentColor}.md\:ring-offset-black{--tw-ring-offset-color:#000}.md\:ring-offset-white{--tw-ring-offset-color:#fff}.md\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.md\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.md\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.md\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.md\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.md\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.md\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.md\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.md\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.md\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.md\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.md\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.md\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.md\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.md\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.md\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.md\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.md\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.md\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.md\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.md\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.md\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.md\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.md\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.md\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.md\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.md\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.md\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.md\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.md\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.md\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.md\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.md\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.md\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.md\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.md\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.md\:ring-offset-green-600{--tw-ring-offset-color:#059669}.md\:ring-offset-green-700{--tw-ring-offset-color:#047857}.md\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.md\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.md\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.md\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.md\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.md\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.md\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.md\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.md\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.md\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.md\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.md\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.md\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.md\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.md\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.md\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.md\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.md\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.md\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.md\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.md\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.md\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.md\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.md\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.md\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.md\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.md\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.md\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.md\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.md\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.md\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.md\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.md\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.md\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.md\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.md\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.md\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.md\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.md\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.md\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.md\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.md\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.md\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.md\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.md\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.md\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.md\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.md\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.md\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.md\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.md\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.md\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.md\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.md\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.md\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.md\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.md\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.md\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.md\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.md\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.md\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.md\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.md\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.md\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.md\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.md\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.md\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.md\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.md\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.md\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.md\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.md\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.md\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.md\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.md\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.md\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.md\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.md\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.md\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.md\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.md\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.md\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.md\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.md\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.md\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.md\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.md\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.md\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.md\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.md\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.md\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.md\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.md\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.md\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.md\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.md\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.md\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.md\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.md\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.md\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.md\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.md\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.md\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.md\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.md\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.md\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.md\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.md\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.md\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.md\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.md\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.md\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.md\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.md\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.md\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.md\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.md\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.md\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.md\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.md\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.md\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.md\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.md\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.md\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.md\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.md\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.md\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.md\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.md\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.md\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.md\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.md\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.md\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.md\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.md\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.md\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.md\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.md\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.md\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.md\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.md\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.md\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.md\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.md\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.md\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.md\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.md\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.md\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.md\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.md\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.md\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.md\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.md\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.md\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.md\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.md\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.md\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.md\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.md\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.md\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.md\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.md\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.md\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.md\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.md\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.md\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.md\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.md\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.md\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.md\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.md\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.md\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.md\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.md\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.md\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.md\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.md\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.md\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.md\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.md\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.md\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.md\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.md\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.md\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.md\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.md\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.md\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.md\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.md\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.md\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.md\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.md\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.md\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.md\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.md\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.md\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.md\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.md\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.md\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.md\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.md\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.md\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.md\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.md\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.md\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.md\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.md\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.md\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.md\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.md\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.md\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.md\:filter-none{filter:none}.md\:blur-0,.md\:blur-none{--tw-blur:blur(0)}.md\:blur-sm{--tw-blur:blur(4px)}.md\:blur{--tw-blur:blur(8px)}.md\:blur-md{--tw-blur:blur(12px)}.md\:blur-lg{--tw-blur:blur(16px)}.md\:blur-xl{--tw-blur:blur(24px)}.md\:blur-2xl{--tw-blur:blur(40px)}.md\:blur-3xl{--tw-blur:blur(64px)}.md\:brightness-0{--tw-brightness:brightness(0)}.md\:brightness-50{--tw-brightness:brightness(.5)}.md\:brightness-75{--tw-brightness:brightness(.75)}.md\:brightness-90{--tw-brightness:brightness(.9)}.md\:brightness-95{--tw-brightness:brightness(.95)}.md\:brightness-100{--tw-brightness:brightness(1)}.md\:brightness-105{--tw-brightness:brightness(1.05)}.md\:brightness-110{--tw-brightness:brightness(1.1)}.md\:brightness-125{--tw-brightness:brightness(1.25)}.md\:brightness-150{--tw-brightness:brightness(1.5)}.md\:brightness-200{--tw-brightness:brightness(2)}.md\:contrast-0{--tw-contrast:contrast(0)}.md\:contrast-50{--tw-contrast:contrast(.5)}.md\:contrast-75{--tw-contrast:contrast(.75)}.md\:contrast-100{--tw-contrast:contrast(1)}.md\:contrast-125{--tw-contrast:contrast(1.25)}.md\:contrast-150{--tw-contrast:contrast(1.5)}.md\:contrast-200{--tw-contrast:contrast(2)}.md\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.md\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.md\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.md\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.md\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.md\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.md\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.md\:grayscale-0{--tw-grayscale:grayscale(0)}.md\:grayscale{--tw-grayscale:grayscale(100%)}.md\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.md\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.md\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.md\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.md\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.md\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.md\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.md\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.md\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.md\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.md\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.md\:invert-0{--tw-invert:invert(0)}.md\:invert{--tw-invert:invert(100%)}.md\:saturate-0{--tw-saturate:saturate(0)}.md\:saturate-50{--tw-saturate:saturate(.5)}.md\:saturate-100{--tw-saturate:saturate(1)}.md\:saturate-150{--tw-saturate:saturate(1.5)}.md\:saturate-200{--tw-saturate:saturate(2)}.md\:sepia-0{--tw-sepia:sepia(0)}.md\:sepia{--tw-sepia:sepia(100%)}.md\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.md\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.md\:backdrop-blur-0,.md\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.md\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.md\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.md\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.md\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.md\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.md\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.md\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.md\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.md\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.md\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.md\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.md\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.md\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.md\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.md\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.md\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.md\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.md\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.md\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.md\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.md\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.md\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.md\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.md\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.md\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.md\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.md\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.md\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.md\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.md\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.md\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.md\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.md\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.md\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.md\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.md\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.md\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.md\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.md\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.md\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.md\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.md\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.md\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.md\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.md\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.md\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.md\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.md\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.md\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.md\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.md\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.md\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.md\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.md\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.md\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.md\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.md\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.md\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.md\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.md\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.md\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.md\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.md\:transition-none{transition-property:none}.md\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md\:delay-75{transition-delay:75ms}.md\:delay-100{transition-delay:.1s}.md\:delay-150{transition-delay:.15s}.md\:delay-200{transition-delay:.2s}.md\:delay-300{transition-delay:.3s}.md\:delay-500{transition-delay:.5s}.md\:delay-700{transition-delay:.7s}.md\:delay-1000{transition-delay:1s}.md\:duration-75{transition-duration:75ms}.md\:duration-100{transition-duration:.1s}.md\:duration-150{transition-duration:.15s}.md\:duration-200{transition-duration:.2s}.md\:duration-300{transition-duration:.3s}.md\:duration-500{transition-duration:.5s}.md\:duration-700{transition-duration:.7s}.md\:duration-1000{transition-duration:1s}.md\:ease-linear{transition-timing-function:linear}.md\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.md\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.md\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}@media (min-width:1536px){.lg\:container{max-width:1536px}}.lg\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:pointer-events-none{pointer-events:none}.lg\:pointer-events-auto{pointer-events:auto}.lg\:visible{visibility:visible}.lg\:invisible{visibility:hidden}.lg\:static{position:static}.lg\:fixed{position:fixed}.lg\:absolute{position:absolute}.lg\:relative{position:relative}.lg\:sticky{position:-webkit-sticky;position:sticky}.lg\:inset-0{top:0;right:0;bottom:0;left:0}.lg\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.lg\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.lg\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.lg\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.lg\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.lg\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.lg\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.lg\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.lg\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.lg\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.lg\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.lg\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.lg\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.lg\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.lg\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.lg\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.lg\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.lg\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.lg\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.lg\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.lg\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.lg\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.lg\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.lg\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.lg\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.lg\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.lg\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.lg\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.lg\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.lg\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.lg\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.lg\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.lg\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.lg\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.lg\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.lg\:-inset-0{top:0;right:0;bottom:0;left:0}.lg\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.lg\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.lg\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.lg\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.lg\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.lg\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.lg\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.lg\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.lg\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.lg\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.lg\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.lg\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.lg\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.lg\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.lg\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.lg\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.lg\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.lg\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.lg\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.lg\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.lg\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.lg\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.lg\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.lg\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.lg\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.lg\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.lg\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.lg\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.lg\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.lg\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.lg\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.lg\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.lg\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.lg\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.lg\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.lg\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.lg\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.lg\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.lg\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.lg\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.lg\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.lg\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.lg\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.lg\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.lg\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.lg\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.lg\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.lg\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.lg\:inset-x-0{left:0;right:0}.lg\:inset-x-1{left:.25rem;right:.25rem}.lg\:inset-x-2{left:.5rem;right:.5rem}.lg\:inset-x-3{left:.75rem;right:.75rem}.lg\:inset-x-4{left:1rem;right:1rem}.lg\:inset-x-5{left:1.25rem;right:1.25rem}.lg\:inset-x-6{left:1.5rem;right:1.5rem}.lg\:inset-x-7{left:1.75rem;right:1.75rem}.lg\:inset-x-8{left:2rem;right:2rem}.lg\:inset-x-9{left:2.25rem;right:2.25rem}.lg\:inset-x-10{left:2.5rem;right:2.5rem}.lg\:inset-x-11{left:2.75rem;right:2.75rem}.lg\:inset-x-12{left:3rem;right:3rem}.lg\:inset-x-14{left:3.5rem;right:3.5rem}.lg\:inset-x-16{left:4rem;right:4rem}.lg\:inset-x-20{left:5rem;right:5rem}.lg\:inset-x-24{left:6rem;right:6rem}.lg\:inset-x-28{left:7rem;right:7rem}.lg\:inset-x-32{left:8rem;right:8rem}.lg\:inset-x-36{left:9rem;right:9rem}.lg\:inset-x-40{left:10rem;right:10rem}.lg\:inset-x-44{left:11rem;right:11rem}.lg\:inset-x-48{left:12rem;right:12rem}.lg\:inset-x-52{left:13rem;right:13rem}.lg\:inset-x-56{left:14rem;right:14rem}.lg\:inset-x-60{left:15rem;right:15rem}.lg\:inset-x-64{left:16rem;right:16rem}.lg\:inset-x-72{left:18rem;right:18rem}.lg\:inset-x-80{left:20rem;right:20rem}.lg\:inset-x-96{left:24rem;right:24rem}.lg\:inset-x-auto{left:auto;right:auto}.lg\:inset-x-px{left:1px;right:1px}.lg\:inset-x-0\.5{left:.125rem;right:.125rem}.lg\:inset-x-1\.5{left:.375rem;right:.375rem}.lg\:inset-x-2\.5{left:.625rem;right:.625rem}.lg\:inset-x-3\.5{left:.875rem;right:.875rem}.lg\:-inset-x-0{left:0;right:0}.lg\:-inset-x-1{left:-.25rem;right:-.25rem}.lg\:-inset-x-2{left:-.5rem;right:-.5rem}.lg\:-inset-x-3{left:-.75rem;right:-.75rem}.lg\:-inset-x-4{left:-1rem;right:-1rem}.lg\:-inset-x-5{left:-1.25rem;right:-1.25rem}.lg\:-inset-x-6{left:-1.5rem;right:-1.5rem}.lg\:-inset-x-7{left:-1.75rem;right:-1.75rem}.lg\:-inset-x-8{left:-2rem;right:-2rem}.lg\:-inset-x-9{left:-2.25rem;right:-2.25rem}.lg\:-inset-x-10{left:-2.5rem;right:-2.5rem}.lg\:-inset-x-11{left:-2.75rem;right:-2.75rem}.lg\:-inset-x-12{left:-3rem;right:-3rem}.lg\:-inset-x-14{left:-3.5rem;right:-3.5rem}.lg\:-inset-x-16{left:-4rem;right:-4rem}.lg\:-inset-x-20{left:-5rem;right:-5rem}.lg\:-inset-x-24{left:-6rem;right:-6rem}.lg\:-inset-x-28{left:-7rem;right:-7rem}.lg\:-inset-x-32{left:-8rem;right:-8rem}.lg\:-inset-x-36{left:-9rem;right:-9rem}.lg\:-inset-x-40{left:-10rem;right:-10rem}.lg\:-inset-x-44{left:-11rem;right:-11rem}.lg\:-inset-x-48{left:-12rem;right:-12rem}.lg\:-inset-x-52{left:-13rem;right:-13rem}.lg\:-inset-x-56{left:-14rem;right:-14rem}.lg\:-inset-x-60{left:-15rem;right:-15rem}.lg\:-inset-x-64{left:-16rem;right:-16rem}.lg\:-inset-x-72{left:-18rem;right:-18rem}.lg\:-inset-x-80{left:-20rem;right:-20rem}.lg\:-inset-x-96{left:-24rem;right:-24rem}.lg\:-inset-x-px{left:-1px;right:-1px}.lg\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.lg\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.lg\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.lg\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.lg\:inset-x-1\/2{left:50%;right:50%}.lg\:inset-x-1\/3{left:33.333333%;right:33.333333%}.lg\:inset-x-2\/3{left:66.666667%;right:66.666667%}.lg\:inset-x-1\/4{left:25%;right:25%}.lg\:inset-x-2\/4{left:50%;right:50%}.lg\:inset-x-3\/4{left:75%;right:75%}.lg\:inset-x-full{left:100%;right:100%}.lg\:-inset-x-1\/2{left:-50%;right:-50%}.lg\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.lg\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.lg\:-inset-x-1\/4{left:-25%;right:-25%}.lg\:-inset-x-2\/4{left:-50%;right:-50%}.lg\:-inset-x-3\/4{left:-75%;right:-75%}.lg\:-inset-x-full{left:-100%;right:-100%}.lg\:inset-y-0{top:0;bottom:0}.lg\:inset-y-1{top:.25rem;bottom:.25rem}.lg\:inset-y-2{top:.5rem;bottom:.5rem}.lg\:inset-y-3{top:.75rem;bottom:.75rem}.lg\:inset-y-4{top:1rem;bottom:1rem}.lg\:inset-y-5{top:1.25rem;bottom:1.25rem}.lg\:inset-y-6{top:1.5rem;bottom:1.5rem}.lg\:inset-y-7{top:1.75rem;bottom:1.75rem}.lg\:inset-y-8{top:2rem;bottom:2rem}.lg\:inset-y-9{top:2.25rem;bottom:2.25rem}.lg\:inset-y-10{top:2.5rem;bottom:2.5rem}.lg\:inset-y-11{top:2.75rem;bottom:2.75rem}.lg\:inset-y-12{top:3rem;bottom:3rem}.lg\:inset-y-14{top:3.5rem;bottom:3.5rem}.lg\:inset-y-16{top:4rem;bottom:4rem}.lg\:inset-y-20{top:5rem;bottom:5rem}.lg\:inset-y-24{top:6rem;bottom:6rem}.lg\:inset-y-28{top:7rem;bottom:7rem}.lg\:inset-y-32{top:8rem;bottom:8rem}.lg\:inset-y-36{top:9rem;bottom:9rem}.lg\:inset-y-40{top:10rem;bottom:10rem}.lg\:inset-y-44{top:11rem;bottom:11rem}.lg\:inset-y-48{top:12rem;bottom:12rem}.lg\:inset-y-52{top:13rem;bottom:13rem}.lg\:inset-y-56{top:14rem;bottom:14rem}.lg\:inset-y-60{top:15rem;bottom:15rem}.lg\:inset-y-64{top:16rem;bottom:16rem}.lg\:inset-y-72{top:18rem;bottom:18rem}.lg\:inset-y-80{top:20rem;bottom:20rem}.lg\:inset-y-96{top:24rem;bottom:24rem}.lg\:inset-y-auto{top:auto;bottom:auto}.lg\:inset-y-px{top:1px;bottom:1px}.lg\:inset-y-0\.5{top:.125rem;bottom:.125rem}.lg\:inset-y-1\.5{top:.375rem;bottom:.375rem}.lg\:inset-y-2\.5{top:.625rem;bottom:.625rem}.lg\:inset-y-3\.5{top:.875rem;bottom:.875rem}.lg\:-inset-y-0{top:0;bottom:0}.lg\:-inset-y-1{top:-.25rem;bottom:-.25rem}.lg\:-inset-y-2{top:-.5rem;bottom:-.5rem}.lg\:-inset-y-3{top:-.75rem;bottom:-.75rem}.lg\:-inset-y-4{top:-1rem;bottom:-1rem}.lg\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.lg\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.lg\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.lg\:-inset-y-8{top:-2rem;bottom:-2rem}.lg\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.lg\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.lg\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.lg\:-inset-y-12{top:-3rem;bottom:-3rem}.lg\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.lg\:-inset-y-16{top:-4rem;bottom:-4rem}.lg\:-inset-y-20{top:-5rem;bottom:-5rem}.lg\:-inset-y-24{top:-6rem;bottom:-6rem}.lg\:-inset-y-28{top:-7rem;bottom:-7rem}.lg\:-inset-y-32{top:-8rem;bottom:-8rem}.lg\:-inset-y-36{top:-9rem;bottom:-9rem}.lg\:-inset-y-40{top:-10rem;bottom:-10rem}.lg\:-inset-y-44{top:-11rem;bottom:-11rem}.lg\:-inset-y-48{top:-12rem;bottom:-12rem}.lg\:-inset-y-52{top:-13rem;bottom:-13rem}.lg\:-inset-y-56{top:-14rem;bottom:-14rem}.lg\:-inset-y-60{top:-15rem;bottom:-15rem}.lg\:-inset-y-64{top:-16rem;bottom:-16rem}.lg\:-inset-y-72{top:-18rem;bottom:-18rem}.lg\:-inset-y-80{top:-20rem;bottom:-20rem}.lg\:-inset-y-96{top:-24rem;bottom:-24rem}.lg\:-inset-y-px{top:-1px;bottom:-1px}.lg\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.lg\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.lg\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.lg\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.lg\:inset-y-1\/2{top:50%;bottom:50%}.lg\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.lg\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.lg\:inset-y-1\/4{top:25%;bottom:25%}.lg\:inset-y-2\/4{top:50%;bottom:50%}.lg\:inset-y-3\/4{top:75%;bottom:75%}.lg\:inset-y-full{top:100%;bottom:100%}.lg\:-inset-y-1\/2{top:-50%;bottom:-50%}.lg\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.lg\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.lg\:-inset-y-1\/4{top:-25%;bottom:-25%}.lg\:-inset-y-2\/4{top:-50%;bottom:-50%}.lg\:-inset-y-3\/4{top:-75%;bottom:-75%}.lg\:-inset-y-full{top:-100%;bottom:-100%}.lg\:top-0{top:0}.lg\:top-1{top:.25rem}.lg\:top-2{top:.5rem}.lg\:top-3{top:.75rem}.lg\:top-4{top:1rem}.lg\:top-5{top:1.25rem}.lg\:top-6{top:1.5rem}.lg\:top-7{top:1.75rem}.lg\:top-8{top:2rem}.lg\:top-9{top:2.25rem}.lg\:top-10{top:2.5rem}.lg\:top-11{top:2.75rem}.lg\:top-12{top:3rem}.lg\:top-14{top:3.5rem}.lg\:top-16{top:4rem}.lg\:top-20{top:5rem}.lg\:top-24{top:6rem}.lg\:top-28{top:7rem}.lg\:top-32{top:8rem}.lg\:top-36{top:9rem}.lg\:top-40{top:10rem}.lg\:top-44{top:11rem}.lg\:top-48{top:12rem}.lg\:top-52{top:13rem}.lg\:top-56{top:14rem}.lg\:top-60{top:15rem}.lg\:top-64{top:16rem}.lg\:top-72{top:18rem}.lg\:top-80{top:20rem}.lg\:top-96{top:24rem}.lg\:top-auto{top:auto}.lg\:top-px{top:1px}.lg\:top-0\.5{top:.125rem}.lg\:top-1\.5{top:.375rem}.lg\:top-2\.5{top:.625rem}.lg\:top-3\.5{top:.875rem}.lg\:-top-0{top:0}.lg\:-top-1{top:-.25rem}.lg\:-top-2{top:-.5rem}.lg\:-top-3{top:-.75rem}.lg\:-top-4{top:-1rem}.lg\:-top-5{top:-1.25rem}.lg\:-top-6{top:-1.5rem}.lg\:-top-7{top:-1.75rem}.lg\:-top-8{top:-2rem}.lg\:-top-9{top:-2.25rem}.lg\:-top-10{top:-2.5rem}.lg\:-top-11{top:-2.75rem}.lg\:-top-12{top:-3rem}.lg\:-top-14{top:-3.5rem}.lg\:-top-16{top:-4rem}.lg\:-top-20{top:-5rem}.lg\:-top-24{top:-6rem}.lg\:-top-28{top:-7rem}.lg\:-top-32{top:-8rem}.lg\:-top-36{top:-9rem}.lg\:-top-40{top:-10rem}.lg\:-top-44{top:-11rem}.lg\:-top-48{top:-12rem}.lg\:-top-52{top:-13rem}.lg\:-top-56{top:-14rem}.lg\:-top-60{top:-15rem}.lg\:-top-64{top:-16rem}.lg\:-top-72{top:-18rem}.lg\:-top-80{top:-20rem}.lg\:-top-96{top:-24rem}.lg\:-top-px{top:-1px}.lg\:-top-0\.5{top:-.125rem}.lg\:-top-1\.5{top:-.375rem}.lg\:-top-2\.5{top:-.625rem}.lg\:-top-3\.5{top:-.875rem}.lg\:top-1\/2{top:50%}.lg\:top-1\/3{top:33.333333%}.lg\:top-2\/3{top:66.666667%}.lg\:top-1\/4{top:25%}.lg\:top-2\/4{top:50%}.lg\:top-3\/4{top:75%}.lg\:top-full{top:100%}.lg\:-top-1\/2{top:-50%}.lg\:-top-1\/3{top:-33.333333%}.lg\:-top-2\/3{top:-66.666667%}.lg\:-top-1\/4{top:-25%}.lg\:-top-2\/4{top:-50%}.lg\:-top-3\/4{top:-75%}.lg\:-top-full{top:-100%}.lg\:right-0{right:0}.lg\:right-1{right:.25rem}.lg\:right-2{right:.5rem}.lg\:right-3{right:.75rem}.lg\:right-4{right:1rem}.lg\:right-5{right:1.25rem}.lg\:right-6{right:1.5rem}.lg\:right-7{right:1.75rem}.lg\:right-8{right:2rem}.lg\:right-9{right:2.25rem}.lg\:right-10{right:2.5rem}.lg\:right-11{right:2.75rem}.lg\:right-12{right:3rem}.lg\:right-14{right:3.5rem}.lg\:right-16{right:4rem}.lg\:right-20{right:5rem}.lg\:right-24{right:6rem}.lg\:right-28{right:7rem}.lg\:right-32{right:8rem}.lg\:right-36{right:9rem}.lg\:right-40{right:10rem}.lg\:right-44{right:11rem}.lg\:right-48{right:12rem}.lg\:right-52{right:13rem}.lg\:right-56{right:14rem}.lg\:right-60{right:15rem}.lg\:right-64{right:16rem}.lg\:right-72{right:18rem}.lg\:right-80{right:20rem}.lg\:right-96{right:24rem}.lg\:right-auto{right:auto}.lg\:right-px{right:1px}.lg\:right-0\.5{right:.125rem}.lg\:right-1\.5{right:.375rem}.lg\:right-2\.5{right:.625rem}.lg\:right-3\.5{right:.875rem}.lg\:-right-0{right:0}.lg\:-right-1{right:-.25rem}.lg\:-right-2{right:-.5rem}.lg\:-right-3{right:-.75rem}.lg\:-right-4{right:-1rem}.lg\:-right-5{right:-1.25rem}.lg\:-right-6{right:-1.5rem}.lg\:-right-7{right:-1.75rem}.lg\:-right-8{right:-2rem}.lg\:-right-9{right:-2.25rem}.lg\:-right-10{right:-2.5rem}.lg\:-right-11{right:-2.75rem}.lg\:-right-12{right:-3rem}.lg\:-right-14{right:-3.5rem}.lg\:-right-16{right:-4rem}.lg\:-right-20{right:-5rem}.lg\:-right-24{right:-6rem}.lg\:-right-28{right:-7rem}.lg\:-right-32{right:-8rem}.lg\:-right-36{right:-9rem}.lg\:-right-40{right:-10rem}.lg\:-right-44{right:-11rem}.lg\:-right-48{right:-12rem}.lg\:-right-52{right:-13rem}.lg\:-right-56{right:-14rem}.lg\:-right-60{right:-15rem}.lg\:-right-64{right:-16rem}.lg\:-right-72{right:-18rem}.lg\:-right-80{right:-20rem}.lg\:-right-96{right:-24rem}.lg\:-right-px{right:-1px}.lg\:-right-0\.5{right:-.125rem}.lg\:-right-1\.5{right:-.375rem}.lg\:-right-2\.5{right:-.625rem}.lg\:-right-3\.5{right:-.875rem}.lg\:right-1\/2{right:50%}.lg\:right-1\/3{right:33.333333%}.lg\:right-2\/3{right:66.666667%}.lg\:right-1\/4{right:25%}.lg\:right-2\/4{right:50%}.lg\:right-3\/4{right:75%}.lg\:right-full{right:100%}.lg\:-right-1\/2{right:-50%}.lg\:-right-1\/3{right:-33.333333%}.lg\:-right-2\/3{right:-66.666667%}.lg\:-right-1\/4{right:-25%}.lg\:-right-2\/4{right:-50%}.lg\:-right-3\/4{right:-75%}.lg\:-right-full{right:-100%}.lg\:bottom-0{bottom:0}.lg\:bottom-1{bottom:.25rem}.lg\:bottom-2{bottom:.5rem}.lg\:bottom-3{bottom:.75rem}.lg\:bottom-4{bottom:1rem}.lg\:bottom-5{bottom:1.25rem}.lg\:bottom-6{bottom:1.5rem}.lg\:bottom-7{bottom:1.75rem}.lg\:bottom-8{bottom:2rem}.lg\:bottom-9{bottom:2.25rem}.lg\:bottom-10{bottom:2.5rem}.lg\:bottom-11{bottom:2.75rem}.lg\:bottom-12{bottom:3rem}.lg\:bottom-14{bottom:3.5rem}.lg\:bottom-16{bottom:4rem}.lg\:bottom-20{bottom:5rem}.lg\:bottom-24{bottom:6rem}.lg\:bottom-28{bottom:7rem}.lg\:bottom-32{bottom:8rem}.lg\:bottom-36{bottom:9rem}.lg\:bottom-40{bottom:10rem}.lg\:bottom-44{bottom:11rem}.lg\:bottom-48{bottom:12rem}.lg\:bottom-52{bottom:13rem}.lg\:bottom-56{bottom:14rem}.lg\:bottom-60{bottom:15rem}.lg\:bottom-64{bottom:16rem}.lg\:bottom-72{bottom:18rem}.lg\:bottom-80{bottom:20rem}.lg\:bottom-96{bottom:24rem}.lg\:bottom-auto{bottom:auto}.lg\:bottom-px{bottom:1px}.lg\:bottom-0\.5{bottom:.125rem}.lg\:bottom-1\.5{bottom:.375rem}.lg\:bottom-2\.5{bottom:.625rem}.lg\:bottom-3\.5{bottom:.875rem}.lg\:-bottom-0{bottom:0}.lg\:-bottom-1{bottom:-.25rem}.lg\:-bottom-2{bottom:-.5rem}.lg\:-bottom-3{bottom:-.75rem}.lg\:-bottom-4{bottom:-1rem}.lg\:-bottom-5{bottom:-1.25rem}.lg\:-bottom-6{bottom:-1.5rem}.lg\:-bottom-7{bottom:-1.75rem}.lg\:-bottom-8{bottom:-2rem}.lg\:-bottom-9{bottom:-2.25rem}.lg\:-bottom-10{bottom:-2.5rem}.lg\:-bottom-11{bottom:-2.75rem}.lg\:-bottom-12{bottom:-3rem}.lg\:-bottom-14{bottom:-3.5rem}.lg\:-bottom-16{bottom:-4rem}.lg\:-bottom-20{bottom:-5rem}.lg\:-bottom-24{bottom:-6rem}.lg\:-bottom-28{bottom:-7rem}.lg\:-bottom-32{bottom:-8rem}.lg\:-bottom-36{bottom:-9rem}.lg\:-bottom-40{bottom:-10rem}.lg\:-bottom-44{bottom:-11rem}.lg\:-bottom-48{bottom:-12rem}.lg\:-bottom-52{bottom:-13rem}.lg\:-bottom-56{bottom:-14rem}.lg\:-bottom-60{bottom:-15rem}.lg\:-bottom-64{bottom:-16rem}.lg\:-bottom-72{bottom:-18rem}.lg\:-bottom-80{bottom:-20rem}.lg\:-bottom-96{bottom:-24rem}.lg\:-bottom-px{bottom:-1px}.lg\:-bottom-0\.5{bottom:-.125rem}.lg\:-bottom-1\.5{bottom:-.375rem}.lg\:-bottom-2\.5{bottom:-.625rem}.lg\:-bottom-3\.5{bottom:-.875rem}.lg\:bottom-1\/2{bottom:50%}.lg\:bottom-1\/3{bottom:33.333333%}.lg\:bottom-2\/3{bottom:66.666667%}.lg\:bottom-1\/4{bottom:25%}.lg\:bottom-2\/4{bottom:50%}.lg\:bottom-3\/4{bottom:75%}.lg\:bottom-full{bottom:100%}.lg\:-bottom-1\/2{bottom:-50%}.lg\:-bottom-1\/3{bottom:-33.333333%}.lg\:-bottom-2\/3{bottom:-66.666667%}.lg\:-bottom-1\/4{bottom:-25%}.lg\:-bottom-2\/4{bottom:-50%}.lg\:-bottom-3\/4{bottom:-75%}.lg\:-bottom-full{bottom:-100%}.lg\:left-0{left:0}.lg\:left-1{left:.25rem}.lg\:left-2{left:.5rem}.lg\:left-3{left:.75rem}.lg\:left-4{left:1rem}.lg\:left-5{left:1.25rem}.lg\:left-6{left:1.5rem}.lg\:left-7{left:1.75rem}.lg\:left-8{left:2rem}.lg\:left-9{left:2.25rem}.lg\:left-10{left:2.5rem}.lg\:left-11{left:2.75rem}.lg\:left-12{left:3rem}.lg\:left-14{left:3.5rem}.lg\:left-16{left:4rem}.lg\:left-20{left:5rem}.lg\:left-24{left:6rem}.lg\:left-28{left:7rem}.lg\:left-32{left:8rem}.lg\:left-36{left:9rem}.lg\:left-40{left:10rem}.lg\:left-44{left:11rem}.lg\:left-48{left:12rem}.lg\:left-52{left:13rem}.lg\:left-56{left:14rem}.lg\:left-60{left:15rem}.lg\:left-64{left:16rem}.lg\:left-72{left:18rem}.lg\:left-80{left:20rem}.lg\:left-96{left:24rem}.lg\:left-auto{left:auto}.lg\:left-px{left:1px}.lg\:left-0\.5{left:.125rem}.lg\:left-1\.5{left:.375rem}.lg\:left-2\.5{left:.625rem}.lg\:left-3\.5{left:.875rem}.lg\:-left-0{left:0}.lg\:-left-1{left:-.25rem}.lg\:-left-2{left:-.5rem}.lg\:-left-3{left:-.75rem}.lg\:-left-4{left:-1rem}.lg\:-left-5{left:-1.25rem}.lg\:-left-6{left:-1.5rem}.lg\:-left-7{left:-1.75rem}.lg\:-left-8{left:-2rem}.lg\:-left-9{left:-2.25rem}.lg\:-left-10{left:-2.5rem}.lg\:-left-11{left:-2.75rem}.lg\:-left-12{left:-3rem}.lg\:-left-14{left:-3.5rem}.lg\:-left-16{left:-4rem}.lg\:-left-20{left:-5rem}.lg\:-left-24{left:-6rem}.lg\:-left-28{left:-7rem}.lg\:-left-32{left:-8rem}.lg\:-left-36{left:-9rem}.lg\:-left-40{left:-10rem}.lg\:-left-44{left:-11rem}.lg\:-left-48{left:-12rem}.lg\:-left-52{left:-13rem}.lg\:-left-56{left:-14rem}.lg\:-left-60{left:-15rem}.lg\:-left-64{left:-16rem}.lg\:-left-72{left:-18rem}.lg\:-left-80{left:-20rem}.lg\:-left-96{left:-24rem}.lg\:-left-px{left:-1px}.lg\:-left-0\.5{left:-.125rem}.lg\:-left-1\.5{left:-.375rem}.lg\:-left-2\.5{left:-.625rem}.lg\:-left-3\.5{left:-.875rem}.lg\:left-1\/2{left:50%}.lg\:left-1\/3{left:33.333333%}.lg\:left-2\/3{left:66.666667%}.lg\:left-1\/4{left:25%}.lg\:left-2\/4{left:50%}.lg\:left-3\/4{left:75%}.lg\:left-full{left:100%}.lg\:-left-1\/2{left:-50%}.lg\:-left-1\/3{left:-33.333333%}.lg\:-left-2\/3{left:-66.666667%}.lg\:-left-1\/4{left:-25%}.lg\:-left-2\/4{left:-50%}.lg\:-left-3\/4{left:-75%}.lg\:-left-full{left:-100%}.lg\:isolate{isolation:isolate}.lg\:isolation-auto{isolation:auto}.lg\:z-0{z-index:0}.lg\:z-10{z-index:10}.lg\:z-20{z-index:20}.lg\:z-30{z-index:30}.lg\:z-40{z-index:40}.lg\:z-50{z-index:50}.lg\:z-auto{z-index:auto}.lg\:focus-within\:z-0:focus-within{z-index:0}.lg\:focus-within\:z-10:focus-within{z-index:10}.lg\:focus-within\:z-20:focus-within{z-index:20}.lg\:focus-within\:z-30:focus-within{z-index:30}.lg\:focus-within\:z-40:focus-within{z-index:40}.lg\:focus-within\:z-50:focus-within{z-index:50}.lg\:focus-within\:z-auto:focus-within{z-index:auto}.lg\:focus\:z-0:focus{z-index:0}.lg\:focus\:z-10:focus{z-index:10}.lg\:focus\:z-20:focus{z-index:20}.lg\:focus\:z-30:focus{z-index:30}.lg\:focus\:z-40:focus{z-index:40}.lg\:focus\:z-50:focus{z-index:50}.lg\:focus\:z-auto:focus{z-index:auto}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-4{order:4}.lg\:order-5{order:5}.lg\:order-6{order:6}.lg\:order-7{order:7}.lg\:order-8{order:8}.lg\:order-9{order:9}.lg\:order-10{order:10}.lg\:order-11{order:11}.lg\:order-12{order:12}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:order-none{order:0}.lg\:col-auto{grid-column:auto}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-4{grid-column-start:4}.lg\:col-start-5{grid-column-start:5}.lg\:col-start-6{grid-column-start:6}.lg\:col-start-7{grid-column-start:7}.lg\:col-start-8{grid-column-start:8}.lg\:col-start-9{grid-column-start:9}.lg\:col-start-10{grid-column-start:10}.lg\:col-start-11{grid-column-start:11}.lg\:col-start-12{grid-column-start:12}.lg\:col-start-13{grid-column-start:13}.lg\:col-start-auto{grid-column-start:auto}.lg\:col-end-1{grid-column-end:1}.lg\:col-end-2{grid-column-end:2}.lg\:col-end-3{grid-column-end:3}.lg\:col-end-4{grid-column-end:4}.lg\:col-end-5{grid-column-end:5}.lg\:col-end-6{grid-column-end:6}.lg\:col-end-7{grid-column-end:7}.lg\:col-end-8{grid-column-end:8}.lg\:col-end-9{grid-column-end:9}.lg\:col-end-10{grid-column-end:10}.lg\:col-end-11{grid-column-end:11}.lg\:col-end-12{grid-column-end:12}.lg\:col-end-13{grid-column-end:13}.lg\:col-end-auto{grid-column-end:auto}.lg\:row-auto{grid-row:auto}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-span-3{grid-row:span 3/span 3}.lg\:row-span-4{grid-row:span 4/span 4}.lg\:row-span-5{grid-row:span 5/span 5}.lg\:row-span-6{grid-row:span 6/span 6}.lg\:row-span-full{grid-row:1/-1}.lg\:row-start-1{grid-row-start:1}.lg\:row-start-2{grid-row-start:2}.lg\:row-start-3{grid-row-start:3}.lg\:row-start-4{grid-row-start:4}.lg\:row-start-5{grid-row-start:5}.lg\:row-start-6{grid-row-start:6}.lg\:row-start-7{grid-row-start:7}.lg\:row-start-auto{grid-row-start:auto}.lg\:row-end-1{grid-row-end:1}.lg\:row-end-2{grid-row-end:2}.lg\:row-end-3{grid-row-end:3}.lg\:row-end-4{grid-row-end:4}.lg\:row-end-5{grid-row-end:5}.lg\:row-end-6{grid-row-end:6}.lg\:row-end-7{grid-row-end:7}.lg\:row-end-auto{grid-row-end:auto}.lg\:float-right{float:right}.lg\:float-left{float:left}.lg\:float-none{float:none}.lg\:clear-left{clear:left}.lg\:clear-right{clear:right}.lg\:clear-both{clear:both}.lg\:clear-none{clear:none}.lg\:m-0{margin:0}.lg\:m-1{margin:.25rem}.lg\:m-2{margin:.5rem}.lg\:m-3{margin:.75rem}.lg\:m-4{margin:1rem}.lg\:m-5{margin:1.25rem}.lg\:m-6{margin:1.5rem}.lg\:m-7{margin:1.75rem}.lg\:m-8{margin:2rem}.lg\:m-9{margin:2.25rem}.lg\:m-10{margin:2.5rem}.lg\:m-11{margin:2.75rem}.lg\:m-12{margin:3rem}.lg\:m-14{margin:3.5rem}.lg\:m-16{margin:4rem}.lg\:m-20{margin:5rem}.lg\:m-24{margin:6rem}.lg\:m-28{margin:7rem}.lg\:m-32{margin:8rem}.lg\:m-36{margin:9rem}.lg\:m-40{margin:10rem}.lg\:m-44{margin:11rem}.lg\:m-48{margin:12rem}.lg\:m-52{margin:13rem}.lg\:m-56{margin:14rem}.lg\:m-60{margin:15rem}.lg\:m-64{margin:16rem}.lg\:m-72{margin:18rem}.lg\:m-80{margin:20rem}.lg\:m-96{margin:24rem}.lg\:m-auto{margin:auto}.lg\:m-px{margin:1px}.lg\:m-0\.5{margin:.125rem}.lg\:m-1\.5{margin:.375rem}.lg\:m-2\.5{margin:.625rem}.lg\:m-3\.5{margin:.875rem}.lg\:-m-0{margin:0}.lg\:-m-1{margin:-.25rem}.lg\:-m-2{margin:-.5rem}.lg\:-m-3{margin:-.75rem}.lg\:-m-4{margin:-1rem}.lg\:-m-5{margin:-1.25rem}.lg\:-m-6{margin:-1.5rem}.lg\:-m-7{margin:-1.75rem}.lg\:-m-8{margin:-2rem}.lg\:-m-9{margin:-2.25rem}.lg\:-m-10{margin:-2.5rem}.lg\:-m-11{margin:-2.75rem}.lg\:-m-12{margin:-3rem}.lg\:-m-14{margin:-3.5rem}.lg\:-m-16{margin:-4rem}.lg\:-m-20{margin:-5rem}.lg\:-m-24{margin:-6rem}.lg\:-m-28{margin:-7rem}.lg\:-m-32{margin:-8rem}.lg\:-m-36{margin:-9rem}.lg\:-m-40{margin:-10rem}.lg\:-m-44{margin:-11rem}.lg\:-m-48{margin:-12rem}.lg\:-m-52{margin:-13rem}.lg\:-m-56{margin:-14rem}.lg\:-m-60{margin:-15rem}.lg\:-m-64{margin:-16rem}.lg\:-m-72{margin:-18rem}.lg\:-m-80{margin:-20rem}.lg\:-m-96{margin:-24rem}.lg\:-m-px{margin:-1px}.lg\:-m-0\.5{margin:-.125rem}.lg\:-m-1\.5{margin:-.375rem}.lg\:-m-2\.5{margin:-.625rem}.lg\:-m-3\.5{margin:-.875rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:mx-1{margin-left:.25rem;margin-right:.25rem}.lg\:mx-2{margin-left:.5rem;margin-right:.5rem}.lg\:mx-3{margin-left:.75rem;margin-right:.75rem}.lg\:mx-4{margin-left:1rem;margin-right:1rem}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.lg\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.lg\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.lg\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.lg\:mx-12{margin-left:3rem;margin-right:3rem}.lg\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.lg\:mx-16{margin-left:4rem;margin-right:4rem}.lg\:mx-20{margin-left:5rem;margin-right:5rem}.lg\:mx-24{margin-left:6rem;margin-right:6rem}.lg\:mx-28{margin-left:7rem;margin-right:7rem}.lg\:mx-32{margin-left:8rem;margin-right:8rem}.lg\:mx-36{margin-left:9rem;margin-right:9rem}.lg\:mx-40{margin-left:10rem;margin-right:10rem}.lg\:mx-44{margin-left:11rem;margin-right:11rem}.lg\:mx-48{margin-left:12rem;margin-right:12rem}.lg\:mx-52{margin-left:13rem;margin-right:13rem}.lg\:mx-56{margin-left:14rem;margin-right:14rem}.lg\:mx-60{margin-left:15rem;margin-right:15rem}.lg\:mx-64{margin-left:16rem;margin-right:16rem}.lg\:mx-72{margin-left:18rem;margin-right:18rem}.lg\:mx-80{margin-left:20rem;margin-right:20rem}.lg\:mx-96{margin-left:24rem;margin-right:24rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:mx-px{margin-left:1px;margin-right:1px}.lg\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.lg\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.lg\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.lg\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.lg\:-mx-0{margin-left:0;margin-right:0}.lg\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.lg\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.lg\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.lg\:-mx-4{margin-left:-1rem;margin-right:-1rem}.lg\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lg\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.lg\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.lg\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.lg\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.lg\:-mx-12{margin-left:-3rem;margin-right:-3rem}.lg\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.lg\:-mx-16{margin-left:-4rem;margin-right:-4rem}.lg\:-mx-20{margin-left:-5rem;margin-right:-5rem}.lg\:-mx-24{margin-left:-6rem;margin-right:-6rem}.lg\:-mx-28{margin-left:-7rem;margin-right:-7rem}.lg\:-mx-32{margin-left:-8rem;margin-right:-8rem}.lg\:-mx-36{margin-left:-9rem;margin-right:-9rem}.lg\:-mx-40{margin-left:-10rem;margin-right:-10rem}.lg\:-mx-44{margin-left:-11rem;margin-right:-11rem}.lg\:-mx-48{margin-left:-12rem;margin-right:-12rem}.lg\:-mx-52{margin-left:-13rem;margin-right:-13rem}.lg\:-mx-56{margin-left:-14rem;margin-right:-14rem}.lg\:-mx-60{margin-left:-15rem;margin-right:-15rem}.lg\:-mx-64{margin-left:-16rem;margin-right:-16rem}.lg\:-mx-72{margin-left:-18rem;margin-right:-18rem}.lg\:-mx-80{margin-left:-20rem;margin-right:-20rem}.lg\:-mx-96{margin-left:-24rem;margin-right:-24rem}.lg\:-mx-px{margin-left:-1px;margin-right:-1px}.lg\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.lg\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.lg\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.lg\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:my-1{margin-top:.25rem;margin-bottom:.25rem}.lg\:my-2{margin-top:.5rem;margin-bottom:.5rem}.lg\:my-3{margin-top:.75rem;margin-bottom:.75rem}.lg\:my-4{margin-top:1rem;margin-bottom:1rem}.lg\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.lg\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lg\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.lg\:my-8{margin-top:2rem;margin-bottom:2rem}.lg\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.lg\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.lg\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.lg\:my-12{margin-top:3rem;margin-bottom:3rem}.lg\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.lg\:my-16{margin-top:4rem;margin-bottom:4rem}.lg\:my-20{margin-top:5rem;margin-bottom:5rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:my-28{margin-top:7rem;margin-bottom:7rem}.lg\:my-32{margin-top:8rem;margin-bottom:8rem}.lg\:my-36{margin-top:9rem;margin-bottom:9rem}.lg\:my-40{margin-top:10rem;margin-bottom:10rem}.lg\:my-44{margin-top:11rem;margin-bottom:11rem}.lg\:my-48{margin-top:12rem;margin-bottom:12rem}.lg\:my-52{margin-top:13rem;margin-bottom:13rem}.lg\:my-56{margin-top:14rem;margin-bottom:14rem}.lg\:my-60{margin-top:15rem;margin-bottom:15rem}.lg\:my-64{margin-top:16rem;margin-bottom:16rem}.lg\:my-72{margin-top:18rem;margin-bottom:18rem}.lg\:my-80{margin-top:20rem;margin-bottom:20rem}.lg\:my-96{margin-top:24rem;margin-bottom:24rem}.lg\:my-auto{margin-top:auto;margin-bottom:auto}.lg\:my-px{margin-top:1px;margin-bottom:1px}.lg\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.lg\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.lg\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.lg\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.lg\:-my-0{margin-top:0;margin-bottom:0}.lg\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.lg\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.lg\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.lg\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.lg\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.lg\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.lg\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.lg\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.lg\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.lg\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.lg\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.lg\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.lg\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.lg\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.lg\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.lg\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.lg\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.lg\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.lg\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.lg\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.lg\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.lg\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.lg\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.lg\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.lg\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.lg\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.lg\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.lg\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.lg\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.lg\:-my-px{margin-top:-1px;margin-bottom:-1px}.lg\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.lg\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.lg\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.lg\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.lg\:mt-0{margin-top:0}.lg\:mt-1{margin-top:.25rem}.lg\:mt-2{margin-top:.5rem}.lg\:mt-3{margin-top:.75rem}.lg\:mt-4{margin-top:1rem}.lg\:mt-5{margin-top:1.25rem}.lg\:mt-6{margin-top:1.5rem}.lg\:mt-7{margin-top:1.75rem}.lg\:mt-8{margin-top:2rem}.lg\:mt-9{margin-top:2.25rem}.lg\:mt-10{margin-top:2.5rem}.lg\:mt-11{margin-top:2.75rem}.lg\:mt-12{margin-top:3rem}.lg\:mt-14{margin-top:3.5rem}.lg\:mt-16{margin-top:4rem}.lg\:mt-20{margin-top:5rem}.lg\:mt-24{margin-top:6rem}.lg\:mt-28{margin-top:7rem}.lg\:mt-32{margin-top:8rem}.lg\:mt-36{margin-top:9rem}.lg\:mt-40{margin-top:10rem}.lg\:mt-44{margin-top:11rem}.lg\:mt-48{margin-top:12rem}.lg\:mt-52{margin-top:13rem}.lg\:mt-56{margin-top:14rem}.lg\:mt-60{margin-top:15rem}.lg\:mt-64{margin-top:16rem}.lg\:mt-72{margin-top:18rem}.lg\:mt-80{margin-top:20rem}.lg\:mt-96{margin-top:24rem}.lg\:mt-auto{margin-top:auto}.lg\:mt-px{margin-top:1px}.lg\:mt-0\.5{margin-top:.125rem}.lg\:mt-1\.5{margin-top:.375rem}.lg\:mt-2\.5{margin-top:.625rem}.lg\:mt-3\.5{margin-top:.875rem}.lg\:-mt-0{margin-top:0}.lg\:-mt-1{margin-top:-.25rem}.lg\:-mt-2{margin-top:-.5rem}.lg\:-mt-3{margin-top:-.75rem}.lg\:-mt-4{margin-top:-1rem}.lg\:-mt-5{margin-top:-1.25rem}.lg\:-mt-6{margin-top:-1.5rem}.lg\:-mt-7{margin-top:-1.75rem}.lg\:-mt-8{margin-top:-2rem}.lg\:-mt-9{margin-top:-2.25rem}.lg\:-mt-10{margin-top:-2.5rem}.lg\:-mt-11{margin-top:-2.75rem}.lg\:-mt-12{margin-top:-3rem}.lg\:-mt-14{margin-top:-3.5rem}.lg\:-mt-16{margin-top:-4rem}.lg\:-mt-20{margin-top:-5rem}.lg\:-mt-24{margin-top:-6rem}.lg\:-mt-28{margin-top:-7rem}.lg\:-mt-32{margin-top:-8rem}.lg\:-mt-36{margin-top:-9rem}.lg\:-mt-40{margin-top:-10rem}.lg\:-mt-44{margin-top:-11rem}.lg\:-mt-48{margin-top:-12rem}.lg\:-mt-52{margin-top:-13rem}.lg\:-mt-56{margin-top:-14rem}.lg\:-mt-60{margin-top:-15rem}.lg\:-mt-64{margin-top:-16rem}.lg\:-mt-72{margin-top:-18rem}.lg\:-mt-80{margin-top:-20rem}.lg\:-mt-96{margin-top:-24rem}.lg\:-mt-px{margin-top:-1px}.lg\:-mt-0\.5{margin-top:-.125rem}.lg\:-mt-1\.5{margin-top:-.375rem}.lg\:-mt-2\.5{margin-top:-.625rem}.lg\:-mt-3\.5{margin-top:-.875rem}.lg\:mr-0{margin-right:0}.lg\:mr-1{margin-right:.25rem}.lg\:mr-2{margin-right:.5rem}.lg\:mr-3{margin-right:.75rem}.lg\:mr-4{margin-right:1rem}.lg\:mr-5{margin-right:1.25rem}.lg\:mr-6{margin-right:1.5rem}.lg\:mr-7{margin-right:1.75rem}.lg\:mr-8{margin-right:2rem}.lg\:mr-9{margin-right:2.25rem}.lg\:mr-10{margin-right:2.5rem}.lg\:mr-11{margin-right:2.75rem}.lg\:mr-12{margin-right:3rem}.lg\:mr-14{margin-right:3.5rem}.lg\:mr-16{margin-right:4rem}.lg\:mr-20{margin-right:5rem}.lg\:mr-24{margin-right:6rem}.lg\:mr-28{margin-right:7rem}.lg\:mr-32{margin-right:8rem}.lg\:mr-36{margin-right:9rem}.lg\:mr-40{margin-right:10rem}.lg\:mr-44{margin-right:11rem}.lg\:mr-48{margin-right:12rem}.lg\:mr-52{margin-right:13rem}.lg\:mr-56{margin-right:14rem}.lg\:mr-60{margin-right:15rem}.lg\:mr-64{margin-right:16rem}.lg\:mr-72{margin-right:18rem}.lg\:mr-80{margin-right:20rem}.lg\:mr-96{margin-right:24rem}.lg\:mr-auto{margin-right:auto}.lg\:mr-px{margin-right:1px}.lg\:mr-0\.5{margin-right:.125rem}.lg\:mr-1\.5{margin-right:.375rem}.lg\:mr-2\.5{margin-right:.625rem}.lg\:mr-3\.5{margin-right:.875rem}.lg\:-mr-0{margin-right:0}.lg\:-mr-1{margin-right:-.25rem}.lg\:-mr-2{margin-right:-.5rem}.lg\:-mr-3{margin-right:-.75rem}.lg\:-mr-4{margin-right:-1rem}.lg\:-mr-5{margin-right:-1.25rem}.lg\:-mr-6{margin-right:-1.5rem}.lg\:-mr-7{margin-right:-1.75rem}.lg\:-mr-8{margin-right:-2rem}.lg\:-mr-9{margin-right:-2.25rem}.lg\:-mr-10{margin-right:-2.5rem}.lg\:-mr-11{margin-right:-2.75rem}.lg\:-mr-12{margin-right:-3rem}.lg\:-mr-14{margin-right:-3.5rem}.lg\:-mr-16{margin-right:-4rem}.lg\:-mr-20{margin-right:-5rem}.lg\:-mr-24{margin-right:-6rem}.lg\:-mr-28{margin-right:-7rem}.lg\:-mr-32{margin-right:-8rem}.lg\:-mr-36{margin-right:-9rem}.lg\:-mr-40{margin-right:-10rem}.lg\:-mr-44{margin-right:-11rem}.lg\:-mr-48{margin-right:-12rem}.lg\:-mr-52{margin-right:-13rem}.lg\:-mr-56{margin-right:-14rem}.lg\:-mr-60{margin-right:-15rem}.lg\:-mr-64{margin-right:-16rem}.lg\:-mr-72{margin-right:-18rem}.lg\:-mr-80{margin-right:-20rem}.lg\:-mr-96{margin-right:-24rem}.lg\:-mr-px{margin-right:-1px}.lg\:-mr-0\.5{margin-right:-.125rem}.lg\:-mr-1\.5{margin-right:-.375rem}.lg\:-mr-2\.5{margin-right:-.625rem}.lg\:-mr-3\.5{margin-right:-.875rem}.lg\:mb-0{margin-bottom:0}.lg\:mb-1{margin-bottom:.25rem}.lg\:mb-2{margin-bottom:.5rem}.lg\:mb-3{margin-bottom:.75rem}.lg\:mb-4{margin-bottom:1rem}.lg\:mb-5{margin-bottom:1.25rem}.lg\:mb-6{margin-bottom:1.5rem}.lg\:mb-7{margin-bottom:1.75rem}.lg\:mb-8{margin-bottom:2rem}.lg\:mb-9{margin-bottom:2.25rem}.lg\:mb-10{margin-bottom:2.5rem}.lg\:mb-11{margin-bottom:2.75rem}.lg\:mb-12{margin-bottom:3rem}.lg\:mb-14{margin-bottom:3.5rem}.lg\:mb-16{margin-bottom:4rem}.lg\:mb-20{margin-bottom:5rem}.lg\:mb-24{margin-bottom:6rem}.lg\:mb-28{margin-bottom:7rem}.lg\:mb-32{margin-bottom:8rem}.lg\:mb-36{margin-bottom:9rem}.lg\:mb-40{margin-bottom:10rem}.lg\:mb-44{margin-bottom:11rem}.lg\:mb-48{margin-bottom:12rem}.lg\:mb-52{margin-bottom:13rem}.lg\:mb-56{margin-bottom:14rem}.lg\:mb-60{margin-bottom:15rem}.lg\:mb-64{margin-bottom:16rem}.lg\:mb-72{margin-bottom:18rem}.lg\:mb-80{margin-bottom:20rem}.lg\:mb-96{margin-bottom:24rem}.lg\:mb-auto{margin-bottom:auto}.lg\:mb-px{margin-bottom:1px}.lg\:mb-0\.5{margin-bottom:.125rem}.lg\:mb-1\.5{margin-bottom:.375rem}.lg\:mb-2\.5{margin-bottom:.625rem}.lg\:mb-3\.5{margin-bottom:.875rem}.lg\:-mb-0{margin-bottom:0}.lg\:-mb-1{margin-bottom:-.25rem}.lg\:-mb-2{margin-bottom:-.5rem}.lg\:-mb-3{margin-bottom:-.75rem}.lg\:-mb-4{margin-bottom:-1rem}.lg\:-mb-5{margin-bottom:-1.25rem}.lg\:-mb-6{margin-bottom:-1.5rem}.lg\:-mb-7{margin-bottom:-1.75rem}.lg\:-mb-8{margin-bottom:-2rem}.lg\:-mb-9{margin-bottom:-2.25rem}.lg\:-mb-10{margin-bottom:-2.5rem}.lg\:-mb-11{margin-bottom:-2.75rem}.lg\:-mb-12{margin-bottom:-3rem}.lg\:-mb-14{margin-bottom:-3.5rem}.lg\:-mb-16{margin-bottom:-4rem}.lg\:-mb-20{margin-bottom:-5rem}.lg\:-mb-24{margin-bottom:-6rem}.lg\:-mb-28{margin-bottom:-7rem}.lg\:-mb-32{margin-bottom:-8rem}.lg\:-mb-36{margin-bottom:-9rem}.lg\:-mb-40{margin-bottom:-10rem}.lg\:-mb-44{margin-bottom:-11rem}.lg\:-mb-48{margin-bottom:-12rem}.lg\:-mb-52{margin-bottom:-13rem}.lg\:-mb-56{margin-bottom:-14rem}.lg\:-mb-60{margin-bottom:-15rem}.lg\:-mb-64{margin-bottom:-16rem}.lg\:-mb-72{margin-bottom:-18rem}.lg\:-mb-80{margin-bottom:-20rem}.lg\:-mb-96{margin-bottom:-24rem}.lg\:-mb-px{margin-bottom:-1px}.lg\:-mb-0\.5{margin-bottom:-.125rem}.lg\:-mb-1\.5{margin-bottom:-.375rem}.lg\:-mb-2\.5{margin-bottom:-.625rem}.lg\:-mb-3\.5{margin-bottom:-.875rem}.lg\:ml-0{margin-left:0}.lg\:ml-1{margin-left:.25rem}.lg\:ml-2{margin-left:.5rem}.lg\:ml-3{margin-left:.75rem}.lg\:ml-4{margin-left:1rem}.lg\:ml-5{margin-left:1.25rem}.lg\:ml-6{margin-left:1.5rem}.lg\:ml-7{margin-left:1.75rem}.lg\:ml-8{margin-left:2rem}.lg\:ml-9{margin-left:2.25rem}.lg\:ml-10{margin-left:2.5rem}.lg\:ml-11{margin-left:2.75rem}.lg\:ml-12{margin-left:3rem}.lg\:ml-14{margin-left:3.5rem}.lg\:ml-16{margin-left:4rem}.lg\:ml-20{margin-left:5rem}.lg\:ml-24{margin-left:6rem}.lg\:ml-28{margin-left:7rem}.lg\:ml-32{margin-left:8rem}.lg\:ml-36{margin-left:9rem}.lg\:ml-40{margin-left:10rem}.lg\:ml-44{margin-left:11rem}.lg\:ml-48{margin-left:12rem}.lg\:ml-52{margin-left:13rem}.lg\:ml-56{margin-left:14rem}.lg\:ml-60{margin-left:15rem}.lg\:ml-64{margin-left:16rem}.lg\:ml-72{margin-left:18rem}.lg\:ml-80{margin-left:20rem}.lg\:ml-96{margin-left:24rem}.lg\:ml-auto{margin-left:auto}.lg\:ml-px{margin-left:1px}.lg\:ml-0\.5{margin-left:.125rem}.lg\:ml-1\.5{margin-left:.375rem}.lg\:ml-2\.5{margin-left:.625rem}.lg\:ml-3\.5{margin-left:.875rem}.lg\:-ml-0{margin-left:0}.lg\:-ml-1{margin-left:-.25rem}.lg\:-ml-2{margin-left:-.5rem}.lg\:-ml-3{margin-left:-.75rem}.lg\:-ml-4{margin-left:-1rem}.lg\:-ml-5{margin-left:-1.25rem}.lg\:-ml-6{margin-left:-1.5rem}.lg\:-ml-7{margin-left:-1.75rem}.lg\:-ml-8{margin-left:-2rem}.lg\:-ml-9{margin-left:-2.25rem}.lg\:-ml-10{margin-left:-2.5rem}.lg\:-ml-11{margin-left:-2.75rem}.lg\:-ml-12{margin-left:-3rem}.lg\:-ml-14{margin-left:-3.5rem}.lg\:-ml-16{margin-left:-4rem}.lg\:-ml-20{margin-left:-5rem}.lg\:-ml-24{margin-left:-6rem}.lg\:-ml-28{margin-left:-7rem}.lg\:-ml-32{margin-left:-8rem}.lg\:-ml-36{margin-left:-9rem}.lg\:-ml-40{margin-left:-10rem}.lg\:-ml-44{margin-left:-11rem}.lg\:-ml-48{margin-left:-12rem}.lg\:-ml-52{margin-left:-13rem}.lg\:-ml-56{margin-left:-14rem}.lg\:-ml-60{margin-left:-15rem}.lg\:-ml-64{margin-left:-16rem}.lg\:-ml-72{margin-left:-18rem}.lg\:-ml-80{margin-left:-20rem}.lg\:-ml-96{margin-left:-24rem}.lg\:-ml-px{margin-left:-1px}.lg\:-ml-0\.5{margin-left:-.125rem}.lg\:-ml-1\.5{margin-left:-.375rem}.lg\:-ml-2\.5{margin-left:-.625rem}.lg\:-ml-3\.5{margin-left:-.875rem}.lg\:box-border{box-sizing:border-box}.lg\:box-content{box-sizing:initial}.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:table{display:table}.lg\:inline-table{display:inline-table}.lg\:table-caption{display:table-caption}.lg\:table-cell{display:table-cell}.lg\:table-column{display:table-column}.lg\:table-column-group{display:table-column-group}.lg\:table-footer-group{display:table-footer-group}.lg\:table-header-group{display:table-header-group}.lg\:table-row-group{display:table-row-group}.lg\:table-row{display:table-row}.lg\:flow-root{display:flow-root}.lg\:grid{display:grid}.lg\:inline-grid{display:inline-grid}.lg\:contents{display:contents}.lg\:list-item{display:list-item}.lg\:hidden{display:none}.lg\:h-0{height:0}.lg\:h-1{height:.25rem}.lg\:h-2{height:.5rem}.lg\:h-3{height:.75rem}.lg\:h-4{height:1rem}.lg\:h-5{height:1.25rem}.lg\:h-6{height:1.5rem}.lg\:h-7{height:1.75rem}.lg\:h-8{height:2rem}.lg\:h-9{height:2.25rem}.lg\:h-10{height:2.5rem}.lg\:h-11{height:2.75rem}.lg\:h-12{height:3rem}.lg\:h-14{height:3.5rem}.lg\:h-16{height:4rem}.lg\:h-20{height:5rem}.lg\:h-24{height:6rem}.lg\:h-28{height:7rem}.lg\:h-32{height:8rem}.lg\:h-36{height:9rem}.lg\:h-40{height:10rem}.lg\:h-44{height:11rem}.lg\:h-48{height:12rem}.lg\:h-52{height:13rem}.lg\:h-56{height:14rem}.lg\:h-60{height:15rem}.lg\:h-64{height:16rem}.lg\:h-72{height:18rem}.lg\:h-80{height:20rem}.lg\:h-96{height:24rem}.lg\:h-auto{height:auto}.lg\:h-px{height:1px}.lg\:h-0\.5{height:.125rem}.lg\:h-1\.5{height:.375rem}.lg\:h-2\.5{height:.625rem}.lg\:h-3\.5{height:.875rem}.lg\:h-1\/2{height:50%}.lg\:h-1\/3{height:33.333333%}.lg\:h-2\/3{height:66.666667%}.lg\:h-1\/4{height:25%}.lg\:h-2\/4{height:50%}.lg\:h-3\/4{height:75%}.lg\:h-1\/5{height:20%}.lg\:h-2\/5{height:40%}.lg\:h-3\/5{height:60%}.lg\:h-4\/5{height:80%}.lg\:h-1\/6{height:16.666667%}.lg\:h-2\/6{height:33.333333%}.lg\:h-3\/6{height:50%}.lg\:h-4\/6{height:66.666667%}.lg\:h-5\/6{height:83.333333%}.lg\:h-full{height:100%}.lg\:h-screen{height:100vh}.lg\:max-h-0{max-height:0}.lg\:max-h-1{max-height:.25rem}.lg\:max-h-2{max-height:.5rem}.lg\:max-h-3{max-height:.75rem}.lg\:max-h-4{max-height:1rem}.lg\:max-h-5{max-height:1.25rem}.lg\:max-h-6{max-height:1.5rem}.lg\:max-h-7{max-height:1.75rem}.lg\:max-h-8{max-height:2rem}.lg\:max-h-9{max-height:2.25rem}.lg\:max-h-10{max-height:2.5rem}.lg\:max-h-11{max-height:2.75rem}.lg\:max-h-12{max-height:3rem}.lg\:max-h-14{max-height:3.5rem}.lg\:max-h-16{max-height:4rem}.lg\:max-h-20{max-height:5rem}.lg\:max-h-24{max-height:6rem}.lg\:max-h-28{max-height:7rem}.lg\:max-h-32{max-height:8rem}.lg\:max-h-36{max-height:9rem}.lg\:max-h-40{max-height:10rem}.lg\:max-h-44{max-height:11rem}.lg\:max-h-48{max-height:12rem}.lg\:max-h-52{max-height:13rem}.lg\:max-h-56{max-height:14rem}.lg\:max-h-60{max-height:15rem}.lg\:max-h-64{max-height:16rem}.lg\:max-h-72{max-height:18rem}.lg\:max-h-80{max-height:20rem}.lg\:max-h-96{max-height:24rem}.lg\:max-h-px{max-height:1px}.lg\:max-h-0\.5{max-height:.125rem}.lg\:max-h-1\.5{max-height:.375rem}.lg\:max-h-2\.5{max-height:.625rem}.lg\:max-h-3\.5{max-height:.875rem}.lg\:max-h-full{max-height:100%}.lg\:max-h-screen{max-height:100vh}.lg\:min-h-0{min-height:0}.lg\:min-h-full{min-height:100%}.lg\:min-h-screen{min-height:100vh}.lg\:w-0{width:0}.lg\:w-1{width:.25rem}.lg\:w-2{width:.5rem}.lg\:w-3{width:.75rem}.lg\:w-4{width:1rem}.lg\:w-5{width:1.25rem}.lg\:w-6{width:1.5rem}.lg\:w-7{width:1.75rem}.lg\:w-8{width:2rem}.lg\:w-9{width:2.25rem}.lg\:w-10{width:2.5rem}.lg\:w-11{width:2.75rem}.lg\:w-12{width:3rem}.lg\:w-14{width:3.5rem}.lg\:w-16{width:4rem}.lg\:w-20{width:5rem}.lg\:w-24{width:6rem}.lg\:w-28{width:7rem}.lg\:w-32{width:8rem}.lg\:w-36{width:9rem}.lg\:w-40{width:10rem}.lg\:w-44{width:11rem}.lg\:w-48{width:12rem}.lg\:w-52{width:13rem}.lg\:w-56{width:14rem}.lg\:w-60{width:15rem}.lg\:w-64{width:16rem}.lg\:w-72{width:18rem}.lg\:w-80{width:20rem}.lg\:w-96{width:24rem}.lg\:w-auto{width:auto}.lg\:w-px{width:1px}.lg\:w-0\.5{width:.125rem}.lg\:w-1\.5{width:.375rem}.lg\:w-2\.5{width:.625rem}.lg\:w-3\.5{width:.875rem}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.333333%}.lg\:w-2\/3{width:66.666667%}.lg\:w-1\/4{width:25%}.lg\:w-2\/4{width:50%}.lg\:w-3\/4{width:75%}.lg\:w-1\/5{width:20%}.lg\:w-2\/5{width:40%}.lg\:w-3\/5{width:60%}.lg\:w-4\/5{width:80%}.lg\:w-1\/6{width:16.666667%}.lg\:w-2\/6{width:33.333333%}.lg\:w-3\/6{width:50%}.lg\:w-4\/6{width:66.666667%}.lg\:w-5\/6{width:83.333333%}.lg\:w-1\/12{width:8.333333%}.lg\:w-2\/12{width:16.666667%}.lg\:w-3\/12{width:25%}.lg\:w-4\/12{width:33.333333%}.lg\:w-5\/12{width:41.666667%}.lg\:w-6\/12{width:50%}.lg\:w-7\/12{width:58.333333%}.lg\:w-8\/12{width:66.666667%}.lg\:w-9\/12{width:75%}.lg\:w-10\/12{width:83.333333%}.lg\:w-11\/12{width:91.666667%}.lg\:w-full{width:100%}.lg\:w-screen{width:100vw}.lg\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.lg\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.lg\:min-w-0{min-width:0}.lg\:min-w-full{min-width:100%}.lg\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.lg\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.lg\:max-w-0{max-width:0}.lg\:max-w-none{max-width:none}.lg\:max-w-xs{max-width:20rem}.lg\:max-w-sm{max-width:24rem}.lg\:max-w-md{max-width:28rem}.lg\:max-w-lg{max-width:32rem}.lg\:max-w-xl{max-width:36rem}.lg\:max-w-2xl{max-width:42rem}.lg\:max-w-3xl{max-width:48rem}.lg\:max-w-4xl{max-width:56rem}.lg\:max-w-5xl{max-width:64rem}.lg\:max-w-6xl{max-width:72rem}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-full{max-width:100%}.lg\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.lg\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.lg\:max-w-prose{max-width:65ch}.lg\:max-w-screen-sm{max-width:640px}.lg\:max-w-screen-md{max-width:768px}.lg\:max-w-screen-lg{max-width:1024px}.lg\:max-w-screen-xl{max-width:1280px}.lg\:max-w-screen-2xl{max-width:1536px}.lg\:flex-1{flex:1 1 0%}.lg\:flex-auto{flex:1 1 auto}.lg\:flex-initial{flex:0 1 auto}.lg\:flex-none{flex:none}.lg\:flex-shrink-0{flex-shrink:0}.lg\:flex-shrink{flex-shrink:1}.lg\:flex-grow-0{flex-grow:0}.lg\:flex-grow{flex-grow:1}.lg\:table-auto{table-layout:auto}.lg\:table-fixed{table-layout:fixed}.lg\:border-collapse{border-collapse:collapse}.lg\:border-separate{border-collapse:initial}.lg\:origin-center{transform-origin:center}.lg\:origin-top{transform-origin:top}.lg\:origin-top-right{transform-origin:top right}.lg\:origin-right{transform-origin:right}.lg\:origin-bottom-right{transform-origin:bottom right}.lg\:origin-bottom{transform-origin:bottom}.lg\:origin-bottom-left{transform-origin:bottom left}.lg\:origin-left{transform-origin:left}.lg\:origin-top-left{transform-origin:top left}.lg\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:transform,.lg\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.lg\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:transform-none{transform:none}.lg\:translate-x-0{--tw-translate-x:0px}.lg\:translate-x-1{--tw-translate-x:0.25rem}.lg\:translate-x-2{--tw-translate-x:0.5rem}.lg\:translate-x-3{--tw-translate-x:0.75rem}.lg\:translate-x-4{--tw-translate-x:1rem}.lg\:translate-x-5{--tw-translate-x:1.25rem}.lg\:translate-x-6{--tw-translate-x:1.5rem}.lg\:translate-x-7{--tw-translate-x:1.75rem}.lg\:translate-x-8{--tw-translate-x:2rem}.lg\:translate-x-9{--tw-translate-x:2.25rem}.lg\:translate-x-10{--tw-translate-x:2.5rem}.lg\:translate-x-11{--tw-translate-x:2.75rem}.lg\:translate-x-12{--tw-translate-x:3rem}.lg\:translate-x-14{--tw-translate-x:3.5rem}.lg\:translate-x-16{--tw-translate-x:4rem}.lg\:translate-x-20{--tw-translate-x:5rem}.lg\:translate-x-24{--tw-translate-x:6rem}.lg\:translate-x-28{--tw-translate-x:7rem}.lg\:translate-x-32{--tw-translate-x:8rem}.lg\:translate-x-36{--tw-translate-x:9rem}.lg\:translate-x-40{--tw-translate-x:10rem}.lg\:translate-x-44{--tw-translate-x:11rem}.lg\:translate-x-48{--tw-translate-x:12rem}.lg\:translate-x-52{--tw-translate-x:13rem}.lg\:translate-x-56{--tw-translate-x:14rem}.lg\:translate-x-60{--tw-translate-x:15rem}.lg\:translate-x-64{--tw-translate-x:16rem}.lg\:translate-x-72{--tw-translate-x:18rem}.lg\:translate-x-80{--tw-translate-x:20rem}.lg\:translate-x-96{--tw-translate-x:24rem}.lg\:translate-x-px{--tw-translate-x:1px}.lg\:translate-x-0\.5{--tw-translate-x:0.125rem}.lg\:translate-x-1\.5{--tw-translate-x:0.375rem}.lg\:translate-x-2\.5{--tw-translate-x:0.625rem}.lg\:translate-x-3\.5{--tw-translate-x:0.875rem}.lg\:-translate-x-0{--tw-translate-x:0px}.lg\:-translate-x-1{--tw-translate-x:-0.25rem}.lg\:-translate-x-2{--tw-translate-x:-0.5rem}.lg\:-translate-x-3{--tw-translate-x:-0.75rem}.lg\:-translate-x-4{--tw-translate-x:-1rem}.lg\:-translate-x-5{--tw-translate-x:-1.25rem}.lg\:-translate-x-6{--tw-translate-x:-1.5rem}.lg\:-translate-x-7{--tw-translate-x:-1.75rem}.lg\:-translate-x-8{--tw-translate-x:-2rem}.lg\:-translate-x-9{--tw-translate-x:-2.25rem}.lg\:-translate-x-10{--tw-translate-x:-2.5rem}.lg\:-translate-x-11{--tw-translate-x:-2.75rem}.lg\:-translate-x-12{--tw-translate-x:-3rem}.lg\:-translate-x-14{--tw-translate-x:-3.5rem}.lg\:-translate-x-16{--tw-translate-x:-4rem}.lg\:-translate-x-20{--tw-translate-x:-5rem}.lg\:-translate-x-24{--tw-translate-x:-6rem}.lg\:-translate-x-28{--tw-translate-x:-7rem}.lg\:-translate-x-32{--tw-translate-x:-8rem}.lg\:-translate-x-36{--tw-translate-x:-9rem}.lg\:-translate-x-40{--tw-translate-x:-10rem}.lg\:-translate-x-44{--tw-translate-x:-11rem}.lg\:-translate-x-48{--tw-translate-x:-12rem}.lg\:-translate-x-52{--tw-translate-x:-13rem}.lg\:-translate-x-56{--tw-translate-x:-14rem}.lg\:-translate-x-60{--tw-translate-x:-15rem}.lg\:-translate-x-64{--tw-translate-x:-16rem}.lg\:-translate-x-72{--tw-translate-x:-18rem}.lg\:-translate-x-80{--tw-translate-x:-20rem}.lg\:-translate-x-96{--tw-translate-x:-24rem}.lg\:-translate-x-px{--tw-translate-x:-1px}.lg\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.lg\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.lg\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.lg\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.lg\:translate-x-1\/2{--tw-translate-x:50%}.lg\:translate-x-1\/3{--tw-translate-x:33.333333%}.lg\:translate-x-2\/3{--tw-translate-x:66.666667%}.lg\:translate-x-1\/4{--tw-translate-x:25%}.lg\:translate-x-2\/4{--tw-translate-x:50%}.lg\:translate-x-3\/4{--tw-translate-x:75%}.lg\:translate-x-full{--tw-translate-x:100%}.lg\:-translate-x-1\/2{--tw-translate-x:-50%}.lg\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.lg\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.lg\:-translate-x-1\/4{--tw-translate-x:-25%}.lg\:-translate-x-2\/4{--tw-translate-x:-50%}.lg\:-translate-x-3\/4{--tw-translate-x:-75%}.lg\:-translate-x-full{--tw-translate-x:-100%}.lg\:translate-y-0{--tw-translate-y:0px}.lg\:translate-y-1{--tw-translate-y:0.25rem}.lg\:translate-y-2{--tw-translate-y:0.5rem}.lg\:translate-y-3{--tw-translate-y:0.75rem}.lg\:translate-y-4{--tw-translate-y:1rem}.lg\:translate-y-5{--tw-translate-y:1.25rem}.lg\:translate-y-6{--tw-translate-y:1.5rem}.lg\:translate-y-7{--tw-translate-y:1.75rem}.lg\:translate-y-8{--tw-translate-y:2rem}.lg\:translate-y-9{--tw-translate-y:2.25rem}.lg\:translate-y-10{--tw-translate-y:2.5rem}.lg\:translate-y-11{--tw-translate-y:2.75rem}.lg\:translate-y-12{--tw-translate-y:3rem}.lg\:translate-y-14{--tw-translate-y:3.5rem}.lg\:translate-y-16{--tw-translate-y:4rem}.lg\:translate-y-20{--tw-translate-y:5rem}.lg\:translate-y-24{--tw-translate-y:6rem}.lg\:translate-y-28{--tw-translate-y:7rem}.lg\:translate-y-32{--tw-translate-y:8rem}.lg\:translate-y-36{--tw-translate-y:9rem}.lg\:translate-y-40{--tw-translate-y:10rem}.lg\:translate-y-44{--tw-translate-y:11rem}.lg\:translate-y-48{--tw-translate-y:12rem}.lg\:translate-y-52{--tw-translate-y:13rem}.lg\:translate-y-56{--tw-translate-y:14rem}.lg\:translate-y-60{--tw-translate-y:15rem}.lg\:translate-y-64{--tw-translate-y:16rem}.lg\:translate-y-72{--tw-translate-y:18rem}.lg\:translate-y-80{--tw-translate-y:20rem}.lg\:translate-y-96{--tw-translate-y:24rem}.lg\:translate-y-px{--tw-translate-y:1px}.lg\:translate-y-0\.5{--tw-translate-y:0.125rem}.lg\:translate-y-1\.5{--tw-translate-y:0.375rem}.lg\:translate-y-2\.5{--tw-translate-y:0.625rem}.lg\:translate-y-3\.5{--tw-translate-y:0.875rem}.lg\:-translate-y-0{--tw-translate-y:0px}.lg\:-translate-y-1{--tw-translate-y:-0.25rem}.lg\:-translate-y-2{--tw-translate-y:-0.5rem}.lg\:-translate-y-3{--tw-translate-y:-0.75rem}.lg\:-translate-y-4{--tw-translate-y:-1rem}.lg\:-translate-y-5{--tw-translate-y:-1.25rem}.lg\:-translate-y-6{--tw-translate-y:-1.5rem}.lg\:-translate-y-7{--tw-translate-y:-1.75rem}.lg\:-translate-y-8{--tw-translate-y:-2rem}.lg\:-translate-y-9{--tw-translate-y:-2.25rem}.lg\:-translate-y-10{--tw-translate-y:-2.5rem}.lg\:-translate-y-11{--tw-translate-y:-2.75rem}.lg\:-translate-y-12{--tw-translate-y:-3rem}.lg\:-translate-y-14{--tw-translate-y:-3.5rem}.lg\:-translate-y-16{--tw-translate-y:-4rem}.lg\:-translate-y-20{--tw-translate-y:-5rem}.lg\:-translate-y-24{--tw-translate-y:-6rem}.lg\:-translate-y-28{--tw-translate-y:-7rem}.lg\:-translate-y-32{--tw-translate-y:-8rem}.lg\:-translate-y-36{--tw-translate-y:-9rem}.lg\:-translate-y-40{--tw-translate-y:-10rem}.lg\:-translate-y-44{--tw-translate-y:-11rem}.lg\:-translate-y-48{--tw-translate-y:-12rem}.lg\:-translate-y-52{--tw-translate-y:-13rem}.lg\:-translate-y-56{--tw-translate-y:-14rem}.lg\:-translate-y-60{--tw-translate-y:-15rem}.lg\:-translate-y-64{--tw-translate-y:-16rem}.lg\:-translate-y-72{--tw-translate-y:-18rem}.lg\:-translate-y-80{--tw-translate-y:-20rem}.lg\:-translate-y-96{--tw-translate-y:-24rem}.lg\:-translate-y-px{--tw-translate-y:-1px}.lg\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.lg\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.lg\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.lg\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.lg\:translate-y-1\/2{--tw-translate-y:50%}.lg\:translate-y-1\/3{--tw-translate-y:33.333333%}.lg\:translate-y-2\/3{--tw-translate-y:66.666667%}.lg\:translate-y-1\/4{--tw-translate-y:25%}.lg\:translate-y-2\/4{--tw-translate-y:50%}.lg\:translate-y-3\/4{--tw-translate-y:75%}.lg\:translate-y-full{--tw-translate-y:100%}.lg\:-translate-y-1\/2{--tw-translate-y:-50%}.lg\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.lg\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.lg\:-translate-y-1\/4{--tw-translate-y:-25%}.lg\:-translate-y-2\/4{--tw-translate-y:-50%}.lg\:-translate-y-3\/4{--tw-translate-y:-75%}.lg\:-translate-y-full{--tw-translate-y:-100%}.lg\:hover\:translate-x-0:hover{--tw-translate-x:0px}.lg\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.lg\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.lg\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.lg\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.lg\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.lg\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.lg\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.lg\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.lg\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.lg\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.lg\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.lg\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.lg\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.lg\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.lg\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.lg\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.lg\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.lg\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.lg\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.lg\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.lg\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.lg\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.lg\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.lg\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.lg\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.lg\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.lg\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.lg\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.lg\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.lg\:hover\:translate-x-px:hover{--tw-translate-x:1px}.lg\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.lg\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.lg\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.lg\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.lg\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.lg\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.lg\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.lg\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.lg\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.lg\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.lg\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.lg\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.lg\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.lg\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.lg\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.lg\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.lg\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.lg\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.lg\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.lg\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.lg\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.lg\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.lg\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.lg\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.lg\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.lg\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.lg\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.lg\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.lg\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.lg\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.lg\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.lg\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.lg\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.lg\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.lg\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.lg\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.lg\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.lg\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.lg\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.lg\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.lg\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.lg\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.lg\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.lg\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.lg\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.lg\:hover\:translate-x-full:hover{--tw-translate-x:100%}.lg\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.lg\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.lg\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.lg\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.lg\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.lg\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.lg\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.lg\:hover\:translate-y-0:hover{--tw-translate-y:0px}.lg\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.lg\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.lg\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.lg\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.lg\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.lg\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.lg\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.lg\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.lg\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.lg\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.lg\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.lg\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.lg\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.lg\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.lg\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.lg\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.lg\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.lg\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.lg\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.lg\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.lg\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.lg\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.lg\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.lg\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.lg\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.lg\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.lg\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.lg\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.lg\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.lg\:hover\:translate-y-px:hover{--tw-translate-y:1px}.lg\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.lg\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.lg\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.lg\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.lg\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.lg\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.lg\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.lg\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.lg\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.lg\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.lg\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.lg\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.lg\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.lg\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.lg\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.lg\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.lg\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.lg\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.lg\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.lg\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.lg\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.lg\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.lg\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.lg\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.lg\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.lg\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.lg\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.lg\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.lg\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.lg\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.lg\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.lg\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.lg\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.lg\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.lg\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.lg\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.lg\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.lg\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.lg\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.lg\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.lg\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.lg\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.lg\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.lg\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.lg\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.lg\:hover\:translate-y-full:hover{--tw-translate-y:100%}.lg\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.lg\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.lg\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.lg\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.lg\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.lg\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.lg\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.lg\:focus\:translate-x-0:focus{--tw-translate-x:0px}.lg\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.lg\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.lg\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.lg\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.lg\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.lg\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.lg\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.lg\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.lg\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.lg\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.lg\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.lg\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.lg\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.lg\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.lg\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.lg\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.lg\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.lg\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.lg\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.lg\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.lg\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.lg\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.lg\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.lg\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.lg\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.lg\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.lg\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.lg\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.lg\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.lg\:focus\:translate-x-px:focus{--tw-translate-x:1px}.lg\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.lg\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.lg\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.lg\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.lg\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.lg\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.lg\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.lg\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.lg\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.lg\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.lg\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.lg\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.lg\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.lg\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.lg\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.lg\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.lg\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.lg\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.lg\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.lg\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.lg\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.lg\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.lg\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.lg\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.lg\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.lg\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.lg\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.lg\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.lg\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.lg\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.lg\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.lg\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.lg\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.lg\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.lg\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.lg\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.lg\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.lg\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.lg\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.lg\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.lg\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.lg\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.lg\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.lg\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.lg\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.lg\:focus\:translate-x-full:focus{--tw-translate-x:100%}.lg\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.lg\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.lg\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.lg\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.lg\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.lg\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.lg\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.lg\:focus\:translate-y-0:focus{--tw-translate-y:0px}.lg\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.lg\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.lg\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.lg\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.lg\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.lg\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.lg\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.lg\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.lg\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.lg\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.lg\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.lg\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.lg\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.lg\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.lg\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.lg\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.lg\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.lg\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.lg\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.lg\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.lg\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.lg\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.lg\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.lg\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.lg\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.lg\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.lg\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.lg\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.lg\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.lg\:focus\:translate-y-px:focus{--tw-translate-y:1px}.lg\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.lg\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.lg\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.lg\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.lg\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.lg\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.lg\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.lg\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.lg\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.lg\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.lg\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.lg\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.lg\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.lg\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.lg\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.lg\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.lg\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.lg\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.lg\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.lg\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.lg\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.lg\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.lg\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.lg\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.lg\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.lg\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.lg\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.lg\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.lg\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.lg\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.lg\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.lg\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.lg\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.lg\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.lg\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.lg\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.lg\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.lg\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.lg\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.lg\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.lg\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.lg\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.lg\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.lg\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.lg\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.lg\:focus\:translate-y-full:focus{--tw-translate-y:100%}.lg\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.lg\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.lg\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.lg\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.lg\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.lg\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.lg\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.lg\:rotate-0{--tw-rotate:0deg}.lg\:rotate-1{--tw-rotate:1deg}.lg\:rotate-2{--tw-rotate:2deg}.lg\:rotate-3{--tw-rotate:3deg}.lg\:rotate-6{--tw-rotate:6deg}.lg\:rotate-12{--tw-rotate:12deg}.lg\:rotate-45{--tw-rotate:45deg}.lg\:rotate-90{--tw-rotate:90deg}.lg\:rotate-180{--tw-rotate:180deg}.lg\:-rotate-180{--tw-rotate:-180deg}.lg\:-rotate-90{--tw-rotate:-90deg}.lg\:-rotate-45{--tw-rotate:-45deg}.lg\:-rotate-12{--tw-rotate:-12deg}.lg\:-rotate-6{--tw-rotate:-6deg}.lg\:-rotate-3{--tw-rotate:-3deg}.lg\:-rotate-2{--tw-rotate:-2deg}.lg\:-rotate-1{--tw-rotate:-1deg}.lg\:hover\:rotate-0:hover{--tw-rotate:0deg}.lg\:hover\:rotate-1:hover{--tw-rotate:1deg}.lg\:hover\:rotate-2:hover{--tw-rotate:2deg}.lg\:hover\:rotate-3:hover{--tw-rotate:3deg}.lg\:hover\:rotate-6:hover{--tw-rotate:6deg}.lg\:hover\:rotate-12:hover{--tw-rotate:12deg}.lg\:hover\:rotate-45:hover{--tw-rotate:45deg}.lg\:hover\:rotate-90:hover{--tw-rotate:90deg}.lg\:hover\:rotate-180:hover{--tw-rotate:180deg}.lg\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.lg\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.lg\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.lg\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.lg\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.lg\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.lg\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.lg\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.lg\:focus\:rotate-0:focus{--tw-rotate:0deg}.lg\:focus\:rotate-1:focus{--tw-rotate:1deg}.lg\:focus\:rotate-2:focus{--tw-rotate:2deg}.lg\:focus\:rotate-3:focus{--tw-rotate:3deg}.lg\:focus\:rotate-6:focus{--tw-rotate:6deg}.lg\:focus\:rotate-12:focus{--tw-rotate:12deg}.lg\:focus\:rotate-45:focus{--tw-rotate:45deg}.lg\:focus\:rotate-90:focus{--tw-rotate:90deg}.lg\:focus\:rotate-180:focus{--tw-rotate:180deg}.lg\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.lg\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.lg\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.lg\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.lg\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.lg\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.lg\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.lg\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.lg\:skew-x-0{--tw-skew-x:0deg}.lg\:skew-x-1{--tw-skew-x:1deg}.lg\:skew-x-2{--tw-skew-x:2deg}.lg\:skew-x-3{--tw-skew-x:3deg}.lg\:skew-x-6{--tw-skew-x:6deg}.lg\:skew-x-12{--tw-skew-x:12deg}.lg\:-skew-x-12{--tw-skew-x:-12deg}.lg\:-skew-x-6{--tw-skew-x:-6deg}.lg\:-skew-x-3{--tw-skew-x:-3deg}.lg\:-skew-x-2{--tw-skew-x:-2deg}.lg\:-skew-x-1{--tw-skew-x:-1deg}.lg\:skew-y-0{--tw-skew-y:0deg}.lg\:skew-y-1{--tw-skew-y:1deg}.lg\:skew-y-2{--tw-skew-y:2deg}.lg\:skew-y-3{--tw-skew-y:3deg}.lg\:skew-y-6{--tw-skew-y:6deg}.lg\:skew-y-12{--tw-skew-y:12deg}.lg\:-skew-y-12{--tw-skew-y:-12deg}.lg\:-skew-y-6{--tw-skew-y:-6deg}.lg\:-skew-y-3{--tw-skew-y:-3deg}.lg\:-skew-y-2{--tw-skew-y:-2deg}.lg\:-skew-y-1{--tw-skew-y:-1deg}.lg\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.lg\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.lg\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.lg\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.lg\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.lg\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.lg\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.lg\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.lg\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.lg\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.lg\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.lg\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.lg\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.lg\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.lg\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.lg\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.lg\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.lg\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.lg\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.lg\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.lg\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.lg\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.lg\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.lg\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.lg\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.lg\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.lg\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.lg\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.lg\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.lg\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.lg\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.lg\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.lg\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.lg\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.lg\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.lg\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.lg\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.lg\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.lg\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.lg\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.lg\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.lg\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.lg\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.lg\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.lg\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.lg\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.lg\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.lg\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.lg\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.lg\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.lg\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.lg\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.lg\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.lg\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.lg\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.lg\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.lg\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.lg\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.lg\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.lg\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.lg\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.lg\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.lg\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.lg\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.lg\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.lg\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.lg\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.lg\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.lg\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.lg\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.lg\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.lg\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.lg\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.lg\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.lg\:scale-x-0{--tw-scale-x:0}.lg\:scale-x-50{--tw-scale-x:.5}.lg\:scale-x-75{--tw-scale-x:.75}.lg\:scale-x-90{--tw-scale-x:.9}.lg\:scale-x-95{--tw-scale-x:.95}.lg\:scale-x-100{--tw-scale-x:1}.lg\:scale-x-105{--tw-scale-x:1.05}.lg\:scale-x-110{--tw-scale-x:1.1}.lg\:scale-x-125{--tw-scale-x:1.25}.lg\:scale-x-150{--tw-scale-x:1.5}.lg\:scale-y-0{--tw-scale-y:0}.lg\:scale-y-50{--tw-scale-y:.5}.lg\:scale-y-75{--tw-scale-y:.75}.lg\:scale-y-90{--tw-scale-y:.9}.lg\:scale-y-95{--tw-scale-y:.95}.lg\:scale-y-100{--tw-scale-y:1}.lg\:scale-y-105{--tw-scale-y:1.05}.lg\:scale-y-110{--tw-scale-y:1.1}.lg\:scale-y-125{--tw-scale-y:1.25}.lg\:scale-y-150{--tw-scale-y:1.5}.lg\:hover\:scale-x-0:hover{--tw-scale-x:0}.lg\:hover\:scale-x-50:hover{--tw-scale-x:.5}.lg\:hover\:scale-x-75:hover{--tw-scale-x:.75}.lg\:hover\:scale-x-90:hover{--tw-scale-x:.9}.lg\:hover\:scale-x-95:hover{--tw-scale-x:.95}.lg\:hover\:scale-x-100:hover{--tw-scale-x:1}.lg\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.lg\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.lg\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.lg\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.lg\:hover\:scale-y-0:hover{--tw-scale-y:0}.lg\:hover\:scale-y-50:hover{--tw-scale-y:.5}.lg\:hover\:scale-y-75:hover{--tw-scale-y:.75}.lg\:hover\:scale-y-90:hover{--tw-scale-y:.9}.lg\:hover\:scale-y-95:hover{--tw-scale-y:.95}.lg\:hover\:scale-y-100:hover{--tw-scale-y:1}.lg\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.lg\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.lg\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.lg\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.lg\:focus\:scale-x-0:focus{--tw-scale-x:0}.lg\:focus\:scale-x-50:focus{--tw-scale-x:.5}.lg\:focus\:scale-x-75:focus{--tw-scale-x:.75}.lg\:focus\:scale-x-90:focus{--tw-scale-x:.9}.lg\:focus\:scale-x-95:focus{--tw-scale-x:.95}.lg\:focus\:scale-x-100:focus{--tw-scale-x:1}.lg\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.lg\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.lg\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.lg\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.lg\:focus\:scale-y-0:focus{--tw-scale-y:0}.lg\:focus\:scale-y-50:focus{--tw-scale-y:.5}.lg\:focus\:scale-y-75:focus{--tw-scale-y:.75}.lg\:focus\:scale-y-90:focus{--tw-scale-y:.9}.lg\:focus\:scale-y-95:focus{--tw-scale-y:.95}.lg\:focus\:scale-y-100:focus{--tw-scale-y:1}.lg\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.lg\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.lg\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.lg\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.lg\:animate-none{-webkit-animation:none;animation:none}.lg\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.lg\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.lg\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.lg\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.lg\:cursor-auto{cursor:auto}.lg\:cursor-default{cursor:default}.lg\:cursor-pointer{cursor:pointer}.lg\:cursor-wait{cursor:wait}.lg\:cursor-text{cursor:text}.lg\:cursor-move{cursor:move}.lg\:cursor-help{cursor:help}.lg\:cursor-not-allowed{cursor:not-allowed}.lg\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.lg\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.lg\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.lg\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.lg\:resize-none{resize:none}.lg\:resize-y{resize:vertical}.lg\:resize-x{resize:horizontal}.lg\:resize{resize:both}.lg\:list-inside{list-style-position:inside}.lg\:list-outside{list-style-position:outside}.lg\:list-none{list-style-type:none}.lg\:list-disc{list-style-type:disc}.lg\:list-decimal{list-style-type:decimal}.lg\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.lg\:auto-cols-auto{grid-auto-columns:auto}.lg\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.lg\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.lg\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.lg\:grid-flow-row{grid-auto-flow:row}.lg\:grid-flow-col{grid-auto-flow:column}.lg\:grid-flow-row-dense{grid-auto-flow:row dense}.lg\:grid-flow-col-dense{grid-auto-flow:column dense}.lg\:auto-rows-auto{grid-auto-rows:auto}.lg\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.lg\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.lg\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.lg\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.lg\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.lg\:grid-rows-none{grid-template-rows:none}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:flex-col{flex-direction:column}.lg\:flex-col-reverse{flex-direction:column-reverse}.lg\:flex-wrap{flex-wrap:wrap}.lg\:flex-wrap-reverse{flex-wrap:wrap-reverse}.lg\:flex-nowrap{flex-wrap:nowrap}.lg\:place-content-center{place-content:center}.lg\:place-content-start{place-content:start}.lg\:place-content-end{place-content:end}.lg\:place-content-between{place-content:space-between}.lg\:place-content-around{place-content:space-around}.lg\:place-content-evenly{place-content:space-evenly}.lg\:place-content-stretch{place-content:stretch}.lg\:place-items-start{place-items:start}.lg\:place-items-end{place-items:end}.lg\:place-items-center{place-items:center}.lg\:place-items-stretch{place-items:stretch}.lg\:content-center{align-content:center}.lg\:content-start{align-content:flex-start}.lg\:content-end{align-content:flex-end}.lg\:content-between{align-content:space-between}.lg\:content-around{align-content:space-around}.lg\:content-evenly{align-content:space-evenly}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:items-baseline{align-items:baseline}.lg\:items-stretch{align-items:stretch}.lg\:justify-start{justify-content:flex-start}.lg\:justify-end{justify-content:flex-end}.lg\:justify-center{justify-content:center}.lg\:justify-between{justify-content:space-between}.lg\:justify-around{justify-content:space-around}.lg\:justify-evenly{justify-content:space-evenly}.lg\:justify-items-start{justify-items:start}.lg\:justify-items-end{justify-items:end}.lg\:justify-items-center{justify-items:center}.lg\:justify-items-stretch{justify-items:stretch}.lg\:gap-0{gap:0}.lg\:gap-1{gap:.25rem}.lg\:gap-2{gap:.5rem}.lg\:gap-3{gap:.75rem}.lg\:gap-4{gap:1rem}.lg\:gap-5{gap:1.25rem}.lg\:gap-6{gap:1.5rem}.lg\:gap-7{gap:1.75rem}.lg\:gap-8{gap:2rem}.lg\:gap-9{gap:2.25rem}.lg\:gap-10{gap:2.5rem}.lg\:gap-11{gap:2.75rem}.lg\:gap-12{gap:3rem}.lg\:gap-14{gap:3.5rem}.lg\:gap-16{gap:4rem}.lg\:gap-20{gap:5rem}.lg\:gap-24{gap:6rem}.lg\:gap-28{gap:7rem}.lg\:gap-32{gap:8rem}.lg\:gap-36{gap:9rem}.lg\:gap-40{gap:10rem}.lg\:gap-44{gap:11rem}.lg\:gap-48{gap:12rem}.lg\:gap-52{gap:13rem}.lg\:gap-56{gap:14rem}.lg\:gap-60{gap:15rem}.lg\:gap-64{gap:16rem}.lg\:gap-72{gap:18rem}.lg\:gap-80{gap:20rem}.lg\:gap-96{gap:24rem}.lg\:gap-px{gap:1px}.lg\:gap-0\.5{gap:.125rem}.lg\:gap-1\.5{gap:.375rem}.lg\:gap-2\.5{gap:.625rem}.lg\:gap-3\.5{gap:.875rem}.lg\:gap-x-0{-moz-column-gap:0;column-gap:0}.lg\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.lg\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.lg\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.lg\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.lg\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.lg\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.lg\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.lg\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.lg\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.lg\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.lg\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.lg\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.lg\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.lg\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.lg\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.lg\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.lg\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.lg\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.lg\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.lg\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.lg\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.lg\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.lg\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.lg\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.lg\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.lg\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.lg\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.lg\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.lg\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.lg\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.lg\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.lg\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.lg\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.lg\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.lg\:gap-y-0{row-gap:0}.lg\:gap-y-1{row-gap:.25rem}.lg\:gap-y-2{row-gap:.5rem}.lg\:gap-y-3{row-gap:.75rem}.lg\:gap-y-4{row-gap:1rem}.lg\:gap-y-5{row-gap:1.25rem}.lg\:gap-y-6{row-gap:1.5rem}.lg\:gap-y-7{row-gap:1.75rem}.lg\:gap-y-8{row-gap:2rem}.lg\:gap-y-9{row-gap:2.25rem}.lg\:gap-y-10{row-gap:2.5rem}.lg\:gap-y-11{row-gap:2.75rem}.lg\:gap-y-12{row-gap:3rem}.lg\:gap-y-14{row-gap:3.5rem}.lg\:gap-y-16{row-gap:4rem}.lg\:gap-y-20{row-gap:5rem}.lg\:gap-y-24{row-gap:6rem}.lg\:gap-y-28{row-gap:7rem}.lg\:gap-y-32{row-gap:8rem}.lg\:gap-y-36{row-gap:9rem}.lg\:gap-y-40{row-gap:10rem}.lg\:gap-y-44{row-gap:11rem}.lg\:gap-y-48{row-gap:12rem}.lg\:gap-y-52{row-gap:13rem}.lg\:gap-y-56{row-gap:14rem}.lg\:gap-y-60{row-gap:15rem}.lg\:gap-y-64{row-gap:16rem}.lg\:gap-y-72{row-gap:18rem}.lg\:gap-y-80{row-gap:20rem}.lg\:gap-y-96{row-gap:24rem}.lg\:gap-y-px{row-gap:1px}.lg\:gap-y-0\.5{row-gap:.125rem}.lg\:gap-y-1\.5{row-gap:.375rem}.lg\:gap-y-2\.5{row-gap:.625rem}.lg\:gap-y-3\.5{row-gap:.875rem}.lg\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.lg\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.lg\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.lg\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.lg\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.lg\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.lg\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.lg\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.lg\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.lg\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.lg\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.lg\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.lg\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.lg\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.lg\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.lg\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.lg\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.lg\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.lg\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.lg\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.lg\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.lg\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.lg\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.lg\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.lg\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.lg\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.lg\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.lg\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.lg\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.lg\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.lg\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.lg\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.lg\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.lg\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.lg\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.lg\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.lg\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.lg\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.lg\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.lg\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.lg\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.lg\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.lg\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.lg\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.lg\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.lg\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.lg\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.lg\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.lg\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.lg\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.lg\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.lg\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.lg\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.lg\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.lg\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.lg\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.lg\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.lg\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.lg\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.lg\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.lg\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.lg\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.lg\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.lg\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.lg\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.lg\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.lg\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.lg\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.lg\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.lg\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.lg\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.lg\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.lg\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.lg\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.lg\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.lg\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.lg\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.lg\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.lg\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.lg\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.lg\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.lg\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.lg\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.lg\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.lg\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.lg\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.lg\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.lg\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.lg\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.lg\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.lg\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.lg\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.lg\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.lg\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.lg\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.lg\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.lg\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.lg\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.lg\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.lg\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.lg\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.lg\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.lg\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.lg\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.lg\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.lg\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.lg\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.lg\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.lg\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.lg\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.lg\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.lg\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.lg\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.lg\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.lg\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.lg\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.lg\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.lg\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.lg\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.lg\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.lg\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.lg\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.lg\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.lg\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.lg\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.lg\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.lg\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.lg\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.lg\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.lg\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.lg\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.lg\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.lg\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.lg\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.lg\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.lg\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.lg\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.lg\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.lg\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.lg\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.lg\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.lg\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.lg\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.lg\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.lg\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.lg\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.lg\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.lg\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.lg\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.lg\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.lg\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.lg\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.lg\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.lg\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.lg\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.lg\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.lg\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.lg\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.lg\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.lg\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.lg\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.lg\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.lg\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.lg\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.lg\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.lg\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.lg\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.lg\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.lg\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.lg\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.lg\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.lg\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.lg\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.lg\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.lg\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.lg\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.lg\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.lg\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.lg\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.lg\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.lg\:place-self-auto{place-self:auto}.lg\:place-self-start{place-self:start}.lg\:place-self-end{place-self:end}.lg\:place-self-center{place-self:center}.lg\:place-self-stretch{place-self:stretch}.lg\:self-auto{align-self:auto}.lg\:self-start{align-self:flex-start}.lg\:self-end{align-self:flex-end}.lg\:self-center{align-self:center}.lg\:self-stretch{align-self:stretch}.lg\:self-baseline{align-self:baseline}.lg\:justify-self-auto{justify-self:auto}.lg\:justify-self-start{justify-self:start}.lg\:justify-self-end{justify-self:end}.lg\:justify-self-center{justify-self:center}.lg\:justify-self-stretch{justify-self:stretch}.lg\:overflow-auto{overflow:auto}.lg\:overflow-hidden{overflow:hidden}.lg\:overflow-visible{overflow:visible}.lg\:overflow-scroll{overflow:scroll}.lg\:overflow-x-auto{overflow-x:auto}.lg\:overflow-y-auto{overflow-y:auto}.lg\:overflow-x-hidden{overflow-x:hidden}.lg\:overflow-y-hidden{overflow-y:hidden}.lg\:overflow-x-visible{overflow-x:visible}.lg\:overflow-y-visible{overflow-y:visible}.lg\:overflow-x-scroll{overflow-x:scroll}.lg\:overflow-y-scroll{overflow-y:scroll}.lg\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.lg\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.lg\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.lg\:overscroll-y-auto{overscroll-behavior-y:auto}.lg\:overscroll-y-contain{overscroll-behavior-y:contain}.lg\:overscroll-y-none{overscroll-behavior-y:none}.lg\:overscroll-x-auto{overscroll-behavior-x:auto}.lg\:overscroll-x-contain{overscroll-behavior-x:contain}.lg\:overscroll-x-none{overscroll-behavior-x:none}.lg\:truncate{overflow:hidden;white-space:nowrap}.lg\:overflow-ellipsis,.lg\:truncate{text-overflow:ellipsis}.lg\:overflow-clip{text-overflow:clip}.lg\:whitespace-normal{white-space:normal}.lg\:whitespace-nowrap{white-space:nowrap}.lg\:whitespace-pre{white-space:pre}.lg\:whitespace-pre-line{white-space:pre-line}.lg\:whitespace-pre-wrap{white-space:pre-wrap}.lg\:break-normal{overflow-wrap:normal;word-break:normal}.lg\:break-words{overflow-wrap:break-word}.lg\:break-all{word-break:break-all}.lg\:rounded-none{border-radius:0}.lg\:rounded-sm{border-radius:.125rem}.lg\:rounded{border-radius:.25rem}.lg\:rounded-md{border-radius:.375rem}.lg\:rounded-lg{border-radius:.5rem}.lg\:rounded-xl{border-radius:.75rem}.lg\:rounded-2xl{border-radius:1rem}.lg\:rounded-3xl{border-radius:1.5rem}.lg\:rounded-full{border-radius:9999px}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.lg\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.lg\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.lg\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.lg\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.lg\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.lg\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.lg\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.lg\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.lg\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.lg\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.lg\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.lg\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.lg\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.lg\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.lg\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.lg\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.lg\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.lg\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.lg\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-tl-none{border-top-left-radius:0}.lg\:rounded-tl-sm{border-top-left-radius:.125rem}.lg\:rounded-tl{border-top-left-radius:.25rem}.lg\:rounded-tl-md{border-top-left-radius:.375rem}.lg\:rounded-tl-lg{border-top-left-radius:.5rem}.lg\:rounded-tl-xl{border-top-left-radius:.75rem}.lg\:rounded-tl-2xl{border-top-left-radius:1rem}.lg\:rounded-tl-3xl{border-top-left-radius:1.5rem}.lg\:rounded-tl-full{border-top-left-radius:9999px}.lg\:rounded-tr-none{border-top-right-radius:0}.lg\:rounded-tr-sm{border-top-right-radius:.125rem}.lg\:rounded-tr{border-top-right-radius:.25rem}.lg\:rounded-tr-md{border-top-right-radius:.375rem}.lg\:rounded-tr-lg{border-top-right-radius:.5rem}.lg\:rounded-tr-xl{border-top-right-radius:.75rem}.lg\:rounded-tr-2xl{border-top-right-radius:1rem}.lg\:rounded-tr-3xl{border-top-right-radius:1.5rem}.lg\:rounded-tr-full{border-top-right-radius:9999px}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:rounded-br-sm{border-bottom-right-radius:.125rem}.lg\:rounded-br{border-bottom-right-radius:.25rem}.lg\:rounded-br-md{border-bottom-right-radius:.375rem}.lg\:rounded-br-lg{border-bottom-right-radius:.5rem}.lg\:rounded-br-xl{border-bottom-right-radius:.75rem}.lg\:rounded-br-2xl{border-bottom-right-radius:1rem}.lg\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.lg\:rounded-br-full{border-bottom-right-radius:9999px}.lg\:rounded-bl-none{border-bottom-left-radius:0}.lg\:rounded-bl-sm{border-bottom-left-radius:.125rem}.lg\:rounded-bl{border-bottom-left-radius:.25rem}.lg\:rounded-bl-md{border-bottom-left-radius:.375rem}.lg\:rounded-bl-lg{border-bottom-left-radius:.5rem}.lg\:rounded-bl-xl{border-bottom-left-radius:.75rem}.lg\:rounded-bl-2xl{border-bottom-left-radius:1rem}.lg\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.lg\:rounded-bl-full{border-bottom-left-radius:9999px}.lg\:border-0{border-width:0}.lg\:border-2{border-width:2px}.lg\:border-4{border-width:4px}.lg\:border-8{border-width:8px}.lg\:border{border-width:1px}.lg\:border-t-0{border-top-width:0}.lg\:border-t-2{border-top-width:2px}.lg\:border-t-4{border-top-width:4px}.lg\:border-t-8{border-top-width:8px}.lg\:border-t{border-top-width:1px}.lg\:border-r-0{border-right-width:0}.lg\:border-r-2{border-right-width:2px}.lg\:border-r-4{border-right-width:4px}.lg\:border-r-8{border-right-width:8px}.lg\:border-r{border-right-width:1px}.lg\:border-b-0{border-bottom-width:0}.lg\:border-b-2{border-bottom-width:2px}.lg\:border-b-4{border-bottom-width:4px}.lg\:border-b-8{border-bottom-width:8px}.lg\:border-b{border-bottom-width:1px}.lg\:border-l-0{border-left-width:0}.lg\:border-l-2{border-left-width:2px}.lg\:border-l-4{border-left-width:4px}.lg\:border-l-8{border-left-width:8px}.lg\:border-l{border-left-width:1px}.lg\:border-solid{border-style:solid}.lg\:border-dashed{border-style:dashed}.lg\:border-dotted{border-style:dotted}.lg\:border-double{border-style:double}.lg\:border-none{border-style:none}.lg\:border-transparent{border-color:transparent}.lg\:border-current{border-color:currentColor}.lg\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-transparent{border-color:transparent}.group:hover .lg\:group-hover\:border-current{border-color:currentColor}.group:hover .lg\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .lg\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:focus-within\:border-transparent:focus-within{border-color:transparent}.lg\:focus-within\:border-current:focus-within{border-color:currentColor}.lg\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:hover\:border-transparent:hover{border-color:transparent}.lg\:hover\:border-current:hover{border-color:currentColor}.lg\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:focus\:border-transparent:focus{border-color:transparent}.lg\:focus\:border-current:focus{border-color:currentColor}.lg\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.lg\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.lg\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.lg\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.lg\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.lg\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.lg\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.lg\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.lg\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.lg\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.lg\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.lg\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.lg\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.lg\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.lg\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.lg\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.lg\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.lg\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.lg\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.lg\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.lg\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.lg\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.lg\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.lg\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.lg\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.lg\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.lg\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.lg\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.lg\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.lg\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.lg\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.lg\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.lg\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.lg\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.lg\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.lg\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.lg\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.lg\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.lg\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.lg\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.lg\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.lg\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.lg\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.lg\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.lg\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.lg\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.lg\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.lg\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.lg\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.lg\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.lg\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.lg\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.lg\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.lg\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.lg\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.lg\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.lg\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.lg\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.lg\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.lg\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.lg\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.lg\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.lg\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.lg\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.lg\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.lg\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.lg\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.lg\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.lg\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.lg\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.lg\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.lg\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.lg\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.lg\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.lg\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.lg\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.lg\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.lg\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.lg\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.lg\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.lg\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.lg\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.lg\:border-opacity-0{--tw-border-opacity:0}.lg\:border-opacity-5{--tw-border-opacity:0.05}.lg\:border-opacity-10{--tw-border-opacity:0.1}.lg\:border-opacity-20{--tw-border-opacity:0.2}.lg\:border-opacity-25{--tw-border-opacity:0.25}.lg\:border-opacity-30{--tw-border-opacity:0.3}.lg\:border-opacity-40{--tw-border-opacity:0.4}.lg\:border-opacity-50{--tw-border-opacity:0.5}.lg\:border-opacity-60{--tw-border-opacity:0.6}.lg\:border-opacity-70{--tw-border-opacity:0.7}.lg\:border-opacity-75{--tw-border-opacity:0.75}.lg\:border-opacity-80{--tw-border-opacity:0.8}.lg\:border-opacity-90{--tw-border-opacity:0.9}.lg\:border-opacity-95{--tw-border-opacity:0.95}.lg\:border-opacity-100{--tw-border-opacity:1}.group:hover .lg\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .lg\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .lg\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .lg\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .lg\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .lg\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .lg\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .lg\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .lg\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .lg\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .lg\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .lg\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .lg\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .lg\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .lg\:group-hover\:border-opacity-100{--tw-border-opacity:1}.lg\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.lg\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.lg\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.lg\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.lg\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.lg\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.lg\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.lg\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.lg\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.lg\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.lg\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.lg\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.lg\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.lg\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.lg\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.lg\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.lg\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.lg\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.lg\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.lg\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.lg\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.lg\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.lg\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.lg\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.lg\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.lg\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.lg\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.lg\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.lg\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.lg\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.lg\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.lg\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.lg\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.lg\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.lg\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.lg\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.lg\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.lg\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.lg\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.lg\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.lg\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.lg\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.lg\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.lg\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.lg\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.lg\:bg-transparent{background-color:initial}.lg\:bg-current{background-color:currentColor}.lg\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-transparent{background-color:initial}.group:hover .lg\:group-hover\:bg-current{background-color:currentColor}.group:hover .lg\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .lg\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:focus-within\:bg-transparent:focus-within{background-color:initial}.lg\:focus-within\:bg-current:focus-within{background-color:currentColor}.lg\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:hover\:bg-transparent:hover{background-color:initial}.lg\:hover\:bg-current:hover{background-color:currentColor}.lg\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:focus\:bg-transparent:focus{background-color:initial}.lg\:focus\:bg-current:focus{background-color:currentColor}.lg\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.lg\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.lg\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.lg\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.lg\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.lg\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.lg\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.lg\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.lg\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.lg\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.lg\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.lg\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.lg\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.lg\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.lg\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.lg\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.lg\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.lg\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.lg\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.lg\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.lg\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.lg\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.lg\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.lg\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.lg\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.lg\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.lg\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.lg\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.lg\:bg-opacity-0{--tw-bg-opacity:0}.lg\:bg-opacity-5{--tw-bg-opacity:0.05}.lg\:bg-opacity-10{--tw-bg-opacity:0.1}.lg\:bg-opacity-20{--tw-bg-opacity:0.2}.lg\:bg-opacity-25{--tw-bg-opacity:0.25}.lg\:bg-opacity-30{--tw-bg-opacity:0.3}.lg\:bg-opacity-40{--tw-bg-opacity:0.4}.lg\:bg-opacity-50{--tw-bg-opacity:0.5}.lg\:bg-opacity-60{--tw-bg-opacity:0.6}.lg\:bg-opacity-70{--tw-bg-opacity:0.7}.lg\:bg-opacity-75{--tw-bg-opacity:0.75}.lg\:bg-opacity-80{--tw-bg-opacity:0.8}.lg\:bg-opacity-90{--tw-bg-opacity:0.9}.lg\:bg-opacity-95{--tw-bg-opacity:0.95}.lg\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .lg\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .lg\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .lg\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .lg\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .lg\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .lg\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .lg\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .lg\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .lg\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .lg\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .lg\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .lg\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .lg\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .lg\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .lg\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.lg\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.lg\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.lg\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.lg\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.lg\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.lg\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.lg\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.lg\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.lg\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.lg\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.lg\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.lg\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.lg\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.lg\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.lg\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.lg\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.lg\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.lg\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.lg\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.lg\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.lg\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.lg\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.lg\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.lg\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.lg\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.lg\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.lg\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.lg\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.lg\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.lg\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.lg\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.lg\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.lg\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.lg\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.lg\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.lg\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.lg\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.lg\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.lg\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.lg\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.lg\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.lg\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.lg\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.lg\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.lg\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.lg\:bg-none{background-image:none}.lg\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.lg\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.lg\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.lg\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.lg\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.lg\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.lg\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.lg\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.lg\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.lg\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.lg\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.lg\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.lg\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.lg\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.lg\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.lg\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.lg\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.lg\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.lg\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.lg\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.lg\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.lg\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.lg\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.lg\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.lg\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.lg\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.lg\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.lg\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.lg\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.lg\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.lg\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.lg\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.lg\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.lg\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.lg\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.lg\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.lg\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.lg\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.lg\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.lg\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.lg\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.lg\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.lg\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.lg\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.lg\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.lg\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.lg\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.lg\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.lg\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.lg\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.lg\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.lg\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.lg\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.lg\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.lg\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.lg\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.lg\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.lg\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.lg\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.lg\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.lg\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.lg\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.lg\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.lg\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.lg\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.lg\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.lg\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.lg\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.lg\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.lg\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.lg\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.lg\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.lg\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.lg\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.lg\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.lg\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.lg\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.lg\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.lg\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.lg\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.lg\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.lg\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.lg\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.lg\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.lg\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.lg\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.lg\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.lg\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.lg\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.lg\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.lg\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.lg\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.lg\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.lg\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.lg\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.lg\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.lg\:to-transparent{--tw-gradient-to:transparent}.lg\:to-current{--tw-gradient-to:currentColor}.lg\:to-black{--tw-gradient-to:#000}.lg\:to-white{--tw-gradient-to:#fff}.lg\:to-gray-50{--tw-gradient-to:#f9fafb}.lg\:to-gray-100{--tw-gradient-to:#f3f4f6}.lg\:to-gray-200{--tw-gradient-to:#e5e7eb}.lg\:to-gray-300{--tw-gradient-to:#d1d5db}.lg\:to-gray-400{--tw-gradient-to:#9ca3af}.lg\:to-gray-500{--tw-gradient-to:#6b7280}.lg\:to-gray-600{--tw-gradient-to:#4b5563}.lg\:to-gray-700{--tw-gradient-to:#374151}.lg\:to-gray-800{--tw-gradient-to:#1f2937}.lg\:to-gray-900{--tw-gradient-to:#111827}.lg\:to-red-50{--tw-gradient-to:#fef2f2}.lg\:to-red-100{--tw-gradient-to:#fee2e2}.lg\:to-red-200{--tw-gradient-to:#fecaca}.lg\:to-red-300{--tw-gradient-to:#fca5a5}.lg\:to-red-400{--tw-gradient-to:#f87171}.lg\:to-red-500{--tw-gradient-to:#ef4444}.lg\:to-red-600{--tw-gradient-to:#dc2626}.lg\:to-red-700{--tw-gradient-to:#b91c1c}.lg\:to-red-800{--tw-gradient-to:#991b1b}.lg\:to-red-900{--tw-gradient-to:#7f1d1d}.lg\:to-yellow-50{--tw-gradient-to:#fffbeb}.lg\:to-yellow-100{--tw-gradient-to:#fef3c7}.lg\:to-yellow-200{--tw-gradient-to:#fde68a}.lg\:to-yellow-300{--tw-gradient-to:#fcd34d}.lg\:to-yellow-400{--tw-gradient-to:#fbbf24}.lg\:to-yellow-500{--tw-gradient-to:#f59e0b}.lg\:to-yellow-600{--tw-gradient-to:#d97706}.lg\:to-yellow-700{--tw-gradient-to:#b45309}.lg\:to-yellow-800{--tw-gradient-to:#92400e}.lg\:to-yellow-900{--tw-gradient-to:#78350f}.lg\:to-green-50{--tw-gradient-to:#ecfdf5}.lg\:to-green-100{--tw-gradient-to:#d1fae5}.lg\:to-green-200{--tw-gradient-to:#a7f3d0}.lg\:to-green-300{--tw-gradient-to:#6ee7b7}.lg\:to-green-400{--tw-gradient-to:#34d399}.lg\:to-green-500{--tw-gradient-to:#10b981}.lg\:to-green-600{--tw-gradient-to:#059669}.lg\:to-green-700{--tw-gradient-to:#047857}.lg\:to-green-800{--tw-gradient-to:#065f46}.lg\:to-green-900{--tw-gradient-to:#064e3b}.lg\:to-blue-50{--tw-gradient-to:#eff6ff}.lg\:to-blue-100{--tw-gradient-to:#dbeafe}.lg\:to-blue-200{--tw-gradient-to:#bfdbfe}.lg\:to-blue-300{--tw-gradient-to:#93c5fd}.lg\:to-blue-400{--tw-gradient-to:#60a5fa}.lg\:to-blue-500{--tw-gradient-to:#3b82f6}.lg\:to-blue-600{--tw-gradient-to:#2563eb}.lg\:to-blue-700{--tw-gradient-to:#1d4ed8}.lg\:to-blue-800{--tw-gradient-to:#1e40af}.lg\:to-blue-900{--tw-gradient-to:#1e3a8a}.lg\:to-indigo-50{--tw-gradient-to:#eef2ff}.lg\:to-indigo-100{--tw-gradient-to:#e0e7ff}.lg\:to-indigo-200{--tw-gradient-to:#c7d2fe}.lg\:to-indigo-300{--tw-gradient-to:#a5b4fc}.lg\:to-indigo-400{--tw-gradient-to:#818cf8}.lg\:to-indigo-500{--tw-gradient-to:#6366f1}.lg\:to-indigo-600{--tw-gradient-to:#4f46e5}.lg\:to-indigo-700{--tw-gradient-to:#4338ca}.lg\:to-indigo-800{--tw-gradient-to:#3730a3}.lg\:to-indigo-900{--tw-gradient-to:#312e81}.lg\:to-purple-50{--tw-gradient-to:#f5f3ff}.lg\:to-purple-100{--tw-gradient-to:#ede9fe}.lg\:to-purple-200{--tw-gradient-to:#ddd6fe}.lg\:to-purple-300{--tw-gradient-to:#c4b5fd}.lg\:to-purple-400{--tw-gradient-to:#a78bfa}.lg\:to-purple-500{--tw-gradient-to:#8b5cf6}.lg\:to-purple-600{--tw-gradient-to:#7c3aed}.lg\:to-purple-700{--tw-gradient-to:#6d28d9}.lg\:to-purple-800{--tw-gradient-to:#5b21b6}.lg\:to-purple-900{--tw-gradient-to:#4c1d95}.lg\:to-pink-50{--tw-gradient-to:#fdf2f8}.lg\:to-pink-100{--tw-gradient-to:#fce7f3}.lg\:to-pink-200{--tw-gradient-to:#fbcfe8}.lg\:to-pink-300{--tw-gradient-to:#f9a8d4}.lg\:to-pink-400{--tw-gradient-to:#f472b6}.lg\:to-pink-500{--tw-gradient-to:#ec4899}.lg\:to-pink-600{--tw-gradient-to:#db2777}.lg\:to-pink-700{--tw-gradient-to:#be185d}.lg\:to-pink-800{--tw-gradient-to:#9d174d}.lg\:to-pink-900{--tw-gradient-to:#831843}.lg\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.lg\:hover\:to-current:hover{--tw-gradient-to:currentColor}.lg\:hover\:to-black:hover{--tw-gradient-to:#000}.lg\:hover\:to-white:hover{--tw-gradient-to:#fff}.lg\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.lg\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.lg\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.lg\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.lg\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.lg\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.lg\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.lg\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.lg\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.lg\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.lg\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.lg\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.lg\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.lg\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.lg\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.lg\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.lg\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.lg\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.lg\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.lg\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.lg\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.lg\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.lg\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.lg\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.lg\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.lg\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.lg\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.lg\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.lg\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.lg\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.lg\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.lg\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.lg\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.lg\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.lg\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.lg\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.lg\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.lg\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.lg\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.lg\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.lg\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.lg\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.lg\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.lg\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.lg\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.lg\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.lg\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.lg\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.lg\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.lg\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.lg\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.lg\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.lg\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.lg\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.lg\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.lg\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.lg\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.lg\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.lg\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.lg\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.lg\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.lg\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.lg\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.lg\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.lg\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.lg\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.lg\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.lg\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.lg\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.lg\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.lg\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.lg\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.lg\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.lg\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.lg\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.lg\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.lg\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.lg\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.lg\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.lg\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.lg\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.lg\:focus\:to-current:focus{--tw-gradient-to:currentColor}.lg\:focus\:to-black:focus{--tw-gradient-to:#000}.lg\:focus\:to-white:focus{--tw-gradient-to:#fff}.lg\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.lg\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.lg\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.lg\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.lg\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.lg\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.lg\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.lg\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.lg\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.lg\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.lg\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.lg\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.lg\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.lg\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.lg\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.lg\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.lg\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.lg\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.lg\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.lg\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.lg\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.lg\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.lg\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.lg\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.lg\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.lg\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.lg\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.lg\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.lg\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.lg\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.lg\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.lg\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.lg\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.lg\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.lg\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.lg\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.lg\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.lg\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.lg\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.lg\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.lg\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.lg\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.lg\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.lg\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.lg\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.lg\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.lg\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.lg\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.lg\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.lg\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.lg\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.lg\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.lg\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.lg\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.lg\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.lg\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.lg\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.lg\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.lg\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.lg\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.lg\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.lg\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.lg\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.lg\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.lg\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.lg\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.lg\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.lg\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.lg\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.lg\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.lg\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.lg\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.lg\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.lg\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.lg\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.lg\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.lg\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.lg\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.lg\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.lg\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.lg\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.lg\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.lg\:bg-auto{background-size:auto}.lg\:bg-cover{background-size:cover}.lg\:bg-contain{background-size:contain}.lg\:bg-fixed{background-attachment:fixed}.lg\:bg-local{background-attachment:local}.lg\:bg-scroll{background-attachment:scroll}.lg\:bg-clip-border{background-clip:initial}.lg\:bg-clip-padding{background-clip:padding-box}.lg\:bg-clip-content{background-clip:content-box}.lg\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.lg\:bg-bottom{background-position:bottom}.lg\:bg-center{background-position:50%}.lg\:bg-left{background-position:0}.lg\:bg-left-bottom{background-position:0 100%}.lg\:bg-left-top{background-position:0 0}.lg\:bg-right{background-position:100%}.lg\:bg-right-bottom{background-position:100% 100%}.lg\:bg-right-top{background-position:100% 0}.lg\:bg-top{background-position:top}.lg\:bg-repeat{background-repeat:repeat}.lg\:bg-no-repeat{background-repeat:no-repeat}.lg\:bg-repeat-x{background-repeat:repeat-x}.lg\:bg-repeat-y{background-repeat:repeat-y}.lg\:bg-repeat-round{background-repeat:round}.lg\:bg-repeat-space{background-repeat:space}.lg\:bg-origin-border{background-origin:border-box}.lg\:bg-origin-padding{background-origin:initial}.lg\:bg-origin-content{background-origin:content-box}.lg\:fill-current{fill:currentColor}.lg\:stroke-current{stroke:currentColor}.lg\:stroke-0{stroke-width:0}.lg\:stroke-1{stroke-width:1}.lg\:stroke-2{stroke-width:2}.lg\:object-contain{-o-object-fit:contain;object-fit:contain}.lg\:object-cover{-o-object-fit:cover;object-fit:cover}.lg\:object-fill{-o-object-fit:fill;object-fit:fill}.lg\:object-none{-o-object-fit:none;object-fit:none}.lg\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.lg\:object-bottom{-o-object-position:bottom;object-position:bottom}.lg\:object-center{-o-object-position:center;object-position:center}.lg\:object-left{-o-object-position:left;object-position:left}.lg\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.lg\:object-left-top{-o-object-position:left top;object-position:left top}.lg\:object-right{-o-object-position:right;object-position:right}.lg\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.lg\:object-right-top{-o-object-position:right top;object-position:right top}.lg\:object-top{-o-object-position:top;object-position:top}.lg\:p-0{padding:0}.lg\:p-1{padding:.25rem}.lg\:p-2{padding:.5rem}.lg\:p-3{padding:.75rem}.lg\:p-4{padding:1rem}.lg\:p-5{padding:1.25rem}.lg\:p-6{padding:1.5rem}.lg\:p-7{padding:1.75rem}.lg\:p-8{padding:2rem}.lg\:p-9{padding:2.25rem}.lg\:p-10{padding:2.5rem}.lg\:p-11{padding:2.75rem}.lg\:p-12{padding:3rem}.lg\:p-14{padding:3.5rem}.lg\:p-16{padding:4rem}.lg\:p-20{padding:5rem}.lg\:p-24{padding:6rem}.lg\:p-28{padding:7rem}.lg\:p-32{padding:8rem}.lg\:p-36{padding:9rem}.lg\:p-40{padding:10rem}.lg\:p-44{padding:11rem}.lg\:p-48{padding:12rem}.lg\:p-52{padding:13rem}.lg\:p-56{padding:14rem}.lg\:p-60{padding:15rem}.lg\:p-64{padding:16rem}.lg\:p-72{padding:18rem}.lg\:p-80{padding:20rem}.lg\:p-96{padding:24rem}.lg\:p-px{padding:1px}.lg\:p-0\.5{padding:.125rem}.lg\:p-1\.5{padding:.375rem}.lg\:p-2\.5{padding:.625rem}.lg\:p-3\.5{padding:.875rem}.lg\:px-0{padding-left:0;padding-right:0}.lg\:px-1{padding-left:.25rem;padding-right:.25rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:px-7{padding-left:1.75rem;padding-right:1.75rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:px-9{padding-left:2.25rem;padding-right:2.25rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:px-11{padding-left:2.75rem;padding-right:2.75rem}.lg\:px-12{padding-left:3rem;padding-right:3rem}.lg\:px-14{padding-left:3.5rem;padding-right:3.5rem}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:px-20{padding-left:5rem;padding-right:5rem}.lg\:px-24{padding-left:6rem;padding-right:6rem}.lg\:px-28{padding-left:7rem;padding-right:7rem}.lg\:px-32{padding-left:8rem;padding-right:8rem}.lg\:px-36{padding-left:9rem;padding-right:9rem}.lg\:px-40{padding-left:10rem;padding-right:10rem}.lg\:px-44{padding-left:11rem;padding-right:11rem}.lg\:px-48{padding-left:12rem;padding-right:12rem}.lg\:px-52{padding-left:13rem;padding-right:13rem}.lg\:px-56{padding-left:14rem;padding-right:14rem}.lg\:px-60{padding-left:15rem;padding-right:15rem}.lg\:px-64{padding-left:16rem;padding-right:16rem}.lg\:px-72{padding-left:18rem;padding-right:18rem}.lg\:px-80{padding-left:20rem;padding-right:20rem}.lg\:px-96{padding-left:24rem;padding-right:24rem}.lg\:px-px{padding-left:1px;padding-right:1px}.lg\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.lg\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.lg\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.lg\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.lg\:py-0{padding-top:0;padding-bottom:0}.lg\:py-1{padding-top:.25rem;padding-bottom:.25rem}.lg\:py-2{padding-top:.5rem;padding-bottom:.5rem}.lg\:py-3{padding-top:.75rem;padding-bottom:.75rem}.lg\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.lg\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.lg\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.lg\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.lg\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.lg\:py-12{padding-top:3rem;padding-bottom:3rem}.lg\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.lg\:py-16{padding-top:4rem;padding-bottom:4rem}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:py-24{padding-top:6rem;padding-bottom:6rem}.lg\:py-28{padding-top:7rem;padding-bottom:7rem}.lg\:py-32{padding-top:8rem;padding-bottom:8rem}.lg\:py-36{padding-top:9rem;padding-bottom:9rem}.lg\:py-40{padding-top:10rem;padding-bottom:10rem}.lg\:py-44{padding-top:11rem;padding-bottom:11rem}.lg\:py-48{padding-top:12rem;padding-bottom:12rem}.lg\:py-52{padding-top:13rem;padding-bottom:13rem}.lg\:py-56{padding-top:14rem;padding-bottom:14rem}.lg\:py-60{padding-top:15rem;padding-bottom:15rem}.lg\:py-64{padding-top:16rem;padding-bottom:16rem}.lg\:py-72{padding-top:18rem;padding-bottom:18rem}.lg\:py-80{padding-top:20rem;padding-bottom:20rem}.lg\:py-96{padding-top:24rem;padding-bottom:24rem}.lg\:py-px{padding-top:1px;padding-bottom:1px}.lg\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.lg\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.lg\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.lg\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.lg\:pt-0{padding-top:0}.lg\:pt-1{padding-top:.25rem}.lg\:pt-2{padding-top:.5rem}.lg\:pt-3{padding-top:.75rem}.lg\:pt-4{padding-top:1rem}.lg\:pt-5{padding-top:1.25rem}.lg\:pt-6{padding-top:1.5rem}.lg\:pt-7{padding-top:1.75rem}.lg\:pt-8{padding-top:2rem}.lg\:pt-9{padding-top:2.25rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pt-11{padding-top:2.75rem}.lg\:pt-12{padding-top:3rem}.lg\:pt-14{padding-top:3.5rem}.lg\:pt-16{padding-top:4rem}.lg\:pt-20{padding-top:5rem}.lg\:pt-24{padding-top:6rem}.lg\:pt-28{padding-top:7rem}.lg\:pt-32{padding-top:8rem}.lg\:pt-36{padding-top:9rem}.lg\:pt-40{padding-top:10rem}.lg\:pt-44{padding-top:11rem}.lg\:pt-48{padding-top:12rem}.lg\:pt-52{padding-top:13rem}.lg\:pt-56{padding-top:14rem}.lg\:pt-60{padding-top:15rem}.lg\:pt-64{padding-top:16rem}.lg\:pt-72{padding-top:18rem}.lg\:pt-80{padding-top:20rem}.lg\:pt-96{padding-top:24rem}.lg\:pt-px{padding-top:1px}.lg\:pt-0\.5{padding-top:.125rem}.lg\:pt-1\.5{padding-top:.375rem}.lg\:pt-2\.5{padding-top:.625rem}.lg\:pt-3\.5{padding-top:.875rem}.lg\:pr-0{padding-right:0}.lg\:pr-1{padding-right:.25rem}.lg\:pr-2{padding-right:.5rem}.lg\:pr-3{padding-right:.75rem}.lg\:pr-4{padding-right:1rem}.lg\:pr-5{padding-right:1.25rem}.lg\:pr-6{padding-right:1.5rem}.lg\:pr-7{padding-right:1.75rem}.lg\:pr-8{padding-right:2rem}.lg\:pr-9{padding-right:2.25rem}.lg\:pr-10{padding-right:2.5rem}.lg\:pr-11{padding-right:2.75rem}.lg\:pr-12{padding-right:3rem}.lg\:pr-14{padding-right:3.5rem}.lg\:pr-16{padding-right:4rem}.lg\:pr-20{padding-right:5rem}.lg\:pr-24{padding-right:6rem}.lg\:pr-28{padding-right:7rem}.lg\:pr-32{padding-right:8rem}.lg\:pr-36{padding-right:9rem}.lg\:pr-40{padding-right:10rem}.lg\:pr-44{padding-right:11rem}.lg\:pr-48{padding-right:12rem}.lg\:pr-52{padding-right:13rem}.lg\:pr-56{padding-right:14rem}.lg\:pr-60{padding-right:15rem}.lg\:pr-64{padding-right:16rem}.lg\:pr-72{padding-right:18rem}.lg\:pr-80{padding-right:20rem}.lg\:pr-96{padding-right:24rem}.lg\:pr-px{padding-right:1px}.lg\:pr-0\.5{padding-right:.125rem}.lg\:pr-1\.5{padding-right:.375rem}.lg\:pr-2\.5{padding-right:.625rem}.lg\:pr-3\.5{padding-right:.875rem}.lg\:pb-0{padding-bottom:0}.lg\:pb-1{padding-bottom:.25rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pb-3{padding-bottom:.75rem}.lg\:pb-4{padding-bottom:1rem}.lg\:pb-5{padding-bottom:1.25rem}.lg\:pb-6{padding-bottom:1.5rem}.lg\:pb-7{padding-bottom:1.75rem}.lg\:pb-8{padding-bottom:2rem}.lg\:pb-9{padding-bottom:2.25rem}.lg\:pb-10{padding-bottom:2.5rem}.lg\:pb-11{padding-bottom:2.75rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pb-14{padding-bottom:3.5rem}.lg\:pb-16{padding-bottom:4rem}.lg\:pb-20{padding-bottom:5rem}.lg\:pb-24{padding-bottom:6rem}.lg\:pb-28{padding-bottom:7rem}.lg\:pb-32{padding-bottom:8rem}.lg\:pb-36{padding-bottom:9rem}.lg\:pb-40{padding-bottom:10rem}.lg\:pb-44{padding-bottom:11rem}.lg\:pb-48{padding-bottom:12rem}.lg\:pb-52{padding-bottom:13rem}.lg\:pb-56{padding-bottom:14rem}.lg\:pb-60{padding-bottom:15rem}.lg\:pb-64{padding-bottom:16rem}.lg\:pb-72{padding-bottom:18rem}.lg\:pb-80{padding-bottom:20rem}.lg\:pb-96{padding-bottom:24rem}.lg\:pb-px{padding-bottom:1px}.lg\:pb-0\.5{padding-bottom:.125rem}.lg\:pb-1\.5{padding-bottom:.375rem}.lg\:pb-2\.5{padding-bottom:.625rem}.lg\:pb-3\.5{padding-bottom:.875rem}.lg\:pl-0{padding-left:0}.lg\:pl-1{padding-left:.25rem}.lg\:pl-2{padding-left:.5rem}.lg\:pl-3{padding-left:.75rem}.lg\:pl-4{padding-left:1rem}.lg\:pl-5{padding-left:1.25rem}.lg\:pl-6{padding-left:1.5rem}.lg\:pl-7{padding-left:1.75rem}.lg\:pl-8{padding-left:2rem}.lg\:pl-9{padding-left:2.25rem}.lg\:pl-10{padding-left:2.5rem}.lg\:pl-11{padding-left:2.75rem}.lg\:pl-12{padding-left:3rem}.lg\:pl-14{padding-left:3.5rem}.lg\:pl-16{padding-left:4rem}.lg\:pl-20{padding-left:5rem}.lg\:pl-24{padding-left:6rem}.lg\:pl-28{padding-left:7rem}.lg\:pl-32{padding-left:8rem}.lg\:pl-36{padding-left:9rem}.lg\:pl-40{padding-left:10rem}.lg\:pl-44{padding-left:11rem}.lg\:pl-48{padding-left:12rem}.lg\:pl-52{padding-left:13rem}.lg\:pl-56{padding-left:14rem}.lg\:pl-60{padding-left:15rem}.lg\:pl-64{padding-left:16rem}.lg\:pl-72{padding-left:18rem}.lg\:pl-80{padding-left:20rem}.lg\:pl-96{padding-left:24rem}.lg\:pl-px{padding-left:1px}.lg\:pl-0\.5{padding-left:.125rem}.lg\:pl-1\.5{padding-left:.375rem}.lg\:pl-2\.5{padding-left:.625rem}.lg\:pl-3\.5{padding-left:.875rem}.lg\:text-left{text-align:left}.lg\:text-center{text-align:center}.lg\:text-right{text-align:right}.lg\:text-justify{text-align:justify}.lg\:align-baseline{vertical-align:initial}.lg\:align-top{vertical-align:top}.lg\:align-middle{vertical-align:middle}.lg\:align-bottom{vertical-align:bottom}.lg\:align-text-top{vertical-align:text-top}.lg\:align-text-bottom{vertical-align:text-bottom}.lg\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.lg\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.lg\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.lg\:text-xs{font-size:.75rem;line-height:1rem}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}.lg\:text-base{font-size:1rem;line-height:1.5rem}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}.lg\:text-xl{font-size:1.25rem;line-height:1.75rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-3xl{font-size:1.875rem;line-height:2.25rem}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:text-5xl{font-size:3rem;line-height:1}.lg\:text-6xl{font-size:3.75rem;line-height:1}.lg\:text-7xl{font-size:4.5rem;line-height:1}.lg\:text-8xl{font-size:6rem;line-height:1}.lg\:text-9xl{font-size:8rem;line-height:1}.lg\:font-thin{font-weight:100}.lg\:font-extralight{font-weight:200}.lg\:font-light{font-weight:300}.lg\:font-normal{font-weight:400}.lg\:font-medium{font-weight:500}.lg\:font-semibold{font-weight:600}.lg\:font-bold{font-weight:700}.lg\:font-extrabold{font-weight:800}.lg\:font-black{font-weight:900}.lg\:uppercase{text-transform:uppercase}.lg\:lowercase{text-transform:lowercase}.lg\:capitalize{text-transform:capitalize}.lg\:normal-case{text-transform:none}.lg\:italic{font-style:italic}.lg\:not-italic{font-style:normal}.lg\:diagonal-fractions,.lg\:lining-nums,.lg\:oldstyle-nums,.lg\:ordinal,.lg\:proportional-nums,.lg\:slashed-zero,.lg\:stacked-fractions,.lg\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.lg\:normal-nums{font-variant-numeric:normal}.lg\:ordinal{--tw-ordinal:ordinal}.lg\:slashed-zero{--tw-slashed-zero:slashed-zero}.lg\:lining-nums{--tw-numeric-figure:lining-nums}.lg\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.lg\:proportional-nums{--tw-numeric-spacing:proportional-nums}.lg\:tabular-nums{--tw-numeric-spacing:tabular-nums}.lg\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.lg\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.lg\:leading-3{line-height:.75rem}.lg\:leading-4{line-height:1rem}.lg\:leading-5{line-height:1.25rem}.lg\:leading-6{line-height:1.5rem}.lg\:leading-7{line-height:1.75rem}.lg\:leading-8{line-height:2rem}.lg\:leading-9{line-height:2.25rem}.lg\:leading-10{line-height:2.5rem}.lg\:leading-none{line-height:1}.lg\:leading-tight{line-height:1.25}.lg\:leading-snug{line-height:1.375}.lg\:leading-normal{line-height:1.5}.lg\:leading-relaxed{line-height:1.625}.lg\:leading-loose{line-height:2}.lg\:tracking-tighter{letter-spacing:-.05em}.lg\:tracking-tight{letter-spacing:-.025em}.lg\:tracking-normal{letter-spacing:0}.lg\:tracking-wide{letter-spacing:.025em}.lg\:tracking-wider{letter-spacing:.05em}.lg\:tracking-widest{letter-spacing:.1em}.lg\:text-transparent{color:transparent}.lg\:text-current{color:currentColor}.lg\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-transparent{color:transparent}.group:hover .lg\:group-hover\:text-current{color:currentColor}.group:hover .lg\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .lg\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:focus-within\:text-transparent:focus-within{color:transparent}.lg\:focus-within\:text-current:focus-within{color:currentColor}.lg\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:hover\:text-transparent:hover{color:transparent}.lg\:hover\:text-current:hover{color:currentColor}.lg\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:focus\:text-transparent:focus{color:transparent}.lg\:focus\:text-current:focus{color:currentColor}.lg\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.lg\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.lg\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.lg\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.lg\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.lg\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.lg\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.lg\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.lg\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.lg\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.lg\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.lg\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.lg\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.lg\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.lg\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.lg\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.lg\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.lg\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.lg\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.lg\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.lg\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.lg\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.lg\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.lg\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.lg\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.lg\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.lg\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.lg\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.lg\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.lg\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.lg\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.lg\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.lg\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.lg\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.lg\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.lg\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.lg\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.lg\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.lg\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.lg\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.lg\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.lg\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.lg\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.lg\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.lg\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.lg\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.lg\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.lg\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.lg\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.lg\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.lg\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.lg\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.lg\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.lg\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.lg\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.lg\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.lg\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.lg\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.lg\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.lg\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.lg\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.lg\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.lg\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.lg\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.lg\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.lg\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.lg\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.lg\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.lg\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.lg\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.lg\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.lg\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.lg\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.lg\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.lg\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.lg\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.lg\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.lg\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.lg\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.lg\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.lg\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.lg\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.lg\:text-opacity-0{--tw-text-opacity:0}.lg\:text-opacity-5{--tw-text-opacity:0.05}.lg\:text-opacity-10{--tw-text-opacity:0.1}.lg\:text-opacity-20{--tw-text-opacity:0.2}.lg\:text-opacity-25{--tw-text-opacity:0.25}.lg\:text-opacity-30{--tw-text-opacity:0.3}.lg\:text-opacity-40{--tw-text-opacity:0.4}.lg\:text-opacity-50{--tw-text-opacity:0.5}.lg\:text-opacity-60{--tw-text-opacity:0.6}.lg\:text-opacity-70{--tw-text-opacity:0.7}.lg\:text-opacity-75{--tw-text-opacity:0.75}.lg\:text-opacity-80{--tw-text-opacity:0.8}.lg\:text-opacity-90{--tw-text-opacity:0.9}.lg\:text-opacity-95{--tw-text-opacity:0.95}.lg\:text-opacity-100{--tw-text-opacity:1}.group:hover .lg\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .lg\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .lg\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .lg\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .lg\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .lg\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .lg\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .lg\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .lg\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .lg\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .lg\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .lg\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .lg\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .lg\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .lg\:group-hover\:text-opacity-100{--tw-text-opacity:1}.lg\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.lg\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.lg\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.lg\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.lg\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.lg\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.lg\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.lg\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.lg\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.lg\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.lg\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.lg\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.lg\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.lg\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.lg\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.lg\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.lg\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.lg\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.lg\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.lg\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.lg\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.lg\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.lg\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.lg\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.lg\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.lg\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.lg\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.lg\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.lg\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.lg\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.lg\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.lg\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.lg\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.lg\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.lg\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.lg\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.lg\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.lg\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.lg\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.lg\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.lg\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.lg\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.lg\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.lg\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.lg\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.lg\:underline{text-decoration:underline}.lg\:line-through{text-decoration:line-through}.lg\:no-underline{text-decoration:none}.group:hover .lg\:group-hover\:underline{text-decoration:underline}.group:hover .lg\:group-hover\:line-through{text-decoration:line-through}.group:hover .lg\:group-hover\:no-underline{text-decoration:none}.lg\:focus-within\:underline:focus-within{text-decoration:underline}.lg\:focus-within\:line-through:focus-within{text-decoration:line-through}.lg\:focus-within\:no-underline:focus-within{text-decoration:none}.lg\:hover\:underline:hover{text-decoration:underline}.lg\:hover\:line-through:hover{text-decoration:line-through}.lg\:hover\:no-underline:hover{text-decoration:none}.lg\:focus\:underline:focus{text-decoration:underline}.lg\:focus\:line-through:focus{text-decoration:line-through}.lg\:focus\:no-underline:focus{text-decoration:none}.lg\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.lg\:placeholder-transparent::-moz-placeholder{color:transparent}.lg\:placeholder-transparent:-ms-input-placeholder{color:transparent}.lg\:placeholder-transparent::placeholder{color:transparent}.lg\:placeholder-current::-moz-placeholder{color:currentColor}.lg\:placeholder-current:-ms-input-placeholder{color:currentColor}.lg\:placeholder-current::placeholder{color:currentColor}.lg\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.lg\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus::placeholder{color:currentColor}.lg\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.lg\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.lg\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.lg\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.lg\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.lg\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.lg\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.lg\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.lg\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.lg\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.lg\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.lg\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.lg\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.lg\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.lg\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.lg\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.lg\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.lg\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.lg\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.lg\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.lg\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.lg\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.lg\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.lg\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.lg\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.lg\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.lg\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.lg\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.lg\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.lg\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.lg\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.lg\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.lg\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.lg\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.lg\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.lg\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.lg\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.lg\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.lg\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.lg\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.lg\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.lg\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.lg\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.lg\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.lg\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.lg\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.lg\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.lg\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.lg\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.lg\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.lg\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.lg\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.lg\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.lg\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.lg\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.lg\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.lg\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.lg\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.lg\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.lg\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.lg\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.lg\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.lg\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.lg\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.lg\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.lg\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.lg\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.lg\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.lg\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.lg\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.lg\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.lg\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.lg\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.lg\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.lg\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.lg\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.lg\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.lg\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.lg\:opacity-0{opacity:0}.lg\:opacity-5{opacity:.05}.lg\:opacity-10{opacity:.1}.lg\:opacity-20{opacity:.2}.lg\:opacity-25{opacity:.25}.lg\:opacity-30{opacity:.3}.lg\:opacity-40{opacity:.4}.lg\:opacity-50{opacity:.5}.lg\:opacity-60{opacity:.6}.lg\:opacity-70{opacity:.7}.lg\:opacity-75{opacity:.75}.lg\:opacity-80{opacity:.8}.lg\:opacity-90{opacity:.9}.lg\:opacity-95{opacity:.95}.lg\:opacity-100{opacity:1}.group:hover .lg\:group-hover\:opacity-0{opacity:0}.group:hover .lg\:group-hover\:opacity-5{opacity:.05}.group:hover .lg\:group-hover\:opacity-10{opacity:.1}.group:hover .lg\:group-hover\:opacity-20{opacity:.2}.group:hover .lg\:group-hover\:opacity-25{opacity:.25}.group:hover .lg\:group-hover\:opacity-30{opacity:.3}.group:hover .lg\:group-hover\:opacity-40{opacity:.4}.group:hover .lg\:group-hover\:opacity-50{opacity:.5}.group:hover .lg\:group-hover\:opacity-60{opacity:.6}.group:hover .lg\:group-hover\:opacity-70{opacity:.7}.group:hover .lg\:group-hover\:opacity-75{opacity:.75}.group:hover .lg\:group-hover\:opacity-80{opacity:.8}.group:hover .lg\:group-hover\:opacity-90{opacity:.9}.group:hover .lg\:group-hover\:opacity-95{opacity:.95}.group:hover .lg\:group-hover\:opacity-100{opacity:1}.lg\:focus-within\:opacity-0:focus-within{opacity:0}.lg\:focus-within\:opacity-5:focus-within{opacity:.05}.lg\:focus-within\:opacity-10:focus-within{opacity:.1}.lg\:focus-within\:opacity-20:focus-within{opacity:.2}.lg\:focus-within\:opacity-25:focus-within{opacity:.25}.lg\:focus-within\:opacity-30:focus-within{opacity:.3}.lg\:focus-within\:opacity-40:focus-within{opacity:.4}.lg\:focus-within\:opacity-50:focus-within{opacity:.5}.lg\:focus-within\:opacity-60:focus-within{opacity:.6}.lg\:focus-within\:opacity-70:focus-within{opacity:.7}.lg\:focus-within\:opacity-75:focus-within{opacity:.75}.lg\:focus-within\:opacity-80:focus-within{opacity:.8}.lg\:focus-within\:opacity-90:focus-within{opacity:.9}.lg\:focus-within\:opacity-95:focus-within{opacity:.95}.lg\:focus-within\:opacity-100:focus-within{opacity:1}.lg\:hover\:opacity-0:hover{opacity:0}.lg\:hover\:opacity-5:hover{opacity:.05}.lg\:hover\:opacity-10:hover{opacity:.1}.lg\:hover\:opacity-20:hover{opacity:.2}.lg\:hover\:opacity-25:hover{opacity:.25}.lg\:hover\:opacity-30:hover{opacity:.3}.lg\:hover\:opacity-40:hover{opacity:.4}.lg\:hover\:opacity-50:hover{opacity:.5}.lg\:hover\:opacity-60:hover{opacity:.6}.lg\:hover\:opacity-70:hover{opacity:.7}.lg\:hover\:opacity-75:hover{opacity:.75}.lg\:hover\:opacity-80:hover{opacity:.8}.lg\:hover\:opacity-90:hover{opacity:.9}.lg\:hover\:opacity-95:hover{opacity:.95}.lg\:hover\:opacity-100:hover{opacity:1}.lg\:focus\:opacity-0:focus{opacity:0}.lg\:focus\:opacity-5:focus{opacity:.05}.lg\:focus\:opacity-10:focus{opacity:.1}.lg\:focus\:opacity-20:focus{opacity:.2}.lg\:focus\:opacity-25:focus{opacity:.25}.lg\:focus\:opacity-30:focus{opacity:.3}.lg\:focus\:opacity-40:focus{opacity:.4}.lg\:focus\:opacity-50:focus{opacity:.5}.lg\:focus\:opacity-60:focus{opacity:.6}.lg\:focus\:opacity-70:focus{opacity:.7}.lg\:focus\:opacity-75:focus{opacity:.75}.lg\:focus\:opacity-80:focus{opacity:.8}.lg\:focus\:opacity-90:focus{opacity:.9}.lg\:focus\:opacity-95:focus{opacity:.95}.lg\:focus\:opacity-100:focus{opacity:1}.lg\:bg-blend-normal{background-blend-mode:normal}.lg\:bg-blend-multiply{background-blend-mode:multiply}.lg\:bg-blend-screen{background-blend-mode:screen}.lg\:bg-blend-overlay{background-blend-mode:overlay}.lg\:bg-blend-darken{background-blend-mode:darken}.lg\:bg-blend-lighten{background-blend-mode:lighten}.lg\:bg-blend-color-dodge{background-blend-mode:color-dodge}.lg\:bg-blend-color-burn{background-blend-mode:color-burn}.lg\:bg-blend-hard-light{background-blend-mode:hard-light}.lg\:bg-blend-soft-light{background-blend-mode:soft-light}.lg\:bg-blend-difference{background-blend-mode:difference}.lg\:bg-blend-exclusion{background-blend-mode:exclusion}.lg\:bg-blend-hue{background-blend-mode:hue}.lg\:bg-blend-saturation{background-blend-mode:saturation}.lg\:bg-blend-color{background-blend-mode:color}.lg\:bg-blend-luminosity{background-blend-mode:luminosity}.lg\:mix-blend-normal{mix-blend-mode:normal}.lg\:mix-blend-multiply{mix-blend-mode:multiply}.lg\:mix-blend-screen{mix-blend-mode:screen}.lg\:mix-blend-overlay{mix-blend-mode:overlay}.lg\:mix-blend-darken{mix-blend-mode:darken}.lg\:mix-blend-lighten{mix-blend-mode:lighten}.lg\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.lg\:mix-blend-color-burn{mix-blend-mode:color-burn}.lg\:mix-blend-hard-light{mix-blend-mode:hard-light}.lg\:mix-blend-soft-light{mix-blend-mode:soft-light}.lg\:mix-blend-difference{mix-blend-mode:difference}.lg\:mix-blend-exclusion{mix-blend-mode:exclusion}.lg\:mix-blend-hue{mix-blend-mode:hue}.lg\:mix-blend-saturation{mix-blend-mode:saturation}.lg\:mix-blend-color{mix-blend-mode:color}.lg\:mix-blend-luminosity{mix-blend-mode:luminosity}.lg\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.lg\:shadow,.lg\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.lg\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.lg\:shadow-lg,.lg\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.lg\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.lg\:shadow-2xl,.lg\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.lg\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.lg\:shadow-inner,.lg\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .lg\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .lg\:group-hover\:shadow,.group:hover .lg\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .lg\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .lg\:group-hover\:shadow-lg,.group:hover .lg\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .lg\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .lg\:group-hover\:shadow-2xl,.group:hover .lg\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .lg\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .lg\:group-hover\:shadow-inner,.group:hover .lg\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .lg\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.lg\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.lg\:hover\:shadow-sm:hover,.lg\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.lg\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.lg\:hover\:shadow-lg:hover,.lg\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.lg\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.lg\:hover\:shadow-2xl:hover,.lg\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.lg\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.lg\:hover\:shadow-inner:hover,.lg\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.lg\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.lg\:focus\:shadow-sm:focus,.lg\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.lg\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.lg\:focus\:shadow-lg:focus,.lg\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.lg\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.lg\:focus\:shadow-2xl:focus,.lg\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.lg\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.lg\:focus\:shadow-inner:focus,.lg\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lg\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.lg\:outline-none{outline:2px solid transparent;outline-offset:2px}.lg\:outline-white{outline:2px dotted #fff;outline-offset:2px}.lg\:outline-black{outline:2px dotted #000;outline-offset:2px}.lg\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.lg\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.lg\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.lg\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lg\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.lg\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.lg\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-0,.lg\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-2,.lg\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring,.lg\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-0:focus,.lg\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-2:focus,.lg\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:focus\:ring-8:focus,.lg\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.lg\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.lg\:ring-inset{--tw-ring-inset:inset}.lg\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.lg\:focus\:ring-inset:focus{--tw-ring-inset:inset}.lg\:ring-transparent{--tw-ring-color:transparent}.lg\:ring-current{--tw-ring-color:currentColor}.lg\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.lg\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.lg\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.lg\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.lg\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.lg\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.lg\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.lg\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.lg\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.lg\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.lg\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.lg\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.lg\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.lg\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.lg\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.lg\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.lg\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.lg\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.lg\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.lg\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.lg\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.lg\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.lg\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.lg\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.lg\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.lg\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.lg\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.lg\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.lg\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.lg\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.lg\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.lg\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.lg\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.lg\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.lg\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.lg\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.lg\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.lg\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.lg\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.lg\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.lg\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.lg\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.lg\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.lg\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.lg\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.lg\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.lg\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.lg\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.lg\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.lg\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.lg\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.lg\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.lg\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.lg\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.lg\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.lg\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.lg\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.lg\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.lg\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.lg\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.lg\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.lg\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.lg\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.lg\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.lg\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.lg\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.lg\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.lg\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.lg\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.lg\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.lg\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.lg\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.lg\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.lg\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.lg\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.lg\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.lg\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.lg\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.lg\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.lg\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.lg\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.lg\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.lg\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.lg\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.lg\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.lg\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.lg\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.lg\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.lg\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.lg\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.lg\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.lg\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.lg\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.lg\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.lg\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.lg\:focus\:ring-current:focus{--tw-ring-color:currentColor}.lg\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.lg\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.lg\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.lg\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.lg\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.lg\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.lg\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.lg\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.lg\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.lg\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.lg\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.lg\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.lg\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.lg\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.lg\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.lg\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.lg\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.lg\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.lg\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.lg\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.lg\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.lg\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.lg\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.lg\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.lg\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.lg\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.lg\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.lg\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.lg\:ring-opacity-0{--tw-ring-opacity:0}.lg\:ring-opacity-5{--tw-ring-opacity:0.05}.lg\:ring-opacity-10{--tw-ring-opacity:0.1}.lg\:ring-opacity-20{--tw-ring-opacity:0.2}.lg\:ring-opacity-25{--tw-ring-opacity:0.25}.lg\:ring-opacity-30{--tw-ring-opacity:0.3}.lg\:ring-opacity-40{--tw-ring-opacity:0.4}.lg\:ring-opacity-50{--tw-ring-opacity:0.5}.lg\:ring-opacity-60{--tw-ring-opacity:0.6}.lg\:ring-opacity-70{--tw-ring-opacity:0.7}.lg\:ring-opacity-75{--tw-ring-opacity:0.75}.lg\:ring-opacity-80{--tw-ring-opacity:0.8}.lg\:ring-opacity-90{--tw-ring-opacity:0.9}.lg\:ring-opacity-95{--tw-ring-opacity:0.95}.lg\:ring-opacity-100{--tw-ring-opacity:1}.lg\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.lg\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.lg\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.lg\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.lg\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.lg\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.lg\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.lg\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.lg\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.lg\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.lg\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.lg\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.lg\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.lg\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.lg\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.lg\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.lg\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.lg\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.lg\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.lg\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.lg\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.lg\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.lg\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.lg\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.lg\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.lg\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.lg\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.lg\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.lg\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.lg\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.lg\:ring-offset-0{--tw-ring-offset-width:0px}.lg\:ring-offset-1{--tw-ring-offset-width:1px}.lg\:ring-offset-2{--tw-ring-offset-width:2px}.lg\:ring-offset-4{--tw-ring-offset-width:4px}.lg\:ring-offset-8{--tw-ring-offset-width:8px}.lg\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.lg\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.lg\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.lg\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.lg\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.lg\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.lg\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.lg\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.lg\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.lg\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.lg\:ring-offset-transparent{--tw-ring-offset-color:transparent}.lg\:ring-offset-current{--tw-ring-offset-color:currentColor}.lg\:ring-offset-black{--tw-ring-offset-color:#000}.lg\:ring-offset-white{--tw-ring-offset-color:#fff}.lg\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.lg\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.lg\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.lg\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.lg\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.lg\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.lg\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.lg\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.lg\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.lg\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.lg\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.lg\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.lg\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.lg\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.lg\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.lg\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.lg\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.lg\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.lg\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.lg\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.lg\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.lg\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.lg\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.lg\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.lg\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.lg\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.lg\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.lg\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.lg\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.lg\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.lg\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.lg\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.lg\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.lg\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.lg\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.lg\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.lg\:ring-offset-green-600{--tw-ring-offset-color:#059669}.lg\:ring-offset-green-700{--tw-ring-offset-color:#047857}.lg\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.lg\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.lg\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.lg\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.lg\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.lg\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.lg\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.lg\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.lg\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.lg\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.lg\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.lg\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.lg\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.lg\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.lg\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.lg\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.lg\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.lg\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.lg\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.lg\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.lg\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.lg\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.lg\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.lg\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.lg\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.lg\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.lg\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.lg\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.lg\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.lg\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.lg\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.lg\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.lg\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.lg\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.lg\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.lg\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.lg\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.lg\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.lg\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.lg\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.lg\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.lg\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.lg\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.lg\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.lg\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.lg\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.lg\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.lg\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.lg\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.lg\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.lg\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.lg\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.lg\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.lg\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.lg\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.lg\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.lg\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.lg\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.lg\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.lg\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.lg\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.lg\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.lg\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.lg\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.lg\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.lg\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.lg\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.lg\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.lg\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.lg\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.lg\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.lg\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.lg\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.lg\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.lg\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.lg\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.lg\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.lg\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.lg\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.lg\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.lg\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.lg\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.lg\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.lg\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.lg\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.lg\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.lg\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.lg\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.lg\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.lg\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.lg\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.lg\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.lg\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.lg\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.lg\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.lg\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.lg\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.lg\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.lg\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.lg\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.lg\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.lg\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.lg\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.lg\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.lg\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.lg\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.lg\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.lg\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.lg\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.lg\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.lg\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.lg\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.lg\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.lg\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.lg\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.lg\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.lg\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.lg\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.lg\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.lg\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.lg\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.lg\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.lg\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.lg\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.lg\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.lg\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.lg\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.lg\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.lg\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.lg\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.lg\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.lg\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.lg\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.lg\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.lg\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.lg\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.lg\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.lg\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.lg\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.lg\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.lg\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.lg\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.lg\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.lg\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.lg\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.lg\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.lg\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.lg\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.lg\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.lg\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.lg\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.lg\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.lg\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.lg\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.lg\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.lg\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.lg\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.lg\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.lg\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.lg\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.lg\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.lg\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.lg\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.lg\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.lg\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.lg\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.lg\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.lg\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.lg\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.lg\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.lg\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.lg\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.lg\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.lg\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.lg\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.lg\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.lg\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.lg\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.lg\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.lg\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.lg\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.lg\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.lg\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.lg\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.lg\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.lg\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.lg\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.lg\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.lg\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.lg\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.lg\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.lg\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.lg\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.lg\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.lg\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.lg\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.lg\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.lg\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.lg\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.lg\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.lg\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.lg\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.lg\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.lg\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.lg\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.lg\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.lg\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.lg\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.lg\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.lg\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.lg\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.lg\:filter-none{filter:none}.lg\:blur-0,.lg\:blur-none{--tw-blur:blur(0)}.lg\:blur-sm{--tw-blur:blur(4px)}.lg\:blur{--tw-blur:blur(8px)}.lg\:blur-md{--tw-blur:blur(12px)}.lg\:blur-lg{--tw-blur:blur(16px)}.lg\:blur-xl{--tw-blur:blur(24px)}.lg\:blur-2xl{--tw-blur:blur(40px)}.lg\:blur-3xl{--tw-blur:blur(64px)}.lg\:brightness-0{--tw-brightness:brightness(0)}.lg\:brightness-50{--tw-brightness:brightness(.5)}.lg\:brightness-75{--tw-brightness:brightness(.75)}.lg\:brightness-90{--tw-brightness:brightness(.9)}.lg\:brightness-95{--tw-brightness:brightness(.95)}.lg\:brightness-100{--tw-brightness:brightness(1)}.lg\:brightness-105{--tw-brightness:brightness(1.05)}.lg\:brightness-110{--tw-brightness:brightness(1.1)}.lg\:brightness-125{--tw-brightness:brightness(1.25)}.lg\:brightness-150{--tw-brightness:brightness(1.5)}.lg\:brightness-200{--tw-brightness:brightness(2)}.lg\:contrast-0{--tw-contrast:contrast(0)}.lg\:contrast-50{--tw-contrast:contrast(.5)}.lg\:contrast-75{--tw-contrast:contrast(.75)}.lg\:contrast-100{--tw-contrast:contrast(1)}.lg\:contrast-125{--tw-contrast:contrast(1.25)}.lg\:contrast-150{--tw-contrast:contrast(1.5)}.lg\:contrast-200{--tw-contrast:contrast(2)}.lg\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.lg\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.lg\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.lg\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.lg\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.lg\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.lg\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.lg\:grayscale-0{--tw-grayscale:grayscale(0)}.lg\:grayscale{--tw-grayscale:grayscale(100%)}.lg\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.lg\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.lg\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.lg\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.lg\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.lg\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.lg\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.lg\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.lg\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.lg\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.lg\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.lg\:invert-0{--tw-invert:invert(0)}.lg\:invert{--tw-invert:invert(100%)}.lg\:saturate-0{--tw-saturate:saturate(0)}.lg\:saturate-50{--tw-saturate:saturate(.5)}.lg\:saturate-100{--tw-saturate:saturate(1)}.lg\:saturate-150{--tw-saturate:saturate(1.5)}.lg\:saturate-200{--tw-saturate:saturate(2)}.lg\:sepia-0{--tw-sepia:sepia(0)}.lg\:sepia{--tw-sepia:sepia(100%)}.lg\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.lg\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.lg\:backdrop-blur-0,.lg\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.lg\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.lg\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.lg\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.lg\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.lg\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.lg\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.lg\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.lg\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.lg\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.lg\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.lg\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.lg\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.lg\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.lg\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.lg\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.lg\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.lg\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.lg\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.lg\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.lg\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.lg\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.lg\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.lg\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.lg\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.lg\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.lg\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.lg\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.lg\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.lg\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.lg\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.lg\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.lg\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.lg\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.lg\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.lg\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.lg\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.lg\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.lg\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.lg\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.lg\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.lg\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.lg\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.lg\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.lg\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.lg\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.lg\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.lg\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.lg\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.lg\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.lg\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.lg\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.lg\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.lg\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.lg\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.lg\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.lg\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.lg\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.lg\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.lg\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.lg\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.lg\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.lg\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.lg\:transition-none{transition-property:none}.lg\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lg\:delay-75{transition-delay:75ms}.lg\:delay-100{transition-delay:.1s}.lg\:delay-150{transition-delay:.15s}.lg\:delay-200{transition-delay:.2s}.lg\:delay-300{transition-delay:.3s}.lg\:delay-500{transition-delay:.5s}.lg\:delay-700{transition-delay:.7s}.lg\:delay-1000{transition-delay:1s}.lg\:duration-75{transition-duration:75ms}.lg\:duration-100{transition-duration:.1s}.lg\:duration-150{transition-duration:.15s}.lg\:duration-200{transition-duration:.2s}.lg\:duration-300{transition-duration:.3s}.lg\:duration-500{transition-duration:.5s}.lg\:duration-700{transition-duration:.7s}.lg\:duration-1000{transition-duration:1s}.lg\:ease-linear{transition-timing-function:linear}.lg\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lg\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.lg\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}@media (min-width:1536px){.xl\:container{max-width:1536px}}.xl\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:pointer-events-none{pointer-events:none}.xl\:pointer-events-auto{pointer-events:auto}.xl\:visible{visibility:visible}.xl\:invisible{visibility:hidden}.xl\:static{position:static}.xl\:fixed{position:fixed}.xl\:absolute{position:absolute}.xl\:relative{position:relative}.xl\:sticky{position:-webkit-sticky;position:sticky}.xl\:inset-0{top:0;right:0;bottom:0;left:0}.xl\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.xl\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.xl\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.xl\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.xl\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.xl\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.xl\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.xl\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.xl\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.xl\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.xl\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.xl\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.xl\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.xl\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.xl\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.xl\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.xl\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.xl\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.xl\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.xl\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.xl\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.xl\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.xl\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.xl\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.xl\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.xl\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.xl\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.xl\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.xl\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.xl\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.xl\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.xl\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.xl\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.xl\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.xl\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.xl\:-inset-0{top:0;right:0;bottom:0;left:0}.xl\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.xl\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.xl\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.xl\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.xl\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.xl\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.xl\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.xl\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.xl\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.xl\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.xl\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.xl\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.xl\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.xl\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.xl\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.xl\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.xl\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.xl\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.xl\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.xl\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.xl\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.xl\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.xl\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.xl\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.xl\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.xl\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.xl\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.xl\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.xl\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.xl\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.xl\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.xl\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.xl\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.xl\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.xl\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.xl\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.xl\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.xl\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.xl\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.xl\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.xl\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.xl\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.xl\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.xl\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.xl\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.xl\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.xl\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.xl\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.xl\:inset-x-0{left:0;right:0}.xl\:inset-x-1{left:.25rem;right:.25rem}.xl\:inset-x-2{left:.5rem;right:.5rem}.xl\:inset-x-3{left:.75rem;right:.75rem}.xl\:inset-x-4{left:1rem;right:1rem}.xl\:inset-x-5{left:1.25rem;right:1.25rem}.xl\:inset-x-6{left:1.5rem;right:1.5rem}.xl\:inset-x-7{left:1.75rem;right:1.75rem}.xl\:inset-x-8{left:2rem;right:2rem}.xl\:inset-x-9{left:2.25rem;right:2.25rem}.xl\:inset-x-10{left:2.5rem;right:2.5rem}.xl\:inset-x-11{left:2.75rem;right:2.75rem}.xl\:inset-x-12{left:3rem;right:3rem}.xl\:inset-x-14{left:3.5rem;right:3.5rem}.xl\:inset-x-16{left:4rem;right:4rem}.xl\:inset-x-20{left:5rem;right:5rem}.xl\:inset-x-24{left:6rem;right:6rem}.xl\:inset-x-28{left:7rem;right:7rem}.xl\:inset-x-32{left:8rem;right:8rem}.xl\:inset-x-36{left:9rem;right:9rem}.xl\:inset-x-40{left:10rem;right:10rem}.xl\:inset-x-44{left:11rem;right:11rem}.xl\:inset-x-48{left:12rem;right:12rem}.xl\:inset-x-52{left:13rem;right:13rem}.xl\:inset-x-56{left:14rem;right:14rem}.xl\:inset-x-60{left:15rem;right:15rem}.xl\:inset-x-64{left:16rem;right:16rem}.xl\:inset-x-72{left:18rem;right:18rem}.xl\:inset-x-80{left:20rem;right:20rem}.xl\:inset-x-96{left:24rem;right:24rem}.xl\:inset-x-auto{left:auto;right:auto}.xl\:inset-x-px{left:1px;right:1px}.xl\:inset-x-0\.5{left:.125rem;right:.125rem}.xl\:inset-x-1\.5{left:.375rem;right:.375rem}.xl\:inset-x-2\.5{left:.625rem;right:.625rem}.xl\:inset-x-3\.5{left:.875rem;right:.875rem}.xl\:-inset-x-0{left:0;right:0}.xl\:-inset-x-1{left:-.25rem;right:-.25rem}.xl\:-inset-x-2{left:-.5rem;right:-.5rem}.xl\:-inset-x-3{left:-.75rem;right:-.75rem}.xl\:-inset-x-4{left:-1rem;right:-1rem}.xl\:-inset-x-5{left:-1.25rem;right:-1.25rem}.xl\:-inset-x-6{left:-1.5rem;right:-1.5rem}.xl\:-inset-x-7{left:-1.75rem;right:-1.75rem}.xl\:-inset-x-8{left:-2rem;right:-2rem}.xl\:-inset-x-9{left:-2.25rem;right:-2.25rem}.xl\:-inset-x-10{left:-2.5rem;right:-2.5rem}.xl\:-inset-x-11{left:-2.75rem;right:-2.75rem}.xl\:-inset-x-12{left:-3rem;right:-3rem}.xl\:-inset-x-14{left:-3.5rem;right:-3.5rem}.xl\:-inset-x-16{left:-4rem;right:-4rem}.xl\:-inset-x-20{left:-5rem;right:-5rem}.xl\:-inset-x-24{left:-6rem;right:-6rem}.xl\:-inset-x-28{left:-7rem;right:-7rem}.xl\:-inset-x-32{left:-8rem;right:-8rem}.xl\:-inset-x-36{left:-9rem;right:-9rem}.xl\:-inset-x-40{left:-10rem;right:-10rem}.xl\:-inset-x-44{left:-11rem;right:-11rem}.xl\:-inset-x-48{left:-12rem;right:-12rem}.xl\:-inset-x-52{left:-13rem;right:-13rem}.xl\:-inset-x-56{left:-14rem;right:-14rem}.xl\:-inset-x-60{left:-15rem;right:-15rem}.xl\:-inset-x-64{left:-16rem;right:-16rem}.xl\:-inset-x-72{left:-18rem;right:-18rem}.xl\:-inset-x-80{left:-20rem;right:-20rem}.xl\:-inset-x-96{left:-24rem;right:-24rem}.xl\:-inset-x-px{left:-1px;right:-1px}.xl\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.xl\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.xl\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.xl\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.xl\:inset-x-1\/2{left:50%;right:50%}.xl\:inset-x-1\/3{left:33.333333%;right:33.333333%}.xl\:inset-x-2\/3{left:66.666667%;right:66.666667%}.xl\:inset-x-1\/4{left:25%;right:25%}.xl\:inset-x-2\/4{left:50%;right:50%}.xl\:inset-x-3\/4{left:75%;right:75%}.xl\:inset-x-full{left:100%;right:100%}.xl\:-inset-x-1\/2{left:-50%;right:-50%}.xl\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.xl\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.xl\:-inset-x-1\/4{left:-25%;right:-25%}.xl\:-inset-x-2\/4{left:-50%;right:-50%}.xl\:-inset-x-3\/4{left:-75%;right:-75%}.xl\:-inset-x-full{left:-100%;right:-100%}.xl\:inset-y-0{top:0;bottom:0}.xl\:inset-y-1{top:.25rem;bottom:.25rem}.xl\:inset-y-2{top:.5rem;bottom:.5rem}.xl\:inset-y-3{top:.75rem;bottom:.75rem}.xl\:inset-y-4{top:1rem;bottom:1rem}.xl\:inset-y-5{top:1.25rem;bottom:1.25rem}.xl\:inset-y-6{top:1.5rem;bottom:1.5rem}.xl\:inset-y-7{top:1.75rem;bottom:1.75rem}.xl\:inset-y-8{top:2rem;bottom:2rem}.xl\:inset-y-9{top:2.25rem;bottom:2.25rem}.xl\:inset-y-10{top:2.5rem;bottom:2.5rem}.xl\:inset-y-11{top:2.75rem;bottom:2.75rem}.xl\:inset-y-12{top:3rem;bottom:3rem}.xl\:inset-y-14{top:3.5rem;bottom:3.5rem}.xl\:inset-y-16{top:4rem;bottom:4rem}.xl\:inset-y-20{top:5rem;bottom:5rem}.xl\:inset-y-24{top:6rem;bottom:6rem}.xl\:inset-y-28{top:7rem;bottom:7rem}.xl\:inset-y-32{top:8rem;bottom:8rem}.xl\:inset-y-36{top:9rem;bottom:9rem}.xl\:inset-y-40{top:10rem;bottom:10rem}.xl\:inset-y-44{top:11rem;bottom:11rem}.xl\:inset-y-48{top:12rem;bottom:12rem}.xl\:inset-y-52{top:13rem;bottom:13rem}.xl\:inset-y-56{top:14rem;bottom:14rem}.xl\:inset-y-60{top:15rem;bottom:15rem}.xl\:inset-y-64{top:16rem;bottom:16rem}.xl\:inset-y-72{top:18rem;bottom:18rem}.xl\:inset-y-80{top:20rem;bottom:20rem}.xl\:inset-y-96{top:24rem;bottom:24rem}.xl\:inset-y-auto{top:auto;bottom:auto}.xl\:inset-y-px{top:1px;bottom:1px}.xl\:inset-y-0\.5{top:.125rem;bottom:.125rem}.xl\:inset-y-1\.5{top:.375rem;bottom:.375rem}.xl\:inset-y-2\.5{top:.625rem;bottom:.625rem}.xl\:inset-y-3\.5{top:.875rem;bottom:.875rem}.xl\:-inset-y-0{top:0;bottom:0}.xl\:-inset-y-1{top:-.25rem;bottom:-.25rem}.xl\:-inset-y-2{top:-.5rem;bottom:-.5rem}.xl\:-inset-y-3{top:-.75rem;bottom:-.75rem}.xl\:-inset-y-4{top:-1rem;bottom:-1rem}.xl\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.xl\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.xl\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.xl\:-inset-y-8{top:-2rem;bottom:-2rem}.xl\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.xl\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.xl\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.xl\:-inset-y-12{top:-3rem;bottom:-3rem}.xl\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.xl\:-inset-y-16{top:-4rem;bottom:-4rem}.xl\:-inset-y-20{top:-5rem;bottom:-5rem}.xl\:-inset-y-24{top:-6rem;bottom:-6rem}.xl\:-inset-y-28{top:-7rem;bottom:-7rem}.xl\:-inset-y-32{top:-8rem;bottom:-8rem}.xl\:-inset-y-36{top:-9rem;bottom:-9rem}.xl\:-inset-y-40{top:-10rem;bottom:-10rem}.xl\:-inset-y-44{top:-11rem;bottom:-11rem}.xl\:-inset-y-48{top:-12rem;bottom:-12rem}.xl\:-inset-y-52{top:-13rem;bottom:-13rem}.xl\:-inset-y-56{top:-14rem;bottom:-14rem}.xl\:-inset-y-60{top:-15rem;bottom:-15rem}.xl\:-inset-y-64{top:-16rem;bottom:-16rem}.xl\:-inset-y-72{top:-18rem;bottom:-18rem}.xl\:-inset-y-80{top:-20rem;bottom:-20rem}.xl\:-inset-y-96{top:-24rem;bottom:-24rem}.xl\:-inset-y-px{top:-1px;bottom:-1px}.xl\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.xl\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.xl\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.xl\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.xl\:inset-y-1\/2{top:50%;bottom:50%}.xl\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.xl\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.xl\:inset-y-1\/4{top:25%;bottom:25%}.xl\:inset-y-2\/4{top:50%;bottom:50%}.xl\:inset-y-3\/4{top:75%;bottom:75%}.xl\:inset-y-full{top:100%;bottom:100%}.xl\:-inset-y-1\/2{top:-50%;bottom:-50%}.xl\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.xl\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.xl\:-inset-y-1\/4{top:-25%;bottom:-25%}.xl\:-inset-y-2\/4{top:-50%;bottom:-50%}.xl\:-inset-y-3\/4{top:-75%;bottom:-75%}.xl\:-inset-y-full{top:-100%;bottom:-100%}.xl\:top-0{top:0}.xl\:top-1{top:.25rem}.xl\:top-2{top:.5rem}.xl\:top-3{top:.75rem}.xl\:top-4{top:1rem}.xl\:top-5{top:1.25rem}.xl\:top-6{top:1.5rem}.xl\:top-7{top:1.75rem}.xl\:top-8{top:2rem}.xl\:top-9{top:2.25rem}.xl\:top-10{top:2.5rem}.xl\:top-11{top:2.75rem}.xl\:top-12{top:3rem}.xl\:top-14{top:3.5rem}.xl\:top-16{top:4rem}.xl\:top-20{top:5rem}.xl\:top-24{top:6rem}.xl\:top-28{top:7rem}.xl\:top-32{top:8rem}.xl\:top-36{top:9rem}.xl\:top-40{top:10rem}.xl\:top-44{top:11rem}.xl\:top-48{top:12rem}.xl\:top-52{top:13rem}.xl\:top-56{top:14rem}.xl\:top-60{top:15rem}.xl\:top-64{top:16rem}.xl\:top-72{top:18rem}.xl\:top-80{top:20rem}.xl\:top-96{top:24rem}.xl\:top-auto{top:auto}.xl\:top-px{top:1px}.xl\:top-0\.5{top:.125rem}.xl\:top-1\.5{top:.375rem}.xl\:top-2\.5{top:.625rem}.xl\:top-3\.5{top:.875rem}.xl\:-top-0{top:0}.xl\:-top-1{top:-.25rem}.xl\:-top-2{top:-.5rem}.xl\:-top-3{top:-.75rem}.xl\:-top-4{top:-1rem}.xl\:-top-5{top:-1.25rem}.xl\:-top-6{top:-1.5rem}.xl\:-top-7{top:-1.75rem}.xl\:-top-8{top:-2rem}.xl\:-top-9{top:-2.25rem}.xl\:-top-10{top:-2.5rem}.xl\:-top-11{top:-2.75rem}.xl\:-top-12{top:-3rem}.xl\:-top-14{top:-3.5rem}.xl\:-top-16{top:-4rem}.xl\:-top-20{top:-5rem}.xl\:-top-24{top:-6rem}.xl\:-top-28{top:-7rem}.xl\:-top-32{top:-8rem}.xl\:-top-36{top:-9rem}.xl\:-top-40{top:-10rem}.xl\:-top-44{top:-11rem}.xl\:-top-48{top:-12rem}.xl\:-top-52{top:-13rem}.xl\:-top-56{top:-14rem}.xl\:-top-60{top:-15rem}.xl\:-top-64{top:-16rem}.xl\:-top-72{top:-18rem}.xl\:-top-80{top:-20rem}.xl\:-top-96{top:-24rem}.xl\:-top-px{top:-1px}.xl\:-top-0\.5{top:-.125rem}.xl\:-top-1\.5{top:-.375rem}.xl\:-top-2\.5{top:-.625rem}.xl\:-top-3\.5{top:-.875rem}.xl\:top-1\/2{top:50%}.xl\:top-1\/3{top:33.333333%}.xl\:top-2\/3{top:66.666667%}.xl\:top-1\/4{top:25%}.xl\:top-2\/4{top:50%}.xl\:top-3\/4{top:75%}.xl\:top-full{top:100%}.xl\:-top-1\/2{top:-50%}.xl\:-top-1\/3{top:-33.333333%}.xl\:-top-2\/3{top:-66.666667%}.xl\:-top-1\/4{top:-25%}.xl\:-top-2\/4{top:-50%}.xl\:-top-3\/4{top:-75%}.xl\:-top-full{top:-100%}.xl\:right-0{right:0}.xl\:right-1{right:.25rem}.xl\:right-2{right:.5rem}.xl\:right-3{right:.75rem}.xl\:right-4{right:1rem}.xl\:right-5{right:1.25rem}.xl\:right-6{right:1.5rem}.xl\:right-7{right:1.75rem}.xl\:right-8{right:2rem}.xl\:right-9{right:2.25rem}.xl\:right-10{right:2.5rem}.xl\:right-11{right:2.75rem}.xl\:right-12{right:3rem}.xl\:right-14{right:3.5rem}.xl\:right-16{right:4rem}.xl\:right-20{right:5rem}.xl\:right-24{right:6rem}.xl\:right-28{right:7rem}.xl\:right-32{right:8rem}.xl\:right-36{right:9rem}.xl\:right-40{right:10rem}.xl\:right-44{right:11rem}.xl\:right-48{right:12rem}.xl\:right-52{right:13rem}.xl\:right-56{right:14rem}.xl\:right-60{right:15rem}.xl\:right-64{right:16rem}.xl\:right-72{right:18rem}.xl\:right-80{right:20rem}.xl\:right-96{right:24rem}.xl\:right-auto{right:auto}.xl\:right-px{right:1px}.xl\:right-0\.5{right:.125rem}.xl\:right-1\.5{right:.375rem}.xl\:right-2\.5{right:.625rem}.xl\:right-3\.5{right:.875rem}.xl\:-right-0{right:0}.xl\:-right-1{right:-.25rem}.xl\:-right-2{right:-.5rem}.xl\:-right-3{right:-.75rem}.xl\:-right-4{right:-1rem}.xl\:-right-5{right:-1.25rem}.xl\:-right-6{right:-1.5rem}.xl\:-right-7{right:-1.75rem}.xl\:-right-8{right:-2rem}.xl\:-right-9{right:-2.25rem}.xl\:-right-10{right:-2.5rem}.xl\:-right-11{right:-2.75rem}.xl\:-right-12{right:-3rem}.xl\:-right-14{right:-3.5rem}.xl\:-right-16{right:-4rem}.xl\:-right-20{right:-5rem}.xl\:-right-24{right:-6rem}.xl\:-right-28{right:-7rem}.xl\:-right-32{right:-8rem}.xl\:-right-36{right:-9rem}.xl\:-right-40{right:-10rem}.xl\:-right-44{right:-11rem}.xl\:-right-48{right:-12rem}.xl\:-right-52{right:-13rem}.xl\:-right-56{right:-14rem}.xl\:-right-60{right:-15rem}.xl\:-right-64{right:-16rem}.xl\:-right-72{right:-18rem}.xl\:-right-80{right:-20rem}.xl\:-right-96{right:-24rem}.xl\:-right-px{right:-1px}.xl\:-right-0\.5{right:-.125rem}.xl\:-right-1\.5{right:-.375rem}.xl\:-right-2\.5{right:-.625rem}.xl\:-right-3\.5{right:-.875rem}.xl\:right-1\/2{right:50%}.xl\:right-1\/3{right:33.333333%}.xl\:right-2\/3{right:66.666667%}.xl\:right-1\/4{right:25%}.xl\:right-2\/4{right:50%}.xl\:right-3\/4{right:75%}.xl\:right-full{right:100%}.xl\:-right-1\/2{right:-50%}.xl\:-right-1\/3{right:-33.333333%}.xl\:-right-2\/3{right:-66.666667%}.xl\:-right-1\/4{right:-25%}.xl\:-right-2\/4{right:-50%}.xl\:-right-3\/4{right:-75%}.xl\:-right-full{right:-100%}.xl\:bottom-0{bottom:0}.xl\:bottom-1{bottom:.25rem}.xl\:bottom-2{bottom:.5rem}.xl\:bottom-3{bottom:.75rem}.xl\:bottom-4{bottom:1rem}.xl\:bottom-5{bottom:1.25rem}.xl\:bottom-6{bottom:1.5rem}.xl\:bottom-7{bottom:1.75rem}.xl\:bottom-8{bottom:2rem}.xl\:bottom-9{bottom:2.25rem}.xl\:bottom-10{bottom:2.5rem}.xl\:bottom-11{bottom:2.75rem}.xl\:bottom-12{bottom:3rem}.xl\:bottom-14{bottom:3.5rem}.xl\:bottom-16{bottom:4rem}.xl\:bottom-20{bottom:5rem}.xl\:bottom-24{bottom:6rem}.xl\:bottom-28{bottom:7rem}.xl\:bottom-32{bottom:8rem}.xl\:bottom-36{bottom:9rem}.xl\:bottom-40{bottom:10rem}.xl\:bottom-44{bottom:11rem}.xl\:bottom-48{bottom:12rem}.xl\:bottom-52{bottom:13rem}.xl\:bottom-56{bottom:14rem}.xl\:bottom-60{bottom:15rem}.xl\:bottom-64{bottom:16rem}.xl\:bottom-72{bottom:18rem}.xl\:bottom-80{bottom:20rem}.xl\:bottom-96{bottom:24rem}.xl\:bottom-auto{bottom:auto}.xl\:bottom-px{bottom:1px}.xl\:bottom-0\.5{bottom:.125rem}.xl\:bottom-1\.5{bottom:.375rem}.xl\:bottom-2\.5{bottom:.625rem}.xl\:bottom-3\.5{bottom:.875rem}.xl\:-bottom-0{bottom:0}.xl\:-bottom-1{bottom:-.25rem}.xl\:-bottom-2{bottom:-.5rem}.xl\:-bottom-3{bottom:-.75rem}.xl\:-bottom-4{bottom:-1rem}.xl\:-bottom-5{bottom:-1.25rem}.xl\:-bottom-6{bottom:-1.5rem}.xl\:-bottom-7{bottom:-1.75rem}.xl\:-bottom-8{bottom:-2rem}.xl\:-bottom-9{bottom:-2.25rem}.xl\:-bottom-10{bottom:-2.5rem}.xl\:-bottom-11{bottom:-2.75rem}.xl\:-bottom-12{bottom:-3rem}.xl\:-bottom-14{bottom:-3.5rem}.xl\:-bottom-16{bottom:-4rem}.xl\:-bottom-20{bottom:-5rem}.xl\:-bottom-24{bottom:-6rem}.xl\:-bottom-28{bottom:-7rem}.xl\:-bottom-32{bottom:-8rem}.xl\:-bottom-36{bottom:-9rem}.xl\:-bottom-40{bottom:-10rem}.xl\:-bottom-44{bottom:-11rem}.xl\:-bottom-48{bottom:-12rem}.xl\:-bottom-52{bottom:-13rem}.xl\:-bottom-56{bottom:-14rem}.xl\:-bottom-60{bottom:-15rem}.xl\:-bottom-64{bottom:-16rem}.xl\:-bottom-72{bottom:-18rem}.xl\:-bottom-80{bottom:-20rem}.xl\:-bottom-96{bottom:-24rem}.xl\:-bottom-px{bottom:-1px}.xl\:-bottom-0\.5{bottom:-.125rem}.xl\:-bottom-1\.5{bottom:-.375rem}.xl\:-bottom-2\.5{bottom:-.625rem}.xl\:-bottom-3\.5{bottom:-.875rem}.xl\:bottom-1\/2{bottom:50%}.xl\:bottom-1\/3{bottom:33.333333%}.xl\:bottom-2\/3{bottom:66.666667%}.xl\:bottom-1\/4{bottom:25%}.xl\:bottom-2\/4{bottom:50%}.xl\:bottom-3\/4{bottom:75%}.xl\:bottom-full{bottom:100%}.xl\:-bottom-1\/2{bottom:-50%}.xl\:-bottom-1\/3{bottom:-33.333333%}.xl\:-bottom-2\/3{bottom:-66.666667%}.xl\:-bottom-1\/4{bottom:-25%}.xl\:-bottom-2\/4{bottom:-50%}.xl\:-bottom-3\/4{bottom:-75%}.xl\:-bottom-full{bottom:-100%}.xl\:left-0{left:0}.xl\:left-1{left:.25rem}.xl\:left-2{left:.5rem}.xl\:left-3{left:.75rem}.xl\:left-4{left:1rem}.xl\:left-5{left:1.25rem}.xl\:left-6{left:1.5rem}.xl\:left-7{left:1.75rem}.xl\:left-8{left:2rem}.xl\:left-9{left:2.25rem}.xl\:left-10{left:2.5rem}.xl\:left-11{left:2.75rem}.xl\:left-12{left:3rem}.xl\:left-14{left:3.5rem}.xl\:left-16{left:4rem}.xl\:left-20{left:5rem}.xl\:left-24{left:6rem}.xl\:left-28{left:7rem}.xl\:left-32{left:8rem}.xl\:left-36{left:9rem}.xl\:left-40{left:10rem}.xl\:left-44{left:11rem}.xl\:left-48{left:12rem}.xl\:left-52{left:13rem}.xl\:left-56{left:14rem}.xl\:left-60{left:15rem}.xl\:left-64{left:16rem}.xl\:left-72{left:18rem}.xl\:left-80{left:20rem}.xl\:left-96{left:24rem}.xl\:left-auto{left:auto}.xl\:left-px{left:1px}.xl\:left-0\.5{left:.125rem}.xl\:left-1\.5{left:.375rem}.xl\:left-2\.5{left:.625rem}.xl\:left-3\.5{left:.875rem}.xl\:-left-0{left:0}.xl\:-left-1{left:-.25rem}.xl\:-left-2{left:-.5rem}.xl\:-left-3{left:-.75rem}.xl\:-left-4{left:-1rem}.xl\:-left-5{left:-1.25rem}.xl\:-left-6{left:-1.5rem}.xl\:-left-7{left:-1.75rem}.xl\:-left-8{left:-2rem}.xl\:-left-9{left:-2.25rem}.xl\:-left-10{left:-2.5rem}.xl\:-left-11{left:-2.75rem}.xl\:-left-12{left:-3rem}.xl\:-left-14{left:-3.5rem}.xl\:-left-16{left:-4rem}.xl\:-left-20{left:-5rem}.xl\:-left-24{left:-6rem}.xl\:-left-28{left:-7rem}.xl\:-left-32{left:-8rem}.xl\:-left-36{left:-9rem}.xl\:-left-40{left:-10rem}.xl\:-left-44{left:-11rem}.xl\:-left-48{left:-12rem}.xl\:-left-52{left:-13rem}.xl\:-left-56{left:-14rem}.xl\:-left-60{left:-15rem}.xl\:-left-64{left:-16rem}.xl\:-left-72{left:-18rem}.xl\:-left-80{left:-20rem}.xl\:-left-96{left:-24rem}.xl\:-left-px{left:-1px}.xl\:-left-0\.5{left:-.125rem}.xl\:-left-1\.5{left:-.375rem}.xl\:-left-2\.5{left:-.625rem}.xl\:-left-3\.5{left:-.875rem}.xl\:left-1\/2{left:50%}.xl\:left-1\/3{left:33.333333%}.xl\:left-2\/3{left:66.666667%}.xl\:left-1\/4{left:25%}.xl\:left-2\/4{left:50%}.xl\:left-3\/4{left:75%}.xl\:left-full{left:100%}.xl\:-left-1\/2{left:-50%}.xl\:-left-1\/3{left:-33.333333%}.xl\:-left-2\/3{left:-66.666667%}.xl\:-left-1\/4{left:-25%}.xl\:-left-2\/4{left:-50%}.xl\:-left-3\/4{left:-75%}.xl\:-left-full{left:-100%}.xl\:isolate{isolation:isolate}.xl\:isolation-auto{isolation:auto}.xl\:z-0{z-index:0}.xl\:z-10{z-index:10}.xl\:z-20{z-index:20}.xl\:z-30{z-index:30}.xl\:z-40{z-index:40}.xl\:z-50{z-index:50}.xl\:z-auto{z-index:auto}.xl\:focus-within\:z-0:focus-within{z-index:0}.xl\:focus-within\:z-10:focus-within{z-index:10}.xl\:focus-within\:z-20:focus-within{z-index:20}.xl\:focus-within\:z-30:focus-within{z-index:30}.xl\:focus-within\:z-40:focus-within{z-index:40}.xl\:focus-within\:z-50:focus-within{z-index:50}.xl\:focus-within\:z-auto:focus-within{z-index:auto}.xl\:focus\:z-0:focus{z-index:0}.xl\:focus\:z-10:focus{z-index:10}.xl\:focus\:z-20:focus{z-index:20}.xl\:focus\:z-30:focus{z-index:30}.xl\:focus\:z-40:focus{z-index:40}.xl\:focus\:z-50:focus{z-index:50}.xl\:focus\:z-auto:focus{z-index:auto}.xl\:order-1{order:1}.xl\:order-2{order:2}.xl\:order-3{order:3}.xl\:order-4{order:4}.xl\:order-5{order:5}.xl\:order-6{order:6}.xl\:order-7{order:7}.xl\:order-8{order:8}.xl\:order-9{order:9}.xl\:order-10{order:10}.xl\:order-11{order:11}.xl\:order-12{order:12}.xl\:order-first{order:-9999}.xl\:order-last{order:9999}.xl\:order-none{order:0}.xl\:col-auto{grid-column:auto}.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:col-span-9{grid-column:span 9/span 9}.xl\:col-span-10{grid-column:span 10/span 10}.xl\:col-span-11{grid-column:span 11/span 11}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:col-start-3{grid-column-start:3}.xl\:col-start-4{grid-column-start:4}.xl\:col-start-5{grid-column-start:5}.xl\:col-start-6{grid-column-start:6}.xl\:col-start-7{grid-column-start:7}.xl\:col-start-8{grid-column-start:8}.xl\:col-start-9{grid-column-start:9}.xl\:col-start-10{grid-column-start:10}.xl\:col-start-11{grid-column-start:11}.xl\:col-start-12{grid-column-start:12}.xl\:col-start-13{grid-column-start:13}.xl\:col-start-auto{grid-column-start:auto}.xl\:col-end-1{grid-column-end:1}.xl\:col-end-2{grid-column-end:2}.xl\:col-end-3{grid-column-end:3}.xl\:col-end-4{grid-column-end:4}.xl\:col-end-5{grid-column-end:5}.xl\:col-end-6{grid-column-end:6}.xl\:col-end-7{grid-column-end:7}.xl\:col-end-8{grid-column-end:8}.xl\:col-end-9{grid-column-end:9}.xl\:col-end-10{grid-column-end:10}.xl\:col-end-11{grid-column-end:11}.xl\:col-end-12{grid-column-end:12}.xl\:col-end-13{grid-column-end:13}.xl\:col-end-auto{grid-column-end:auto}.xl\:row-auto{grid-row:auto}.xl\:row-span-1{grid-row:span 1/span 1}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-span-3{grid-row:span 3/span 3}.xl\:row-span-4{grid-row:span 4/span 4}.xl\:row-span-5{grid-row:span 5/span 5}.xl\:row-span-6{grid-row:span 6/span 6}.xl\:row-span-full{grid-row:1/-1}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:row-start-3{grid-row-start:3}.xl\:row-start-4{grid-row-start:4}.xl\:row-start-5{grid-row-start:5}.xl\:row-start-6{grid-row-start:6}.xl\:row-start-7{grid-row-start:7}.xl\:row-start-auto{grid-row-start:auto}.xl\:row-end-1{grid-row-end:1}.xl\:row-end-2{grid-row-end:2}.xl\:row-end-3{grid-row-end:3}.xl\:row-end-4{grid-row-end:4}.xl\:row-end-5{grid-row-end:5}.xl\:row-end-6{grid-row-end:6}.xl\:row-end-7{grid-row-end:7}.xl\:row-end-auto{grid-row-end:auto}.xl\:float-right{float:right}.xl\:float-left{float:left}.xl\:float-none{float:none}.xl\:clear-left{clear:left}.xl\:clear-right{clear:right}.xl\:clear-both{clear:both}.xl\:clear-none{clear:none}.xl\:m-0{margin:0}.xl\:m-1{margin:.25rem}.xl\:m-2{margin:.5rem}.xl\:m-3{margin:.75rem}.xl\:m-4{margin:1rem}.xl\:m-5{margin:1.25rem}.xl\:m-6{margin:1.5rem}.xl\:m-7{margin:1.75rem}.xl\:m-8{margin:2rem}.xl\:m-9{margin:2.25rem}.xl\:m-10{margin:2.5rem}.xl\:m-11{margin:2.75rem}.xl\:m-12{margin:3rem}.xl\:m-14{margin:3.5rem}.xl\:m-16{margin:4rem}.xl\:m-20{margin:5rem}.xl\:m-24{margin:6rem}.xl\:m-28{margin:7rem}.xl\:m-32{margin:8rem}.xl\:m-36{margin:9rem}.xl\:m-40{margin:10rem}.xl\:m-44{margin:11rem}.xl\:m-48{margin:12rem}.xl\:m-52{margin:13rem}.xl\:m-56{margin:14rem}.xl\:m-60{margin:15rem}.xl\:m-64{margin:16rem}.xl\:m-72{margin:18rem}.xl\:m-80{margin:20rem}.xl\:m-96{margin:24rem}.xl\:m-auto{margin:auto}.xl\:m-px{margin:1px}.xl\:m-0\.5{margin:.125rem}.xl\:m-1\.5{margin:.375rem}.xl\:m-2\.5{margin:.625rem}.xl\:m-3\.5{margin:.875rem}.xl\:-m-0{margin:0}.xl\:-m-1{margin:-.25rem}.xl\:-m-2{margin:-.5rem}.xl\:-m-3{margin:-.75rem}.xl\:-m-4{margin:-1rem}.xl\:-m-5{margin:-1.25rem}.xl\:-m-6{margin:-1.5rem}.xl\:-m-7{margin:-1.75rem}.xl\:-m-8{margin:-2rem}.xl\:-m-9{margin:-2.25rem}.xl\:-m-10{margin:-2.5rem}.xl\:-m-11{margin:-2.75rem}.xl\:-m-12{margin:-3rem}.xl\:-m-14{margin:-3.5rem}.xl\:-m-16{margin:-4rem}.xl\:-m-20{margin:-5rem}.xl\:-m-24{margin:-6rem}.xl\:-m-28{margin:-7rem}.xl\:-m-32{margin:-8rem}.xl\:-m-36{margin:-9rem}.xl\:-m-40{margin:-10rem}.xl\:-m-44{margin:-11rem}.xl\:-m-48{margin:-12rem}.xl\:-m-52{margin:-13rem}.xl\:-m-56{margin:-14rem}.xl\:-m-60{margin:-15rem}.xl\:-m-64{margin:-16rem}.xl\:-m-72{margin:-18rem}.xl\:-m-80{margin:-20rem}.xl\:-m-96{margin:-24rem}.xl\:-m-px{margin:-1px}.xl\:-m-0\.5{margin:-.125rem}.xl\:-m-1\.5{margin:-.375rem}.xl\:-m-2\.5{margin:-.625rem}.xl\:-m-3\.5{margin:-.875rem}.xl\:mx-0{margin-left:0;margin-right:0}.xl\:mx-1{margin-left:.25rem;margin-right:.25rem}.xl\:mx-2{margin-left:.5rem;margin-right:.5rem}.xl\:mx-3{margin-left:.75rem;margin-right:.75rem}.xl\:mx-4{margin-left:1rem;margin-right:1rem}.xl\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.xl\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mx-8{margin-left:2rem;margin-right:2rem}.xl\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.xl\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.xl\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.xl\:mx-12{margin-left:3rem;margin-right:3rem}.xl\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.xl\:mx-16{margin-left:4rem;margin-right:4rem}.xl\:mx-20{margin-left:5rem;margin-right:5rem}.xl\:mx-24{margin-left:6rem;margin-right:6rem}.xl\:mx-28{margin-left:7rem;margin-right:7rem}.xl\:mx-32{margin-left:8rem;margin-right:8rem}.xl\:mx-36{margin-left:9rem;margin-right:9rem}.xl\:mx-40{margin-left:10rem;margin-right:10rem}.xl\:mx-44{margin-left:11rem;margin-right:11rem}.xl\:mx-48{margin-left:12rem;margin-right:12rem}.xl\:mx-52{margin-left:13rem;margin-right:13rem}.xl\:mx-56{margin-left:14rem;margin-right:14rem}.xl\:mx-60{margin-left:15rem;margin-right:15rem}.xl\:mx-64{margin-left:16rem;margin-right:16rem}.xl\:mx-72{margin-left:18rem;margin-right:18rem}.xl\:mx-80{margin-left:20rem;margin-right:20rem}.xl\:mx-96{margin-left:24rem;margin-right:24rem}.xl\:mx-auto{margin-left:auto;margin-right:auto}.xl\:mx-px{margin-left:1px;margin-right:1px}.xl\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.xl\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.xl\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.xl\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.xl\:-mx-0{margin-left:0;margin-right:0}.xl\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.xl\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.xl\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.xl\:-mx-4{margin-left:-1rem;margin-right:-1rem}.xl\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.xl\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.xl\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.xl\:-mx-8{margin-left:-2rem;margin-right:-2rem}.xl\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.xl\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.xl\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.xl\:-mx-12{margin-left:-3rem;margin-right:-3rem}.xl\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.xl\:-mx-16{margin-left:-4rem;margin-right:-4rem}.xl\:-mx-20{margin-left:-5rem;margin-right:-5rem}.xl\:-mx-24{margin-left:-6rem;margin-right:-6rem}.xl\:-mx-28{margin-left:-7rem;margin-right:-7rem}.xl\:-mx-32{margin-left:-8rem;margin-right:-8rem}.xl\:-mx-36{margin-left:-9rem;margin-right:-9rem}.xl\:-mx-40{margin-left:-10rem;margin-right:-10rem}.xl\:-mx-44{margin-left:-11rem;margin-right:-11rem}.xl\:-mx-48{margin-left:-12rem;margin-right:-12rem}.xl\:-mx-52{margin-left:-13rem;margin-right:-13rem}.xl\:-mx-56{margin-left:-14rem;margin-right:-14rem}.xl\:-mx-60{margin-left:-15rem;margin-right:-15rem}.xl\:-mx-64{margin-left:-16rem;margin-right:-16rem}.xl\:-mx-72{margin-left:-18rem;margin-right:-18rem}.xl\:-mx-80{margin-left:-20rem;margin-right:-20rem}.xl\:-mx-96{margin-left:-24rem;margin-right:-24rem}.xl\:-mx-px{margin-left:-1px;margin-right:-1px}.xl\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.xl\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.xl\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.xl\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.xl\:my-0{margin-top:0;margin-bottom:0}.xl\:my-1{margin-top:.25rem;margin-bottom:.25rem}.xl\:my-2{margin-top:.5rem;margin-bottom:.5rem}.xl\:my-3{margin-top:.75rem;margin-bottom:.75rem}.xl\:my-4{margin-top:1rem;margin-bottom:1rem}.xl\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.xl\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.xl\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.xl\:my-8{margin-top:2rem;margin-bottom:2rem}.xl\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.xl\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.xl\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.xl\:my-12{margin-top:3rem;margin-bottom:3rem}.xl\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.xl\:my-16{margin-top:4rem;margin-bottom:4rem}.xl\:my-20{margin-top:5rem;margin-bottom:5rem}.xl\:my-24{margin-top:6rem;margin-bottom:6rem}.xl\:my-28{margin-top:7rem;margin-bottom:7rem}.xl\:my-32{margin-top:8rem;margin-bottom:8rem}.xl\:my-36{margin-top:9rem;margin-bottom:9rem}.xl\:my-40{margin-top:10rem;margin-bottom:10rem}.xl\:my-44{margin-top:11rem;margin-bottom:11rem}.xl\:my-48{margin-top:12rem;margin-bottom:12rem}.xl\:my-52{margin-top:13rem;margin-bottom:13rem}.xl\:my-56{margin-top:14rem;margin-bottom:14rem}.xl\:my-60{margin-top:15rem;margin-bottom:15rem}.xl\:my-64{margin-top:16rem;margin-bottom:16rem}.xl\:my-72{margin-top:18rem;margin-bottom:18rem}.xl\:my-80{margin-top:20rem;margin-bottom:20rem}.xl\:my-96{margin-top:24rem;margin-bottom:24rem}.xl\:my-auto{margin-top:auto;margin-bottom:auto}.xl\:my-px{margin-top:1px;margin-bottom:1px}.xl\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.xl\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.xl\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.xl\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.xl\:-my-0{margin-top:0;margin-bottom:0}.xl\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.xl\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.xl\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.xl\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.xl\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.xl\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.xl\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.xl\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.xl\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.xl\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.xl\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.xl\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.xl\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.xl\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.xl\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.xl\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.xl\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.xl\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.xl\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.xl\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.xl\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.xl\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.xl\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.xl\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.xl\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.xl\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.xl\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.xl\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.xl\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.xl\:-my-px{margin-top:-1px;margin-bottom:-1px}.xl\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.xl\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.xl\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.xl\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.xl\:mt-0{margin-top:0}.xl\:mt-1{margin-top:.25rem}.xl\:mt-2{margin-top:.5rem}.xl\:mt-3{margin-top:.75rem}.xl\:mt-4{margin-top:1rem}.xl\:mt-5{margin-top:1.25rem}.xl\:mt-6{margin-top:1.5rem}.xl\:mt-7{margin-top:1.75rem}.xl\:mt-8{margin-top:2rem}.xl\:mt-9{margin-top:2.25rem}.xl\:mt-10{margin-top:2.5rem}.xl\:mt-11{margin-top:2.75rem}.xl\:mt-12{margin-top:3rem}.xl\:mt-14{margin-top:3.5rem}.xl\:mt-16{margin-top:4rem}.xl\:mt-20{margin-top:5rem}.xl\:mt-24{margin-top:6rem}.xl\:mt-28{margin-top:7rem}.xl\:mt-32{margin-top:8rem}.xl\:mt-36{margin-top:9rem}.xl\:mt-40{margin-top:10rem}.xl\:mt-44{margin-top:11rem}.xl\:mt-48{margin-top:12rem}.xl\:mt-52{margin-top:13rem}.xl\:mt-56{margin-top:14rem}.xl\:mt-60{margin-top:15rem}.xl\:mt-64{margin-top:16rem}.xl\:mt-72{margin-top:18rem}.xl\:mt-80{margin-top:20rem}.xl\:mt-96{margin-top:24rem}.xl\:mt-auto{margin-top:auto}.xl\:mt-px{margin-top:1px}.xl\:mt-0\.5{margin-top:.125rem}.xl\:mt-1\.5{margin-top:.375rem}.xl\:mt-2\.5{margin-top:.625rem}.xl\:mt-3\.5{margin-top:.875rem}.xl\:-mt-0{margin-top:0}.xl\:-mt-1{margin-top:-.25rem}.xl\:-mt-2{margin-top:-.5rem}.xl\:-mt-3{margin-top:-.75rem}.xl\:-mt-4{margin-top:-1rem}.xl\:-mt-5{margin-top:-1.25rem}.xl\:-mt-6{margin-top:-1.5rem}.xl\:-mt-7{margin-top:-1.75rem}.xl\:-mt-8{margin-top:-2rem}.xl\:-mt-9{margin-top:-2.25rem}.xl\:-mt-10{margin-top:-2.5rem}.xl\:-mt-11{margin-top:-2.75rem}.xl\:-mt-12{margin-top:-3rem}.xl\:-mt-14{margin-top:-3.5rem}.xl\:-mt-16{margin-top:-4rem}.xl\:-mt-20{margin-top:-5rem}.xl\:-mt-24{margin-top:-6rem}.xl\:-mt-28{margin-top:-7rem}.xl\:-mt-32{margin-top:-8rem}.xl\:-mt-36{margin-top:-9rem}.xl\:-mt-40{margin-top:-10rem}.xl\:-mt-44{margin-top:-11rem}.xl\:-mt-48{margin-top:-12rem}.xl\:-mt-52{margin-top:-13rem}.xl\:-mt-56{margin-top:-14rem}.xl\:-mt-60{margin-top:-15rem}.xl\:-mt-64{margin-top:-16rem}.xl\:-mt-72{margin-top:-18rem}.xl\:-mt-80{margin-top:-20rem}.xl\:-mt-96{margin-top:-24rem}.xl\:-mt-px{margin-top:-1px}.xl\:-mt-0\.5{margin-top:-.125rem}.xl\:-mt-1\.5{margin-top:-.375rem}.xl\:-mt-2\.5{margin-top:-.625rem}.xl\:-mt-3\.5{margin-top:-.875rem}.xl\:mr-0{margin-right:0}.xl\:mr-1{margin-right:.25rem}.xl\:mr-2{margin-right:.5rem}.xl\:mr-3{margin-right:.75rem}.xl\:mr-4{margin-right:1rem}.xl\:mr-5{margin-right:1.25rem}.xl\:mr-6{margin-right:1.5rem}.xl\:mr-7{margin-right:1.75rem}.xl\:mr-8{margin-right:2rem}.xl\:mr-9{margin-right:2.25rem}.xl\:mr-10{margin-right:2.5rem}.xl\:mr-11{margin-right:2.75rem}.xl\:mr-12{margin-right:3rem}.xl\:mr-14{margin-right:3.5rem}.xl\:mr-16{margin-right:4rem}.xl\:mr-20{margin-right:5rem}.xl\:mr-24{margin-right:6rem}.xl\:mr-28{margin-right:7rem}.xl\:mr-32{margin-right:8rem}.xl\:mr-36{margin-right:9rem}.xl\:mr-40{margin-right:10rem}.xl\:mr-44{margin-right:11rem}.xl\:mr-48{margin-right:12rem}.xl\:mr-52{margin-right:13rem}.xl\:mr-56{margin-right:14rem}.xl\:mr-60{margin-right:15rem}.xl\:mr-64{margin-right:16rem}.xl\:mr-72{margin-right:18rem}.xl\:mr-80{margin-right:20rem}.xl\:mr-96{margin-right:24rem}.xl\:mr-auto{margin-right:auto}.xl\:mr-px{margin-right:1px}.xl\:mr-0\.5{margin-right:.125rem}.xl\:mr-1\.5{margin-right:.375rem}.xl\:mr-2\.5{margin-right:.625rem}.xl\:mr-3\.5{margin-right:.875rem}.xl\:-mr-0{margin-right:0}.xl\:-mr-1{margin-right:-.25rem}.xl\:-mr-2{margin-right:-.5rem}.xl\:-mr-3{margin-right:-.75rem}.xl\:-mr-4{margin-right:-1rem}.xl\:-mr-5{margin-right:-1.25rem}.xl\:-mr-6{margin-right:-1.5rem}.xl\:-mr-7{margin-right:-1.75rem}.xl\:-mr-8{margin-right:-2rem}.xl\:-mr-9{margin-right:-2.25rem}.xl\:-mr-10{margin-right:-2.5rem}.xl\:-mr-11{margin-right:-2.75rem}.xl\:-mr-12{margin-right:-3rem}.xl\:-mr-14{margin-right:-3.5rem}.xl\:-mr-16{margin-right:-4rem}.xl\:-mr-20{margin-right:-5rem}.xl\:-mr-24{margin-right:-6rem}.xl\:-mr-28{margin-right:-7rem}.xl\:-mr-32{margin-right:-8rem}.xl\:-mr-36{margin-right:-9rem}.xl\:-mr-40{margin-right:-10rem}.xl\:-mr-44{margin-right:-11rem}.xl\:-mr-48{margin-right:-12rem}.xl\:-mr-52{margin-right:-13rem}.xl\:-mr-56{margin-right:-14rem}.xl\:-mr-60{margin-right:-15rem}.xl\:-mr-64{margin-right:-16rem}.xl\:-mr-72{margin-right:-18rem}.xl\:-mr-80{margin-right:-20rem}.xl\:-mr-96{margin-right:-24rem}.xl\:-mr-px{margin-right:-1px}.xl\:-mr-0\.5{margin-right:-.125rem}.xl\:-mr-1\.5{margin-right:-.375rem}.xl\:-mr-2\.5{margin-right:-.625rem}.xl\:-mr-3\.5{margin-right:-.875rem}.xl\:mb-0{margin-bottom:0}.xl\:mb-1{margin-bottom:.25rem}.xl\:mb-2{margin-bottom:.5rem}.xl\:mb-3{margin-bottom:.75rem}.xl\:mb-4{margin-bottom:1rem}.xl\:mb-5{margin-bottom:1.25rem}.xl\:mb-6{margin-bottom:1.5rem}.xl\:mb-7{margin-bottom:1.75rem}.xl\:mb-8{margin-bottom:2rem}.xl\:mb-9{margin-bottom:2.25rem}.xl\:mb-10{margin-bottom:2.5rem}.xl\:mb-11{margin-bottom:2.75rem}.xl\:mb-12{margin-bottom:3rem}.xl\:mb-14{margin-bottom:3.5rem}.xl\:mb-16{margin-bottom:4rem}.xl\:mb-20{margin-bottom:5rem}.xl\:mb-24{margin-bottom:6rem}.xl\:mb-28{margin-bottom:7rem}.xl\:mb-32{margin-bottom:8rem}.xl\:mb-36{margin-bottom:9rem}.xl\:mb-40{margin-bottom:10rem}.xl\:mb-44{margin-bottom:11rem}.xl\:mb-48{margin-bottom:12rem}.xl\:mb-52{margin-bottom:13rem}.xl\:mb-56{margin-bottom:14rem}.xl\:mb-60{margin-bottom:15rem}.xl\:mb-64{margin-bottom:16rem}.xl\:mb-72{margin-bottom:18rem}.xl\:mb-80{margin-bottom:20rem}.xl\:mb-96{margin-bottom:24rem}.xl\:mb-auto{margin-bottom:auto}.xl\:mb-px{margin-bottom:1px}.xl\:mb-0\.5{margin-bottom:.125rem}.xl\:mb-1\.5{margin-bottom:.375rem}.xl\:mb-2\.5{margin-bottom:.625rem}.xl\:mb-3\.5{margin-bottom:.875rem}.xl\:-mb-0{margin-bottom:0}.xl\:-mb-1{margin-bottom:-.25rem}.xl\:-mb-2{margin-bottom:-.5rem}.xl\:-mb-3{margin-bottom:-.75rem}.xl\:-mb-4{margin-bottom:-1rem}.xl\:-mb-5{margin-bottom:-1.25rem}.xl\:-mb-6{margin-bottom:-1.5rem}.xl\:-mb-7{margin-bottom:-1.75rem}.xl\:-mb-8{margin-bottom:-2rem}.xl\:-mb-9{margin-bottom:-2.25rem}.xl\:-mb-10{margin-bottom:-2.5rem}.xl\:-mb-11{margin-bottom:-2.75rem}.xl\:-mb-12{margin-bottom:-3rem}.xl\:-mb-14{margin-bottom:-3.5rem}.xl\:-mb-16{margin-bottom:-4rem}.xl\:-mb-20{margin-bottom:-5rem}.xl\:-mb-24{margin-bottom:-6rem}.xl\:-mb-28{margin-bottom:-7rem}.xl\:-mb-32{margin-bottom:-8rem}.xl\:-mb-36{margin-bottom:-9rem}.xl\:-mb-40{margin-bottom:-10rem}.xl\:-mb-44{margin-bottom:-11rem}.xl\:-mb-48{margin-bottom:-12rem}.xl\:-mb-52{margin-bottom:-13rem}.xl\:-mb-56{margin-bottom:-14rem}.xl\:-mb-60{margin-bottom:-15rem}.xl\:-mb-64{margin-bottom:-16rem}.xl\:-mb-72{margin-bottom:-18rem}.xl\:-mb-80{margin-bottom:-20rem}.xl\:-mb-96{margin-bottom:-24rem}.xl\:-mb-px{margin-bottom:-1px}.xl\:-mb-0\.5{margin-bottom:-.125rem}.xl\:-mb-1\.5{margin-bottom:-.375rem}.xl\:-mb-2\.5{margin-bottom:-.625rem}.xl\:-mb-3\.5{margin-bottom:-.875rem}.xl\:ml-0{margin-left:0}.xl\:ml-1{margin-left:.25rem}.xl\:ml-2{margin-left:.5rem}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-5{margin-left:1.25rem}.xl\:ml-6{margin-left:1.5rem}.xl\:ml-7{margin-left:1.75rem}.xl\:ml-8{margin-left:2rem}.xl\:ml-9{margin-left:2.25rem}.xl\:ml-10{margin-left:2.5rem}.xl\:ml-11{margin-left:2.75rem}.xl\:ml-12{margin-left:3rem}.xl\:ml-14{margin-left:3.5rem}.xl\:ml-16{margin-left:4rem}.xl\:ml-20{margin-left:5rem}.xl\:ml-24{margin-left:6rem}.xl\:ml-28{margin-left:7rem}.xl\:ml-32{margin-left:8rem}.xl\:ml-36{margin-left:9rem}.xl\:ml-40{margin-left:10rem}.xl\:ml-44{margin-left:11rem}.xl\:ml-48{margin-left:12rem}.xl\:ml-52{margin-left:13rem}.xl\:ml-56{margin-left:14rem}.xl\:ml-60{margin-left:15rem}.xl\:ml-64{margin-left:16rem}.xl\:ml-72{margin-left:18rem}.xl\:ml-80{margin-left:20rem}.xl\:ml-96{margin-left:24rem}.xl\:ml-auto{margin-left:auto}.xl\:ml-px{margin-left:1px}.xl\:ml-0\.5{margin-left:.125rem}.xl\:ml-1\.5{margin-left:.375rem}.xl\:ml-2\.5{margin-left:.625rem}.xl\:ml-3\.5{margin-left:.875rem}.xl\:-ml-0{margin-left:0}.xl\:-ml-1{margin-left:-.25rem}.xl\:-ml-2{margin-left:-.5rem}.xl\:-ml-3{margin-left:-.75rem}.xl\:-ml-4{margin-left:-1rem}.xl\:-ml-5{margin-left:-1.25rem}.xl\:-ml-6{margin-left:-1.5rem}.xl\:-ml-7{margin-left:-1.75rem}.xl\:-ml-8{margin-left:-2rem}.xl\:-ml-9{margin-left:-2.25rem}.xl\:-ml-10{margin-left:-2.5rem}.xl\:-ml-11{margin-left:-2.75rem}.xl\:-ml-12{margin-left:-3rem}.xl\:-ml-14{margin-left:-3.5rem}.xl\:-ml-16{margin-left:-4rem}.xl\:-ml-20{margin-left:-5rem}.xl\:-ml-24{margin-left:-6rem}.xl\:-ml-28{margin-left:-7rem}.xl\:-ml-32{margin-left:-8rem}.xl\:-ml-36{margin-left:-9rem}.xl\:-ml-40{margin-left:-10rem}.xl\:-ml-44{margin-left:-11rem}.xl\:-ml-48{margin-left:-12rem}.xl\:-ml-52{margin-left:-13rem}.xl\:-ml-56{margin-left:-14rem}.xl\:-ml-60{margin-left:-15rem}.xl\:-ml-64{margin-left:-16rem}.xl\:-ml-72{margin-left:-18rem}.xl\:-ml-80{margin-left:-20rem}.xl\:-ml-96{margin-left:-24rem}.xl\:-ml-px{margin-left:-1px}.xl\:-ml-0\.5{margin-left:-.125rem}.xl\:-ml-1\.5{margin-left:-.375rem}.xl\:-ml-2\.5{margin-left:-.625rem}.xl\:-ml-3\.5{margin-left:-.875rem}.xl\:box-border{box-sizing:border-box}.xl\:box-content{box-sizing:initial}.xl\:block{display:block}.xl\:inline-block{display:inline-block}.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:inline-flex{display:inline-flex}.xl\:table{display:table}.xl\:inline-table{display:inline-table}.xl\:table-caption{display:table-caption}.xl\:table-cell{display:table-cell}.xl\:table-column{display:table-column}.xl\:table-column-group{display:table-column-group}.xl\:table-footer-group{display:table-footer-group}.xl\:table-header-group{display:table-header-group}.xl\:table-row-group{display:table-row-group}.xl\:table-row{display:table-row}.xl\:flow-root{display:flow-root}.xl\:grid{display:grid}.xl\:inline-grid{display:inline-grid}.xl\:contents{display:contents}.xl\:list-item{display:list-item}.xl\:hidden{display:none}.xl\:h-0{height:0}.xl\:h-1{height:.25rem}.xl\:h-2{height:.5rem}.xl\:h-3{height:.75rem}.xl\:h-4{height:1rem}.xl\:h-5{height:1.25rem}.xl\:h-6{height:1.5rem}.xl\:h-7{height:1.75rem}.xl\:h-8{height:2rem}.xl\:h-9{height:2.25rem}.xl\:h-10{height:2.5rem}.xl\:h-11{height:2.75rem}.xl\:h-12{height:3rem}.xl\:h-14{height:3.5rem}.xl\:h-16{height:4rem}.xl\:h-20{height:5rem}.xl\:h-24{height:6rem}.xl\:h-28{height:7rem}.xl\:h-32{height:8rem}.xl\:h-36{height:9rem}.xl\:h-40{height:10rem}.xl\:h-44{height:11rem}.xl\:h-48{height:12rem}.xl\:h-52{height:13rem}.xl\:h-56{height:14rem}.xl\:h-60{height:15rem}.xl\:h-64{height:16rem}.xl\:h-72{height:18rem}.xl\:h-80{height:20rem}.xl\:h-96{height:24rem}.xl\:h-auto{height:auto}.xl\:h-px{height:1px}.xl\:h-0\.5{height:.125rem}.xl\:h-1\.5{height:.375rem}.xl\:h-2\.5{height:.625rem}.xl\:h-3\.5{height:.875rem}.xl\:h-1\/2{height:50%}.xl\:h-1\/3{height:33.333333%}.xl\:h-2\/3{height:66.666667%}.xl\:h-1\/4{height:25%}.xl\:h-2\/4{height:50%}.xl\:h-3\/4{height:75%}.xl\:h-1\/5{height:20%}.xl\:h-2\/5{height:40%}.xl\:h-3\/5{height:60%}.xl\:h-4\/5{height:80%}.xl\:h-1\/6{height:16.666667%}.xl\:h-2\/6{height:33.333333%}.xl\:h-3\/6{height:50%}.xl\:h-4\/6{height:66.666667%}.xl\:h-5\/6{height:83.333333%}.xl\:h-full{height:100%}.xl\:h-screen{height:100vh}.xl\:max-h-0{max-height:0}.xl\:max-h-1{max-height:.25rem}.xl\:max-h-2{max-height:.5rem}.xl\:max-h-3{max-height:.75rem}.xl\:max-h-4{max-height:1rem}.xl\:max-h-5{max-height:1.25rem}.xl\:max-h-6{max-height:1.5rem}.xl\:max-h-7{max-height:1.75rem}.xl\:max-h-8{max-height:2rem}.xl\:max-h-9{max-height:2.25rem}.xl\:max-h-10{max-height:2.5rem}.xl\:max-h-11{max-height:2.75rem}.xl\:max-h-12{max-height:3rem}.xl\:max-h-14{max-height:3.5rem}.xl\:max-h-16{max-height:4rem}.xl\:max-h-20{max-height:5rem}.xl\:max-h-24{max-height:6rem}.xl\:max-h-28{max-height:7rem}.xl\:max-h-32{max-height:8rem}.xl\:max-h-36{max-height:9rem}.xl\:max-h-40{max-height:10rem}.xl\:max-h-44{max-height:11rem}.xl\:max-h-48{max-height:12rem}.xl\:max-h-52{max-height:13rem}.xl\:max-h-56{max-height:14rem}.xl\:max-h-60{max-height:15rem}.xl\:max-h-64{max-height:16rem}.xl\:max-h-72{max-height:18rem}.xl\:max-h-80{max-height:20rem}.xl\:max-h-96{max-height:24rem}.xl\:max-h-px{max-height:1px}.xl\:max-h-0\.5{max-height:.125rem}.xl\:max-h-1\.5{max-height:.375rem}.xl\:max-h-2\.5{max-height:.625rem}.xl\:max-h-3\.5{max-height:.875rem}.xl\:max-h-full{max-height:100%}.xl\:max-h-screen{max-height:100vh}.xl\:min-h-0{min-height:0}.xl\:min-h-full{min-height:100%}.xl\:min-h-screen{min-height:100vh}.xl\:w-0{width:0}.xl\:w-1{width:.25rem}.xl\:w-2{width:.5rem}.xl\:w-3{width:.75rem}.xl\:w-4{width:1rem}.xl\:w-5{width:1.25rem}.xl\:w-6{width:1.5rem}.xl\:w-7{width:1.75rem}.xl\:w-8{width:2rem}.xl\:w-9{width:2.25rem}.xl\:w-10{width:2.5rem}.xl\:w-11{width:2.75rem}.xl\:w-12{width:3rem}.xl\:w-14{width:3.5rem}.xl\:w-16{width:4rem}.xl\:w-20{width:5rem}.xl\:w-24{width:6rem}.xl\:w-28{width:7rem}.xl\:w-32{width:8rem}.xl\:w-36{width:9rem}.xl\:w-40{width:10rem}.xl\:w-44{width:11rem}.xl\:w-48{width:12rem}.xl\:w-52{width:13rem}.xl\:w-56{width:14rem}.xl\:w-60{width:15rem}.xl\:w-64{width:16rem}.xl\:w-72{width:18rem}.xl\:w-80{width:20rem}.xl\:w-96{width:24rem}.xl\:w-auto{width:auto}.xl\:w-px{width:1px}.xl\:w-0\.5{width:.125rem}.xl\:w-1\.5{width:.375rem}.xl\:w-2\.5{width:.625rem}.xl\:w-3\.5{width:.875rem}.xl\:w-1\/2{width:50%}.xl\:w-1\/3{width:33.333333%}.xl\:w-2\/3{width:66.666667%}.xl\:w-1\/4{width:25%}.xl\:w-2\/4{width:50%}.xl\:w-3\/4{width:75%}.xl\:w-1\/5{width:20%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-4\/5{width:80%}.xl\:w-1\/6{width:16.666667%}.xl\:w-2\/6{width:33.333333%}.xl\:w-3\/6{width:50%}.xl\:w-4\/6{width:66.666667%}.xl\:w-5\/6{width:83.333333%}.xl\:w-1\/12{width:8.333333%}.xl\:w-2\/12{width:16.666667%}.xl\:w-3\/12{width:25%}.xl\:w-4\/12{width:33.333333%}.xl\:w-5\/12{width:41.666667%}.xl\:w-6\/12{width:50%}.xl\:w-7\/12{width:58.333333%}.xl\:w-8\/12{width:66.666667%}.xl\:w-9\/12{width:75%}.xl\:w-10\/12{width:83.333333%}.xl\:w-11\/12{width:91.666667%}.xl\:w-full{width:100%}.xl\:w-screen{width:100vw}.xl\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.xl\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.xl\:min-w-0{min-width:0}.xl\:min-w-full{min-width:100%}.xl\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.xl\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.xl\:max-w-0{max-width:0}.xl\:max-w-none{max-width:none}.xl\:max-w-xs{max-width:20rem}.xl\:max-w-sm{max-width:24rem}.xl\:max-w-md{max-width:28rem}.xl\:max-w-lg{max-width:32rem}.xl\:max-w-xl{max-width:36rem}.xl\:max-w-2xl{max-width:42rem}.xl\:max-w-3xl{max-width:48rem}.xl\:max-w-4xl{max-width:56rem}.xl\:max-w-5xl{max-width:64rem}.xl\:max-w-6xl{max-width:72rem}.xl\:max-w-7xl{max-width:80rem}.xl\:max-w-full{max-width:100%}.xl\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.xl\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.xl\:max-w-prose{max-width:65ch}.xl\:max-w-screen-sm{max-width:640px}.xl\:max-w-screen-md{max-width:768px}.xl\:max-w-screen-lg{max-width:1024px}.xl\:max-w-screen-xl{max-width:1280px}.xl\:max-w-screen-2xl{max-width:1536px}.xl\:flex-1{flex:1 1 0%}.xl\:flex-auto{flex:1 1 auto}.xl\:flex-initial{flex:0 1 auto}.xl\:flex-none{flex:none}.xl\:flex-shrink-0{flex-shrink:0}.xl\:flex-shrink{flex-shrink:1}.xl\:flex-grow-0{flex-grow:0}.xl\:flex-grow{flex-grow:1}.xl\:table-auto{table-layout:auto}.xl\:table-fixed{table-layout:fixed}.xl\:border-collapse{border-collapse:collapse}.xl\:border-separate{border-collapse:initial}.xl\:origin-center{transform-origin:center}.xl\:origin-top{transform-origin:top}.xl\:origin-top-right{transform-origin:top right}.xl\:origin-right{transform-origin:right}.xl\:origin-bottom-right{transform-origin:bottom right}.xl\:origin-bottom{transform-origin:bottom}.xl\:origin-bottom-left{transform-origin:bottom left}.xl\:origin-left{transform-origin:left}.xl\:origin-top-left{transform-origin:top left}.xl\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xl\:transform,.xl\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.xl\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.xl\:transform-none{transform:none}.xl\:translate-x-0{--tw-translate-x:0px}.xl\:translate-x-1{--tw-translate-x:0.25rem}.xl\:translate-x-2{--tw-translate-x:0.5rem}.xl\:translate-x-3{--tw-translate-x:0.75rem}.xl\:translate-x-4{--tw-translate-x:1rem}.xl\:translate-x-5{--tw-translate-x:1.25rem}.xl\:translate-x-6{--tw-translate-x:1.5rem}.xl\:translate-x-7{--tw-translate-x:1.75rem}.xl\:translate-x-8{--tw-translate-x:2rem}.xl\:translate-x-9{--tw-translate-x:2.25rem}.xl\:translate-x-10{--tw-translate-x:2.5rem}.xl\:translate-x-11{--tw-translate-x:2.75rem}.xl\:translate-x-12{--tw-translate-x:3rem}.xl\:translate-x-14{--tw-translate-x:3.5rem}.xl\:translate-x-16{--tw-translate-x:4rem}.xl\:translate-x-20{--tw-translate-x:5rem}.xl\:translate-x-24{--tw-translate-x:6rem}.xl\:translate-x-28{--tw-translate-x:7rem}.xl\:translate-x-32{--tw-translate-x:8rem}.xl\:translate-x-36{--tw-translate-x:9rem}.xl\:translate-x-40{--tw-translate-x:10rem}.xl\:translate-x-44{--tw-translate-x:11rem}.xl\:translate-x-48{--tw-translate-x:12rem}.xl\:translate-x-52{--tw-translate-x:13rem}.xl\:translate-x-56{--tw-translate-x:14rem}.xl\:translate-x-60{--tw-translate-x:15rem}.xl\:translate-x-64{--tw-translate-x:16rem}.xl\:translate-x-72{--tw-translate-x:18rem}.xl\:translate-x-80{--tw-translate-x:20rem}.xl\:translate-x-96{--tw-translate-x:24rem}.xl\:translate-x-px{--tw-translate-x:1px}.xl\:translate-x-0\.5{--tw-translate-x:0.125rem}.xl\:translate-x-1\.5{--tw-translate-x:0.375rem}.xl\:translate-x-2\.5{--tw-translate-x:0.625rem}.xl\:translate-x-3\.5{--tw-translate-x:0.875rem}.xl\:-translate-x-0{--tw-translate-x:0px}.xl\:-translate-x-1{--tw-translate-x:-0.25rem}.xl\:-translate-x-2{--tw-translate-x:-0.5rem}.xl\:-translate-x-3{--tw-translate-x:-0.75rem}.xl\:-translate-x-4{--tw-translate-x:-1rem}.xl\:-translate-x-5{--tw-translate-x:-1.25rem}.xl\:-translate-x-6{--tw-translate-x:-1.5rem}.xl\:-translate-x-7{--tw-translate-x:-1.75rem}.xl\:-translate-x-8{--tw-translate-x:-2rem}.xl\:-translate-x-9{--tw-translate-x:-2.25rem}.xl\:-translate-x-10{--tw-translate-x:-2.5rem}.xl\:-translate-x-11{--tw-translate-x:-2.75rem}.xl\:-translate-x-12{--tw-translate-x:-3rem}.xl\:-translate-x-14{--tw-translate-x:-3.5rem}.xl\:-translate-x-16{--tw-translate-x:-4rem}.xl\:-translate-x-20{--tw-translate-x:-5rem}.xl\:-translate-x-24{--tw-translate-x:-6rem}.xl\:-translate-x-28{--tw-translate-x:-7rem}.xl\:-translate-x-32{--tw-translate-x:-8rem}.xl\:-translate-x-36{--tw-translate-x:-9rem}.xl\:-translate-x-40{--tw-translate-x:-10rem}.xl\:-translate-x-44{--tw-translate-x:-11rem}.xl\:-translate-x-48{--tw-translate-x:-12rem}.xl\:-translate-x-52{--tw-translate-x:-13rem}.xl\:-translate-x-56{--tw-translate-x:-14rem}.xl\:-translate-x-60{--tw-translate-x:-15rem}.xl\:-translate-x-64{--tw-translate-x:-16rem}.xl\:-translate-x-72{--tw-translate-x:-18rem}.xl\:-translate-x-80{--tw-translate-x:-20rem}.xl\:-translate-x-96{--tw-translate-x:-24rem}.xl\:-translate-x-px{--tw-translate-x:-1px}.xl\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.xl\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.xl\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.xl\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.xl\:translate-x-1\/2{--tw-translate-x:50%}.xl\:translate-x-1\/3{--tw-translate-x:33.333333%}.xl\:translate-x-2\/3{--tw-translate-x:66.666667%}.xl\:translate-x-1\/4{--tw-translate-x:25%}.xl\:translate-x-2\/4{--tw-translate-x:50%}.xl\:translate-x-3\/4{--tw-translate-x:75%}.xl\:translate-x-full{--tw-translate-x:100%}.xl\:-translate-x-1\/2{--tw-translate-x:-50%}.xl\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.xl\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.xl\:-translate-x-1\/4{--tw-translate-x:-25%}.xl\:-translate-x-2\/4{--tw-translate-x:-50%}.xl\:-translate-x-3\/4{--tw-translate-x:-75%}.xl\:-translate-x-full{--tw-translate-x:-100%}.xl\:translate-y-0{--tw-translate-y:0px}.xl\:translate-y-1{--tw-translate-y:0.25rem}.xl\:translate-y-2{--tw-translate-y:0.5rem}.xl\:translate-y-3{--tw-translate-y:0.75rem}.xl\:translate-y-4{--tw-translate-y:1rem}.xl\:translate-y-5{--tw-translate-y:1.25rem}.xl\:translate-y-6{--tw-translate-y:1.5rem}.xl\:translate-y-7{--tw-translate-y:1.75rem}.xl\:translate-y-8{--tw-translate-y:2rem}.xl\:translate-y-9{--tw-translate-y:2.25rem}.xl\:translate-y-10{--tw-translate-y:2.5rem}.xl\:translate-y-11{--tw-translate-y:2.75rem}.xl\:translate-y-12{--tw-translate-y:3rem}.xl\:translate-y-14{--tw-translate-y:3.5rem}.xl\:translate-y-16{--tw-translate-y:4rem}.xl\:translate-y-20{--tw-translate-y:5rem}.xl\:translate-y-24{--tw-translate-y:6rem}.xl\:translate-y-28{--tw-translate-y:7rem}.xl\:translate-y-32{--tw-translate-y:8rem}.xl\:translate-y-36{--tw-translate-y:9rem}.xl\:translate-y-40{--tw-translate-y:10rem}.xl\:translate-y-44{--tw-translate-y:11rem}.xl\:translate-y-48{--tw-translate-y:12rem}.xl\:translate-y-52{--tw-translate-y:13rem}.xl\:translate-y-56{--tw-translate-y:14rem}.xl\:translate-y-60{--tw-translate-y:15rem}.xl\:translate-y-64{--tw-translate-y:16rem}.xl\:translate-y-72{--tw-translate-y:18rem}.xl\:translate-y-80{--tw-translate-y:20rem}.xl\:translate-y-96{--tw-translate-y:24rem}.xl\:translate-y-px{--tw-translate-y:1px}.xl\:translate-y-0\.5{--tw-translate-y:0.125rem}.xl\:translate-y-1\.5{--tw-translate-y:0.375rem}.xl\:translate-y-2\.5{--tw-translate-y:0.625rem}.xl\:translate-y-3\.5{--tw-translate-y:0.875rem}.xl\:-translate-y-0{--tw-translate-y:0px}.xl\:-translate-y-1{--tw-translate-y:-0.25rem}.xl\:-translate-y-2{--tw-translate-y:-0.5rem}.xl\:-translate-y-3{--tw-translate-y:-0.75rem}.xl\:-translate-y-4{--tw-translate-y:-1rem}.xl\:-translate-y-5{--tw-translate-y:-1.25rem}.xl\:-translate-y-6{--tw-translate-y:-1.5rem}.xl\:-translate-y-7{--tw-translate-y:-1.75rem}.xl\:-translate-y-8{--tw-translate-y:-2rem}.xl\:-translate-y-9{--tw-translate-y:-2.25rem}.xl\:-translate-y-10{--tw-translate-y:-2.5rem}.xl\:-translate-y-11{--tw-translate-y:-2.75rem}.xl\:-translate-y-12{--tw-translate-y:-3rem}.xl\:-translate-y-14{--tw-translate-y:-3.5rem}.xl\:-translate-y-16{--tw-translate-y:-4rem}.xl\:-translate-y-20{--tw-translate-y:-5rem}.xl\:-translate-y-24{--tw-translate-y:-6rem}.xl\:-translate-y-28{--tw-translate-y:-7rem}.xl\:-translate-y-32{--tw-translate-y:-8rem}.xl\:-translate-y-36{--tw-translate-y:-9rem}.xl\:-translate-y-40{--tw-translate-y:-10rem}.xl\:-translate-y-44{--tw-translate-y:-11rem}.xl\:-translate-y-48{--tw-translate-y:-12rem}.xl\:-translate-y-52{--tw-translate-y:-13rem}.xl\:-translate-y-56{--tw-translate-y:-14rem}.xl\:-translate-y-60{--tw-translate-y:-15rem}.xl\:-translate-y-64{--tw-translate-y:-16rem}.xl\:-translate-y-72{--tw-translate-y:-18rem}.xl\:-translate-y-80{--tw-translate-y:-20rem}.xl\:-translate-y-96{--tw-translate-y:-24rem}.xl\:-translate-y-px{--tw-translate-y:-1px}.xl\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.xl\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.xl\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.xl\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.xl\:translate-y-1\/2{--tw-translate-y:50%}.xl\:translate-y-1\/3{--tw-translate-y:33.333333%}.xl\:translate-y-2\/3{--tw-translate-y:66.666667%}.xl\:translate-y-1\/4{--tw-translate-y:25%}.xl\:translate-y-2\/4{--tw-translate-y:50%}.xl\:translate-y-3\/4{--tw-translate-y:75%}.xl\:translate-y-full{--tw-translate-y:100%}.xl\:-translate-y-1\/2{--tw-translate-y:-50%}.xl\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.xl\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.xl\:-translate-y-1\/4{--tw-translate-y:-25%}.xl\:-translate-y-2\/4{--tw-translate-y:-50%}.xl\:-translate-y-3\/4{--tw-translate-y:-75%}.xl\:-translate-y-full{--tw-translate-y:-100%}.xl\:hover\:translate-x-0:hover{--tw-translate-x:0px}.xl\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.xl\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.xl\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.xl\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.xl\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.xl\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.xl\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.xl\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.xl\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.xl\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.xl\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.xl\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.xl\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.xl\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.xl\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.xl\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.xl\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.xl\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.xl\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.xl\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.xl\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.xl\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.xl\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.xl\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.xl\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.xl\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.xl\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.xl\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.xl\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.xl\:hover\:translate-x-px:hover{--tw-translate-x:1px}.xl\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.xl\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.xl\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.xl\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.xl\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.xl\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.xl\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.xl\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.xl\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.xl\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.xl\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.xl\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.xl\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.xl\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.xl\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.xl\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.xl\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.xl\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.xl\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.xl\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.xl\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.xl\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.xl\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.xl\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.xl\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.xl\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.xl\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.xl\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.xl\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.xl\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.xl\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.xl\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.xl\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.xl\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.xl\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.xl\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.xl\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.xl\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.xl\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.xl\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.xl\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.xl\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.xl\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.xl\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.xl\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.xl\:hover\:translate-x-full:hover{--tw-translate-x:100%}.xl\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.xl\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.xl\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.xl\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.xl\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.xl\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.xl\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.xl\:hover\:translate-y-0:hover{--tw-translate-y:0px}.xl\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.xl\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.xl\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.xl\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.xl\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.xl\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.xl\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.xl\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.xl\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.xl\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.xl\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.xl\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.xl\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.xl\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.xl\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.xl\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.xl\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.xl\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.xl\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.xl\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.xl\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.xl\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.xl\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.xl\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.xl\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.xl\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.xl\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.xl\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.xl\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.xl\:hover\:translate-y-px:hover{--tw-translate-y:1px}.xl\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.xl\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.xl\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.xl\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.xl\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.xl\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.xl\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.xl\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.xl\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.xl\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.xl\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.xl\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.xl\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.xl\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.xl\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.xl\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.xl\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.xl\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.xl\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.xl\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.xl\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.xl\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.xl\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.xl\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.xl\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.xl\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.xl\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.xl\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.xl\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.xl\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.xl\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.xl\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.xl\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.xl\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.xl\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.xl\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.xl\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.xl\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.xl\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.xl\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.xl\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.xl\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.xl\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.xl\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.xl\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.xl\:hover\:translate-y-full:hover{--tw-translate-y:100%}.xl\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.xl\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.xl\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.xl\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.xl\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.xl\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.xl\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.xl\:focus\:translate-x-0:focus{--tw-translate-x:0px}.xl\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.xl\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.xl\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.xl\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.xl\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.xl\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.xl\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.xl\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.xl\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.xl\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.xl\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.xl\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.xl\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.xl\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.xl\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.xl\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.xl\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.xl\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.xl\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.xl\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.xl\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.xl\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.xl\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.xl\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.xl\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.xl\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.xl\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.xl\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.xl\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.xl\:focus\:translate-x-px:focus{--tw-translate-x:1px}.xl\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.xl\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.xl\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.xl\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.xl\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.xl\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.xl\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.xl\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.xl\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.xl\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.xl\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.xl\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.xl\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.xl\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.xl\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.xl\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.xl\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.xl\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.xl\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.xl\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.xl\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.xl\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.xl\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.xl\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.xl\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.xl\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.xl\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.xl\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.xl\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.xl\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.xl\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.xl\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.xl\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.xl\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.xl\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.xl\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.xl\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.xl\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.xl\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.xl\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.xl\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.xl\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.xl\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.xl\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.xl\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.xl\:focus\:translate-x-full:focus{--tw-translate-x:100%}.xl\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.xl\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.xl\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.xl\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.xl\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.xl\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.xl\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.xl\:focus\:translate-y-0:focus{--tw-translate-y:0px}.xl\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.xl\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.xl\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.xl\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.xl\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.xl\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.xl\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.xl\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.xl\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.xl\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.xl\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.xl\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.xl\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.xl\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.xl\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.xl\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.xl\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.xl\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.xl\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.xl\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.xl\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.xl\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.xl\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.xl\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.xl\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.xl\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.xl\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.xl\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.xl\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.xl\:focus\:translate-y-px:focus{--tw-translate-y:1px}.xl\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.xl\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.xl\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.xl\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.xl\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.xl\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.xl\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.xl\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.xl\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.xl\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.xl\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.xl\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.xl\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.xl\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.xl\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.xl\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.xl\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.xl\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.xl\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.xl\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.xl\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.xl\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.xl\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.xl\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.xl\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.xl\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.xl\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.xl\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.xl\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.xl\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.xl\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.xl\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.xl\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.xl\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.xl\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.xl\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.xl\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.xl\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.xl\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.xl\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.xl\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.xl\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.xl\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.xl\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.xl\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.xl\:focus\:translate-y-full:focus{--tw-translate-y:100%}.xl\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.xl\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.xl\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.xl\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.xl\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.xl\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.xl\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.xl\:rotate-0{--tw-rotate:0deg}.xl\:rotate-1{--tw-rotate:1deg}.xl\:rotate-2{--tw-rotate:2deg}.xl\:rotate-3{--tw-rotate:3deg}.xl\:rotate-6{--tw-rotate:6deg}.xl\:rotate-12{--tw-rotate:12deg}.xl\:rotate-45{--tw-rotate:45deg}.xl\:rotate-90{--tw-rotate:90deg}.xl\:rotate-180{--tw-rotate:180deg}.xl\:-rotate-180{--tw-rotate:-180deg}.xl\:-rotate-90{--tw-rotate:-90deg}.xl\:-rotate-45{--tw-rotate:-45deg}.xl\:-rotate-12{--tw-rotate:-12deg}.xl\:-rotate-6{--tw-rotate:-6deg}.xl\:-rotate-3{--tw-rotate:-3deg}.xl\:-rotate-2{--tw-rotate:-2deg}.xl\:-rotate-1{--tw-rotate:-1deg}.xl\:hover\:rotate-0:hover{--tw-rotate:0deg}.xl\:hover\:rotate-1:hover{--tw-rotate:1deg}.xl\:hover\:rotate-2:hover{--tw-rotate:2deg}.xl\:hover\:rotate-3:hover{--tw-rotate:3deg}.xl\:hover\:rotate-6:hover{--tw-rotate:6deg}.xl\:hover\:rotate-12:hover{--tw-rotate:12deg}.xl\:hover\:rotate-45:hover{--tw-rotate:45deg}.xl\:hover\:rotate-90:hover{--tw-rotate:90deg}.xl\:hover\:rotate-180:hover{--tw-rotate:180deg}.xl\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.xl\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.xl\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.xl\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.xl\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.xl\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.xl\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.xl\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.xl\:focus\:rotate-0:focus{--tw-rotate:0deg}.xl\:focus\:rotate-1:focus{--tw-rotate:1deg}.xl\:focus\:rotate-2:focus{--tw-rotate:2deg}.xl\:focus\:rotate-3:focus{--tw-rotate:3deg}.xl\:focus\:rotate-6:focus{--tw-rotate:6deg}.xl\:focus\:rotate-12:focus{--tw-rotate:12deg}.xl\:focus\:rotate-45:focus{--tw-rotate:45deg}.xl\:focus\:rotate-90:focus{--tw-rotate:90deg}.xl\:focus\:rotate-180:focus{--tw-rotate:180deg}.xl\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.xl\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.xl\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.xl\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.xl\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.xl\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.xl\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.xl\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.xl\:skew-x-0{--tw-skew-x:0deg}.xl\:skew-x-1{--tw-skew-x:1deg}.xl\:skew-x-2{--tw-skew-x:2deg}.xl\:skew-x-3{--tw-skew-x:3deg}.xl\:skew-x-6{--tw-skew-x:6deg}.xl\:skew-x-12{--tw-skew-x:12deg}.xl\:-skew-x-12{--tw-skew-x:-12deg}.xl\:-skew-x-6{--tw-skew-x:-6deg}.xl\:-skew-x-3{--tw-skew-x:-3deg}.xl\:-skew-x-2{--tw-skew-x:-2deg}.xl\:-skew-x-1{--tw-skew-x:-1deg}.xl\:skew-y-0{--tw-skew-y:0deg}.xl\:skew-y-1{--tw-skew-y:1deg}.xl\:skew-y-2{--tw-skew-y:2deg}.xl\:skew-y-3{--tw-skew-y:3deg}.xl\:skew-y-6{--tw-skew-y:6deg}.xl\:skew-y-12{--tw-skew-y:12deg}.xl\:-skew-y-12{--tw-skew-y:-12deg}.xl\:-skew-y-6{--tw-skew-y:-6deg}.xl\:-skew-y-3{--tw-skew-y:-3deg}.xl\:-skew-y-2{--tw-skew-y:-2deg}.xl\:-skew-y-1{--tw-skew-y:-1deg}.xl\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.xl\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.xl\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.xl\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.xl\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.xl\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.xl\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.xl\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.xl\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.xl\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.xl\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.xl\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.xl\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.xl\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.xl\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.xl\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.xl\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.xl\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.xl\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.xl\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.xl\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.xl\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.xl\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.xl\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.xl\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.xl\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.xl\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.xl\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.xl\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.xl\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.xl\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.xl\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.xl\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.xl\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.xl\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.xl\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.xl\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.xl\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.xl\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.xl\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.xl\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.xl\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.xl\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.xl\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.xl\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.xl\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.xl\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.xl\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.xl\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.xl\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.xl\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.xl\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.xl\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.xl\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.xl\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.xl\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.xl\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.xl\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.xl\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.xl\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.xl\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.xl\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.xl\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.xl\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.xl\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.xl\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.xl\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.xl\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.xl\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.xl\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.xl\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.xl\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.xl\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.xl\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.xl\:scale-x-0{--tw-scale-x:0}.xl\:scale-x-50{--tw-scale-x:.5}.xl\:scale-x-75{--tw-scale-x:.75}.xl\:scale-x-90{--tw-scale-x:.9}.xl\:scale-x-95{--tw-scale-x:.95}.xl\:scale-x-100{--tw-scale-x:1}.xl\:scale-x-105{--tw-scale-x:1.05}.xl\:scale-x-110{--tw-scale-x:1.1}.xl\:scale-x-125{--tw-scale-x:1.25}.xl\:scale-x-150{--tw-scale-x:1.5}.xl\:scale-y-0{--tw-scale-y:0}.xl\:scale-y-50{--tw-scale-y:.5}.xl\:scale-y-75{--tw-scale-y:.75}.xl\:scale-y-90{--tw-scale-y:.9}.xl\:scale-y-95{--tw-scale-y:.95}.xl\:scale-y-100{--tw-scale-y:1}.xl\:scale-y-105{--tw-scale-y:1.05}.xl\:scale-y-110{--tw-scale-y:1.1}.xl\:scale-y-125{--tw-scale-y:1.25}.xl\:scale-y-150{--tw-scale-y:1.5}.xl\:hover\:scale-x-0:hover{--tw-scale-x:0}.xl\:hover\:scale-x-50:hover{--tw-scale-x:.5}.xl\:hover\:scale-x-75:hover{--tw-scale-x:.75}.xl\:hover\:scale-x-90:hover{--tw-scale-x:.9}.xl\:hover\:scale-x-95:hover{--tw-scale-x:.95}.xl\:hover\:scale-x-100:hover{--tw-scale-x:1}.xl\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.xl\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.xl\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.xl\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.xl\:hover\:scale-y-0:hover{--tw-scale-y:0}.xl\:hover\:scale-y-50:hover{--tw-scale-y:.5}.xl\:hover\:scale-y-75:hover{--tw-scale-y:.75}.xl\:hover\:scale-y-90:hover{--tw-scale-y:.9}.xl\:hover\:scale-y-95:hover{--tw-scale-y:.95}.xl\:hover\:scale-y-100:hover{--tw-scale-y:1}.xl\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.xl\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.xl\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.xl\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.xl\:focus\:scale-x-0:focus{--tw-scale-x:0}.xl\:focus\:scale-x-50:focus{--tw-scale-x:.5}.xl\:focus\:scale-x-75:focus{--tw-scale-x:.75}.xl\:focus\:scale-x-90:focus{--tw-scale-x:.9}.xl\:focus\:scale-x-95:focus{--tw-scale-x:.95}.xl\:focus\:scale-x-100:focus{--tw-scale-x:1}.xl\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.xl\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.xl\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.xl\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.xl\:focus\:scale-y-0:focus{--tw-scale-y:0}.xl\:focus\:scale-y-50:focus{--tw-scale-y:.5}.xl\:focus\:scale-y-75:focus{--tw-scale-y:.75}.xl\:focus\:scale-y-90:focus{--tw-scale-y:.9}.xl\:focus\:scale-y-95:focus{--tw-scale-y:.95}.xl\:focus\:scale-y-100:focus{--tw-scale-y:1}.xl\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.xl\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.xl\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.xl\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.xl\:animate-none{-webkit-animation:none;animation:none}.xl\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.xl\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.xl\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.xl\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.xl\:cursor-auto{cursor:auto}.xl\:cursor-default{cursor:default}.xl\:cursor-pointer{cursor:pointer}.xl\:cursor-wait{cursor:wait}.xl\:cursor-text{cursor:text}.xl\:cursor-move{cursor:move}.xl\:cursor-help{cursor:help}.xl\:cursor-not-allowed{cursor:not-allowed}.xl\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.xl\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.xl\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.xl\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.xl\:resize-none{resize:none}.xl\:resize-y{resize:vertical}.xl\:resize-x{resize:horizontal}.xl\:resize{resize:both}.xl\:list-inside{list-style-position:inside}.xl\:list-outside{list-style-position:outside}.xl\:list-none{list-style-type:none}.xl\:list-disc{list-style-type:disc}.xl\:list-decimal{list-style-type:decimal}.xl\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.xl\:auto-cols-auto{grid-auto-columns:auto}.xl\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.xl\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.xl\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.xl\:grid-flow-row{grid-auto-flow:row}.xl\:grid-flow-col{grid-auto-flow:column}.xl\:grid-flow-row-dense{grid-auto-flow:row dense}.xl\:grid-flow-col-dense{grid-auto-flow:column dense}.xl\:auto-rows-auto{grid-auto-rows:auto}.xl\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.xl\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.xl\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-none{grid-template-columns:none}.xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.xl\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.xl\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.xl\:grid-rows-none{grid-template-rows:none}.xl\:flex-row{flex-direction:row}.xl\:flex-row-reverse{flex-direction:row-reverse}.xl\:flex-col{flex-direction:column}.xl\:flex-col-reverse{flex-direction:column-reverse}.xl\:flex-wrap{flex-wrap:wrap}.xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}.xl\:flex-nowrap{flex-wrap:nowrap}.xl\:place-content-center{place-content:center}.xl\:place-content-start{place-content:start}.xl\:place-content-end{place-content:end}.xl\:place-content-between{place-content:space-between}.xl\:place-content-around{place-content:space-around}.xl\:place-content-evenly{place-content:space-evenly}.xl\:place-content-stretch{place-content:stretch}.xl\:place-items-start{place-items:start}.xl\:place-items-end{place-items:end}.xl\:place-items-center{place-items:center}.xl\:place-items-stretch{place-items:stretch}.xl\:content-center{align-content:center}.xl\:content-start{align-content:flex-start}.xl\:content-end{align-content:flex-end}.xl\:content-between{align-content:space-between}.xl\:content-around{align-content:space-around}.xl\:content-evenly{align-content:space-evenly}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:items-baseline{align-items:baseline}.xl\:items-stretch{align-items:stretch}.xl\:justify-start{justify-content:flex-start}.xl\:justify-end{justify-content:flex-end}.xl\:justify-center{justify-content:center}.xl\:justify-between{justify-content:space-between}.xl\:justify-around{justify-content:space-around}.xl\:justify-evenly{justify-content:space-evenly}.xl\:justify-items-start{justify-items:start}.xl\:justify-items-end{justify-items:end}.xl\:justify-items-center{justify-items:center}.xl\:justify-items-stretch{justify-items:stretch}.xl\:gap-0{gap:0}.xl\:gap-1{gap:.25rem}.xl\:gap-2{gap:.5rem}.xl\:gap-3{gap:.75rem}.xl\:gap-4{gap:1rem}.xl\:gap-5{gap:1.25rem}.xl\:gap-6{gap:1.5rem}.xl\:gap-7{gap:1.75rem}.xl\:gap-8{gap:2rem}.xl\:gap-9{gap:2.25rem}.xl\:gap-10{gap:2.5rem}.xl\:gap-11{gap:2.75rem}.xl\:gap-12{gap:3rem}.xl\:gap-14{gap:3.5rem}.xl\:gap-16{gap:4rem}.xl\:gap-20{gap:5rem}.xl\:gap-24{gap:6rem}.xl\:gap-28{gap:7rem}.xl\:gap-32{gap:8rem}.xl\:gap-36{gap:9rem}.xl\:gap-40{gap:10rem}.xl\:gap-44{gap:11rem}.xl\:gap-48{gap:12rem}.xl\:gap-52{gap:13rem}.xl\:gap-56{gap:14rem}.xl\:gap-60{gap:15rem}.xl\:gap-64{gap:16rem}.xl\:gap-72{gap:18rem}.xl\:gap-80{gap:20rem}.xl\:gap-96{gap:24rem}.xl\:gap-px{gap:1px}.xl\:gap-0\.5{gap:.125rem}.xl\:gap-1\.5{gap:.375rem}.xl\:gap-2\.5{gap:.625rem}.xl\:gap-3\.5{gap:.875rem}.xl\:gap-x-0{-moz-column-gap:0;column-gap:0}.xl\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.xl\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.xl\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.xl\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.xl\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.xl\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.xl\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.xl\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.xl\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.xl\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.xl\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.xl\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.xl\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.xl\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.xl\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.xl\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.xl\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.xl\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.xl\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.xl\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.xl\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.xl\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.xl\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.xl\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.xl\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.xl\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.xl\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.xl\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.xl\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.xl\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.xl\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.xl\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.xl\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.xl\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.xl\:gap-y-0{row-gap:0}.xl\:gap-y-1{row-gap:.25rem}.xl\:gap-y-2{row-gap:.5rem}.xl\:gap-y-3{row-gap:.75rem}.xl\:gap-y-4{row-gap:1rem}.xl\:gap-y-5{row-gap:1.25rem}.xl\:gap-y-6{row-gap:1.5rem}.xl\:gap-y-7{row-gap:1.75rem}.xl\:gap-y-8{row-gap:2rem}.xl\:gap-y-9{row-gap:2.25rem}.xl\:gap-y-10{row-gap:2.5rem}.xl\:gap-y-11{row-gap:2.75rem}.xl\:gap-y-12{row-gap:3rem}.xl\:gap-y-14{row-gap:3.5rem}.xl\:gap-y-16{row-gap:4rem}.xl\:gap-y-20{row-gap:5rem}.xl\:gap-y-24{row-gap:6rem}.xl\:gap-y-28{row-gap:7rem}.xl\:gap-y-32{row-gap:8rem}.xl\:gap-y-36{row-gap:9rem}.xl\:gap-y-40{row-gap:10rem}.xl\:gap-y-44{row-gap:11rem}.xl\:gap-y-48{row-gap:12rem}.xl\:gap-y-52{row-gap:13rem}.xl\:gap-y-56{row-gap:14rem}.xl\:gap-y-60{row-gap:15rem}.xl\:gap-y-64{row-gap:16rem}.xl\:gap-y-72{row-gap:18rem}.xl\:gap-y-80{row-gap:20rem}.xl\:gap-y-96{row-gap:24rem}.xl\:gap-y-px{row-gap:1px}.xl\:gap-y-0\.5{row-gap:.125rem}.xl\:gap-y-1\.5{row-gap:.375rem}.xl\:gap-y-2\.5{row-gap:.625rem}.xl\:gap-y-3\.5{row-gap:.875rem}.xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.xl\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.xl\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.xl\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.xl\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.xl\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.xl\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.xl\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.xl\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.xl\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.xl\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.xl\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.xl\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.xl\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.xl\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.xl\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.xl\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.xl\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.xl\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.xl\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.xl\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.xl\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.xl\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.xl\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.xl\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.xl\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.xl\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.xl\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.xl\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.xl\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.xl\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.xl\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.xl\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.xl\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.xl\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.xl\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.xl\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.xl\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.xl\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.xl\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.xl\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.xl\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.xl\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.xl\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.xl\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.xl\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.xl\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.xl\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.xl\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.xl\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.xl\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.xl\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.xl\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.xl\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.xl\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.xl\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.xl\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.xl\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.xl\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.xl\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.xl\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.xl\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.xl\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.xl\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.xl\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.xl\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.xl\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.xl\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.xl\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.xl\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.xl\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.xl\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.xl\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.xl\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.xl\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.xl\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.xl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.xl\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.xl\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.xl\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.xl\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.xl\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.xl\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.xl\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.xl\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.xl\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.xl\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.xl\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.xl\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.xl\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.xl\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.xl\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.xl\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.xl\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.xl\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.xl\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.xl\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.xl\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.xl\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.xl\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.xl\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.xl\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.xl\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.xl\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.xl\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.xl\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.xl\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.xl\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.xl\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.xl\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.xl\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.xl\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.xl\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.xl\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.xl\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.xl\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.xl\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.xl\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.xl\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.xl\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.xl\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.xl\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.xl\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.xl\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.xl\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.xl\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.xl\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.xl\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.xl\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.xl\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.xl\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.xl\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.xl\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.xl\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.xl\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.xl\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.xl\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.xl\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.xl\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.xl\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.xl\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.xl\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.xl\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.xl\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.xl\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.xl\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.xl\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.xl\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.xl\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.xl\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.xl\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.xl\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.xl\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.xl\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.xl\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.xl\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.xl\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.xl\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.xl\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.xl\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.xl\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.xl\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.xl\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.xl\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.xl\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.xl\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.xl\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.xl\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.xl\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.xl\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.xl\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.xl\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.xl\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.xl\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.xl\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.xl\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.xl\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.xl\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.xl\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.xl\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.xl\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.xl\:place-self-auto{place-self:auto}.xl\:place-self-start{place-self:start}.xl\:place-self-end{place-self:end}.xl\:place-self-center{place-self:center}.xl\:place-self-stretch{place-self:stretch}.xl\:self-auto{align-self:auto}.xl\:self-start{align-self:flex-start}.xl\:self-end{align-self:flex-end}.xl\:self-center{align-self:center}.xl\:self-stretch{align-self:stretch}.xl\:self-baseline{align-self:baseline}.xl\:justify-self-auto{justify-self:auto}.xl\:justify-self-start{justify-self:start}.xl\:justify-self-end{justify-self:end}.xl\:justify-self-center{justify-self:center}.xl\:justify-self-stretch{justify-self:stretch}.xl\:overflow-auto{overflow:auto}.xl\:overflow-hidden{overflow:hidden}.xl\:overflow-visible{overflow:visible}.xl\:overflow-scroll{overflow:scroll}.xl\:overflow-x-auto{overflow-x:auto}.xl\:overflow-y-auto{overflow-y:auto}.xl\:overflow-x-hidden{overflow-x:hidden}.xl\:overflow-y-hidden{overflow-y:hidden}.xl\:overflow-x-visible{overflow-x:visible}.xl\:overflow-y-visible{overflow-y:visible}.xl\:overflow-x-scroll{overflow-x:scroll}.xl\:overflow-y-scroll{overflow-y:scroll}.xl\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.xl\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.xl\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.xl\:overscroll-y-auto{overscroll-behavior-y:auto}.xl\:overscroll-y-contain{overscroll-behavior-y:contain}.xl\:overscroll-y-none{overscroll-behavior-y:none}.xl\:overscroll-x-auto{overscroll-behavior-x:auto}.xl\:overscroll-x-contain{overscroll-behavior-x:contain}.xl\:overscroll-x-none{overscroll-behavior-x:none}.xl\:truncate{overflow:hidden;white-space:nowrap}.xl\:overflow-ellipsis,.xl\:truncate{text-overflow:ellipsis}.xl\:overflow-clip{text-overflow:clip}.xl\:whitespace-normal{white-space:normal}.xl\:whitespace-nowrap{white-space:nowrap}.xl\:whitespace-pre{white-space:pre}.xl\:whitespace-pre-line{white-space:pre-line}.xl\:whitespace-pre-wrap{white-space:pre-wrap}.xl\:break-normal{overflow-wrap:normal;word-break:normal}.xl\:break-words{overflow-wrap:break-word}.xl\:break-all{word-break:break-all}.xl\:rounded-none{border-radius:0}.xl\:rounded-sm{border-radius:.125rem}.xl\:rounded{border-radius:.25rem}.xl\:rounded-md{border-radius:.375rem}.xl\:rounded-lg{border-radius:.5rem}.xl\:rounded-xl{border-radius:.75rem}.xl\:rounded-2xl{border-radius:1rem}.xl\:rounded-3xl{border-radius:1.5rem}.xl\:rounded-full{border-radius:9999px}.xl\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.xl\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.xl\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.xl\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.xl\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.xl\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.xl\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.xl\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.xl\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.xl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.xl\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.xl\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.xl\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.xl\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.xl\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.xl\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.xl\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.xl\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.xl\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.xl\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.xl\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-tl-none{border-top-left-radius:0}.xl\:rounded-tl-sm{border-top-left-radius:.125rem}.xl\:rounded-tl{border-top-left-radius:.25rem}.xl\:rounded-tl-md{border-top-left-radius:.375rem}.xl\:rounded-tl-lg{border-top-left-radius:.5rem}.xl\:rounded-tl-xl{border-top-left-radius:.75rem}.xl\:rounded-tl-2xl{border-top-left-radius:1rem}.xl\:rounded-tl-3xl{border-top-left-radius:1.5rem}.xl\:rounded-tl-full{border-top-left-radius:9999px}.xl\:rounded-tr-none{border-top-right-radius:0}.xl\:rounded-tr-sm{border-top-right-radius:.125rem}.xl\:rounded-tr{border-top-right-radius:.25rem}.xl\:rounded-tr-md{border-top-right-radius:.375rem}.xl\:rounded-tr-lg{border-top-right-radius:.5rem}.xl\:rounded-tr-xl{border-top-right-radius:.75rem}.xl\:rounded-tr-2xl{border-top-right-radius:1rem}.xl\:rounded-tr-3xl{border-top-right-radius:1.5rem}.xl\:rounded-tr-full{border-top-right-radius:9999px}.xl\:rounded-br-none{border-bottom-right-radius:0}.xl\:rounded-br-sm{border-bottom-right-radius:.125rem}.xl\:rounded-br{border-bottom-right-radius:.25rem}.xl\:rounded-br-md{border-bottom-right-radius:.375rem}.xl\:rounded-br-lg{border-bottom-right-radius:.5rem}.xl\:rounded-br-xl{border-bottom-right-radius:.75rem}.xl\:rounded-br-2xl{border-bottom-right-radius:1rem}.xl\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.xl\:rounded-br-full{border-bottom-right-radius:9999px}.xl\:rounded-bl-none{border-bottom-left-radius:0}.xl\:rounded-bl-sm{border-bottom-left-radius:.125rem}.xl\:rounded-bl{border-bottom-left-radius:.25rem}.xl\:rounded-bl-md{border-bottom-left-radius:.375rem}.xl\:rounded-bl-lg{border-bottom-left-radius:.5rem}.xl\:rounded-bl-xl{border-bottom-left-radius:.75rem}.xl\:rounded-bl-2xl{border-bottom-left-radius:1rem}.xl\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.xl\:rounded-bl-full{border-bottom-left-radius:9999px}.xl\:border-0{border-width:0}.xl\:border-2{border-width:2px}.xl\:border-4{border-width:4px}.xl\:border-8{border-width:8px}.xl\:border{border-width:1px}.xl\:border-t-0{border-top-width:0}.xl\:border-t-2{border-top-width:2px}.xl\:border-t-4{border-top-width:4px}.xl\:border-t-8{border-top-width:8px}.xl\:border-t{border-top-width:1px}.xl\:border-r-0{border-right-width:0}.xl\:border-r-2{border-right-width:2px}.xl\:border-r-4{border-right-width:4px}.xl\:border-r-8{border-right-width:8px}.xl\:border-r{border-right-width:1px}.xl\:border-b-0{border-bottom-width:0}.xl\:border-b-2{border-bottom-width:2px}.xl\:border-b-4{border-bottom-width:4px}.xl\:border-b-8{border-bottom-width:8px}.xl\:border-b{border-bottom-width:1px}.xl\:border-l-0{border-left-width:0}.xl\:border-l-2{border-left-width:2px}.xl\:border-l-4{border-left-width:4px}.xl\:border-l-8{border-left-width:8px}.xl\:border-l{border-left-width:1px}.xl\:border-solid{border-style:solid}.xl\:border-dashed{border-style:dashed}.xl\:border-dotted{border-style:dotted}.xl\:border-double{border-style:double}.xl\:border-none{border-style:none}.xl\:border-transparent{border-color:transparent}.xl\:border-current{border-color:currentColor}.xl\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-transparent{border-color:transparent}.group:hover .xl\:group-hover\:border-current{border-color:currentColor}.group:hover .xl\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .xl\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:focus-within\:border-transparent:focus-within{border-color:transparent}.xl\:focus-within\:border-current:focus-within{border-color:currentColor}.xl\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:hover\:border-transparent:hover{border-color:transparent}.xl\:hover\:border-current:hover{border-color:currentColor}.xl\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:focus\:border-transparent:focus{border-color:transparent}.xl\:focus\:border-current:focus{border-color:currentColor}.xl\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.xl\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.xl\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.xl\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.xl\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.xl\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.xl\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.xl\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.xl\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.xl\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.xl\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.xl\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.xl\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.xl\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.xl\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.xl\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.xl\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.xl\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.xl\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.xl\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.xl\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.xl\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.xl\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.xl\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.xl\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.xl\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.xl\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.xl\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.xl\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.xl\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.xl\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.xl\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.xl\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.xl\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.xl\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.xl\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.xl\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.xl\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.xl\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.xl\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.xl\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.xl\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.xl\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.xl\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.xl\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.xl\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.xl\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.xl\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.xl\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.xl\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.xl\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.xl\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.xl\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.xl\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.xl\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.xl\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.xl\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.xl\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.xl\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.xl\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.xl\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.xl\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.xl\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.xl\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.xl\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.xl\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.xl\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.xl\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.xl\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.xl\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.xl\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.xl\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.xl\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.xl\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.xl\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.xl\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.xl\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.xl\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.xl\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.xl\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.xl\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.xl\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.xl\:border-opacity-0{--tw-border-opacity:0}.xl\:border-opacity-5{--tw-border-opacity:0.05}.xl\:border-opacity-10{--tw-border-opacity:0.1}.xl\:border-opacity-20{--tw-border-opacity:0.2}.xl\:border-opacity-25{--tw-border-opacity:0.25}.xl\:border-opacity-30{--tw-border-opacity:0.3}.xl\:border-opacity-40{--tw-border-opacity:0.4}.xl\:border-opacity-50{--tw-border-opacity:0.5}.xl\:border-opacity-60{--tw-border-opacity:0.6}.xl\:border-opacity-70{--tw-border-opacity:0.7}.xl\:border-opacity-75{--tw-border-opacity:0.75}.xl\:border-opacity-80{--tw-border-opacity:0.8}.xl\:border-opacity-90{--tw-border-opacity:0.9}.xl\:border-opacity-95{--tw-border-opacity:0.95}.xl\:border-opacity-100{--tw-border-opacity:1}.group:hover .xl\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .xl\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .xl\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .xl\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .xl\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .xl\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .xl\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .xl\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .xl\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .xl\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .xl\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .xl\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .xl\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .xl\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .xl\:group-hover\:border-opacity-100{--tw-border-opacity:1}.xl\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.xl\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.xl\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.xl\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.xl\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.xl\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.xl\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.xl\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.xl\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.xl\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.xl\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.xl\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.xl\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.xl\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.xl\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.xl\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.xl\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.xl\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.xl\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.xl\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.xl\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.xl\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.xl\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.xl\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.xl\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.xl\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.xl\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.xl\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.xl\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.xl\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.xl\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.xl\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.xl\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.xl\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.xl\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.xl\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.xl\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.xl\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.xl\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.xl\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.xl\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.xl\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.xl\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.xl\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.xl\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.xl\:bg-transparent{background-color:initial}.xl\:bg-current{background-color:currentColor}.xl\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-transparent{background-color:initial}.group:hover .xl\:group-hover\:bg-current{background-color:currentColor}.group:hover .xl\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .xl\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:focus-within\:bg-transparent:focus-within{background-color:initial}.xl\:focus-within\:bg-current:focus-within{background-color:currentColor}.xl\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:hover\:bg-transparent:hover{background-color:initial}.xl\:hover\:bg-current:hover{background-color:currentColor}.xl\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:focus\:bg-transparent:focus{background-color:initial}.xl\:focus\:bg-current:focus{background-color:currentColor}.xl\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.xl\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.xl\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.xl\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.xl\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.xl\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.xl\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.xl\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.xl\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.xl\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.xl\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.xl\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.xl\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.xl\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.xl\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.xl\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.xl\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.xl\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.xl\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.xl\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.xl\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.xl\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.xl\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.xl\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.xl\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.xl\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.xl\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.xl\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.xl\:bg-opacity-0{--tw-bg-opacity:0}.xl\:bg-opacity-5{--tw-bg-opacity:0.05}.xl\:bg-opacity-10{--tw-bg-opacity:0.1}.xl\:bg-opacity-20{--tw-bg-opacity:0.2}.xl\:bg-opacity-25{--tw-bg-opacity:0.25}.xl\:bg-opacity-30{--tw-bg-opacity:0.3}.xl\:bg-opacity-40{--tw-bg-opacity:0.4}.xl\:bg-opacity-50{--tw-bg-opacity:0.5}.xl\:bg-opacity-60{--tw-bg-opacity:0.6}.xl\:bg-opacity-70{--tw-bg-opacity:0.7}.xl\:bg-opacity-75{--tw-bg-opacity:0.75}.xl\:bg-opacity-80{--tw-bg-opacity:0.8}.xl\:bg-opacity-90{--tw-bg-opacity:0.9}.xl\:bg-opacity-95{--tw-bg-opacity:0.95}.xl\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .xl\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .xl\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .xl\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .xl\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .xl\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .xl\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .xl\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .xl\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .xl\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .xl\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .xl\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .xl\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .xl\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .xl\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .xl\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.xl\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.xl\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.xl\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.xl\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.xl\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.xl\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.xl\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.xl\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.xl\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.xl\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.xl\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.xl\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.xl\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.xl\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.xl\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.xl\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.xl\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.xl\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.xl\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.xl\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.xl\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.xl\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.xl\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.xl\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.xl\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.xl\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.xl\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.xl\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.xl\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.xl\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.xl\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.xl\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.xl\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.xl\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.xl\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.xl\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.xl\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.xl\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.xl\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.xl\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.xl\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.xl\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.xl\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.xl\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.xl\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.xl\:bg-none{background-image:none}.xl\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.xl\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.xl\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.xl\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.xl\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.xl\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.xl\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.xl\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.xl\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.xl\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.xl\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.xl\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.xl\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.xl\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.xl\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.xl\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.xl\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.xl\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.xl\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.xl\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.xl\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.xl\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.xl\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.xl\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.xl\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.xl\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.xl\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.xl\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.xl\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.xl\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.xl\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.xl\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.xl\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.xl\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.xl\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.xl\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.xl\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.xl\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.xl\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.xl\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.xl\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.xl\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.xl\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.xl\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.xl\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.xl\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.xl\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.xl\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.xl\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.xl\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.xl\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.xl\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.xl\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.xl\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.xl\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.xl\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.xl\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.xl\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.xl\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.xl\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.xl\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.xl\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.xl\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.xl\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.xl\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.xl\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.xl\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.xl\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.xl\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.xl\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.xl\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.xl\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.xl\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.xl\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.xl\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.xl\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.xl\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.xl\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.xl\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.xl\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.xl\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.xl\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.xl\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.xl\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.xl\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.xl\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.xl\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.xl\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.xl\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.xl\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.xl\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.xl\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.xl\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.xl\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.xl\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.xl\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.xl\:to-transparent{--tw-gradient-to:transparent}.xl\:to-current{--tw-gradient-to:currentColor}.xl\:to-black{--tw-gradient-to:#000}.xl\:to-white{--tw-gradient-to:#fff}.xl\:to-gray-50{--tw-gradient-to:#f9fafb}.xl\:to-gray-100{--tw-gradient-to:#f3f4f6}.xl\:to-gray-200{--tw-gradient-to:#e5e7eb}.xl\:to-gray-300{--tw-gradient-to:#d1d5db}.xl\:to-gray-400{--tw-gradient-to:#9ca3af}.xl\:to-gray-500{--tw-gradient-to:#6b7280}.xl\:to-gray-600{--tw-gradient-to:#4b5563}.xl\:to-gray-700{--tw-gradient-to:#374151}.xl\:to-gray-800{--tw-gradient-to:#1f2937}.xl\:to-gray-900{--tw-gradient-to:#111827}.xl\:to-red-50{--tw-gradient-to:#fef2f2}.xl\:to-red-100{--tw-gradient-to:#fee2e2}.xl\:to-red-200{--tw-gradient-to:#fecaca}.xl\:to-red-300{--tw-gradient-to:#fca5a5}.xl\:to-red-400{--tw-gradient-to:#f87171}.xl\:to-red-500{--tw-gradient-to:#ef4444}.xl\:to-red-600{--tw-gradient-to:#dc2626}.xl\:to-red-700{--tw-gradient-to:#b91c1c}.xl\:to-red-800{--tw-gradient-to:#991b1b}.xl\:to-red-900{--tw-gradient-to:#7f1d1d}.xl\:to-yellow-50{--tw-gradient-to:#fffbeb}.xl\:to-yellow-100{--tw-gradient-to:#fef3c7}.xl\:to-yellow-200{--tw-gradient-to:#fde68a}.xl\:to-yellow-300{--tw-gradient-to:#fcd34d}.xl\:to-yellow-400{--tw-gradient-to:#fbbf24}.xl\:to-yellow-500{--tw-gradient-to:#f59e0b}.xl\:to-yellow-600{--tw-gradient-to:#d97706}.xl\:to-yellow-700{--tw-gradient-to:#b45309}.xl\:to-yellow-800{--tw-gradient-to:#92400e}.xl\:to-yellow-900{--tw-gradient-to:#78350f}.xl\:to-green-50{--tw-gradient-to:#ecfdf5}.xl\:to-green-100{--tw-gradient-to:#d1fae5}.xl\:to-green-200{--tw-gradient-to:#a7f3d0}.xl\:to-green-300{--tw-gradient-to:#6ee7b7}.xl\:to-green-400{--tw-gradient-to:#34d399}.xl\:to-green-500{--tw-gradient-to:#10b981}.xl\:to-green-600{--tw-gradient-to:#059669}.xl\:to-green-700{--tw-gradient-to:#047857}.xl\:to-green-800{--tw-gradient-to:#065f46}.xl\:to-green-900{--tw-gradient-to:#064e3b}.xl\:to-blue-50{--tw-gradient-to:#eff6ff}.xl\:to-blue-100{--tw-gradient-to:#dbeafe}.xl\:to-blue-200{--tw-gradient-to:#bfdbfe}.xl\:to-blue-300{--tw-gradient-to:#93c5fd}.xl\:to-blue-400{--tw-gradient-to:#60a5fa}.xl\:to-blue-500{--tw-gradient-to:#3b82f6}.xl\:to-blue-600{--tw-gradient-to:#2563eb}.xl\:to-blue-700{--tw-gradient-to:#1d4ed8}.xl\:to-blue-800{--tw-gradient-to:#1e40af}.xl\:to-blue-900{--tw-gradient-to:#1e3a8a}.xl\:to-indigo-50{--tw-gradient-to:#eef2ff}.xl\:to-indigo-100{--tw-gradient-to:#e0e7ff}.xl\:to-indigo-200{--tw-gradient-to:#c7d2fe}.xl\:to-indigo-300{--tw-gradient-to:#a5b4fc}.xl\:to-indigo-400{--tw-gradient-to:#818cf8}.xl\:to-indigo-500{--tw-gradient-to:#6366f1}.xl\:to-indigo-600{--tw-gradient-to:#4f46e5}.xl\:to-indigo-700{--tw-gradient-to:#4338ca}.xl\:to-indigo-800{--tw-gradient-to:#3730a3}.xl\:to-indigo-900{--tw-gradient-to:#312e81}.xl\:to-purple-50{--tw-gradient-to:#f5f3ff}.xl\:to-purple-100{--tw-gradient-to:#ede9fe}.xl\:to-purple-200{--tw-gradient-to:#ddd6fe}.xl\:to-purple-300{--tw-gradient-to:#c4b5fd}.xl\:to-purple-400{--tw-gradient-to:#a78bfa}.xl\:to-purple-500{--tw-gradient-to:#8b5cf6}.xl\:to-purple-600{--tw-gradient-to:#7c3aed}.xl\:to-purple-700{--tw-gradient-to:#6d28d9}.xl\:to-purple-800{--tw-gradient-to:#5b21b6}.xl\:to-purple-900{--tw-gradient-to:#4c1d95}.xl\:to-pink-50{--tw-gradient-to:#fdf2f8}.xl\:to-pink-100{--tw-gradient-to:#fce7f3}.xl\:to-pink-200{--tw-gradient-to:#fbcfe8}.xl\:to-pink-300{--tw-gradient-to:#f9a8d4}.xl\:to-pink-400{--tw-gradient-to:#f472b6}.xl\:to-pink-500{--tw-gradient-to:#ec4899}.xl\:to-pink-600{--tw-gradient-to:#db2777}.xl\:to-pink-700{--tw-gradient-to:#be185d}.xl\:to-pink-800{--tw-gradient-to:#9d174d}.xl\:to-pink-900{--tw-gradient-to:#831843}.xl\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.xl\:hover\:to-current:hover{--tw-gradient-to:currentColor}.xl\:hover\:to-black:hover{--tw-gradient-to:#000}.xl\:hover\:to-white:hover{--tw-gradient-to:#fff}.xl\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.xl\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.xl\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.xl\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.xl\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.xl\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.xl\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.xl\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.xl\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.xl\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.xl\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.xl\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.xl\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.xl\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.xl\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.xl\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.xl\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.xl\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.xl\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.xl\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.xl\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.xl\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.xl\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.xl\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.xl\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.xl\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.xl\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.xl\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.xl\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.xl\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.xl\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.xl\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.xl\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.xl\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.xl\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.xl\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.xl\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.xl\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.xl\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.xl\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.xl\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.xl\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.xl\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.xl\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.xl\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.xl\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.xl\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.xl\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.xl\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.xl\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.xl\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.xl\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.xl\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.xl\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.xl\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.xl\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.xl\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.xl\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.xl\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.xl\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.xl\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.xl\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.xl\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.xl\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.xl\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.xl\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.xl\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.xl\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.xl\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.xl\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.xl\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.xl\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.xl\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.xl\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.xl\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.xl\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.xl\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.xl\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.xl\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.xl\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.xl\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.xl\:focus\:to-current:focus{--tw-gradient-to:currentColor}.xl\:focus\:to-black:focus{--tw-gradient-to:#000}.xl\:focus\:to-white:focus{--tw-gradient-to:#fff}.xl\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.xl\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.xl\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.xl\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.xl\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.xl\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.xl\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.xl\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.xl\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.xl\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.xl\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.xl\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.xl\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.xl\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.xl\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.xl\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.xl\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.xl\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.xl\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.xl\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.xl\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.xl\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.xl\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.xl\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.xl\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.xl\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.xl\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.xl\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.xl\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.xl\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.xl\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.xl\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.xl\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.xl\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.xl\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.xl\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.xl\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.xl\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.xl\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.xl\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.xl\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.xl\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.xl\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.xl\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.xl\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.xl\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.xl\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.xl\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.xl\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.xl\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.xl\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.xl\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.xl\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.xl\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.xl\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.xl\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.xl\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.xl\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.xl\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.xl\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.xl\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.xl\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.xl\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.xl\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.xl\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.xl\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.xl\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.xl\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.xl\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.xl\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.xl\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.xl\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.xl\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.xl\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.xl\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.xl\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.xl\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.xl\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.xl\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.xl\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.xl\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.xl\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.xl\:bg-auto{background-size:auto}.xl\:bg-cover{background-size:cover}.xl\:bg-contain{background-size:contain}.xl\:bg-fixed{background-attachment:fixed}.xl\:bg-local{background-attachment:local}.xl\:bg-scroll{background-attachment:scroll}.xl\:bg-clip-border{background-clip:initial}.xl\:bg-clip-padding{background-clip:padding-box}.xl\:bg-clip-content{background-clip:content-box}.xl\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.xl\:bg-bottom{background-position:bottom}.xl\:bg-center{background-position:50%}.xl\:bg-left{background-position:0}.xl\:bg-left-bottom{background-position:0 100%}.xl\:bg-left-top{background-position:0 0}.xl\:bg-right{background-position:100%}.xl\:bg-right-bottom{background-position:100% 100%}.xl\:bg-right-top{background-position:100% 0}.xl\:bg-top{background-position:top}.xl\:bg-repeat{background-repeat:repeat}.xl\:bg-no-repeat{background-repeat:no-repeat}.xl\:bg-repeat-x{background-repeat:repeat-x}.xl\:bg-repeat-y{background-repeat:repeat-y}.xl\:bg-repeat-round{background-repeat:round}.xl\:bg-repeat-space{background-repeat:space}.xl\:bg-origin-border{background-origin:border-box}.xl\:bg-origin-padding{background-origin:initial}.xl\:bg-origin-content{background-origin:content-box}.xl\:fill-current{fill:currentColor}.xl\:stroke-current{stroke:currentColor}.xl\:stroke-0{stroke-width:0}.xl\:stroke-1{stroke-width:1}.xl\:stroke-2{stroke-width:2}.xl\:object-contain{-o-object-fit:contain;object-fit:contain}.xl\:object-cover{-o-object-fit:cover;object-fit:cover}.xl\:object-fill{-o-object-fit:fill;object-fit:fill}.xl\:object-none{-o-object-fit:none;object-fit:none}.xl\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.xl\:object-bottom{-o-object-position:bottom;object-position:bottom}.xl\:object-center{-o-object-position:center;object-position:center}.xl\:object-left{-o-object-position:left;object-position:left}.xl\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.xl\:object-left-top{-o-object-position:left top;object-position:left top}.xl\:object-right{-o-object-position:right;object-position:right}.xl\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.xl\:object-right-top{-o-object-position:right top;object-position:right top}.xl\:object-top{-o-object-position:top;object-position:top}.xl\:p-0{padding:0}.xl\:p-1{padding:.25rem}.xl\:p-2{padding:.5rem}.xl\:p-3{padding:.75rem}.xl\:p-4{padding:1rem}.xl\:p-5{padding:1.25rem}.xl\:p-6{padding:1.5rem}.xl\:p-7{padding:1.75rem}.xl\:p-8{padding:2rem}.xl\:p-9{padding:2.25rem}.xl\:p-10{padding:2.5rem}.xl\:p-11{padding:2.75rem}.xl\:p-12{padding:3rem}.xl\:p-14{padding:3.5rem}.xl\:p-16{padding:4rem}.xl\:p-20{padding:5rem}.xl\:p-24{padding:6rem}.xl\:p-28{padding:7rem}.xl\:p-32{padding:8rem}.xl\:p-36{padding:9rem}.xl\:p-40{padding:10rem}.xl\:p-44{padding:11rem}.xl\:p-48{padding:12rem}.xl\:p-52{padding:13rem}.xl\:p-56{padding:14rem}.xl\:p-60{padding:15rem}.xl\:p-64{padding:16rem}.xl\:p-72{padding:18rem}.xl\:p-80{padding:20rem}.xl\:p-96{padding:24rem}.xl\:p-px{padding:1px}.xl\:p-0\.5{padding:.125rem}.xl\:p-1\.5{padding:.375rem}.xl\:p-2\.5{padding:.625rem}.xl\:p-3\.5{padding:.875rem}.xl\:px-0{padding-left:0;padding-right:0}.xl\:px-1{padding-left:.25rem;padding-right:.25rem}.xl\:px-2{padding-left:.5rem;padding-right:.5rem}.xl\:px-3{padding-left:.75rem;padding-right:.75rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.xl\:px-6{padding-left:1.5rem;padding-right:1.5rem}.xl\:px-7{padding-left:1.75rem;padding-right:1.75rem}.xl\:px-8{padding-left:2rem;padding-right:2rem}.xl\:px-9{padding-left:2.25rem;padding-right:2.25rem}.xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.xl\:px-11{padding-left:2.75rem;padding-right:2.75rem}.xl\:px-12{padding-left:3rem;padding-right:3rem}.xl\:px-14{padding-left:3.5rem;padding-right:3.5rem}.xl\:px-16{padding-left:4rem;padding-right:4rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:px-24{padding-left:6rem;padding-right:6rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:px-32{padding-left:8rem;padding-right:8rem}.xl\:px-36{padding-left:9rem;padding-right:9rem}.xl\:px-40{padding-left:10rem;padding-right:10rem}.xl\:px-44{padding-left:11rem;padding-right:11rem}.xl\:px-48{padding-left:12rem;padding-right:12rem}.xl\:px-52{padding-left:13rem;padding-right:13rem}.xl\:px-56{padding-left:14rem;padding-right:14rem}.xl\:px-60{padding-left:15rem;padding-right:15rem}.xl\:px-64{padding-left:16rem;padding-right:16rem}.xl\:px-72{padding-left:18rem;padding-right:18rem}.xl\:px-80{padding-left:20rem;padding-right:20rem}.xl\:px-96{padding-left:24rem;padding-right:24rem}.xl\:px-px{padding-left:1px;padding-right:1px}.xl\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.xl\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.xl\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.xl\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.xl\:py-0{padding-top:0;padding-bottom:0}.xl\:py-1{padding-top:.25rem;padding-bottom:.25rem}.xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.xl\:py-3{padding-top:.75rem;padding-bottom:.75rem}.xl\:py-4{padding-top:1rem;padding-bottom:1rem}.xl\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.xl\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.xl\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.xl\:py-8{padding-top:2rem;padding-bottom:2rem}.xl\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.xl\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.xl\:py-12{padding-top:3rem;padding-bottom:3rem}.xl\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.xl\:py-16{padding-top:4rem;padding-bottom:4rem}.xl\:py-20{padding-top:5rem;padding-bottom:5rem}.xl\:py-24{padding-top:6rem;padding-bottom:6rem}.xl\:py-28{padding-top:7rem;padding-bottom:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}.xl\:py-36{padding-top:9rem;padding-bottom:9rem}.xl\:py-40{padding-top:10rem;padding-bottom:10rem}.xl\:py-44{padding-top:11rem;padding-bottom:11rem}.xl\:py-48{padding-top:12rem;padding-bottom:12rem}.xl\:py-52{padding-top:13rem;padding-bottom:13rem}.xl\:py-56{padding-top:14rem;padding-bottom:14rem}.xl\:py-60{padding-top:15rem;padding-bottom:15rem}.xl\:py-64{padding-top:16rem;padding-bottom:16rem}.xl\:py-72{padding-top:18rem;padding-bottom:18rem}.xl\:py-80{padding-top:20rem;padding-bottom:20rem}.xl\:py-96{padding-top:24rem;padding-bottom:24rem}.xl\:py-px{padding-top:1px;padding-bottom:1px}.xl\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.xl\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.xl\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.xl\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.xl\:pt-0{padding-top:0}.xl\:pt-1{padding-top:.25rem}.xl\:pt-2{padding-top:.5rem}.xl\:pt-3{padding-top:.75rem}.xl\:pt-4{padding-top:1rem}.xl\:pt-5{padding-top:1.25rem}.xl\:pt-6{padding-top:1.5rem}.xl\:pt-7{padding-top:1.75rem}.xl\:pt-8{padding-top:2rem}.xl\:pt-9{padding-top:2.25rem}.xl\:pt-10{padding-top:2.5rem}.xl\:pt-11{padding-top:2.75rem}.xl\:pt-12{padding-top:3rem}.xl\:pt-14{padding-top:3.5rem}.xl\:pt-16{padding-top:4rem}.xl\:pt-20{padding-top:5rem}.xl\:pt-24{padding-top:6rem}.xl\:pt-28{padding-top:7rem}.xl\:pt-32{padding-top:8rem}.xl\:pt-36{padding-top:9rem}.xl\:pt-40{padding-top:10rem}.xl\:pt-44{padding-top:11rem}.xl\:pt-48{padding-top:12rem}.xl\:pt-52{padding-top:13rem}.xl\:pt-56{padding-top:14rem}.xl\:pt-60{padding-top:15rem}.xl\:pt-64{padding-top:16rem}.xl\:pt-72{padding-top:18rem}.xl\:pt-80{padding-top:20rem}.xl\:pt-96{padding-top:24rem}.xl\:pt-px{padding-top:1px}.xl\:pt-0\.5{padding-top:.125rem}.xl\:pt-1\.5{padding-top:.375rem}.xl\:pt-2\.5{padding-top:.625rem}.xl\:pt-3\.5{padding-top:.875rem}.xl\:pr-0{padding-right:0}.xl\:pr-1{padding-right:.25rem}.xl\:pr-2{padding-right:.5rem}.xl\:pr-3{padding-right:.75rem}.xl\:pr-4{padding-right:1rem}.xl\:pr-5{padding-right:1.25rem}.xl\:pr-6{padding-right:1.5rem}.xl\:pr-7{padding-right:1.75rem}.xl\:pr-8{padding-right:2rem}.xl\:pr-9{padding-right:2.25rem}.xl\:pr-10{padding-right:2.5rem}.xl\:pr-11{padding-right:2.75rem}.xl\:pr-12{padding-right:3rem}.xl\:pr-14{padding-right:3.5rem}.xl\:pr-16{padding-right:4rem}.xl\:pr-20{padding-right:5rem}.xl\:pr-24{padding-right:6rem}.xl\:pr-28{padding-right:7rem}.xl\:pr-32{padding-right:8rem}.xl\:pr-36{padding-right:9rem}.xl\:pr-40{padding-right:10rem}.xl\:pr-44{padding-right:11rem}.xl\:pr-48{padding-right:12rem}.xl\:pr-52{padding-right:13rem}.xl\:pr-56{padding-right:14rem}.xl\:pr-60{padding-right:15rem}.xl\:pr-64{padding-right:16rem}.xl\:pr-72{padding-right:18rem}.xl\:pr-80{padding-right:20rem}.xl\:pr-96{padding-right:24rem}.xl\:pr-px{padding-right:1px}.xl\:pr-0\.5{padding-right:.125rem}.xl\:pr-1\.5{padding-right:.375rem}.xl\:pr-2\.5{padding-right:.625rem}.xl\:pr-3\.5{padding-right:.875rem}.xl\:pb-0{padding-bottom:0}.xl\:pb-1{padding-bottom:.25rem}.xl\:pb-2{padding-bottom:.5rem}.xl\:pb-3{padding-bottom:.75rem}.xl\:pb-4{padding-bottom:1rem}.xl\:pb-5{padding-bottom:1.25rem}.xl\:pb-6{padding-bottom:1.5rem}.xl\:pb-7{padding-bottom:1.75rem}.xl\:pb-8{padding-bottom:2rem}.xl\:pb-9{padding-bottom:2.25rem}.xl\:pb-10{padding-bottom:2.5rem}.xl\:pb-11{padding-bottom:2.75rem}.xl\:pb-12{padding-bottom:3rem}.xl\:pb-14{padding-bottom:3.5rem}.xl\:pb-16{padding-bottom:4rem}.xl\:pb-20{padding-bottom:5rem}.xl\:pb-24{padding-bottom:6rem}.xl\:pb-28{padding-bottom:7rem}.xl\:pb-32{padding-bottom:8rem}.xl\:pb-36{padding-bottom:9rem}.xl\:pb-40{padding-bottom:10rem}.xl\:pb-44{padding-bottom:11rem}.xl\:pb-48{padding-bottom:12rem}.xl\:pb-52{padding-bottom:13rem}.xl\:pb-56{padding-bottom:14rem}.xl\:pb-60{padding-bottom:15rem}.xl\:pb-64{padding-bottom:16rem}.xl\:pb-72{padding-bottom:18rem}.xl\:pb-80{padding-bottom:20rem}.xl\:pb-96{padding-bottom:24rem}.xl\:pb-px{padding-bottom:1px}.xl\:pb-0\.5{padding-bottom:.125rem}.xl\:pb-1\.5{padding-bottom:.375rem}.xl\:pb-2\.5{padding-bottom:.625rem}.xl\:pb-3\.5{padding-bottom:.875rem}.xl\:pl-0{padding-left:0}.xl\:pl-1{padding-left:.25rem}.xl\:pl-2{padding-left:.5rem}.xl\:pl-3{padding-left:.75rem}.xl\:pl-4{padding-left:1rem}.xl\:pl-5{padding-left:1.25rem}.xl\:pl-6{padding-left:1.5rem}.xl\:pl-7{padding-left:1.75rem}.xl\:pl-8{padding-left:2rem}.xl\:pl-9{padding-left:2.25rem}.xl\:pl-10{padding-left:2.5rem}.xl\:pl-11{padding-left:2.75rem}.xl\:pl-12{padding-left:3rem}.xl\:pl-14{padding-left:3.5rem}.xl\:pl-16{padding-left:4rem}.xl\:pl-20{padding-left:5rem}.xl\:pl-24{padding-left:6rem}.xl\:pl-28{padding-left:7rem}.xl\:pl-32{padding-left:8rem}.xl\:pl-36{padding-left:9rem}.xl\:pl-40{padding-left:10rem}.xl\:pl-44{padding-left:11rem}.xl\:pl-48{padding-left:12rem}.xl\:pl-52{padding-left:13rem}.xl\:pl-56{padding-left:14rem}.xl\:pl-60{padding-left:15rem}.xl\:pl-64{padding-left:16rem}.xl\:pl-72{padding-left:18rem}.xl\:pl-80{padding-left:20rem}.xl\:pl-96{padding-left:24rem}.xl\:pl-px{padding-left:1px}.xl\:pl-0\.5{padding-left:.125rem}.xl\:pl-1\.5{padding-left:.375rem}.xl\:pl-2\.5{padding-left:.625rem}.xl\:pl-3\.5{padding-left:.875rem}.xl\:text-left{text-align:left}.xl\:text-center{text-align:center}.xl\:text-right{text-align:right}.xl\:text-justify{text-align:justify}.xl\:align-baseline{vertical-align:initial}.xl\:align-top{vertical-align:top}.xl\:align-middle{vertical-align:middle}.xl\:align-bottom{vertical-align:bottom}.xl\:align-text-top{vertical-align:text-top}.xl\:align-text-bottom{vertical-align:text-bottom}.xl\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.xl\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.xl\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.xl\:text-xs{font-size:.75rem;line-height:1rem}.xl\:text-sm{font-size:.875rem;line-height:1.25rem}.xl\:text-base{font-size:1rem;line-height:1.5rem}.xl\:text-lg{font-size:1.125rem;line-height:1.75rem}.xl\:text-xl{font-size:1.25rem;line-height:1.75rem}.xl\:text-2xl{font-size:1.5rem;line-height:2rem}.xl\:text-3xl{font-size:1.875rem;line-height:2.25rem}.xl\:text-4xl{font-size:2.25rem;line-height:2.5rem}.xl\:text-5xl{font-size:3rem;line-height:1}.xl\:text-6xl{font-size:3.75rem;line-height:1}.xl\:text-7xl{font-size:4.5rem;line-height:1}.xl\:text-8xl{font-size:6rem;line-height:1}.xl\:text-9xl{font-size:8rem;line-height:1}.xl\:font-thin{font-weight:100}.xl\:font-extralight{font-weight:200}.xl\:font-light{font-weight:300}.xl\:font-normal{font-weight:400}.xl\:font-medium{font-weight:500}.xl\:font-semibold{font-weight:600}.xl\:font-bold{font-weight:700}.xl\:font-extrabold{font-weight:800}.xl\:font-black{font-weight:900}.xl\:uppercase{text-transform:uppercase}.xl\:lowercase{text-transform:lowercase}.xl\:capitalize{text-transform:capitalize}.xl\:normal-case{text-transform:none}.xl\:italic{font-style:italic}.xl\:not-italic{font-style:normal}.xl\:diagonal-fractions,.xl\:lining-nums,.xl\:oldstyle-nums,.xl\:ordinal,.xl\:proportional-nums,.xl\:slashed-zero,.xl\:stacked-fractions,.xl\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.xl\:normal-nums{font-variant-numeric:normal}.xl\:ordinal{--tw-ordinal:ordinal}.xl\:slashed-zero{--tw-slashed-zero:slashed-zero}.xl\:lining-nums{--tw-numeric-figure:lining-nums}.xl\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.xl\:proportional-nums{--tw-numeric-spacing:proportional-nums}.xl\:tabular-nums{--tw-numeric-spacing:tabular-nums}.xl\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.xl\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.xl\:leading-3{line-height:.75rem}.xl\:leading-4{line-height:1rem}.xl\:leading-5{line-height:1.25rem}.xl\:leading-6{line-height:1.5rem}.xl\:leading-7{line-height:1.75rem}.xl\:leading-8{line-height:2rem}.xl\:leading-9{line-height:2.25rem}.xl\:leading-10{line-height:2.5rem}.xl\:leading-none{line-height:1}.xl\:leading-tight{line-height:1.25}.xl\:leading-snug{line-height:1.375}.xl\:leading-normal{line-height:1.5}.xl\:leading-relaxed{line-height:1.625}.xl\:leading-loose{line-height:2}.xl\:tracking-tighter{letter-spacing:-.05em}.xl\:tracking-tight{letter-spacing:-.025em}.xl\:tracking-normal{letter-spacing:0}.xl\:tracking-wide{letter-spacing:.025em}.xl\:tracking-wider{letter-spacing:.05em}.xl\:tracking-widest{letter-spacing:.1em}.xl\:text-transparent{color:transparent}.xl\:text-current{color:currentColor}.xl\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-transparent{color:transparent}.group:hover .xl\:group-hover\:text-current{color:currentColor}.group:hover .xl\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .xl\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:focus-within\:text-transparent:focus-within{color:transparent}.xl\:focus-within\:text-current:focus-within{color:currentColor}.xl\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:hover\:text-transparent:hover{color:transparent}.xl\:hover\:text-current:hover{color:currentColor}.xl\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:focus\:text-transparent:focus{color:transparent}.xl\:focus\:text-current:focus{color:currentColor}.xl\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.xl\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.xl\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.xl\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.xl\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.xl\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.xl\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.xl\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.xl\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.xl\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.xl\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.xl\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.xl\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.xl\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.xl\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.xl\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.xl\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.xl\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.xl\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.xl\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.xl\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.xl\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.xl\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.xl\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.xl\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.xl\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.xl\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.xl\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.xl\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.xl\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.xl\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.xl\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.xl\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.xl\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.xl\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.xl\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.xl\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.xl\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.xl\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.xl\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.xl\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.xl\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.xl\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.xl\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.xl\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.xl\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.xl\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.xl\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.xl\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.xl\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.xl\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.xl\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.xl\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.xl\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.xl\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.xl\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.xl\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.xl\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.xl\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.xl\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.xl\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.xl\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.xl\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.xl\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.xl\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.xl\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.xl\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.xl\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.xl\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.xl\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.xl\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.xl\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.xl\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.xl\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.xl\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.xl\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.xl\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.xl\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.xl\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.xl\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.xl\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.xl\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.xl\:text-opacity-0{--tw-text-opacity:0}.xl\:text-opacity-5{--tw-text-opacity:0.05}.xl\:text-opacity-10{--tw-text-opacity:0.1}.xl\:text-opacity-20{--tw-text-opacity:0.2}.xl\:text-opacity-25{--tw-text-opacity:0.25}.xl\:text-opacity-30{--tw-text-opacity:0.3}.xl\:text-opacity-40{--tw-text-opacity:0.4}.xl\:text-opacity-50{--tw-text-opacity:0.5}.xl\:text-opacity-60{--tw-text-opacity:0.6}.xl\:text-opacity-70{--tw-text-opacity:0.7}.xl\:text-opacity-75{--tw-text-opacity:0.75}.xl\:text-opacity-80{--tw-text-opacity:0.8}.xl\:text-opacity-90{--tw-text-opacity:0.9}.xl\:text-opacity-95{--tw-text-opacity:0.95}.xl\:text-opacity-100{--tw-text-opacity:1}.group:hover .xl\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .xl\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .xl\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .xl\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .xl\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .xl\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .xl\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .xl\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .xl\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .xl\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .xl\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .xl\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .xl\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .xl\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .xl\:group-hover\:text-opacity-100{--tw-text-opacity:1}.xl\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.xl\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.xl\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.xl\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.xl\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.xl\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.xl\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.xl\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.xl\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.xl\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.xl\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.xl\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.xl\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.xl\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.xl\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.xl\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.xl\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.xl\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.xl\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.xl\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.xl\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.xl\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.xl\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.xl\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.xl\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.xl\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.xl\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.xl\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.xl\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.xl\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.xl\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.xl\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.xl\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.xl\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.xl\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.xl\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.xl\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.xl\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.xl\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.xl\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.xl\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.xl\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.xl\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.xl\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.xl\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.xl\:underline{text-decoration:underline}.xl\:line-through{text-decoration:line-through}.xl\:no-underline{text-decoration:none}.group:hover .xl\:group-hover\:underline{text-decoration:underline}.group:hover .xl\:group-hover\:line-through{text-decoration:line-through}.group:hover .xl\:group-hover\:no-underline{text-decoration:none}.xl\:focus-within\:underline:focus-within{text-decoration:underline}.xl\:focus-within\:line-through:focus-within{text-decoration:line-through}.xl\:focus-within\:no-underline:focus-within{text-decoration:none}.xl\:hover\:underline:hover{text-decoration:underline}.xl\:hover\:line-through:hover{text-decoration:line-through}.xl\:hover\:no-underline:hover{text-decoration:none}.xl\:focus\:underline:focus{text-decoration:underline}.xl\:focus\:line-through:focus{text-decoration:line-through}.xl\:focus\:no-underline:focus{text-decoration:none}.xl\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.xl\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.xl\:placeholder-transparent::-moz-placeholder{color:transparent}.xl\:placeholder-transparent:-ms-input-placeholder{color:transparent}.xl\:placeholder-transparent::placeholder{color:transparent}.xl\:placeholder-current::-moz-placeholder{color:currentColor}.xl\:placeholder-current:-ms-input-placeholder{color:currentColor}.xl\:placeholder-current::placeholder{color:currentColor}.xl\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.xl\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus::placeholder{color:currentColor}.xl\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.xl\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.xl\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.xl\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.xl\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.xl\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.xl\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.xl\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.xl\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.xl\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.xl\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.xl\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.xl\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.xl\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.xl\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.xl\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.xl\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.xl\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.xl\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.xl\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.xl\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.xl\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.xl\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.xl\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.xl\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.xl\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.xl\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.xl\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.xl\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.xl\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.xl\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.xl\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.xl\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.xl\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.xl\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.xl\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.xl\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.xl\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.xl\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.xl\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.xl\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.xl\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.xl\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.xl\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.xl\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.xl\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.xl\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.xl\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.xl\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.xl\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.xl\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.xl\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.xl\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.xl\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.xl\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.xl\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.xl\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.xl\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.xl\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.xl\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.xl\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.xl\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.xl\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.xl\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.xl\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.xl\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.xl\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.xl\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.xl\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.xl\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.xl\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.xl\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.xl\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.xl\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.xl\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.xl\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.xl\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.xl\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.xl\:opacity-0{opacity:0}.xl\:opacity-5{opacity:.05}.xl\:opacity-10{opacity:.1}.xl\:opacity-20{opacity:.2}.xl\:opacity-25{opacity:.25}.xl\:opacity-30{opacity:.3}.xl\:opacity-40{opacity:.4}.xl\:opacity-50{opacity:.5}.xl\:opacity-60{opacity:.6}.xl\:opacity-70{opacity:.7}.xl\:opacity-75{opacity:.75}.xl\:opacity-80{opacity:.8}.xl\:opacity-90{opacity:.9}.xl\:opacity-95{opacity:.95}.xl\:opacity-100{opacity:1}.group:hover .xl\:group-hover\:opacity-0{opacity:0}.group:hover .xl\:group-hover\:opacity-5{opacity:.05}.group:hover .xl\:group-hover\:opacity-10{opacity:.1}.group:hover .xl\:group-hover\:opacity-20{opacity:.2}.group:hover .xl\:group-hover\:opacity-25{opacity:.25}.group:hover .xl\:group-hover\:opacity-30{opacity:.3}.group:hover .xl\:group-hover\:opacity-40{opacity:.4}.group:hover .xl\:group-hover\:opacity-50{opacity:.5}.group:hover .xl\:group-hover\:opacity-60{opacity:.6}.group:hover .xl\:group-hover\:opacity-70{opacity:.7}.group:hover .xl\:group-hover\:opacity-75{opacity:.75}.group:hover .xl\:group-hover\:opacity-80{opacity:.8}.group:hover .xl\:group-hover\:opacity-90{opacity:.9}.group:hover .xl\:group-hover\:opacity-95{opacity:.95}.group:hover .xl\:group-hover\:opacity-100{opacity:1}.xl\:focus-within\:opacity-0:focus-within{opacity:0}.xl\:focus-within\:opacity-5:focus-within{opacity:.05}.xl\:focus-within\:opacity-10:focus-within{opacity:.1}.xl\:focus-within\:opacity-20:focus-within{opacity:.2}.xl\:focus-within\:opacity-25:focus-within{opacity:.25}.xl\:focus-within\:opacity-30:focus-within{opacity:.3}.xl\:focus-within\:opacity-40:focus-within{opacity:.4}.xl\:focus-within\:opacity-50:focus-within{opacity:.5}.xl\:focus-within\:opacity-60:focus-within{opacity:.6}.xl\:focus-within\:opacity-70:focus-within{opacity:.7}.xl\:focus-within\:opacity-75:focus-within{opacity:.75}.xl\:focus-within\:opacity-80:focus-within{opacity:.8}.xl\:focus-within\:opacity-90:focus-within{opacity:.9}.xl\:focus-within\:opacity-95:focus-within{opacity:.95}.xl\:focus-within\:opacity-100:focus-within{opacity:1}.xl\:hover\:opacity-0:hover{opacity:0}.xl\:hover\:opacity-5:hover{opacity:.05}.xl\:hover\:opacity-10:hover{opacity:.1}.xl\:hover\:opacity-20:hover{opacity:.2}.xl\:hover\:opacity-25:hover{opacity:.25}.xl\:hover\:opacity-30:hover{opacity:.3}.xl\:hover\:opacity-40:hover{opacity:.4}.xl\:hover\:opacity-50:hover{opacity:.5}.xl\:hover\:opacity-60:hover{opacity:.6}.xl\:hover\:opacity-70:hover{opacity:.7}.xl\:hover\:opacity-75:hover{opacity:.75}.xl\:hover\:opacity-80:hover{opacity:.8}.xl\:hover\:opacity-90:hover{opacity:.9}.xl\:hover\:opacity-95:hover{opacity:.95}.xl\:hover\:opacity-100:hover{opacity:1}.xl\:focus\:opacity-0:focus{opacity:0}.xl\:focus\:opacity-5:focus{opacity:.05}.xl\:focus\:opacity-10:focus{opacity:.1}.xl\:focus\:opacity-20:focus{opacity:.2}.xl\:focus\:opacity-25:focus{opacity:.25}.xl\:focus\:opacity-30:focus{opacity:.3}.xl\:focus\:opacity-40:focus{opacity:.4}.xl\:focus\:opacity-50:focus{opacity:.5}.xl\:focus\:opacity-60:focus{opacity:.6}.xl\:focus\:opacity-70:focus{opacity:.7}.xl\:focus\:opacity-75:focus{opacity:.75}.xl\:focus\:opacity-80:focus{opacity:.8}.xl\:focus\:opacity-90:focus{opacity:.9}.xl\:focus\:opacity-95:focus{opacity:.95}.xl\:focus\:opacity-100:focus{opacity:1}.xl\:bg-blend-normal{background-blend-mode:normal}.xl\:bg-blend-multiply{background-blend-mode:multiply}.xl\:bg-blend-screen{background-blend-mode:screen}.xl\:bg-blend-overlay{background-blend-mode:overlay}.xl\:bg-blend-darken{background-blend-mode:darken}.xl\:bg-blend-lighten{background-blend-mode:lighten}.xl\:bg-blend-color-dodge{background-blend-mode:color-dodge}.xl\:bg-blend-color-burn{background-blend-mode:color-burn}.xl\:bg-blend-hard-light{background-blend-mode:hard-light}.xl\:bg-blend-soft-light{background-blend-mode:soft-light}.xl\:bg-blend-difference{background-blend-mode:difference}.xl\:bg-blend-exclusion{background-blend-mode:exclusion}.xl\:bg-blend-hue{background-blend-mode:hue}.xl\:bg-blend-saturation{background-blend-mode:saturation}.xl\:bg-blend-color{background-blend-mode:color}.xl\:bg-blend-luminosity{background-blend-mode:luminosity}.xl\:mix-blend-normal{mix-blend-mode:normal}.xl\:mix-blend-multiply{mix-blend-mode:multiply}.xl\:mix-blend-screen{mix-blend-mode:screen}.xl\:mix-blend-overlay{mix-blend-mode:overlay}.xl\:mix-blend-darken{mix-blend-mode:darken}.xl\:mix-blend-lighten{mix-blend-mode:lighten}.xl\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.xl\:mix-blend-color-burn{mix-blend-mode:color-burn}.xl\:mix-blend-hard-light{mix-blend-mode:hard-light}.xl\:mix-blend-soft-light{mix-blend-mode:soft-light}.xl\:mix-blend-difference{mix-blend-mode:difference}.xl\:mix-blend-exclusion{mix-blend-mode:exclusion}.xl\:mix-blend-hue{mix-blend-mode:hue}.xl\:mix-blend-saturation{mix-blend-mode:saturation}.xl\:mix-blend-color{mix-blend-mode:color}.xl\:mix-blend-luminosity{mix-blend-mode:luminosity}.xl\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.xl\:shadow,.xl\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.xl\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.xl\:shadow-lg,.xl\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.xl\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.xl\:shadow-2xl,.xl\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.xl\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.xl\:shadow-inner,.xl\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .xl\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .xl\:group-hover\:shadow,.group:hover .xl\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .xl\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .xl\:group-hover\:shadow-lg,.group:hover .xl\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .xl\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .xl\:group-hover\:shadow-2xl,.group:hover .xl\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .xl\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .xl\:group-hover\:shadow-inner,.group:hover .xl\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .xl\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.xl\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.xl\:hover\:shadow-sm:hover,.xl\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.xl\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.xl\:hover\:shadow-lg:hover,.xl\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.xl\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.xl\:hover\:shadow-2xl:hover,.xl\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.xl\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.xl\:hover\:shadow-inner:hover,.xl\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.xl\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.xl\:focus\:shadow-sm:focus,.xl\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.xl\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.xl\:focus\:shadow-lg:focus,.xl\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.xl\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.xl\:focus\:shadow-2xl:focus,.xl\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.xl\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.xl\:focus\:shadow-inner:focus,.xl\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.xl\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.xl\:outline-none{outline:2px solid transparent;outline-offset:2px}.xl\:outline-white{outline:2px dotted #fff;outline-offset:2px}.xl\:outline-black{outline:2px dotted #000;outline-offset:2px}.xl\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.xl\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.xl\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.xl\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.xl\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.xl\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.xl\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-0,.xl\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-2,.xl\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring,.xl\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-0:focus,.xl\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-2:focus,.xl\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:focus\:ring-8:focus,.xl\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.xl\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.xl\:ring-inset{--tw-ring-inset:inset}.xl\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.xl\:focus\:ring-inset:focus{--tw-ring-inset:inset}.xl\:ring-transparent{--tw-ring-color:transparent}.xl\:ring-current{--tw-ring-color:currentColor}.xl\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.xl\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.xl\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.xl\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.xl\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.xl\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.xl\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.xl\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.xl\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.xl\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.xl\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.xl\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.xl\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.xl\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.xl\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.xl\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.xl\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.xl\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.xl\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.xl\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.xl\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.xl\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.xl\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.xl\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.xl\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.xl\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.xl\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.xl\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.xl\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.xl\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.xl\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.xl\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.xl\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.xl\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.xl\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.xl\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.xl\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.xl\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.xl\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.xl\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.xl\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.xl\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.xl\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.xl\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.xl\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.xl\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.xl\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.xl\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.xl\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.xl\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.xl\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.xl\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.xl\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.xl\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.xl\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.xl\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.xl\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.xl\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.xl\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.xl\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.xl\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.xl\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.xl\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.xl\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.xl\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.xl\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.xl\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.xl\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.xl\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.xl\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.xl\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.xl\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.xl\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.xl\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.xl\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.xl\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.xl\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.xl\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.xl\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.xl\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.xl\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.xl\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.xl\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.xl\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.xl\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.xl\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.xl\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.xl\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.xl\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.xl\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.xl\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.xl\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.xl\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.xl\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.xl\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.xl\:focus\:ring-current:focus{--tw-ring-color:currentColor}.xl\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.xl\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.xl\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.xl\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.xl\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.xl\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.xl\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.xl\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.xl\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.xl\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.xl\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.xl\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.xl\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.xl\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.xl\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.xl\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.xl\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.xl\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.xl\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.xl\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.xl\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.xl\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.xl\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.xl\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.xl\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.xl\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.xl\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.xl\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.xl\:ring-opacity-0{--tw-ring-opacity:0}.xl\:ring-opacity-5{--tw-ring-opacity:0.05}.xl\:ring-opacity-10{--tw-ring-opacity:0.1}.xl\:ring-opacity-20{--tw-ring-opacity:0.2}.xl\:ring-opacity-25{--tw-ring-opacity:0.25}.xl\:ring-opacity-30{--tw-ring-opacity:0.3}.xl\:ring-opacity-40{--tw-ring-opacity:0.4}.xl\:ring-opacity-50{--tw-ring-opacity:0.5}.xl\:ring-opacity-60{--tw-ring-opacity:0.6}.xl\:ring-opacity-70{--tw-ring-opacity:0.7}.xl\:ring-opacity-75{--tw-ring-opacity:0.75}.xl\:ring-opacity-80{--tw-ring-opacity:0.8}.xl\:ring-opacity-90{--tw-ring-opacity:0.9}.xl\:ring-opacity-95{--tw-ring-opacity:0.95}.xl\:ring-opacity-100{--tw-ring-opacity:1}.xl\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.xl\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.xl\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.xl\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.xl\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.xl\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.xl\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.xl\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.xl\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.xl\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.xl\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.xl\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.xl\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.xl\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.xl\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.xl\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.xl\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.xl\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.xl\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.xl\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.xl\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.xl\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.xl\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.xl\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.xl\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.xl\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.xl\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.xl\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.xl\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.xl\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.xl\:ring-offset-0{--tw-ring-offset-width:0px}.xl\:ring-offset-1{--tw-ring-offset-width:1px}.xl\:ring-offset-2{--tw-ring-offset-width:2px}.xl\:ring-offset-4{--tw-ring-offset-width:4px}.xl\:ring-offset-8{--tw-ring-offset-width:8px}.xl\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.xl\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.xl\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.xl\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.xl\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.xl\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.xl\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.xl\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.xl\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.xl\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.xl\:ring-offset-transparent{--tw-ring-offset-color:transparent}.xl\:ring-offset-current{--tw-ring-offset-color:currentColor}.xl\:ring-offset-black{--tw-ring-offset-color:#000}.xl\:ring-offset-white{--tw-ring-offset-color:#fff}.xl\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.xl\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.xl\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.xl\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.xl\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.xl\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.xl\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.xl\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.xl\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.xl\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.xl\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.xl\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.xl\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.xl\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.xl\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.xl\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.xl\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.xl\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.xl\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.xl\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.xl\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.xl\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.xl\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.xl\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.xl\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.xl\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.xl\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.xl\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.xl\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.xl\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.xl\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.xl\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.xl\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.xl\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.xl\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.xl\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.xl\:ring-offset-green-600{--tw-ring-offset-color:#059669}.xl\:ring-offset-green-700{--tw-ring-offset-color:#047857}.xl\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.xl\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.xl\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.xl\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.xl\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.xl\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.xl\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.xl\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.xl\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.xl\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.xl\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.xl\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.xl\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.xl\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.xl\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.xl\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.xl\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.xl\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.xl\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.xl\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.xl\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.xl\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.xl\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.xl\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.xl\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.xl\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.xl\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.xl\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.xl\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.xl\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.xl\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.xl\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.xl\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.xl\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.xl\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.xl\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.xl\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.xl\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.xl\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.xl\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.xl\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.xl\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.xl\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.xl\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.xl\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.xl\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.xl\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.xl\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.xl\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.xl\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.xl\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.xl\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.xl\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.xl\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.xl\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.xl\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.xl\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.xl\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.xl\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.xl\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.xl\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.xl\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.xl\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.xl\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.xl\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.xl\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.xl\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.xl\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.xl\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.xl\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.xl\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.xl\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.xl\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.xl\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.xl\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.xl\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.xl\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.xl\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.xl\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.xl\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.xl\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.xl\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.xl\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.xl\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.xl\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.xl\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.xl\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.xl\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.xl\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.xl\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.xl\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.xl\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.xl\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.xl\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.xl\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.xl\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.xl\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.xl\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.xl\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.xl\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.xl\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.xl\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.xl\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.xl\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.xl\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.xl\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.xl\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.xl\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.xl\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.xl\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.xl\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.xl\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.xl\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.xl\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.xl\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.xl\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.xl\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.xl\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.xl\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.xl\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.xl\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.xl\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.xl\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.xl\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.xl\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.xl\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.xl\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.xl\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.xl\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.xl\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.xl\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.xl\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.xl\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.xl\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.xl\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.xl\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.xl\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.xl\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.xl\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.xl\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.xl\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.xl\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.xl\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.xl\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.xl\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.xl\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.xl\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.xl\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.xl\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.xl\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.xl\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.xl\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.xl\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.xl\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.xl\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.xl\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.xl\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.xl\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.xl\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.xl\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.xl\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.xl\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.xl\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.xl\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.xl\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.xl\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.xl\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.xl\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.xl\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.xl\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.xl\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.xl\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.xl\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.xl\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.xl\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.xl\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.xl\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.xl\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.xl\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.xl\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.xl\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.xl\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.xl\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.xl\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.xl\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.xl\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.xl\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.xl\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.xl\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.xl\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.xl\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.xl\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.xl\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.xl\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.xl\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.xl\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.xl\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.xl\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.xl\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.xl\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.xl\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.xl\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.xl\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.xl\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.xl\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.xl\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.xl\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.xl\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.xl\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.xl\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.xl\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.xl\:filter-none{filter:none}.xl\:blur-0,.xl\:blur-none{--tw-blur:blur(0)}.xl\:blur-sm{--tw-blur:blur(4px)}.xl\:blur{--tw-blur:blur(8px)}.xl\:blur-md{--tw-blur:blur(12px)}.xl\:blur-lg{--tw-blur:blur(16px)}.xl\:blur-xl{--tw-blur:blur(24px)}.xl\:blur-2xl{--tw-blur:blur(40px)}.xl\:blur-3xl{--tw-blur:blur(64px)}.xl\:brightness-0{--tw-brightness:brightness(0)}.xl\:brightness-50{--tw-brightness:brightness(.5)}.xl\:brightness-75{--tw-brightness:brightness(.75)}.xl\:brightness-90{--tw-brightness:brightness(.9)}.xl\:brightness-95{--tw-brightness:brightness(.95)}.xl\:brightness-100{--tw-brightness:brightness(1)}.xl\:brightness-105{--tw-brightness:brightness(1.05)}.xl\:brightness-110{--tw-brightness:brightness(1.1)}.xl\:brightness-125{--tw-brightness:brightness(1.25)}.xl\:brightness-150{--tw-brightness:brightness(1.5)}.xl\:brightness-200{--tw-brightness:brightness(2)}.xl\:contrast-0{--tw-contrast:contrast(0)}.xl\:contrast-50{--tw-contrast:contrast(.5)}.xl\:contrast-75{--tw-contrast:contrast(.75)}.xl\:contrast-100{--tw-contrast:contrast(1)}.xl\:contrast-125{--tw-contrast:contrast(1.25)}.xl\:contrast-150{--tw-contrast:contrast(1.5)}.xl\:contrast-200{--tw-contrast:contrast(2)}.xl\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.xl\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.xl\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.xl\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.xl\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.xl\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.xl\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.xl\:grayscale-0{--tw-grayscale:grayscale(0)}.xl\:grayscale{--tw-grayscale:grayscale(100%)}.xl\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.xl\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.xl\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.xl\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.xl\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.xl\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.xl\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.xl\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.xl\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.xl\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.xl\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.xl\:invert-0{--tw-invert:invert(0)}.xl\:invert{--tw-invert:invert(100%)}.xl\:saturate-0{--tw-saturate:saturate(0)}.xl\:saturate-50{--tw-saturate:saturate(.5)}.xl\:saturate-100{--tw-saturate:saturate(1)}.xl\:saturate-150{--tw-saturate:saturate(1.5)}.xl\:saturate-200{--tw-saturate:saturate(2)}.xl\:sepia-0{--tw-sepia:sepia(0)}.xl\:sepia{--tw-sepia:sepia(100%)}.xl\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.xl\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.xl\:backdrop-blur-0,.xl\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.xl\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.xl\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.xl\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.xl\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.xl\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.xl\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.xl\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.xl\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.xl\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.xl\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.xl\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.xl\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.xl\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.xl\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.xl\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.xl\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.xl\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.xl\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.xl\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.xl\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.xl\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.xl\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.xl\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.xl\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.xl\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.xl\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.xl\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.xl\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.xl\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.xl\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.xl\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.xl\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.xl\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.xl\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.xl\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.xl\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.xl\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.xl\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.xl\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.xl\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.xl\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.xl\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.xl\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.xl\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.xl\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.xl\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.xl\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.xl\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.xl\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.xl\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.xl\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.xl\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.xl\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.xl\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.xl\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.xl\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.xl\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.xl\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.xl\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.xl\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.xl\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.xl\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.xl\:transition-none{transition-property:none}.xl\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.xl\:delay-75{transition-delay:75ms}.xl\:delay-100{transition-delay:.1s}.xl\:delay-150{transition-delay:.15s}.xl\:delay-200{transition-delay:.2s}.xl\:delay-300{transition-delay:.3s}.xl\:delay-500{transition-delay:.5s}.xl\:delay-700{transition-delay:.7s}.xl\:delay-1000{transition-delay:1s}.xl\:duration-75{transition-duration:75ms}.xl\:duration-100{transition-duration:.1s}.xl\:duration-150{transition-duration:.15s}.xl\:duration-200{transition-duration:.2s}.xl\:duration-300{transition-duration:.3s}.xl\:duration-500{transition-duration:.5s}.xl\:duration-700{transition-duration:.7s}.xl\:duration-1000{transition-duration:1s}.xl\:ease-linear{transition-timing-function:linear}.xl\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.xl\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.xl\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}}@media (min-width:1536px){.\32xl\:container{width:100%}@media (min-width:640px){.\32xl\:container{max-width:640px}}@media (min-width:768px){.\32xl\:container{max-width:768px}}@media (min-width:1024px){.\32xl\:container{max-width:1024px}}@media (min-width:1280px){.\32xl\:container{max-width:1280px}}@media (min-width:1536px){.\32xl\:container{max-width:1536px}}.\32xl\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\32xl\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.\32xl\:focus-within\:sr-only:focus-within{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\32xl\:focus-within\:not-sr-only:focus-within{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.\32xl\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\32xl\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.\32xl\:pointer-events-none{pointer-events:none}.\32xl\:pointer-events-auto{pointer-events:auto}.\32xl\:visible{visibility:visible}.\32xl\:invisible{visibility:hidden}.\32xl\:static{position:static}.\32xl\:fixed{position:fixed}.\32xl\:absolute{position:absolute}.\32xl\:relative{position:relative}.\32xl\:sticky{position:-webkit-sticky;position:sticky}.\32xl\:inset-0{top:0;right:0;bottom:0;left:0}.\32xl\:inset-1{top:.25rem;right:.25rem;bottom:.25rem;left:.25rem}.\32xl\:inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.\32xl\:inset-3{top:.75rem;right:.75rem;bottom:.75rem;left:.75rem}.\32xl\:inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.\32xl\:inset-5{top:1.25rem;right:1.25rem;bottom:1.25rem;left:1.25rem}.\32xl\:inset-6{top:1.5rem;right:1.5rem;bottom:1.5rem;left:1.5rem}.\32xl\:inset-7{top:1.75rem;right:1.75rem;bottom:1.75rem;left:1.75rem}.\32xl\:inset-8{top:2rem;right:2rem;bottom:2rem;left:2rem}.\32xl\:inset-9{top:2.25rem;right:2.25rem;bottom:2.25rem;left:2.25rem}.\32xl\:inset-10{top:2.5rem;right:2.5rem;bottom:2.5rem;left:2.5rem}.\32xl\:inset-11{top:2.75rem;right:2.75rem;bottom:2.75rem;left:2.75rem}.\32xl\:inset-12{top:3rem;right:3rem;bottom:3rem;left:3rem}.\32xl\:inset-14{top:3.5rem;right:3.5rem;bottom:3.5rem;left:3.5rem}.\32xl\:inset-16{top:4rem;right:4rem;bottom:4rem;left:4rem}.\32xl\:inset-20{top:5rem;right:5rem;bottom:5rem;left:5rem}.\32xl\:inset-24{top:6rem;right:6rem;bottom:6rem;left:6rem}.\32xl\:inset-28{top:7rem;right:7rem;bottom:7rem;left:7rem}.\32xl\:inset-32{top:8rem;right:8rem;bottom:8rem;left:8rem}.\32xl\:inset-36{top:9rem;right:9rem;bottom:9rem;left:9rem}.\32xl\:inset-40{top:10rem;right:10rem;bottom:10rem;left:10rem}.\32xl\:inset-44{top:11rem;right:11rem;bottom:11rem;left:11rem}.\32xl\:inset-48{top:12rem;right:12rem;bottom:12rem;left:12rem}.\32xl\:inset-52{top:13rem;right:13rem;bottom:13rem;left:13rem}.\32xl\:inset-56{top:14rem;right:14rem;bottom:14rem;left:14rem}.\32xl\:inset-60{top:15rem;right:15rem;bottom:15rem;left:15rem}.\32xl\:inset-64{top:16rem;right:16rem;bottom:16rem;left:16rem}.\32xl\:inset-72{top:18rem;right:18rem;bottom:18rem;left:18rem}.\32xl\:inset-80{top:20rem;right:20rem;bottom:20rem;left:20rem}.\32xl\:inset-96{top:24rem;right:24rem;bottom:24rem;left:24rem}.\32xl\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.\32xl\:inset-px{top:1px;right:1px;bottom:1px;left:1px}.\32xl\:inset-0\.5{top:.125rem;right:.125rem;bottom:.125rem;left:.125rem}.\32xl\:inset-1\.5{top:.375rem;right:.375rem;bottom:.375rem;left:.375rem}.\32xl\:inset-2\.5{top:.625rem;right:.625rem;bottom:.625rem;left:.625rem}.\32xl\:inset-3\.5{top:.875rem;right:.875rem;bottom:.875rem;left:.875rem}.\32xl\:-inset-0{top:0;right:0;bottom:0;left:0}.\32xl\:-inset-1{top:-.25rem;right:-.25rem;bottom:-.25rem;left:-.25rem}.\32xl\:-inset-2{top:-.5rem;right:-.5rem;bottom:-.5rem;left:-.5rem}.\32xl\:-inset-3{top:-.75rem;right:-.75rem;bottom:-.75rem;left:-.75rem}.\32xl\:-inset-4{top:-1rem;right:-1rem;bottom:-1rem;left:-1rem}.\32xl\:-inset-5{top:-1.25rem;right:-1.25rem;bottom:-1.25rem;left:-1.25rem}.\32xl\:-inset-6{top:-1.5rem;right:-1.5rem;bottom:-1.5rem;left:-1.5rem}.\32xl\:-inset-7{top:-1.75rem;right:-1.75rem;bottom:-1.75rem;left:-1.75rem}.\32xl\:-inset-8{top:-2rem;right:-2rem;bottom:-2rem;left:-2rem}.\32xl\:-inset-9{top:-2.25rem;right:-2.25rem;bottom:-2.25rem;left:-2.25rem}.\32xl\:-inset-10{top:-2.5rem;right:-2.5rem;bottom:-2.5rem;left:-2.5rem}.\32xl\:-inset-11{top:-2.75rem;right:-2.75rem;bottom:-2.75rem;left:-2.75rem}.\32xl\:-inset-12{top:-3rem;right:-3rem;bottom:-3rem;left:-3rem}.\32xl\:-inset-14{top:-3.5rem;right:-3.5rem;bottom:-3.5rem;left:-3.5rem}.\32xl\:-inset-16{top:-4rem;right:-4rem;bottom:-4rem;left:-4rem}.\32xl\:-inset-20{top:-5rem;right:-5rem;bottom:-5rem;left:-5rem}.\32xl\:-inset-24{top:-6rem;right:-6rem;bottom:-6rem;left:-6rem}.\32xl\:-inset-28{top:-7rem;right:-7rem;bottom:-7rem;left:-7rem}.\32xl\:-inset-32{top:-8rem;right:-8rem;bottom:-8rem;left:-8rem}.\32xl\:-inset-36{top:-9rem;right:-9rem;bottom:-9rem;left:-9rem}.\32xl\:-inset-40{top:-10rem;right:-10rem;bottom:-10rem;left:-10rem}.\32xl\:-inset-44{top:-11rem;right:-11rem;bottom:-11rem;left:-11rem}.\32xl\:-inset-48{top:-12rem;right:-12rem;bottom:-12rem;left:-12rem}.\32xl\:-inset-52{top:-13rem;right:-13rem;bottom:-13rem;left:-13rem}.\32xl\:-inset-56{top:-14rem;right:-14rem;bottom:-14rem;left:-14rem}.\32xl\:-inset-60{top:-15rem;right:-15rem;bottom:-15rem;left:-15rem}.\32xl\:-inset-64{top:-16rem;right:-16rem;bottom:-16rem;left:-16rem}.\32xl\:-inset-72{top:-18rem;right:-18rem;bottom:-18rem;left:-18rem}.\32xl\:-inset-80{top:-20rem;right:-20rem;bottom:-20rem;left:-20rem}.\32xl\:-inset-96{top:-24rem;right:-24rem;bottom:-24rem;left:-24rem}.\32xl\:-inset-px{top:-1px;right:-1px;bottom:-1px;left:-1px}.\32xl\:-inset-0\.5{top:-.125rem;right:-.125rem;bottom:-.125rem;left:-.125rem}.\32xl\:-inset-1\.5{top:-.375rem;right:-.375rem;bottom:-.375rem;left:-.375rem}.\32xl\:-inset-2\.5{top:-.625rem;right:-.625rem;bottom:-.625rem;left:-.625rem}.\32xl\:-inset-3\.5{top:-.875rem;right:-.875rem;bottom:-.875rem;left:-.875rem}.\32xl\:inset-1\/2{top:50%;right:50%;bottom:50%;left:50%}.\32xl\:inset-1\/3{top:33.333333%;right:33.333333%;bottom:33.333333%;left:33.333333%}.\32xl\:inset-2\/3{top:66.666667%;right:66.666667%;bottom:66.666667%;left:66.666667%}.\32xl\:inset-1\/4{top:25%;right:25%;bottom:25%;left:25%}.\32xl\:inset-2\/4{top:50%;right:50%;bottom:50%;left:50%}.\32xl\:inset-3\/4{top:75%;right:75%;bottom:75%;left:75%}.\32xl\:inset-full{top:100%;right:100%;bottom:100%;left:100%}.\32xl\:-inset-1\/2{top:-50%;right:-50%;bottom:-50%;left:-50%}.\32xl\:-inset-1\/3{top:-33.333333%;right:-33.333333%;bottom:-33.333333%;left:-33.333333%}.\32xl\:-inset-2\/3{top:-66.666667%;right:-66.666667%;bottom:-66.666667%;left:-66.666667%}.\32xl\:-inset-1\/4{top:-25%;right:-25%;bottom:-25%;left:-25%}.\32xl\:-inset-2\/4{top:-50%;right:-50%;bottom:-50%;left:-50%}.\32xl\:-inset-3\/4{top:-75%;right:-75%;bottom:-75%;left:-75%}.\32xl\:-inset-full{top:-100%;right:-100%;bottom:-100%;left:-100%}.\32xl\:inset-x-0{left:0;right:0}.\32xl\:inset-x-1{left:.25rem;right:.25rem}.\32xl\:inset-x-2{left:.5rem;right:.5rem}.\32xl\:inset-x-3{left:.75rem;right:.75rem}.\32xl\:inset-x-4{left:1rem;right:1rem}.\32xl\:inset-x-5{left:1.25rem;right:1.25rem}.\32xl\:inset-x-6{left:1.5rem;right:1.5rem}.\32xl\:inset-x-7{left:1.75rem;right:1.75rem}.\32xl\:inset-x-8{left:2rem;right:2rem}.\32xl\:inset-x-9{left:2.25rem;right:2.25rem}.\32xl\:inset-x-10{left:2.5rem;right:2.5rem}.\32xl\:inset-x-11{left:2.75rem;right:2.75rem}.\32xl\:inset-x-12{left:3rem;right:3rem}.\32xl\:inset-x-14{left:3.5rem;right:3.5rem}.\32xl\:inset-x-16{left:4rem;right:4rem}.\32xl\:inset-x-20{left:5rem;right:5rem}.\32xl\:inset-x-24{left:6rem;right:6rem}.\32xl\:inset-x-28{left:7rem;right:7rem}.\32xl\:inset-x-32{left:8rem;right:8rem}.\32xl\:inset-x-36{left:9rem;right:9rem}.\32xl\:inset-x-40{left:10rem;right:10rem}.\32xl\:inset-x-44{left:11rem;right:11rem}.\32xl\:inset-x-48{left:12rem;right:12rem}.\32xl\:inset-x-52{left:13rem;right:13rem}.\32xl\:inset-x-56{left:14rem;right:14rem}.\32xl\:inset-x-60{left:15rem;right:15rem}.\32xl\:inset-x-64{left:16rem;right:16rem}.\32xl\:inset-x-72{left:18rem;right:18rem}.\32xl\:inset-x-80{left:20rem;right:20rem}.\32xl\:inset-x-96{left:24rem;right:24rem}.\32xl\:inset-x-auto{left:auto;right:auto}.\32xl\:inset-x-px{left:1px;right:1px}.\32xl\:inset-x-0\.5{left:.125rem;right:.125rem}.\32xl\:inset-x-1\.5{left:.375rem;right:.375rem}.\32xl\:inset-x-2\.5{left:.625rem;right:.625rem}.\32xl\:inset-x-3\.5{left:.875rem;right:.875rem}.\32xl\:-inset-x-0{left:0;right:0}.\32xl\:-inset-x-1{left:-.25rem;right:-.25rem}.\32xl\:-inset-x-2{left:-.5rem;right:-.5rem}.\32xl\:-inset-x-3{left:-.75rem;right:-.75rem}.\32xl\:-inset-x-4{left:-1rem;right:-1rem}.\32xl\:-inset-x-5{left:-1.25rem;right:-1.25rem}.\32xl\:-inset-x-6{left:-1.5rem;right:-1.5rem}.\32xl\:-inset-x-7{left:-1.75rem;right:-1.75rem}.\32xl\:-inset-x-8{left:-2rem;right:-2rem}.\32xl\:-inset-x-9{left:-2.25rem;right:-2.25rem}.\32xl\:-inset-x-10{left:-2.5rem;right:-2.5rem}.\32xl\:-inset-x-11{left:-2.75rem;right:-2.75rem}.\32xl\:-inset-x-12{left:-3rem;right:-3rem}.\32xl\:-inset-x-14{left:-3.5rem;right:-3.5rem}.\32xl\:-inset-x-16{left:-4rem;right:-4rem}.\32xl\:-inset-x-20{left:-5rem;right:-5rem}.\32xl\:-inset-x-24{left:-6rem;right:-6rem}.\32xl\:-inset-x-28{left:-7rem;right:-7rem}.\32xl\:-inset-x-32{left:-8rem;right:-8rem}.\32xl\:-inset-x-36{left:-9rem;right:-9rem}.\32xl\:-inset-x-40{left:-10rem;right:-10rem}.\32xl\:-inset-x-44{left:-11rem;right:-11rem}.\32xl\:-inset-x-48{left:-12rem;right:-12rem}.\32xl\:-inset-x-52{left:-13rem;right:-13rem}.\32xl\:-inset-x-56{left:-14rem;right:-14rem}.\32xl\:-inset-x-60{left:-15rem;right:-15rem}.\32xl\:-inset-x-64{left:-16rem;right:-16rem}.\32xl\:-inset-x-72{left:-18rem;right:-18rem}.\32xl\:-inset-x-80{left:-20rem;right:-20rem}.\32xl\:-inset-x-96{left:-24rem;right:-24rem}.\32xl\:-inset-x-px{left:-1px;right:-1px}.\32xl\:-inset-x-0\.5{left:-.125rem;right:-.125rem}.\32xl\:-inset-x-1\.5{left:-.375rem;right:-.375rem}.\32xl\:-inset-x-2\.5{left:-.625rem;right:-.625rem}.\32xl\:-inset-x-3\.5{left:-.875rem;right:-.875rem}.\32xl\:inset-x-1\/2{left:50%;right:50%}.\32xl\:inset-x-1\/3{left:33.333333%;right:33.333333%}.\32xl\:inset-x-2\/3{left:66.666667%;right:66.666667%}.\32xl\:inset-x-1\/4{left:25%;right:25%}.\32xl\:inset-x-2\/4{left:50%;right:50%}.\32xl\:inset-x-3\/4{left:75%;right:75%}.\32xl\:inset-x-full{left:100%;right:100%}.\32xl\:-inset-x-1\/2{left:-50%;right:-50%}.\32xl\:-inset-x-1\/3{left:-33.333333%;right:-33.333333%}.\32xl\:-inset-x-2\/3{left:-66.666667%;right:-66.666667%}.\32xl\:-inset-x-1\/4{left:-25%;right:-25%}.\32xl\:-inset-x-2\/4{left:-50%;right:-50%}.\32xl\:-inset-x-3\/4{left:-75%;right:-75%}.\32xl\:-inset-x-full{left:-100%;right:-100%}.\32xl\:inset-y-0{top:0;bottom:0}.\32xl\:inset-y-1{top:.25rem;bottom:.25rem}.\32xl\:inset-y-2{top:.5rem;bottom:.5rem}.\32xl\:inset-y-3{top:.75rem;bottom:.75rem}.\32xl\:inset-y-4{top:1rem;bottom:1rem}.\32xl\:inset-y-5{top:1.25rem;bottom:1.25rem}.\32xl\:inset-y-6{top:1.5rem;bottom:1.5rem}.\32xl\:inset-y-7{top:1.75rem;bottom:1.75rem}.\32xl\:inset-y-8{top:2rem;bottom:2rem}.\32xl\:inset-y-9{top:2.25rem;bottom:2.25rem}.\32xl\:inset-y-10{top:2.5rem;bottom:2.5rem}.\32xl\:inset-y-11{top:2.75rem;bottom:2.75rem}.\32xl\:inset-y-12{top:3rem;bottom:3rem}.\32xl\:inset-y-14{top:3.5rem;bottom:3.5rem}.\32xl\:inset-y-16{top:4rem;bottom:4rem}.\32xl\:inset-y-20{top:5rem;bottom:5rem}.\32xl\:inset-y-24{top:6rem;bottom:6rem}.\32xl\:inset-y-28{top:7rem;bottom:7rem}.\32xl\:inset-y-32{top:8rem;bottom:8rem}.\32xl\:inset-y-36{top:9rem;bottom:9rem}.\32xl\:inset-y-40{top:10rem;bottom:10rem}.\32xl\:inset-y-44{top:11rem;bottom:11rem}.\32xl\:inset-y-48{top:12rem;bottom:12rem}.\32xl\:inset-y-52{top:13rem;bottom:13rem}.\32xl\:inset-y-56{top:14rem;bottom:14rem}.\32xl\:inset-y-60{top:15rem;bottom:15rem}.\32xl\:inset-y-64{top:16rem;bottom:16rem}.\32xl\:inset-y-72{top:18rem;bottom:18rem}.\32xl\:inset-y-80{top:20rem;bottom:20rem}.\32xl\:inset-y-96{top:24rem;bottom:24rem}.\32xl\:inset-y-auto{top:auto;bottom:auto}.\32xl\:inset-y-px{top:1px;bottom:1px}.\32xl\:inset-y-0\.5{top:.125rem;bottom:.125rem}.\32xl\:inset-y-1\.5{top:.375rem;bottom:.375rem}.\32xl\:inset-y-2\.5{top:.625rem;bottom:.625rem}.\32xl\:inset-y-3\.5{top:.875rem;bottom:.875rem}.\32xl\:-inset-y-0{top:0;bottom:0}.\32xl\:-inset-y-1{top:-.25rem;bottom:-.25rem}.\32xl\:-inset-y-2{top:-.5rem;bottom:-.5rem}.\32xl\:-inset-y-3{top:-.75rem;bottom:-.75rem}.\32xl\:-inset-y-4{top:-1rem;bottom:-1rem}.\32xl\:-inset-y-5{top:-1.25rem;bottom:-1.25rem}.\32xl\:-inset-y-6{top:-1.5rem;bottom:-1.5rem}.\32xl\:-inset-y-7{top:-1.75rem;bottom:-1.75rem}.\32xl\:-inset-y-8{top:-2rem;bottom:-2rem}.\32xl\:-inset-y-9{top:-2.25rem;bottom:-2.25rem}.\32xl\:-inset-y-10{top:-2.5rem;bottom:-2.5rem}.\32xl\:-inset-y-11{top:-2.75rem;bottom:-2.75rem}.\32xl\:-inset-y-12{top:-3rem;bottom:-3rem}.\32xl\:-inset-y-14{top:-3.5rem;bottom:-3.5rem}.\32xl\:-inset-y-16{top:-4rem;bottom:-4rem}.\32xl\:-inset-y-20{top:-5rem;bottom:-5rem}.\32xl\:-inset-y-24{top:-6rem;bottom:-6rem}.\32xl\:-inset-y-28{top:-7rem;bottom:-7rem}.\32xl\:-inset-y-32{top:-8rem;bottom:-8rem}.\32xl\:-inset-y-36{top:-9rem;bottom:-9rem}.\32xl\:-inset-y-40{top:-10rem;bottom:-10rem}.\32xl\:-inset-y-44{top:-11rem;bottom:-11rem}.\32xl\:-inset-y-48{top:-12rem;bottom:-12rem}.\32xl\:-inset-y-52{top:-13rem;bottom:-13rem}.\32xl\:-inset-y-56{top:-14rem;bottom:-14rem}.\32xl\:-inset-y-60{top:-15rem;bottom:-15rem}.\32xl\:-inset-y-64{top:-16rem;bottom:-16rem}.\32xl\:-inset-y-72{top:-18rem;bottom:-18rem}.\32xl\:-inset-y-80{top:-20rem;bottom:-20rem}.\32xl\:-inset-y-96{top:-24rem;bottom:-24rem}.\32xl\:-inset-y-px{top:-1px;bottom:-1px}.\32xl\:-inset-y-0\.5{top:-.125rem;bottom:-.125rem}.\32xl\:-inset-y-1\.5{top:-.375rem;bottom:-.375rem}.\32xl\:-inset-y-2\.5{top:-.625rem;bottom:-.625rem}.\32xl\:-inset-y-3\.5{top:-.875rem;bottom:-.875rem}.\32xl\:inset-y-1\/2{top:50%;bottom:50%}.\32xl\:inset-y-1\/3{top:33.333333%;bottom:33.333333%}.\32xl\:inset-y-2\/3{top:66.666667%;bottom:66.666667%}.\32xl\:inset-y-1\/4{top:25%;bottom:25%}.\32xl\:inset-y-2\/4{top:50%;bottom:50%}.\32xl\:inset-y-3\/4{top:75%;bottom:75%}.\32xl\:inset-y-full{top:100%;bottom:100%}.\32xl\:-inset-y-1\/2{top:-50%;bottom:-50%}.\32xl\:-inset-y-1\/3{top:-33.333333%;bottom:-33.333333%}.\32xl\:-inset-y-2\/3{top:-66.666667%;bottom:-66.666667%}.\32xl\:-inset-y-1\/4{top:-25%;bottom:-25%}.\32xl\:-inset-y-2\/4{top:-50%;bottom:-50%}.\32xl\:-inset-y-3\/4{top:-75%;bottom:-75%}.\32xl\:-inset-y-full{top:-100%;bottom:-100%}.\32xl\:top-0{top:0}.\32xl\:top-1{top:.25rem}.\32xl\:top-2{top:.5rem}.\32xl\:top-3{top:.75rem}.\32xl\:top-4{top:1rem}.\32xl\:top-5{top:1.25rem}.\32xl\:top-6{top:1.5rem}.\32xl\:top-7{top:1.75rem}.\32xl\:top-8{top:2rem}.\32xl\:top-9{top:2.25rem}.\32xl\:top-10{top:2.5rem}.\32xl\:top-11{top:2.75rem}.\32xl\:top-12{top:3rem}.\32xl\:top-14{top:3.5rem}.\32xl\:top-16{top:4rem}.\32xl\:top-20{top:5rem}.\32xl\:top-24{top:6rem}.\32xl\:top-28{top:7rem}.\32xl\:top-32{top:8rem}.\32xl\:top-36{top:9rem}.\32xl\:top-40{top:10rem}.\32xl\:top-44{top:11rem}.\32xl\:top-48{top:12rem}.\32xl\:top-52{top:13rem}.\32xl\:top-56{top:14rem}.\32xl\:top-60{top:15rem}.\32xl\:top-64{top:16rem}.\32xl\:top-72{top:18rem}.\32xl\:top-80{top:20rem}.\32xl\:top-96{top:24rem}.\32xl\:top-auto{top:auto}.\32xl\:top-px{top:1px}.\32xl\:top-0\.5{top:.125rem}.\32xl\:top-1\.5{top:.375rem}.\32xl\:top-2\.5{top:.625rem}.\32xl\:top-3\.5{top:.875rem}.\32xl\:-top-0{top:0}.\32xl\:-top-1{top:-.25rem}.\32xl\:-top-2{top:-.5rem}.\32xl\:-top-3{top:-.75rem}.\32xl\:-top-4{top:-1rem}.\32xl\:-top-5{top:-1.25rem}.\32xl\:-top-6{top:-1.5rem}.\32xl\:-top-7{top:-1.75rem}.\32xl\:-top-8{top:-2rem}.\32xl\:-top-9{top:-2.25rem}.\32xl\:-top-10{top:-2.5rem}.\32xl\:-top-11{top:-2.75rem}.\32xl\:-top-12{top:-3rem}.\32xl\:-top-14{top:-3.5rem}.\32xl\:-top-16{top:-4rem}.\32xl\:-top-20{top:-5rem}.\32xl\:-top-24{top:-6rem}.\32xl\:-top-28{top:-7rem}.\32xl\:-top-32{top:-8rem}.\32xl\:-top-36{top:-9rem}.\32xl\:-top-40{top:-10rem}.\32xl\:-top-44{top:-11rem}.\32xl\:-top-48{top:-12rem}.\32xl\:-top-52{top:-13rem}.\32xl\:-top-56{top:-14rem}.\32xl\:-top-60{top:-15rem}.\32xl\:-top-64{top:-16rem}.\32xl\:-top-72{top:-18rem}.\32xl\:-top-80{top:-20rem}.\32xl\:-top-96{top:-24rem}.\32xl\:-top-px{top:-1px}.\32xl\:-top-0\.5{top:-.125rem}.\32xl\:-top-1\.5{top:-.375rem}.\32xl\:-top-2\.5{top:-.625rem}.\32xl\:-top-3\.5{top:-.875rem}.\32xl\:top-1\/2{top:50%}.\32xl\:top-1\/3{top:33.333333%}.\32xl\:top-2\/3{top:66.666667%}.\32xl\:top-1\/4{top:25%}.\32xl\:top-2\/4{top:50%}.\32xl\:top-3\/4{top:75%}.\32xl\:top-full{top:100%}.\32xl\:-top-1\/2{top:-50%}.\32xl\:-top-1\/3{top:-33.333333%}.\32xl\:-top-2\/3{top:-66.666667%}.\32xl\:-top-1\/4{top:-25%}.\32xl\:-top-2\/4{top:-50%}.\32xl\:-top-3\/4{top:-75%}.\32xl\:-top-full{top:-100%}.\32xl\:right-0{right:0}.\32xl\:right-1{right:.25rem}.\32xl\:right-2{right:.5rem}.\32xl\:right-3{right:.75rem}.\32xl\:right-4{right:1rem}.\32xl\:right-5{right:1.25rem}.\32xl\:right-6{right:1.5rem}.\32xl\:right-7{right:1.75rem}.\32xl\:right-8{right:2rem}.\32xl\:right-9{right:2.25rem}.\32xl\:right-10{right:2.5rem}.\32xl\:right-11{right:2.75rem}.\32xl\:right-12{right:3rem}.\32xl\:right-14{right:3.5rem}.\32xl\:right-16{right:4rem}.\32xl\:right-20{right:5rem}.\32xl\:right-24{right:6rem}.\32xl\:right-28{right:7rem}.\32xl\:right-32{right:8rem}.\32xl\:right-36{right:9rem}.\32xl\:right-40{right:10rem}.\32xl\:right-44{right:11rem}.\32xl\:right-48{right:12rem}.\32xl\:right-52{right:13rem}.\32xl\:right-56{right:14rem}.\32xl\:right-60{right:15rem}.\32xl\:right-64{right:16rem}.\32xl\:right-72{right:18rem}.\32xl\:right-80{right:20rem}.\32xl\:right-96{right:24rem}.\32xl\:right-auto{right:auto}.\32xl\:right-px{right:1px}.\32xl\:right-0\.5{right:.125rem}.\32xl\:right-1\.5{right:.375rem}.\32xl\:right-2\.5{right:.625rem}.\32xl\:right-3\.5{right:.875rem}.\32xl\:-right-0{right:0}.\32xl\:-right-1{right:-.25rem}.\32xl\:-right-2{right:-.5rem}.\32xl\:-right-3{right:-.75rem}.\32xl\:-right-4{right:-1rem}.\32xl\:-right-5{right:-1.25rem}.\32xl\:-right-6{right:-1.5rem}.\32xl\:-right-7{right:-1.75rem}.\32xl\:-right-8{right:-2rem}.\32xl\:-right-9{right:-2.25rem}.\32xl\:-right-10{right:-2.5rem}.\32xl\:-right-11{right:-2.75rem}.\32xl\:-right-12{right:-3rem}.\32xl\:-right-14{right:-3.5rem}.\32xl\:-right-16{right:-4rem}.\32xl\:-right-20{right:-5rem}.\32xl\:-right-24{right:-6rem}.\32xl\:-right-28{right:-7rem}.\32xl\:-right-32{right:-8rem}.\32xl\:-right-36{right:-9rem}.\32xl\:-right-40{right:-10rem}.\32xl\:-right-44{right:-11rem}.\32xl\:-right-48{right:-12rem}.\32xl\:-right-52{right:-13rem}.\32xl\:-right-56{right:-14rem}.\32xl\:-right-60{right:-15rem}.\32xl\:-right-64{right:-16rem}.\32xl\:-right-72{right:-18rem}.\32xl\:-right-80{right:-20rem}.\32xl\:-right-96{right:-24rem}.\32xl\:-right-px{right:-1px}.\32xl\:-right-0\.5{right:-.125rem}.\32xl\:-right-1\.5{right:-.375rem}.\32xl\:-right-2\.5{right:-.625rem}.\32xl\:-right-3\.5{right:-.875rem}.\32xl\:right-1\/2{right:50%}.\32xl\:right-1\/3{right:33.333333%}.\32xl\:right-2\/3{right:66.666667%}.\32xl\:right-1\/4{right:25%}.\32xl\:right-2\/4{right:50%}.\32xl\:right-3\/4{right:75%}.\32xl\:right-full{right:100%}.\32xl\:-right-1\/2{right:-50%}.\32xl\:-right-1\/3{right:-33.333333%}.\32xl\:-right-2\/3{right:-66.666667%}.\32xl\:-right-1\/4{right:-25%}.\32xl\:-right-2\/4{right:-50%}.\32xl\:-right-3\/4{right:-75%}.\32xl\:-right-full{right:-100%}.\32xl\:bottom-0{bottom:0}.\32xl\:bottom-1{bottom:.25rem}.\32xl\:bottom-2{bottom:.5rem}.\32xl\:bottom-3{bottom:.75rem}.\32xl\:bottom-4{bottom:1rem}.\32xl\:bottom-5{bottom:1.25rem}.\32xl\:bottom-6{bottom:1.5rem}.\32xl\:bottom-7{bottom:1.75rem}.\32xl\:bottom-8{bottom:2rem}.\32xl\:bottom-9{bottom:2.25rem}.\32xl\:bottom-10{bottom:2.5rem}.\32xl\:bottom-11{bottom:2.75rem}.\32xl\:bottom-12{bottom:3rem}.\32xl\:bottom-14{bottom:3.5rem}.\32xl\:bottom-16{bottom:4rem}.\32xl\:bottom-20{bottom:5rem}.\32xl\:bottom-24{bottom:6rem}.\32xl\:bottom-28{bottom:7rem}.\32xl\:bottom-32{bottom:8rem}.\32xl\:bottom-36{bottom:9rem}.\32xl\:bottom-40{bottom:10rem}.\32xl\:bottom-44{bottom:11rem}.\32xl\:bottom-48{bottom:12rem}.\32xl\:bottom-52{bottom:13rem}.\32xl\:bottom-56{bottom:14rem}.\32xl\:bottom-60{bottom:15rem}.\32xl\:bottom-64{bottom:16rem}.\32xl\:bottom-72{bottom:18rem}.\32xl\:bottom-80{bottom:20rem}.\32xl\:bottom-96{bottom:24rem}.\32xl\:bottom-auto{bottom:auto}.\32xl\:bottom-px{bottom:1px}.\32xl\:bottom-0\.5{bottom:.125rem}.\32xl\:bottom-1\.5{bottom:.375rem}.\32xl\:bottom-2\.5{bottom:.625rem}.\32xl\:bottom-3\.5{bottom:.875rem}.\32xl\:-bottom-0{bottom:0}.\32xl\:-bottom-1{bottom:-.25rem}.\32xl\:-bottom-2{bottom:-.5rem}.\32xl\:-bottom-3{bottom:-.75rem}.\32xl\:-bottom-4{bottom:-1rem}.\32xl\:-bottom-5{bottom:-1.25rem}.\32xl\:-bottom-6{bottom:-1.5rem}.\32xl\:-bottom-7{bottom:-1.75rem}.\32xl\:-bottom-8{bottom:-2rem}.\32xl\:-bottom-9{bottom:-2.25rem}.\32xl\:-bottom-10{bottom:-2.5rem}.\32xl\:-bottom-11{bottom:-2.75rem}.\32xl\:-bottom-12{bottom:-3rem}.\32xl\:-bottom-14{bottom:-3.5rem}.\32xl\:-bottom-16{bottom:-4rem}.\32xl\:-bottom-20{bottom:-5rem}.\32xl\:-bottom-24{bottom:-6rem}.\32xl\:-bottom-28{bottom:-7rem}.\32xl\:-bottom-32{bottom:-8rem}.\32xl\:-bottom-36{bottom:-9rem}.\32xl\:-bottom-40{bottom:-10rem}.\32xl\:-bottom-44{bottom:-11rem}.\32xl\:-bottom-48{bottom:-12rem}.\32xl\:-bottom-52{bottom:-13rem}.\32xl\:-bottom-56{bottom:-14rem}.\32xl\:-bottom-60{bottom:-15rem}.\32xl\:-bottom-64{bottom:-16rem}.\32xl\:-bottom-72{bottom:-18rem}.\32xl\:-bottom-80{bottom:-20rem}.\32xl\:-bottom-96{bottom:-24rem}.\32xl\:-bottom-px{bottom:-1px}.\32xl\:-bottom-0\.5{bottom:-.125rem}.\32xl\:-bottom-1\.5{bottom:-.375rem}.\32xl\:-bottom-2\.5{bottom:-.625rem}.\32xl\:-bottom-3\.5{bottom:-.875rem}.\32xl\:bottom-1\/2{bottom:50%}.\32xl\:bottom-1\/3{bottom:33.333333%}.\32xl\:bottom-2\/3{bottom:66.666667%}.\32xl\:bottom-1\/4{bottom:25%}.\32xl\:bottom-2\/4{bottom:50%}.\32xl\:bottom-3\/4{bottom:75%}.\32xl\:bottom-full{bottom:100%}.\32xl\:-bottom-1\/2{bottom:-50%}.\32xl\:-bottom-1\/3{bottom:-33.333333%}.\32xl\:-bottom-2\/3{bottom:-66.666667%}.\32xl\:-bottom-1\/4{bottom:-25%}.\32xl\:-bottom-2\/4{bottom:-50%}.\32xl\:-bottom-3\/4{bottom:-75%}.\32xl\:-bottom-full{bottom:-100%}.\32xl\:left-0{left:0}.\32xl\:left-1{left:.25rem}.\32xl\:left-2{left:.5rem}.\32xl\:left-3{left:.75rem}.\32xl\:left-4{left:1rem}.\32xl\:left-5{left:1.25rem}.\32xl\:left-6{left:1.5rem}.\32xl\:left-7{left:1.75rem}.\32xl\:left-8{left:2rem}.\32xl\:left-9{left:2.25rem}.\32xl\:left-10{left:2.5rem}.\32xl\:left-11{left:2.75rem}.\32xl\:left-12{left:3rem}.\32xl\:left-14{left:3.5rem}.\32xl\:left-16{left:4rem}.\32xl\:left-20{left:5rem}.\32xl\:left-24{left:6rem}.\32xl\:left-28{left:7rem}.\32xl\:left-32{left:8rem}.\32xl\:left-36{left:9rem}.\32xl\:left-40{left:10rem}.\32xl\:left-44{left:11rem}.\32xl\:left-48{left:12rem}.\32xl\:left-52{left:13rem}.\32xl\:left-56{left:14rem}.\32xl\:left-60{left:15rem}.\32xl\:left-64{left:16rem}.\32xl\:left-72{left:18rem}.\32xl\:left-80{left:20rem}.\32xl\:left-96{left:24rem}.\32xl\:left-auto{left:auto}.\32xl\:left-px{left:1px}.\32xl\:left-0\.5{left:.125rem}.\32xl\:left-1\.5{left:.375rem}.\32xl\:left-2\.5{left:.625rem}.\32xl\:left-3\.5{left:.875rem}.\32xl\:-left-0{left:0}.\32xl\:-left-1{left:-.25rem}.\32xl\:-left-2{left:-.5rem}.\32xl\:-left-3{left:-.75rem}.\32xl\:-left-4{left:-1rem}.\32xl\:-left-5{left:-1.25rem}.\32xl\:-left-6{left:-1.5rem}.\32xl\:-left-7{left:-1.75rem}.\32xl\:-left-8{left:-2rem}.\32xl\:-left-9{left:-2.25rem}.\32xl\:-left-10{left:-2.5rem}.\32xl\:-left-11{left:-2.75rem}.\32xl\:-left-12{left:-3rem}.\32xl\:-left-14{left:-3.5rem}.\32xl\:-left-16{left:-4rem}.\32xl\:-left-20{left:-5rem}.\32xl\:-left-24{left:-6rem}.\32xl\:-left-28{left:-7rem}.\32xl\:-left-32{left:-8rem}.\32xl\:-left-36{left:-9rem}.\32xl\:-left-40{left:-10rem}.\32xl\:-left-44{left:-11rem}.\32xl\:-left-48{left:-12rem}.\32xl\:-left-52{left:-13rem}.\32xl\:-left-56{left:-14rem}.\32xl\:-left-60{left:-15rem}.\32xl\:-left-64{left:-16rem}.\32xl\:-left-72{left:-18rem}.\32xl\:-left-80{left:-20rem}.\32xl\:-left-96{left:-24rem}.\32xl\:-left-px{left:-1px}.\32xl\:-left-0\.5{left:-.125rem}.\32xl\:-left-1\.5{left:-.375rem}.\32xl\:-left-2\.5{left:-.625rem}.\32xl\:-left-3\.5{left:-.875rem}.\32xl\:left-1\/2{left:50%}.\32xl\:left-1\/3{left:33.333333%}.\32xl\:left-2\/3{left:66.666667%}.\32xl\:left-1\/4{left:25%}.\32xl\:left-2\/4{left:50%}.\32xl\:left-3\/4{left:75%}.\32xl\:left-full{left:100%}.\32xl\:-left-1\/2{left:-50%}.\32xl\:-left-1\/3{left:-33.333333%}.\32xl\:-left-2\/3{left:-66.666667%}.\32xl\:-left-1\/4{left:-25%}.\32xl\:-left-2\/4{left:-50%}.\32xl\:-left-3\/4{left:-75%}.\32xl\:-left-full{left:-100%}.\32xl\:isolate{isolation:isolate}.\32xl\:isolation-auto{isolation:auto}.\32xl\:z-0{z-index:0}.\32xl\:z-10{z-index:10}.\32xl\:z-20{z-index:20}.\32xl\:z-30{z-index:30}.\32xl\:z-40{z-index:40}.\32xl\:z-50{z-index:50}.\32xl\:z-auto{z-index:auto}.\32xl\:focus-within\:z-0:focus-within{z-index:0}.\32xl\:focus-within\:z-10:focus-within{z-index:10}.\32xl\:focus-within\:z-20:focus-within{z-index:20}.\32xl\:focus-within\:z-30:focus-within{z-index:30}.\32xl\:focus-within\:z-40:focus-within{z-index:40}.\32xl\:focus-within\:z-50:focus-within{z-index:50}.\32xl\:focus-within\:z-auto:focus-within{z-index:auto}.\32xl\:focus\:z-0:focus{z-index:0}.\32xl\:focus\:z-10:focus{z-index:10}.\32xl\:focus\:z-20:focus{z-index:20}.\32xl\:focus\:z-30:focus{z-index:30}.\32xl\:focus\:z-40:focus{z-index:40}.\32xl\:focus\:z-50:focus{z-index:50}.\32xl\:focus\:z-auto:focus{z-index:auto}.\32xl\:order-1{order:1}.\32xl\:order-2{order:2}.\32xl\:order-3{order:3}.\32xl\:order-4{order:4}.\32xl\:order-5{order:5}.\32xl\:order-6{order:6}.\32xl\:order-7{order:7}.\32xl\:order-8{order:8}.\32xl\:order-9{order:9}.\32xl\:order-10{order:10}.\32xl\:order-11{order:11}.\32xl\:order-12{order:12}.\32xl\:order-first{order:-9999}.\32xl\:order-last{order:9999}.\32xl\:order-none{order:0}.\32xl\:col-auto{grid-column:auto}.\32xl\:col-span-1{grid-column:span 1/span 1}.\32xl\:col-span-2{grid-column:span 2/span 2}.\32xl\:col-span-3{grid-column:span 3/span 3}.\32xl\:col-span-4{grid-column:span 4/span 4}.\32xl\:col-span-5{grid-column:span 5/span 5}.\32xl\:col-span-6{grid-column:span 6/span 6}.\32xl\:col-span-7{grid-column:span 7/span 7}.\32xl\:col-span-8{grid-column:span 8/span 8}.\32xl\:col-span-9{grid-column:span 9/span 9}.\32xl\:col-span-10{grid-column:span 10/span 10}.\32xl\:col-span-11{grid-column:span 11/span 11}.\32xl\:col-span-12{grid-column:span 12/span 12}.\32xl\:col-span-full{grid-column:1/-1}.\32xl\:col-start-1{grid-column-start:1}.\32xl\:col-start-2{grid-column-start:2}.\32xl\:col-start-3{grid-column-start:3}.\32xl\:col-start-4{grid-column-start:4}.\32xl\:col-start-5{grid-column-start:5}.\32xl\:col-start-6{grid-column-start:6}.\32xl\:col-start-7{grid-column-start:7}.\32xl\:col-start-8{grid-column-start:8}.\32xl\:col-start-9{grid-column-start:9}.\32xl\:col-start-10{grid-column-start:10}.\32xl\:col-start-11{grid-column-start:11}.\32xl\:col-start-12{grid-column-start:12}.\32xl\:col-start-13{grid-column-start:13}.\32xl\:col-start-auto{grid-column-start:auto}.\32xl\:col-end-1{grid-column-end:1}.\32xl\:col-end-2{grid-column-end:2}.\32xl\:col-end-3{grid-column-end:3}.\32xl\:col-end-4{grid-column-end:4}.\32xl\:col-end-5{grid-column-end:5}.\32xl\:col-end-6{grid-column-end:6}.\32xl\:col-end-7{grid-column-end:7}.\32xl\:col-end-8{grid-column-end:8}.\32xl\:col-end-9{grid-column-end:9}.\32xl\:col-end-10{grid-column-end:10}.\32xl\:col-end-11{grid-column-end:11}.\32xl\:col-end-12{grid-column-end:12}.\32xl\:col-end-13{grid-column-end:13}.\32xl\:col-end-auto{grid-column-end:auto}.\32xl\:row-auto{grid-row:auto}.\32xl\:row-span-1{grid-row:span 1/span 1}.\32xl\:row-span-2{grid-row:span 2/span 2}.\32xl\:row-span-3{grid-row:span 3/span 3}.\32xl\:row-span-4{grid-row:span 4/span 4}.\32xl\:row-span-5{grid-row:span 5/span 5}.\32xl\:row-span-6{grid-row:span 6/span 6}.\32xl\:row-span-full{grid-row:1/-1}.\32xl\:row-start-1{grid-row-start:1}.\32xl\:row-start-2{grid-row-start:2}.\32xl\:row-start-3{grid-row-start:3}.\32xl\:row-start-4{grid-row-start:4}.\32xl\:row-start-5{grid-row-start:5}.\32xl\:row-start-6{grid-row-start:6}.\32xl\:row-start-7{grid-row-start:7}.\32xl\:row-start-auto{grid-row-start:auto}.\32xl\:row-end-1{grid-row-end:1}.\32xl\:row-end-2{grid-row-end:2}.\32xl\:row-end-3{grid-row-end:3}.\32xl\:row-end-4{grid-row-end:4}.\32xl\:row-end-5{grid-row-end:5}.\32xl\:row-end-6{grid-row-end:6}.\32xl\:row-end-7{grid-row-end:7}.\32xl\:row-end-auto{grid-row-end:auto}.\32xl\:float-right{float:right}.\32xl\:float-left{float:left}.\32xl\:float-none{float:none}.\32xl\:clear-left{clear:left}.\32xl\:clear-right{clear:right}.\32xl\:clear-both{clear:both}.\32xl\:clear-none{clear:none}.\32xl\:m-0{margin:0}.\32xl\:m-1{margin:.25rem}.\32xl\:m-2{margin:.5rem}.\32xl\:m-3{margin:.75rem}.\32xl\:m-4{margin:1rem}.\32xl\:m-5{margin:1.25rem}.\32xl\:m-6{margin:1.5rem}.\32xl\:m-7{margin:1.75rem}.\32xl\:m-8{margin:2rem}.\32xl\:m-9{margin:2.25rem}.\32xl\:m-10{margin:2.5rem}.\32xl\:m-11{margin:2.75rem}.\32xl\:m-12{margin:3rem}.\32xl\:m-14{margin:3.5rem}.\32xl\:m-16{margin:4rem}.\32xl\:m-20{margin:5rem}.\32xl\:m-24{margin:6rem}.\32xl\:m-28{margin:7rem}.\32xl\:m-32{margin:8rem}.\32xl\:m-36{margin:9rem}.\32xl\:m-40{margin:10rem}.\32xl\:m-44{margin:11rem}.\32xl\:m-48{margin:12rem}.\32xl\:m-52{margin:13rem}.\32xl\:m-56{margin:14rem}.\32xl\:m-60{margin:15rem}.\32xl\:m-64{margin:16rem}.\32xl\:m-72{margin:18rem}.\32xl\:m-80{margin:20rem}.\32xl\:m-96{margin:24rem}.\32xl\:m-auto{margin:auto}.\32xl\:m-px{margin:1px}.\32xl\:m-0\.5{margin:.125rem}.\32xl\:m-1\.5{margin:.375rem}.\32xl\:m-2\.5{margin:.625rem}.\32xl\:m-3\.5{margin:.875rem}.\32xl\:-m-0{margin:0}.\32xl\:-m-1{margin:-.25rem}.\32xl\:-m-2{margin:-.5rem}.\32xl\:-m-3{margin:-.75rem}.\32xl\:-m-4{margin:-1rem}.\32xl\:-m-5{margin:-1.25rem}.\32xl\:-m-6{margin:-1.5rem}.\32xl\:-m-7{margin:-1.75rem}.\32xl\:-m-8{margin:-2rem}.\32xl\:-m-9{margin:-2.25rem}.\32xl\:-m-10{margin:-2.5rem}.\32xl\:-m-11{margin:-2.75rem}.\32xl\:-m-12{margin:-3rem}.\32xl\:-m-14{margin:-3.5rem}.\32xl\:-m-16{margin:-4rem}.\32xl\:-m-20{margin:-5rem}.\32xl\:-m-24{margin:-6rem}.\32xl\:-m-28{margin:-7rem}.\32xl\:-m-32{margin:-8rem}.\32xl\:-m-36{margin:-9rem}.\32xl\:-m-40{margin:-10rem}.\32xl\:-m-44{margin:-11rem}.\32xl\:-m-48{margin:-12rem}.\32xl\:-m-52{margin:-13rem}.\32xl\:-m-56{margin:-14rem}.\32xl\:-m-60{margin:-15rem}.\32xl\:-m-64{margin:-16rem}.\32xl\:-m-72{margin:-18rem}.\32xl\:-m-80{margin:-20rem}.\32xl\:-m-96{margin:-24rem}.\32xl\:-m-px{margin:-1px}.\32xl\:-m-0\.5{margin:-.125rem}.\32xl\:-m-1\.5{margin:-.375rem}.\32xl\:-m-2\.5{margin:-.625rem}.\32xl\:-m-3\.5{margin:-.875rem}.\32xl\:mx-0{margin-left:0;margin-right:0}.\32xl\:mx-1{margin-left:.25rem;margin-right:.25rem}.\32xl\:mx-2{margin-left:.5rem;margin-right:.5rem}.\32xl\:mx-3{margin-left:.75rem;margin-right:.75rem}.\32xl\:mx-4{margin-left:1rem;margin-right:1rem}.\32xl\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.\32xl\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.\32xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.\32xl\:mx-8{margin-left:2rem;margin-right:2rem}.\32xl\:mx-9{margin-left:2.25rem;margin-right:2.25rem}.\32xl\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.\32xl\:mx-11{margin-left:2.75rem;margin-right:2.75rem}.\32xl\:mx-12{margin-left:3rem;margin-right:3rem}.\32xl\:mx-14{margin-left:3.5rem;margin-right:3.5rem}.\32xl\:mx-16{margin-left:4rem;margin-right:4rem}.\32xl\:mx-20{margin-left:5rem;margin-right:5rem}.\32xl\:mx-24{margin-left:6rem;margin-right:6rem}.\32xl\:mx-28{margin-left:7rem;margin-right:7rem}.\32xl\:mx-32{margin-left:8rem;margin-right:8rem}.\32xl\:mx-36{margin-left:9rem;margin-right:9rem}.\32xl\:mx-40{margin-left:10rem;margin-right:10rem}.\32xl\:mx-44{margin-left:11rem;margin-right:11rem}.\32xl\:mx-48{margin-left:12rem;margin-right:12rem}.\32xl\:mx-52{margin-left:13rem;margin-right:13rem}.\32xl\:mx-56{margin-left:14rem;margin-right:14rem}.\32xl\:mx-60{margin-left:15rem;margin-right:15rem}.\32xl\:mx-64{margin-left:16rem;margin-right:16rem}.\32xl\:mx-72{margin-left:18rem;margin-right:18rem}.\32xl\:mx-80{margin-left:20rem;margin-right:20rem}.\32xl\:mx-96{margin-left:24rem;margin-right:24rem}.\32xl\:mx-auto{margin-left:auto;margin-right:auto}.\32xl\:mx-px{margin-left:1px;margin-right:1px}.\32xl\:mx-0\.5{margin-left:.125rem;margin-right:.125rem}.\32xl\:mx-1\.5{margin-left:.375rem;margin-right:.375rem}.\32xl\:mx-2\.5{margin-left:.625rem;margin-right:.625rem}.\32xl\:mx-3\.5{margin-left:.875rem;margin-right:.875rem}.\32xl\:-mx-0{margin-left:0;margin-right:0}.\32xl\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.\32xl\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.\32xl\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.\32xl\:-mx-4{margin-left:-1rem;margin-right:-1rem}.\32xl\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.\32xl\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.\32xl\:-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.\32xl\:-mx-8{margin-left:-2rem;margin-right:-2rem}.\32xl\:-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.\32xl\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.\32xl\:-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.\32xl\:-mx-12{margin-left:-3rem;margin-right:-3rem}.\32xl\:-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.\32xl\:-mx-16{margin-left:-4rem;margin-right:-4rem}.\32xl\:-mx-20{margin-left:-5rem;margin-right:-5rem}.\32xl\:-mx-24{margin-left:-6rem;margin-right:-6rem}.\32xl\:-mx-28{margin-left:-7rem;margin-right:-7rem}.\32xl\:-mx-32{margin-left:-8rem;margin-right:-8rem}.\32xl\:-mx-36{margin-left:-9rem;margin-right:-9rem}.\32xl\:-mx-40{margin-left:-10rem;margin-right:-10rem}.\32xl\:-mx-44{margin-left:-11rem;margin-right:-11rem}.\32xl\:-mx-48{margin-left:-12rem;margin-right:-12rem}.\32xl\:-mx-52{margin-left:-13rem;margin-right:-13rem}.\32xl\:-mx-56{margin-left:-14rem;margin-right:-14rem}.\32xl\:-mx-60{margin-left:-15rem;margin-right:-15rem}.\32xl\:-mx-64{margin-left:-16rem;margin-right:-16rem}.\32xl\:-mx-72{margin-left:-18rem;margin-right:-18rem}.\32xl\:-mx-80{margin-left:-20rem;margin-right:-20rem}.\32xl\:-mx-96{margin-left:-24rem;margin-right:-24rem}.\32xl\:-mx-px{margin-left:-1px;margin-right:-1px}.\32xl\:-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.\32xl\:-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.\32xl\:-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.\32xl\:-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.\32xl\:my-0{margin-top:0;margin-bottom:0}.\32xl\:my-1{margin-top:.25rem;margin-bottom:.25rem}.\32xl\:my-2{margin-top:.5rem;margin-bottom:.5rem}.\32xl\:my-3{margin-top:.75rem;margin-bottom:.75rem}.\32xl\:my-4{margin-top:1rem;margin-bottom:1rem}.\32xl\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.\32xl\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.\32xl\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.\32xl\:my-8{margin-top:2rem;margin-bottom:2rem}.\32xl\:my-9{margin-top:2.25rem;margin-bottom:2.25rem}.\32xl\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.\32xl\:my-11{margin-top:2.75rem;margin-bottom:2.75rem}.\32xl\:my-12{margin-top:3rem;margin-bottom:3rem}.\32xl\:my-14{margin-top:3.5rem;margin-bottom:3.5rem}.\32xl\:my-16{margin-top:4rem;margin-bottom:4rem}.\32xl\:my-20{margin-top:5rem;margin-bottom:5rem}.\32xl\:my-24{margin-top:6rem;margin-bottom:6rem}.\32xl\:my-28{margin-top:7rem;margin-bottom:7rem}.\32xl\:my-32{margin-top:8rem;margin-bottom:8rem}.\32xl\:my-36{margin-top:9rem;margin-bottom:9rem}.\32xl\:my-40{margin-top:10rem;margin-bottom:10rem}.\32xl\:my-44{margin-top:11rem;margin-bottom:11rem}.\32xl\:my-48{margin-top:12rem;margin-bottom:12rem}.\32xl\:my-52{margin-top:13rem;margin-bottom:13rem}.\32xl\:my-56{margin-top:14rem;margin-bottom:14rem}.\32xl\:my-60{margin-top:15rem;margin-bottom:15rem}.\32xl\:my-64{margin-top:16rem;margin-bottom:16rem}.\32xl\:my-72{margin-top:18rem;margin-bottom:18rem}.\32xl\:my-80{margin-top:20rem;margin-bottom:20rem}.\32xl\:my-96{margin-top:24rem;margin-bottom:24rem}.\32xl\:my-auto{margin-top:auto;margin-bottom:auto}.\32xl\:my-px{margin-top:1px;margin-bottom:1px}.\32xl\:my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.\32xl\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.\32xl\:my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.\32xl\:my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.\32xl\:-my-0{margin-top:0;margin-bottom:0}.\32xl\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.\32xl\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.\32xl\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.\32xl\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.\32xl\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.\32xl\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.\32xl\:-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.\32xl\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.\32xl\:-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.\32xl\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.\32xl\:-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.\32xl\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.\32xl\:-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.\32xl\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.\32xl\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.\32xl\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.\32xl\:-my-28{margin-top:-7rem;margin-bottom:-7rem}.\32xl\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.\32xl\:-my-36{margin-top:-9rem;margin-bottom:-9rem}.\32xl\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.\32xl\:-my-44{margin-top:-11rem;margin-bottom:-11rem}.\32xl\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.\32xl\:-my-52{margin-top:-13rem;margin-bottom:-13rem}.\32xl\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.\32xl\:-my-60{margin-top:-15rem;margin-bottom:-15rem}.\32xl\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.\32xl\:-my-72{margin-top:-18rem;margin-bottom:-18rem}.\32xl\:-my-80{margin-top:-20rem;margin-bottom:-20rem}.\32xl\:-my-96{margin-top:-24rem;margin-bottom:-24rem}.\32xl\:-my-px{margin-top:-1px;margin-bottom:-1px}.\32xl\:-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.\32xl\:-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.\32xl\:-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.\32xl\:-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.\32xl\:mt-0{margin-top:0}.\32xl\:mt-1{margin-top:.25rem}.\32xl\:mt-2{margin-top:.5rem}.\32xl\:mt-3{margin-top:.75rem}.\32xl\:mt-4{margin-top:1rem}.\32xl\:mt-5{margin-top:1.25rem}.\32xl\:mt-6{margin-top:1.5rem}.\32xl\:mt-7{margin-top:1.75rem}.\32xl\:mt-8{margin-top:2rem}.\32xl\:mt-9{margin-top:2.25rem}.\32xl\:mt-10{margin-top:2.5rem}.\32xl\:mt-11{margin-top:2.75rem}.\32xl\:mt-12{margin-top:3rem}.\32xl\:mt-14{margin-top:3.5rem}.\32xl\:mt-16{margin-top:4rem}.\32xl\:mt-20{margin-top:5rem}.\32xl\:mt-24{margin-top:6rem}.\32xl\:mt-28{margin-top:7rem}.\32xl\:mt-32{margin-top:8rem}.\32xl\:mt-36{margin-top:9rem}.\32xl\:mt-40{margin-top:10rem}.\32xl\:mt-44{margin-top:11rem}.\32xl\:mt-48{margin-top:12rem}.\32xl\:mt-52{margin-top:13rem}.\32xl\:mt-56{margin-top:14rem}.\32xl\:mt-60{margin-top:15rem}.\32xl\:mt-64{margin-top:16rem}.\32xl\:mt-72{margin-top:18rem}.\32xl\:mt-80{margin-top:20rem}.\32xl\:mt-96{margin-top:24rem}.\32xl\:mt-auto{margin-top:auto}.\32xl\:mt-px{margin-top:1px}.\32xl\:mt-0\.5{margin-top:.125rem}.\32xl\:mt-1\.5{margin-top:.375rem}.\32xl\:mt-2\.5{margin-top:.625rem}.\32xl\:mt-3\.5{margin-top:.875rem}.\32xl\:-mt-0{margin-top:0}.\32xl\:-mt-1{margin-top:-.25rem}.\32xl\:-mt-2{margin-top:-.5rem}.\32xl\:-mt-3{margin-top:-.75rem}.\32xl\:-mt-4{margin-top:-1rem}.\32xl\:-mt-5{margin-top:-1.25rem}.\32xl\:-mt-6{margin-top:-1.5rem}.\32xl\:-mt-7{margin-top:-1.75rem}.\32xl\:-mt-8{margin-top:-2rem}.\32xl\:-mt-9{margin-top:-2.25rem}.\32xl\:-mt-10{margin-top:-2.5rem}.\32xl\:-mt-11{margin-top:-2.75rem}.\32xl\:-mt-12{margin-top:-3rem}.\32xl\:-mt-14{margin-top:-3.5rem}.\32xl\:-mt-16{margin-top:-4rem}.\32xl\:-mt-20{margin-top:-5rem}.\32xl\:-mt-24{margin-top:-6rem}.\32xl\:-mt-28{margin-top:-7rem}.\32xl\:-mt-32{margin-top:-8rem}.\32xl\:-mt-36{margin-top:-9rem}.\32xl\:-mt-40{margin-top:-10rem}.\32xl\:-mt-44{margin-top:-11rem}.\32xl\:-mt-48{margin-top:-12rem}.\32xl\:-mt-52{margin-top:-13rem}.\32xl\:-mt-56{margin-top:-14rem}.\32xl\:-mt-60{margin-top:-15rem}.\32xl\:-mt-64{margin-top:-16rem}.\32xl\:-mt-72{margin-top:-18rem}.\32xl\:-mt-80{margin-top:-20rem}.\32xl\:-mt-96{margin-top:-24rem}.\32xl\:-mt-px{margin-top:-1px}.\32xl\:-mt-0\.5{margin-top:-.125rem}.\32xl\:-mt-1\.5{margin-top:-.375rem}.\32xl\:-mt-2\.5{margin-top:-.625rem}.\32xl\:-mt-3\.5{margin-top:-.875rem}.\32xl\:mr-0{margin-right:0}.\32xl\:mr-1{margin-right:.25rem}.\32xl\:mr-2{margin-right:.5rem}.\32xl\:mr-3{margin-right:.75rem}.\32xl\:mr-4{margin-right:1rem}.\32xl\:mr-5{margin-right:1.25rem}.\32xl\:mr-6{margin-right:1.5rem}.\32xl\:mr-7{margin-right:1.75rem}.\32xl\:mr-8{margin-right:2rem}.\32xl\:mr-9{margin-right:2.25rem}.\32xl\:mr-10{margin-right:2.5rem}.\32xl\:mr-11{margin-right:2.75rem}.\32xl\:mr-12{margin-right:3rem}.\32xl\:mr-14{margin-right:3.5rem}.\32xl\:mr-16{margin-right:4rem}.\32xl\:mr-20{margin-right:5rem}.\32xl\:mr-24{margin-right:6rem}.\32xl\:mr-28{margin-right:7rem}.\32xl\:mr-32{margin-right:8rem}.\32xl\:mr-36{margin-right:9rem}.\32xl\:mr-40{margin-right:10rem}.\32xl\:mr-44{margin-right:11rem}.\32xl\:mr-48{margin-right:12rem}.\32xl\:mr-52{margin-right:13rem}.\32xl\:mr-56{margin-right:14rem}.\32xl\:mr-60{margin-right:15rem}.\32xl\:mr-64{margin-right:16rem}.\32xl\:mr-72{margin-right:18rem}.\32xl\:mr-80{margin-right:20rem}.\32xl\:mr-96{margin-right:24rem}.\32xl\:mr-auto{margin-right:auto}.\32xl\:mr-px{margin-right:1px}.\32xl\:mr-0\.5{margin-right:.125rem}.\32xl\:mr-1\.5{margin-right:.375rem}.\32xl\:mr-2\.5{margin-right:.625rem}.\32xl\:mr-3\.5{margin-right:.875rem}.\32xl\:-mr-0{margin-right:0}.\32xl\:-mr-1{margin-right:-.25rem}.\32xl\:-mr-2{margin-right:-.5rem}.\32xl\:-mr-3{margin-right:-.75rem}.\32xl\:-mr-4{margin-right:-1rem}.\32xl\:-mr-5{margin-right:-1.25rem}.\32xl\:-mr-6{margin-right:-1.5rem}.\32xl\:-mr-7{margin-right:-1.75rem}.\32xl\:-mr-8{margin-right:-2rem}.\32xl\:-mr-9{margin-right:-2.25rem}.\32xl\:-mr-10{margin-right:-2.5rem}.\32xl\:-mr-11{margin-right:-2.75rem}.\32xl\:-mr-12{margin-right:-3rem}.\32xl\:-mr-14{margin-right:-3.5rem}.\32xl\:-mr-16{margin-right:-4rem}.\32xl\:-mr-20{margin-right:-5rem}.\32xl\:-mr-24{margin-right:-6rem}.\32xl\:-mr-28{margin-right:-7rem}.\32xl\:-mr-32{margin-right:-8rem}.\32xl\:-mr-36{margin-right:-9rem}.\32xl\:-mr-40{margin-right:-10rem}.\32xl\:-mr-44{margin-right:-11rem}.\32xl\:-mr-48{margin-right:-12rem}.\32xl\:-mr-52{margin-right:-13rem}.\32xl\:-mr-56{margin-right:-14rem}.\32xl\:-mr-60{margin-right:-15rem}.\32xl\:-mr-64{margin-right:-16rem}.\32xl\:-mr-72{margin-right:-18rem}.\32xl\:-mr-80{margin-right:-20rem}.\32xl\:-mr-96{margin-right:-24rem}.\32xl\:-mr-px{margin-right:-1px}.\32xl\:-mr-0\.5{margin-right:-.125rem}.\32xl\:-mr-1\.5{margin-right:-.375rem}.\32xl\:-mr-2\.5{margin-right:-.625rem}.\32xl\:-mr-3\.5{margin-right:-.875rem}.\32xl\:mb-0{margin-bottom:0}.\32xl\:mb-1{margin-bottom:.25rem}.\32xl\:mb-2{margin-bottom:.5rem}.\32xl\:mb-3{margin-bottom:.75rem}.\32xl\:mb-4{margin-bottom:1rem}.\32xl\:mb-5{margin-bottom:1.25rem}.\32xl\:mb-6{margin-bottom:1.5rem}.\32xl\:mb-7{margin-bottom:1.75rem}.\32xl\:mb-8{margin-bottom:2rem}.\32xl\:mb-9{margin-bottom:2.25rem}.\32xl\:mb-10{margin-bottom:2.5rem}.\32xl\:mb-11{margin-bottom:2.75rem}.\32xl\:mb-12{margin-bottom:3rem}.\32xl\:mb-14{margin-bottom:3.5rem}.\32xl\:mb-16{margin-bottom:4rem}.\32xl\:mb-20{margin-bottom:5rem}.\32xl\:mb-24{margin-bottom:6rem}.\32xl\:mb-28{margin-bottom:7rem}.\32xl\:mb-32{margin-bottom:8rem}.\32xl\:mb-36{margin-bottom:9rem}.\32xl\:mb-40{margin-bottom:10rem}.\32xl\:mb-44{margin-bottom:11rem}.\32xl\:mb-48{margin-bottom:12rem}.\32xl\:mb-52{margin-bottom:13rem}.\32xl\:mb-56{margin-bottom:14rem}.\32xl\:mb-60{margin-bottom:15rem}.\32xl\:mb-64{margin-bottom:16rem}.\32xl\:mb-72{margin-bottom:18rem}.\32xl\:mb-80{margin-bottom:20rem}.\32xl\:mb-96{margin-bottom:24rem}.\32xl\:mb-auto{margin-bottom:auto}.\32xl\:mb-px{margin-bottom:1px}.\32xl\:mb-0\.5{margin-bottom:.125rem}.\32xl\:mb-1\.5{margin-bottom:.375rem}.\32xl\:mb-2\.5{margin-bottom:.625rem}.\32xl\:mb-3\.5{margin-bottom:.875rem}.\32xl\:-mb-0{margin-bottom:0}.\32xl\:-mb-1{margin-bottom:-.25rem}.\32xl\:-mb-2{margin-bottom:-.5rem}.\32xl\:-mb-3{margin-bottom:-.75rem}.\32xl\:-mb-4{margin-bottom:-1rem}.\32xl\:-mb-5{margin-bottom:-1.25rem}.\32xl\:-mb-6{margin-bottom:-1.5rem}.\32xl\:-mb-7{margin-bottom:-1.75rem}.\32xl\:-mb-8{margin-bottom:-2rem}.\32xl\:-mb-9{margin-bottom:-2.25rem}.\32xl\:-mb-10{margin-bottom:-2.5rem}.\32xl\:-mb-11{margin-bottom:-2.75rem}.\32xl\:-mb-12{margin-bottom:-3rem}.\32xl\:-mb-14{margin-bottom:-3.5rem}.\32xl\:-mb-16{margin-bottom:-4rem}.\32xl\:-mb-20{margin-bottom:-5rem}.\32xl\:-mb-24{margin-bottom:-6rem}.\32xl\:-mb-28{margin-bottom:-7rem}.\32xl\:-mb-32{margin-bottom:-8rem}.\32xl\:-mb-36{margin-bottom:-9rem}.\32xl\:-mb-40{margin-bottom:-10rem}.\32xl\:-mb-44{margin-bottom:-11rem}.\32xl\:-mb-48{margin-bottom:-12rem}.\32xl\:-mb-52{margin-bottom:-13rem}.\32xl\:-mb-56{margin-bottom:-14rem}.\32xl\:-mb-60{margin-bottom:-15rem}.\32xl\:-mb-64{margin-bottom:-16rem}.\32xl\:-mb-72{margin-bottom:-18rem}.\32xl\:-mb-80{margin-bottom:-20rem}.\32xl\:-mb-96{margin-bottom:-24rem}.\32xl\:-mb-px{margin-bottom:-1px}.\32xl\:-mb-0\.5{margin-bottom:-.125rem}.\32xl\:-mb-1\.5{margin-bottom:-.375rem}.\32xl\:-mb-2\.5{margin-bottom:-.625rem}.\32xl\:-mb-3\.5{margin-bottom:-.875rem}.\32xl\:ml-0{margin-left:0}.\32xl\:ml-1{margin-left:.25rem}.\32xl\:ml-2{margin-left:.5rem}.\32xl\:ml-3{margin-left:.75rem}.\32xl\:ml-4{margin-left:1rem}.\32xl\:ml-5{margin-left:1.25rem}.\32xl\:ml-6{margin-left:1.5rem}.\32xl\:ml-7{margin-left:1.75rem}.\32xl\:ml-8{margin-left:2rem}.\32xl\:ml-9{margin-left:2.25rem}.\32xl\:ml-10{margin-left:2.5rem}.\32xl\:ml-11{margin-left:2.75rem}.\32xl\:ml-12{margin-left:3rem}.\32xl\:ml-14{margin-left:3.5rem}.\32xl\:ml-16{margin-left:4rem}.\32xl\:ml-20{margin-left:5rem}.\32xl\:ml-24{margin-left:6rem}.\32xl\:ml-28{margin-left:7rem}.\32xl\:ml-32{margin-left:8rem}.\32xl\:ml-36{margin-left:9rem}.\32xl\:ml-40{margin-left:10rem}.\32xl\:ml-44{margin-left:11rem}.\32xl\:ml-48{margin-left:12rem}.\32xl\:ml-52{margin-left:13rem}.\32xl\:ml-56{margin-left:14rem}.\32xl\:ml-60{margin-left:15rem}.\32xl\:ml-64{margin-left:16rem}.\32xl\:ml-72{margin-left:18rem}.\32xl\:ml-80{margin-left:20rem}.\32xl\:ml-96{margin-left:24rem}.\32xl\:ml-auto{margin-left:auto}.\32xl\:ml-px{margin-left:1px}.\32xl\:ml-0\.5{margin-left:.125rem}.\32xl\:ml-1\.5{margin-left:.375rem}.\32xl\:ml-2\.5{margin-left:.625rem}.\32xl\:ml-3\.5{margin-left:.875rem}.\32xl\:-ml-0{margin-left:0}.\32xl\:-ml-1{margin-left:-.25rem}.\32xl\:-ml-2{margin-left:-.5rem}.\32xl\:-ml-3{margin-left:-.75rem}.\32xl\:-ml-4{margin-left:-1rem}.\32xl\:-ml-5{margin-left:-1.25rem}.\32xl\:-ml-6{margin-left:-1.5rem}.\32xl\:-ml-7{margin-left:-1.75rem}.\32xl\:-ml-8{margin-left:-2rem}.\32xl\:-ml-9{margin-left:-2.25rem}.\32xl\:-ml-10{margin-left:-2.5rem}.\32xl\:-ml-11{margin-left:-2.75rem}.\32xl\:-ml-12{margin-left:-3rem}.\32xl\:-ml-14{margin-left:-3.5rem}.\32xl\:-ml-16{margin-left:-4rem}.\32xl\:-ml-20{margin-left:-5rem}.\32xl\:-ml-24{margin-left:-6rem}.\32xl\:-ml-28{margin-left:-7rem}.\32xl\:-ml-32{margin-left:-8rem}.\32xl\:-ml-36{margin-left:-9rem}.\32xl\:-ml-40{margin-left:-10rem}.\32xl\:-ml-44{margin-left:-11rem}.\32xl\:-ml-48{margin-left:-12rem}.\32xl\:-ml-52{margin-left:-13rem}.\32xl\:-ml-56{margin-left:-14rem}.\32xl\:-ml-60{margin-left:-15rem}.\32xl\:-ml-64{margin-left:-16rem}.\32xl\:-ml-72{margin-left:-18rem}.\32xl\:-ml-80{margin-left:-20rem}.\32xl\:-ml-96{margin-left:-24rem}.\32xl\:-ml-px{margin-left:-1px}.\32xl\:-ml-0\.5{margin-left:-.125rem}.\32xl\:-ml-1\.5{margin-left:-.375rem}.\32xl\:-ml-2\.5{margin-left:-.625rem}.\32xl\:-ml-3\.5{margin-left:-.875rem}.\32xl\:box-border{box-sizing:border-box}.\32xl\:box-content{box-sizing:initial}.\32xl\:block{display:block}.\32xl\:inline-block{display:inline-block}.\32xl\:inline{display:inline}.\32xl\:flex{display:flex}.\32xl\:inline-flex{display:inline-flex}.\32xl\:table{display:table}.\32xl\:inline-table{display:inline-table}.\32xl\:table-caption{display:table-caption}.\32xl\:table-cell{display:table-cell}.\32xl\:table-column{display:table-column}.\32xl\:table-column-group{display:table-column-group}.\32xl\:table-footer-group{display:table-footer-group}.\32xl\:table-header-group{display:table-header-group}.\32xl\:table-row-group{display:table-row-group}.\32xl\:table-row{display:table-row}.\32xl\:flow-root{display:flow-root}.\32xl\:grid{display:grid}.\32xl\:inline-grid{display:inline-grid}.\32xl\:contents{display:contents}.\32xl\:list-item{display:list-item}.\32xl\:hidden{display:none}.\32xl\:h-0{height:0}.\32xl\:h-1{height:.25rem}.\32xl\:h-2{height:.5rem}.\32xl\:h-3{height:.75rem}.\32xl\:h-4{height:1rem}.\32xl\:h-5{height:1.25rem}.\32xl\:h-6{height:1.5rem}.\32xl\:h-7{height:1.75rem}.\32xl\:h-8{height:2rem}.\32xl\:h-9{height:2.25rem}.\32xl\:h-10{height:2.5rem}.\32xl\:h-11{height:2.75rem}.\32xl\:h-12{height:3rem}.\32xl\:h-14{height:3.5rem}.\32xl\:h-16{height:4rem}.\32xl\:h-20{height:5rem}.\32xl\:h-24{height:6rem}.\32xl\:h-28{height:7rem}.\32xl\:h-32{height:8rem}.\32xl\:h-36{height:9rem}.\32xl\:h-40{height:10rem}.\32xl\:h-44{height:11rem}.\32xl\:h-48{height:12rem}.\32xl\:h-52{height:13rem}.\32xl\:h-56{height:14rem}.\32xl\:h-60{height:15rem}.\32xl\:h-64{height:16rem}.\32xl\:h-72{height:18rem}.\32xl\:h-80{height:20rem}.\32xl\:h-96{height:24rem}.\32xl\:h-auto{height:auto}.\32xl\:h-px{height:1px}.\32xl\:h-0\.5{height:.125rem}.\32xl\:h-1\.5{height:.375rem}.\32xl\:h-2\.5{height:.625rem}.\32xl\:h-3\.5{height:.875rem}.\32xl\:h-1\/2{height:50%}.\32xl\:h-1\/3{height:33.333333%}.\32xl\:h-2\/3{height:66.666667%}.\32xl\:h-1\/4{height:25%}.\32xl\:h-2\/4{height:50%}.\32xl\:h-3\/4{height:75%}.\32xl\:h-1\/5{height:20%}.\32xl\:h-2\/5{height:40%}.\32xl\:h-3\/5{height:60%}.\32xl\:h-4\/5{height:80%}.\32xl\:h-1\/6{height:16.666667%}.\32xl\:h-2\/6{height:33.333333%}.\32xl\:h-3\/6{height:50%}.\32xl\:h-4\/6{height:66.666667%}.\32xl\:h-5\/6{height:83.333333%}.\32xl\:h-full{height:100%}.\32xl\:h-screen{height:100vh}.\32xl\:max-h-0{max-height:0}.\32xl\:max-h-1{max-height:.25rem}.\32xl\:max-h-2{max-height:.5rem}.\32xl\:max-h-3{max-height:.75rem}.\32xl\:max-h-4{max-height:1rem}.\32xl\:max-h-5{max-height:1.25rem}.\32xl\:max-h-6{max-height:1.5rem}.\32xl\:max-h-7{max-height:1.75rem}.\32xl\:max-h-8{max-height:2rem}.\32xl\:max-h-9{max-height:2.25rem}.\32xl\:max-h-10{max-height:2.5rem}.\32xl\:max-h-11{max-height:2.75rem}.\32xl\:max-h-12{max-height:3rem}.\32xl\:max-h-14{max-height:3.5rem}.\32xl\:max-h-16{max-height:4rem}.\32xl\:max-h-20{max-height:5rem}.\32xl\:max-h-24{max-height:6rem}.\32xl\:max-h-28{max-height:7rem}.\32xl\:max-h-32{max-height:8rem}.\32xl\:max-h-36{max-height:9rem}.\32xl\:max-h-40{max-height:10rem}.\32xl\:max-h-44{max-height:11rem}.\32xl\:max-h-48{max-height:12rem}.\32xl\:max-h-52{max-height:13rem}.\32xl\:max-h-56{max-height:14rem}.\32xl\:max-h-60{max-height:15rem}.\32xl\:max-h-64{max-height:16rem}.\32xl\:max-h-72{max-height:18rem}.\32xl\:max-h-80{max-height:20rem}.\32xl\:max-h-96{max-height:24rem}.\32xl\:max-h-px{max-height:1px}.\32xl\:max-h-0\.5{max-height:.125rem}.\32xl\:max-h-1\.5{max-height:.375rem}.\32xl\:max-h-2\.5{max-height:.625rem}.\32xl\:max-h-3\.5{max-height:.875rem}.\32xl\:max-h-full{max-height:100%}.\32xl\:max-h-screen{max-height:100vh}.\32xl\:min-h-0{min-height:0}.\32xl\:min-h-full{min-height:100%}.\32xl\:min-h-screen{min-height:100vh}.\32xl\:w-0{width:0}.\32xl\:w-1{width:.25rem}.\32xl\:w-2{width:.5rem}.\32xl\:w-3{width:.75rem}.\32xl\:w-4{width:1rem}.\32xl\:w-5{width:1.25rem}.\32xl\:w-6{width:1.5rem}.\32xl\:w-7{width:1.75rem}.\32xl\:w-8{width:2rem}.\32xl\:w-9{width:2.25rem}.\32xl\:w-10{width:2.5rem}.\32xl\:w-11{width:2.75rem}.\32xl\:w-12{width:3rem}.\32xl\:w-14{width:3.5rem}.\32xl\:w-16{width:4rem}.\32xl\:w-20{width:5rem}.\32xl\:w-24{width:6rem}.\32xl\:w-28{width:7rem}.\32xl\:w-32{width:8rem}.\32xl\:w-36{width:9rem}.\32xl\:w-40{width:10rem}.\32xl\:w-44{width:11rem}.\32xl\:w-48{width:12rem}.\32xl\:w-52{width:13rem}.\32xl\:w-56{width:14rem}.\32xl\:w-60{width:15rem}.\32xl\:w-64{width:16rem}.\32xl\:w-72{width:18rem}.\32xl\:w-80{width:20rem}.\32xl\:w-96{width:24rem}.\32xl\:w-auto{width:auto}.\32xl\:w-px{width:1px}.\32xl\:w-0\.5{width:.125rem}.\32xl\:w-1\.5{width:.375rem}.\32xl\:w-2\.5{width:.625rem}.\32xl\:w-3\.5{width:.875rem}.\32xl\:w-1\/2{width:50%}.\32xl\:w-1\/3{width:33.333333%}.\32xl\:w-2\/3{width:66.666667%}.\32xl\:w-1\/4{width:25%}.\32xl\:w-2\/4{width:50%}.\32xl\:w-3\/4{width:75%}.\32xl\:w-1\/5{width:20%}.\32xl\:w-2\/5{width:40%}.\32xl\:w-3\/5{width:60%}.\32xl\:w-4\/5{width:80%}.\32xl\:w-1\/6{width:16.666667%}.\32xl\:w-2\/6{width:33.333333%}.\32xl\:w-3\/6{width:50%}.\32xl\:w-4\/6{width:66.666667%}.\32xl\:w-5\/6{width:83.333333%}.\32xl\:w-1\/12{width:8.333333%}.\32xl\:w-2\/12{width:16.666667%}.\32xl\:w-3\/12{width:25%}.\32xl\:w-4\/12{width:33.333333%}.\32xl\:w-5\/12{width:41.666667%}.\32xl\:w-6\/12{width:50%}.\32xl\:w-7\/12{width:58.333333%}.\32xl\:w-8\/12{width:66.666667%}.\32xl\:w-9\/12{width:75%}.\32xl\:w-10\/12{width:83.333333%}.\32xl\:w-11\/12{width:91.666667%}.\32xl\:w-full{width:100%}.\32xl\:w-screen{width:100vw}.\32xl\:w-min{width:-webkit-min-content;width:-moz-min-content;width:min-content}.\32xl\:w-max{width:-webkit-max-content;width:-moz-max-content;width:max-content}.\32xl\:min-w-0{min-width:0}.\32xl\:min-w-full{min-width:100%}.\32xl\:min-w-min{min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.\32xl\:min-w-max{min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content}.\32xl\:max-w-0{max-width:0}.\32xl\:max-w-none{max-width:none}.\32xl\:max-w-xs{max-width:20rem}.\32xl\:max-w-sm{max-width:24rem}.\32xl\:max-w-md{max-width:28rem}.\32xl\:max-w-lg{max-width:32rem}.\32xl\:max-w-xl{max-width:36rem}.\32xl\:max-w-2xl{max-width:42rem}.\32xl\:max-w-3xl{max-width:48rem}.\32xl\:max-w-4xl{max-width:56rem}.\32xl\:max-w-5xl{max-width:64rem}.\32xl\:max-w-6xl{max-width:72rem}.\32xl\:max-w-7xl{max-width:80rem}.\32xl\:max-w-full{max-width:100%}.\32xl\:max-w-min{max-width:-webkit-min-content;max-width:-moz-min-content;max-width:min-content}.\32xl\:max-w-max{max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content}.\32xl\:max-w-prose{max-width:65ch}.\32xl\:max-w-screen-sm{max-width:640px}.\32xl\:max-w-screen-md{max-width:768px}.\32xl\:max-w-screen-lg{max-width:1024px}.\32xl\:max-w-screen-xl{max-width:1280px}.\32xl\:max-w-screen-2xl{max-width:1536px}.\32xl\:flex-1{flex:1 1 0%}.\32xl\:flex-auto{flex:1 1 auto}.\32xl\:flex-initial{flex:0 1 auto}.\32xl\:flex-none{flex:none}.\32xl\:flex-shrink-0{flex-shrink:0}.\32xl\:flex-shrink{flex-shrink:1}.\32xl\:flex-grow-0{flex-grow:0}.\32xl\:flex-grow{flex-grow:1}.\32xl\:table-auto{table-layout:auto}.\32xl\:table-fixed{table-layout:fixed}.\32xl\:border-collapse{border-collapse:collapse}.\32xl\:border-separate{border-collapse:initial}.\32xl\:origin-center{transform-origin:center}.\32xl\:origin-top{transform-origin:top}.\32xl\:origin-top-right{transform-origin:top right}.\32xl\:origin-right{transform-origin:right}.\32xl\:origin-bottom-right{transform-origin:bottom right}.\32xl\:origin-bottom{transform-origin:bottom}.\32xl\:origin-bottom-left{transform-origin:bottom left}.\32xl\:origin-left{transform-origin:left}.\32xl\:origin-top-left{transform-origin:top left}.\32xl\:transform{transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\32xl\:transform,.\32xl\:transform-gpu{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1}.\32xl\:transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\32xl\:transform-none{transform:none}.\32xl\:translate-x-0{--tw-translate-x:0px}.\32xl\:translate-x-1{--tw-translate-x:0.25rem}.\32xl\:translate-x-2{--tw-translate-x:0.5rem}.\32xl\:translate-x-3{--tw-translate-x:0.75rem}.\32xl\:translate-x-4{--tw-translate-x:1rem}.\32xl\:translate-x-5{--tw-translate-x:1.25rem}.\32xl\:translate-x-6{--tw-translate-x:1.5rem}.\32xl\:translate-x-7{--tw-translate-x:1.75rem}.\32xl\:translate-x-8{--tw-translate-x:2rem}.\32xl\:translate-x-9{--tw-translate-x:2.25rem}.\32xl\:translate-x-10{--tw-translate-x:2.5rem}.\32xl\:translate-x-11{--tw-translate-x:2.75rem}.\32xl\:translate-x-12{--tw-translate-x:3rem}.\32xl\:translate-x-14{--tw-translate-x:3.5rem}.\32xl\:translate-x-16{--tw-translate-x:4rem}.\32xl\:translate-x-20{--tw-translate-x:5rem}.\32xl\:translate-x-24{--tw-translate-x:6rem}.\32xl\:translate-x-28{--tw-translate-x:7rem}.\32xl\:translate-x-32{--tw-translate-x:8rem}.\32xl\:translate-x-36{--tw-translate-x:9rem}.\32xl\:translate-x-40{--tw-translate-x:10rem}.\32xl\:translate-x-44{--tw-translate-x:11rem}.\32xl\:translate-x-48{--tw-translate-x:12rem}.\32xl\:translate-x-52{--tw-translate-x:13rem}.\32xl\:translate-x-56{--tw-translate-x:14rem}.\32xl\:translate-x-60{--tw-translate-x:15rem}.\32xl\:translate-x-64{--tw-translate-x:16rem}.\32xl\:translate-x-72{--tw-translate-x:18rem}.\32xl\:translate-x-80{--tw-translate-x:20rem}.\32xl\:translate-x-96{--tw-translate-x:24rem}.\32xl\:translate-x-px{--tw-translate-x:1px}.\32xl\:translate-x-0\.5{--tw-translate-x:0.125rem}.\32xl\:translate-x-1\.5{--tw-translate-x:0.375rem}.\32xl\:translate-x-2\.5{--tw-translate-x:0.625rem}.\32xl\:translate-x-3\.5{--tw-translate-x:0.875rem}.\32xl\:-translate-x-0{--tw-translate-x:0px}.\32xl\:-translate-x-1{--tw-translate-x:-0.25rem}.\32xl\:-translate-x-2{--tw-translate-x:-0.5rem}.\32xl\:-translate-x-3{--tw-translate-x:-0.75rem}.\32xl\:-translate-x-4{--tw-translate-x:-1rem}.\32xl\:-translate-x-5{--tw-translate-x:-1.25rem}.\32xl\:-translate-x-6{--tw-translate-x:-1.5rem}.\32xl\:-translate-x-7{--tw-translate-x:-1.75rem}.\32xl\:-translate-x-8{--tw-translate-x:-2rem}.\32xl\:-translate-x-9{--tw-translate-x:-2.25rem}.\32xl\:-translate-x-10{--tw-translate-x:-2.5rem}.\32xl\:-translate-x-11{--tw-translate-x:-2.75rem}.\32xl\:-translate-x-12{--tw-translate-x:-3rem}.\32xl\:-translate-x-14{--tw-translate-x:-3.5rem}.\32xl\:-translate-x-16{--tw-translate-x:-4rem}.\32xl\:-translate-x-20{--tw-translate-x:-5rem}.\32xl\:-translate-x-24{--tw-translate-x:-6rem}.\32xl\:-translate-x-28{--tw-translate-x:-7rem}.\32xl\:-translate-x-32{--tw-translate-x:-8rem}.\32xl\:-translate-x-36{--tw-translate-x:-9rem}.\32xl\:-translate-x-40{--tw-translate-x:-10rem}.\32xl\:-translate-x-44{--tw-translate-x:-11rem}.\32xl\:-translate-x-48{--tw-translate-x:-12rem}.\32xl\:-translate-x-52{--tw-translate-x:-13rem}.\32xl\:-translate-x-56{--tw-translate-x:-14rem}.\32xl\:-translate-x-60{--tw-translate-x:-15rem}.\32xl\:-translate-x-64{--tw-translate-x:-16rem}.\32xl\:-translate-x-72{--tw-translate-x:-18rem}.\32xl\:-translate-x-80{--tw-translate-x:-20rem}.\32xl\:-translate-x-96{--tw-translate-x:-24rem}.\32xl\:-translate-x-px{--tw-translate-x:-1px}.\32xl\:-translate-x-0\.5{--tw-translate-x:-0.125rem}.\32xl\:-translate-x-1\.5{--tw-translate-x:-0.375rem}.\32xl\:-translate-x-2\.5{--tw-translate-x:-0.625rem}.\32xl\:-translate-x-3\.5{--tw-translate-x:-0.875rem}.\32xl\:translate-x-1\/2{--tw-translate-x:50%}.\32xl\:translate-x-1\/3{--tw-translate-x:33.333333%}.\32xl\:translate-x-2\/3{--tw-translate-x:66.666667%}.\32xl\:translate-x-1\/4{--tw-translate-x:25%}.\32xl\:translate-x-2\/4{--tw-translate-x:50%}.\32xl\:translate-x-3\/4{--tw-translate-x:75%}.\32xl\:translate-x-full{--tw-translate-x:100%}.\32xl\:-translate-x-1\/2{--tw-translate-x:-50%}.\32xl\:-translate-x-1\/3{--tw-translate-x:-33.333333%}.\32xl\:-translate-x-2\/3{--tw-translate-x:-66.666667%}.\32xl\:-translate-x-1\/4{--tw-translate-x:-25%}.\32xl\:-translate-x-2\/4{--tw-translate-x:-50%}.\32xl\:-translate-x-3\/4{--tw-translate-x:-75%}.\32xl\:-translate-x-full{--tw-translate-x:-100%}.\32xl\:translate-y-0{--tw-translate-y:0px}.\32xl\:translate-y-1{--tw-translate-y:0.25rem}.\32xl\:translate-y-2{--tw-translate-y:0.5rem}.\32xl\:translate-y-3{--tw-translate-y:0.75rem}.\32xl\:translate-y-4{--tw-translate-y:1rem}.\32xl\:translate-y-5{--tw-translate-y:1.25rem}.\32xl\:translate-y-6{--tw-translate-y:1.5rem}.\32xl\:translate-y-7{--tw-translate-y:1.75rem}.\32xl\:translate-y-8{--tw-translate-y:2rem}.\32xl\:translate-y-9{--tw-translate-y:2.25rem}.\32xl\:translate-y-10{--tw-translate-y:2.5rem}.\32xl\:translate-y-11{--tw-translate-y:2.75rem}.\32xl\:translate-y-12{--tw-translate-y:3rem}.\32xl\:translate-y-14{--tw-translate-y:3.5rem}.\32xl\:translate-y-16{--tw-translate-y:4rem}.\32xl\:translate-y-20{--tw-translate-y:5rem}.\32xl\:translate-y-24{--tw-translate-y:6rem}.\32xl\:translate-y-28{--tw-translate-y:7rem}.\32xl\:translate-y-32{--tw-translate-y:8rem}.\32xl\:translate-y-36{--tw-translate-y:9rem}.\32xl\:translate-y-40{--tw-translate-y:10rem}.\32xl\:translate-y-44{--tw-translate-y:11rem}.\32xl\:translate-y-48{--tw-translate-y:12rem}.\32xl\:translate-y-52{--tw-translate-y:13rem}.\32xl\:translate-y-56{--tw-translate-y:14rem}.\32xl\:translate-y-60{--tw-translate-y:15rem}.\32xl\:translate-y-64{--tw-translate-y:16rem}.\32xl\:translate-y-72{--tw-translate-y:18rem}.\32xl\:translate-y-80{--tw-translate-y:20rem}.\32xl\:translate-y-96{--tw-translate-y:24rem}.\32xl\:translate-y-px{--tw-translate-y:1px}.\32xl\:translate-y-0\.5{--tw-translate-y:0.125rem}.\32xl\:translate-y-1\.5{--tw-translate-y:0.375rem}.\32xl\:translate-y-2\.5{--tw-translate-y:0.625rem}.\32xl\:translate-y-3\.5{--tw-translate-y:0.875rem}.\32xl\:-translate-y-0{--tw-translate-y:0px}.\32xl\:-translate-y-1{--tw-translate-y:-0.25rem}.\32xl\:-translate-y-2{--tw-translate-y:-0.5rem}.\32xl\:-translate-y-3{--tw-translate-y:-0.75rem}.\32xl\:-translate-y-4{--tw-translate-y:-1rem}.\32xl\:-translate-y-5{--tw-translate-y:-1.25rem}.\32xl\:-translate-y-6{--tw-translate-y:-1.5rem}.\32xl\:-translate-y-7{--tw-translate-y:-1.75rem}.\32xl\:-translate-y-8{--tw-translate-y:-2rem}.\32xl\:-translate-y-9{--tw-translate-y:-2.25rem}.\32xl\:-translate-y-10{--tw-translate-y:-2.5rem}.\32xl\:-translate-y-11{--tw-translate-y:-2.75rem}.\32xl\:-translate-y-12{--tw-translate-y:-3rem}.\32xl\:-translate-y-14{--tw-translate-y:-3.5rem}.\32xl\:-translate-y-16{--tw-translate-y:-4rem}.\32xl\:-translate-y-20{--tw-translate-y:-5rem}.\32xl\:-translate-y-24{--tw-translate-y:-6rem}.\32xl\:-translate-y-28{--tw-translate-y:-7rem}.\32xl\:-translate-y-32{--tw-translate-y:-8rem}.\32xl\:-translate-y-36{--tw-translate-y:-9rem}.\32xl\:-translate-y-40{--tw-translate-y:-10rem}.\32xl\:-translate-y-44{--tw-translate-y:-11rem}.\32xl\:-translate-y-48{--tw-translate-y:-12rem}.\32xl\:-translate-y-52{--tw-translate-y:-13rem}.\32xl\:-translate-y-56{--tw-translate-y:-14rem}.\32xl\:-translate-y-60{--tw-translate-y:-15rem}.\32xl\:-translate-y-64{--tw-translate-y:-16rem}.\32xl\:-translate-y-72{--tw-translate-y:-18rem}.\32xl\:-translate-y-80{--tw-translate-y:-20rem}.\32xl\:-translate-y-96{--tw-translate-y:-24rem}.\32xl\:-translate-y-px{--tw-translate-y:-1px}.\32xl\:-translate-y-0\.5{--tw-translate-y:-0.125rem}.\32xl\:-translate-y-1\.5{--tw-translate-y:-0.375rem}.\32xl\:-translate-y-2\.5{--tw-translate-y:-0.625rem}.\32xl\:-translate-y-3\.5{--tw-translate-y:-0.875rem}.\32xl\:translate-y-1\/2{--tw-translate-y:50%}.\32xl\:translate-y-1\/3{--tw-translate-y:33.333333%}.\32xl\:translate-y-2\/3{--tw-translate-y:66.666667%}.\32xl\:translate-y-1\/4{--tw-translate-y:25%}.\32xl\:translate-y-2\/4{--tw-translate-y:50%}.\32xl\:translate-y-3\/4{--tw-translate-y:75%}.\32xl\:translate-y-full{--tw-translate-y:100%}.\32xl\:-translate-y-1\/2{--tw-translate-y:-50%}.\32xl\:-translate-y-1\/3{--tw-translate-y:-33.333333%}.\32xl\:-translate-y-2\/3{--tw-translate-y:-66.666667%}.\32xl\:-translate-y-1\/4{--tw-translate-y:-25%}.\32xl\:-translate-y-2\/4{--tw-translate-y:-50%}.\32xl\:-translate-y-3\/4{--tw-translate-y:-75%}.\32xl\:-translate-y-full{--tw-translate-y:-100%}.\32xl\:hover\:translate-x-0:hover{--tw-translate-x:0px}.\32xl\:hover\:translate-x-1:hover{--tw-translate-x:0.25rem}.\32xl\:hover\:translate-x-2:hover{--tw-translate-x:0.5rem}.\32xl\:hover\:translate-x-3:hover{--tw-translate-x:0.75rem}.\32xl\:hover\:translate-x-4:hover{--tw-translate-x:1rem}.\32xl\:hover\:translate-x-5:hover{--tw-translate-x:1.25rem}.\32xl\:hover\:translate-x-6:hover{--tw-translate-x:1.5rem}.\32xl\:hover\:translate-x-7:hover{--tw-translate-x:1.75rem}.\32xl\:hover\:translate-x-8:hover{--tw-translate-x:2rem}.\32xl\:hover\:translate-x-9:hover{--tw-translate-x:2.25rem}.\32xl\:hover\:translate-x-10:hover{--tw-translate-x:2.5rem}.\32xl\:hover\:translate-x-11:hover{--tw-translate-x:2.75rem}.\32xl\:hover\:translate-x-12:hover{--tw-translate-x:3rem}.\32xl\:hover\:translate-x-14:hover{--tw-translate-x:3.5rem}.\32xl\:hover\:translate-x-16:hover{--tw-translate-x:4rem}.\32xl\:hover\:translate-x-20:hover{--tw-translate-x:5rem}.\32xl\:hover\:translate-x-24:hover{--tw-translate-x:6rem}.\32xl\:hover\:translate-x-28:hover{--tw-translate-x:7rem}.\32xl\:hover\:translate-x-32:hover{--tw-translate-x:8rem}.\32xl\:hover\:translate-x-36:hover{--tw-translate-x:9rem}.\32xl\:hover\:translate-x-40:hover{--tw-translate-x:10rem}.\32xl\:hover\:translate-x-44:hover{--tw-translate-x:11rem}.\32xl\:hover\:translate-x-48:hover{--tw-translate-x:12rem}.\32xl\:hover\:translate-x-52:hover{--tw-translate-x:13rem}.\32xl\:hover\:translate-x-56:hover{--tw-translate-x:14rem}.\32xl\:hover\:translate-x-60:hover{--tw-translate-x:15rem}.\32xl\:hover\:translate-x-64:hover{--tw-translate-x:16rem}.\32xl\:hover\:translate-x-72:hover{--tw-translate-x:18rem}.\32xl\:hover\:translate-x-80:hover{--tw-translate-x:20rem}.\32xl\:hover\:translate-x-96:hover{--tw-translate-x:24rem}.\32xl\:hover\:translate-x-px:hover{--tw-translate-x:1px}.\32xl\:hover\:translate-x-0\.5:hover{--tw-translate-x:0.125rem}.\32xl\:hover\:translate-x-1\.5:hover{--tw-translate-x:0.375rem}.\32xl\:hover\:translate-x-2\.5:hover{--tw-translate-x:0.625rem}.\32xl\:hover\:translate-x-3\.5:hover{--tw-translate-x:0.875rem}.\32xl\:hover\:-translate-x-0:hover{--tw-translate-x:0px}.\32xl\:hover\:-translate-x-1:hover{--tw-translate-x:-0.25rem}.\32xl\:hover\:-translate-x-2:hover{--tw-translate-x:-0.5rem}.\32xl\:hover\:-translate-x-3:hover{--tw-translate-x:-0.75rem}.\32xl\:hover\:-translate-x-4:hover{--tw-translate-x:-1rem}.\32xl\:hover\:-translate-x-5:hover{--tw-translate-x:-1.25rem}.\32xl\:hover\:-translate-x-6:hover{--tw-translate-x:-1.5rem}.\32xl\:hover\:-translate-x-7:hover{--tw-translate-x:-1.75rem}.\32xl\:hover\:-translate-x-8:hover{--tw-translate-x:-2rem}.\32xl\:hover\:-translate-x-9:hover{--tw-translate-x:-2.25rem}.\32xl\:hover\:-translate-x-10:hover{--tw-translate-x:-2.5rem}.\32xl\:hover\:-translate-x-11:hover{--tw-translate-x:-2.75rem}.\32xl\:hover\:-translate-x-12:hover{--tw-translate-x:-3rem}.\32xl\:hover\:-translate-x-14:hover{--tw-translate-x:-3.5rem}.\32xl\:hover\:-translate-x-16:hover{--tw-translate-x:-4rem}.\32xl\:hover\:-translate-x-20:hover{--tw-translate-x:-5rem}.\32xl\:hover\:-translate-x-24:hover{--tw-translate-x:-6rem}.\32xl\:hover\:-translate-x-28:hover{--tw-translate-x:-7rem}.\32xl\:hover\:-translate-x-32:hover{--tw-translate-x:-8rem}.\32xl\:hover\:-translate-x-36:hover{--tw-translate-x:-9rem}.\32xl\:hover\:-translate-x-40:hover{--tw-translate-x:-10rem}.\32xl\:hover\:-translate-x-44:hover{--tw-translate-x:-11rem}.\32xl\:hover\:-translate-x-48:hover{--tw-translate-x:-12rem}.\32xl\:hover\:-translate-x-52:hover{--tw-translate-x:-13rem}.\32xl\:hover\:-translate-x-56:hover{--tw-translate-x:-14rem}.\32xl\:hover\:-translate-x-60:hover{--tw-translate-x:-15rem}.\32xl\:hover\:-translate-x-64:hover{--tw-translate-x:-16rem}.\32xl\:hover\:-translate-x-72:hover{--tw-translate-x:-18rem}.\32xl\:hover\:-translate-x-80:hover{--tw-translate-x:-20rem}.\32xl\:hover\:-translate-x-96:hover{--tw-translate-x:-24rem}.\32xl\:hover\:-translate-x-px:hover{--tw-translate-x:-1px}.\32xl\:hover\:-translate-x-0\.5:hover{--tw-translate-x:-0.125rem}.\32xl\:hover\:-translate-x-1\.5:hover{--tw-translate-x:-0.375rem}.\32xl\:hover\:-translate-x-2\.5:hover{--tw-translate-x:-0.625rem}.\32xl\:hover\:-translate-x-3\.5:hover{--tw-translate-x:-0.875rem}.\32xl\:hover\:translate-x-1\/2:hover{--tw-translate-x:50%}.\32xl\:hover\:translate-x-1\/3:hover{--tw-translate-x:33.333333%}.\32xl\:hover\:translate-x-2\/3:hover{--tw-translate-x:66.666667%}.\32xl\:hover\:translate-x-1\/4:hover{--tw-translate-x:25%}.\32xl\:hover\:translate-x-2\/4:hover{--tw-translate-x:50%}.\32xl\:hover\:translate-x-3\/4:hover{--tw-translate-x:75%}.\32xl\:hover\:translate-x-full:hover{--tw-translate-x:100%}.\32xl\:hover\:-translate-x-1\/2:hover{--tw-translate-x:-50%}.\32xl\:hover\:-translate-x-1\/3:hover{--tw-translate-x:-33.333333%}.\32xl\:hover\:-translate-x-2\/3:hover{--tw-translate-x:-66.666667%}.\32xl\:hover\:-translate-x-1\/4:hover{--tw-translate-x:-25%}.\32xl\:hover\:-translate-x-2\/4:hover{--tw-translate-x:-50%}.\32xl\:hover\:-translate-x-3\/4:hover{--tw-translate-x:-75%}.\32xl\:hover\:-translate-x-full:hover{--tw-translate-x:-100%}.\32xl\:hover\:translate-y-0:hover{--tw-translate-y:0px}.\32xl\:hover\:translate-y-1:hover{--tw-translate-y:0.25rem}.\32xl\:hover\:translate-y-2:hover{--tw-translate-y:0.5rem}.\32xl\:hover\:translate-y-3:hover{--tw-translate-y:0.75rem}.\32xl\:hover\:translate-y-4:hover{--tw-translate-y:1rem}.\32xl\:hover\:translate-y-5:hover{--tw-translate-y:1.25rem}.\32xl\:hover\:translate-y-6:hover{--tw-translate-y:1.5rem}.\32xl\:hover\:translate-y-7:hover{--tw-translate-y:1.75rem}.\32xl\:hover\:translate-y-8:hover{--tw-translate-y:2rem}.\32xl\:hover\:translate-y-9:hover{--tw-translate-y:2.25rem}.\32xl\:hover\:translate-y-10:hover{--tw-translate-y:2.5rem}.\32xl\:hover\:translate-y-11:hover{--tw-translate-y:2.75rem}.\32xl\:hover\:translate-y-12:hover{--tw-translate-y:3rem}.\32xl\:hover\:translate-y-14:hover{--tw-translate-y:3.5rem}.\32xl\:hover\:translate-y-16:hover{--tw-translate-y:4rem}.\32xl\:hover\:translate-y-20:hover{--tw-translate-y:5rem}.\32xl\:hover\:translate-y-24:hover{--tw-translate-y:6rem}.\32xl\:hover\:translate-y-28:hover{--tw-translate-y:7rem}.\32xl\:hover\:translate-y-32:hover{--tw-translate-y:8rem}.\32xl\:hover\:translate-y-36:hover{--tw-translate-y:9rem}.\32xl\:hover\:translate-y-40:hover{--tw-translate-y:10rem}.\32xl\:hover\:translate-y-44:hover{--tw-translate-y:11rem}.\32xl\:hover\:translate-y-48:hover{--tw-translate-y:12rem}.\32xl\:hover\:translate-y-52:hover{--tw-translate-y:13rem}.\32xl\:hover\:translate-y-56:hover{--tw-translate-y:14rem}.\32xl\:hover\:translate-y-60:hover{--tw-translate-y:15rem}.\32xl\:hover\:translate-y-64:hover{--tw-translate-y:16rem}.\32xl\:hover\:translate-y-72:hover{--tw-translate-y:18rem}.\32xl\:hover\:translate-y-80:hover{--tw-translate-y:20rem}.\32xl\:hover\:translate-y-96:hover{--tw-translate-y:24rem}.\32xl\:hover\:translate-y-px:hover{--tw-translate-y:1px}.\32xl\:hover\:translate-y-0\.5:hover{--tw-translate-y:0.125rem}.\32xl\:hover\:translate-y-1\.5:hover{--tw-translate-y:0.375rem}.\32xl\:hover\:translate-y-2\.5:hover{--tw-translate-y:0.625rem}.\32xl\:hover\:translate-y-3\.5:hover{--tw-translate-y:0.875rem}.\32xl\:hover\:-translate-y-0:hover{--tw-translate-y:0px}.\32xl\:hover\:-translate-y-1:hover{--tw-translate-y:-0.25rem}.\32xl\:hover\:-translate-y-2:hover{--tw-translate-y:-0.5rem}.\32xl\:hover\:-translate-y-3:hover{--tw-translate-y:-0.75rem}.\32xl\:hover\:-translate-y-4:hover{--tw-translate-y:-1rem}.\32xl\:hover\:-translate-y-5:hover{--tw-translate-y:-1.25rem}.\32xl\:hover\:-translate-y-6:hover{--tw-translate-y:-1.5rem}.\32xl\:hover\:-translate-y-7:hover{--tw-translate-y:-1.75rem}.\32xl\:hover\:-translate-y-8:hover{--tw-translate-y:-2rem}.\32xl\:hover\:-translate-y-9:hover{--tw-translate-y:-2.25rem}.\32xl\:hover\:-translate-y-10:hover{--tw-translate-y:-2.5rem}.\32xl\:hover\:-translate-y-11:hover{--tw-translate-y:-2.75rem}.\32xl\:hover\:-translate-y-12:hover{--tw-translate-y:-3rem}.\32xl\:hover\:-translate-y-14:hover{--tw-translate-y:-3.5rem}.\32xl\:hover\:-translate-y-16:hover{--tw-translate-y:-4rem}.\32xl\:hover\:-translate-y-20:hover{--tw-translate-y:-5rem}.\32xl\:hover\:-translate-y-24:hover{--tw-translate-y:-6rem}.\32xl\:hover\:-translate-y-28:hover{--tw-translate-y:-7rem}.\32xl\:hover\:-translate-y-32:hover{--tw-translate-y:-8rem}.\32xl\:hover\:-translate-y-36:hover{--tw-translate-y:-9rem}.\32xl\:hover\:-translate-y-40:hover{--tw-translate-y:-10rem}.\32xl\:hover\:-translate-y-44:hover{--tw-translate-y:-11rem}.\32xl\:hover\:-translate-y-48:hover{--tw-translate-y:-12rem}.\32xl\:hover\:-translate-y-52:hover{--tw-translate-y:-13rem}.\32xl\:hover\:-translate-y-56:hover{--tw-translate-y:-14rem}.\32xl\:hover\:-translate-y-60:hover{--tw-translate-y:-15rem}.\32xl\:hover\:-translate-y-64:hover{--tw-translate-y:-16rem}.\32xl\:hover\:-translate-y-72:hover{--tw-translate-y:-18rem}.\32xl\:hover\:-translate-y-80:hover{--tw-translate-y:-20rem}.\32xl\:hover\:-translate-y-96:hover{--tw-translate-y:-24rem}.\32xl\:hover\:-translate-y-px:hover{--tw-translate-y:-1px}.\32xl\:hover\:-translate-y-0\.5:hover{--tw-translate-y:-0.125rem}.\32xl\:hover\:-translate-y-1\.5:hover{--tw-translate-y:-0.375rem}.\32xl\:hover\:-translate-y-2\.5:hover{--tw-translate-y:-0.625rem}.\32xl\:hover\:-translate-y-3\.5:hover{--tw-translate-y:-0.875rem}.\32xl\:hover\:translate-y-1\/2:hover{--tw-translate-y:50%}.\32xl\:hover\:translate-y-1\/3:hover{--tw-translate-y:33.333333%}.\32xl\:hover\:translate-y-2\/3:hover{--tw-translate-y:66.666667%}.\32xl\:hover\:translate-y-1\/4:hover{--tw-translate-y:25%}.\32xl\:hover\:translate-y-2\/4:hover{--tw-translate-y:50%}.\32xl\:hover\:translate-y-3\/4:hover{--tw-translate-y:75%}.\32xl\:hover\:translate-y-full:hover{--tw-translate-y:100%}.\32xl\:hover\:-translate-y-1\/2:hover{--tw-translate-y:-50%}.\32xl\:hover\:-translate-y-1\/3:hover{--tw-translate-y:-33.333333%}.\32xl\:hover\:-translate-y-2\/3:hover{--tw-translate-y:-66.666667%}.\32xl\:hover\:-translate-y-1\/4:hover{--tw-translate-y:-25%}.\32xl\:hover\:-translate-y-2\/4:hover{--tw-translate-y:-50%}.\32xl\:hover\:-translate-y-3\/4:hover{--tw-translate-y:-75%}.\32xl\:hover\:-translate-y-full:hover{--tw-translate-y:-100%}.\32xl\:focus\:translate-x-0:focus{--tw-translate-x:0px}.\32xl\:focus\:translate-x-1:focus{--tw-translate-x:0.25rem}.\32xl\:focus\:translate-x-2:focus{--tw-translate-x:0.5rem}.\32xl\:focus\:translate-x-3:focus{--tw-translate-x:0.75rem}.\32xl\:focus\:translate-x-4:focus{--tw-translate-x:1rem}.\32xl\:focus\:translate-x-5:focus{--tw-translate-x:1.25rem}.\32xl\:focus\:translate-x-6:focus{--tw-translate-x:1.5rem}.\32xl\:focus\:translate-x-7:focus{--tw-translate-x:1.75rem}.\32xl\:focus\:translate-x-8:focus{--tw-translate-x:2rem}.\32xl\:focus\:translate-x-9:focus{--tw-translate-x:2.25rem}.\32xl\:focus\:translate-x-10:focus{--tw-translate-x:2.5rem}.\32xl\:focus\:translate-x-11:focus{--tw-translate-x:2.75rem}.\32xl\:focus\:translate-x-12:focus{--tw-translate-x:3rem}.\32xl\:focus\:translate-x-14:focus{--tw-translate-x:3.5rem}.\32xl\:focus\:translate-x-16:focus{--tw-translate-x:4rem}.\32xl\:focus\:translate-x-20:focus{--tw-translate-x:5rem}.\32xl\:focus\:translate-x-24:focus{--tw-translate-x:6rem}.\32xl\:focus\:translate-x-28:focus{--tw-translate-x:7rem}.\32xl\:focus\:translate-x-32:focus{--tw-translate-x:8rem}.\32xl\:focus\:translate-x-36:focus{--tw-translate-x:9rem}.\32xl\:focus\:translate-x-40:focus{--tw-translate-x:10rem}.\32xl\:focus\:translate-x-44:focus{--tw-translate-x:11rem}.\32xl\:focus\:translate-x-48:focus{--tw-translate-x:12rem}.\32xl\:focus\:translate-x-52:focus{--tw-translate-x:13rem}.\32xl\:focus\:translate-x-56:focus{--tw-translate-x:14rem}.\32xl\:focus\:translate-x-60:focus{--tw-translate-x:15rem}.\32xl\:focus\:translate-x-64:focus{--tw-translate-x:16rem}.\32xl\:focus\:translate-x-72:focus{--tw-translate-x:18rem}.\32xl\:focus\:translate-x-80:focus{--tw-translate-x:20rem}.\32xl\:focus\:translate-x-96:focus{--tw-translate-x:24rem}.\32xl\:focus\:translate-x-px:focus{--tw-translate-x:1px}.\32xl\:focus\:translate-x-0\.5:focus{--tw-translate-x:0.125rem}.\32xl\:focus\:translate-x-1\.5:focus{--tw-translate-x:0.375rem}.\32xl\:focus\:translate-x-2\.5:focus{--tw-translate-x:0.625rem}.\32xl\:focus\:translate-x-3\.5:focus{--tw-translate-x:0.875rem}.\32xl\:focus\:-translate-x-0:focus{--tw-translate-x:0px}.\32xl\:focus\:-translate-x-1:focus{--tw-translate-x:-0.25rem}.\32xl\:focus\:-translate-x-2:focus{--tw-translate-x:-0.5rem}.\32xl\:focus\:-translate-x-3:focus{--tw-translate-x:-0.75rem}.\32xl\:focus\:-translate-x-4:focus{--tw-translate-x:-1rem}.\32xl\:focus\:-translate-x-5:focus{--tw-translate-x:-1.25rem}.\32xl\:focus\:-translate-x-6:focus{--tw-translate-x:-1.5rem}.\32xl\:focus\:-translate-x-7:focus{--tw-translate-x:-1.75rem}.\32xl\:focus\:-translate-x-8:focus{--tw-translate-x:-2rem}.\32xl\:focus\:-translate-x-9:focus{--tw-translate-x:-2.25rem}.\32xl\:focus\:-translate-x-10:focus{--tw-translate-x:-2.5rem}.\32xl\:focus\:-translate-x-11:focus{--tw-translate-x:-2.75rem}.\32xl\:focus\:-translate-x-12:focus{--tw-translate-x:-3rem}.\32xl\:focus\:-translate-x-14:focus{--tw-translate-x:-3.5rem}.\32xl\:focus\:-translate-x-16:focus{--tw-translate-x:-4rem}.\32xl\:focus\:-translate-x-20:focus{--tw-translate-x:-5rem}.\32xl\:focus\:-translate-x-24:focus{--tw-translate-x:-6rem}.\32xl\:focus\:-translate-x-28:focus{--tw-translate-x:-7rem}.\32xl\:focus\:-translate-x-32:focus{--tw-translate-x:-8rem}.\32xl\:focus\:-translate-x-36:focus{--tw-translate-x:-9rem}.\32xl\:focus\:-translate-x-40:focus{--tw-translate-x:-10rem}.\32xl\:focus\:-translate-x-44:focus{--tw-translate-x:-11rem}.\32xl\:focus\:-translate-x-48:focus{--tw-translate-x:-12rem}.\32xl\:focus\:-translate-x-52:focus{--tw-translate-x:-13rem}.\32xl\:focus\:-translate-x-56:focus{--tw-translate-x:-14rem}.\32xl\:focus\:-translate-x-60:focus{--tw-translate-x:-15rem}.\32xl\:focus\:-translate-x-64:focus{--tw-translate-x:-16rem}.\32xl\:focus\:-translate-x-72:focus{--tw-translate-x:-18rem}.\32xl\:focus\:-translate-x-80:focus{--tw-translate-x:-20rem}.\32xl\:focus\:-translate-x-96:focus{--tw-translate-x:-24rem}.\32xl\:focus\:-translate-x-px:focus{--tw-translate-x:-1px}.\32xl\:focus\:-translate-x-0\.5:focus{--tw-translate-x:-0.125rem}.\32xl\:focus\:-translate-x-1\.5:focus{--tw-translate-x:-0.375rem}.\32xl\:focus\:-translate-x-2\.5:focus{--tw-translate-x:-0.625rem}.\32xl\:focus\:-translate-x-3\.5:focus{--tw-translate-x:-0.875rem}.\32xl\:focus\:translate-x-1\/2:focus{--tw-translate-x:50%}.\32xl\:focus\:translate-x-1\/3:focus{--tw-translate-x:33.333333%}.\32xl\:focus\:translate-x-2\/3:focus{--tw-translate-x:66.666667%}.\32xl\:focus\:translate-x-1\/4:focus{--tw-translate-x:25%}.\32xl\:focus\:translate-x-2\/4:focus{--tw-translate-x:50%}.\32xl\:focus\:translate-x-3\/4:focus{--tw-translate-x:75%}.\32xl\:focus\:translate-x-full:focus{--tw-translate-x:100%}.\32xl\:focus\:-translate-x-1\/2:focus{--tw-translate-x:-50%}.\32xl\:focus\:-translate-x-1\/3:focus{--tw-translate-x:-33.333333%}.\32xl\:focus\:-translate-x-2\/3:focus{--tw-translate-x:-66.666667%}.\32xl\:focus\:-translate-x-1\/4:focus{--tw-translate-x:-25%}.\32xl\:focus\:-translate-x-2\/4:focus{--tw-translate-x:-50%}.\32xl\:focus\:-translate-x-3\/4:focus{--tw-translate-x:-75%}.\32xl\:focus\:-translate-x-full:focus{--tw-translate-x:-100%}.\32xl\:focus\:translate-y-0:focus{--tw-translate-y:0px}.\32xl\:focus\:translate-y-1:focus{--tw-translate-y:0.25rem}.\32xl\:focus\:translate-y-2:focus{--tw-translate-y:0.5rem}.\32xl\:focus\:translate-y-3:focus{--tw-translate-y:0.75rem}.\32xl\:focus\:translate-y-4:focus{--tw-translate-y:1rem}.\32xl\:focus\:translate-y-5:focus{--tw-translate-y:1.25rem}.\32xl\:focus\:translate-y-6:focus{--tw-translate-y:1.5rem}.\32xl\:focus\:translate-y-7:focus{--tw-translate-y:1.75rem}.\32xl\:focus\:translate-y-8:focus{--tw-translate-y:2rem}.\32xl\:focus\:translate-y-9:focus{--tw-translate-y:2.25rem}.\32xl\:focus\:translate-y-10:focus{--tw-translate-y:2.5rem}.\32xl\:focus\:translate-y-11:focus{--tw-translate-y:2.75rem}.\32xl\:focus\:translate-y-12:focus{--tw-translate-y:3rem}.\32xl\:focus\:translate-y-14:focus{--tw-translate-y:3.5rem}.\32xl\:focus\:translate-y-16:focus{--tw-translate-y:4rem}.\32xl\:focus\:translate-y-20:focus{--tw-translate-y:5rem}.\32xl\:focus\:translate-y-24:focus{--tw-translate-y:6rem}.\32xl\:focus\:translate-y-28:focus{--tw-translate-y:7rem}.\32xl\:focus\:translate-y-32:focus{--tw-translate-y:8rem}.\32xl\:focus\:translate-y-36:focus{--tw-translate-y:9rem}.\32xl\:focus\:translate-y-40:focus{--tw-translate-y:10rem}.\32xl\:focus\:translate-y-44:focus{--tw-translate-y:11rem}.\32xl\:focus\:translate-y-48:focus{--tw-translate-y:12rem}.\32xl\:focus\:translate-y-52:focus{--tw-translate-y:13rem}.\32xl\:focus\:translate-y-56:focus{--tw-translate-y:14rem}.\32xl\:focus\:translate-y-60:focus{--tw-translate-y:15rem}.\32xl\:focus\:translate-y-64:focus{--tw-translate-y:16rem}.\32xl\:focus\:translate-y-72:focus{--tw-translate-y:18rem}.\32xl\:focus\:translate-y-80:focus{--tw-translate-y:20rem}.\32xl\:focus\:translate-y-96:focus{--tw-translate-y:24rem}.\32xl\:focus\:translate-y-px:focus{--tw-translate-y:1px}.\32xl\:focus\:translate-y-0\.5:focus{--tw-translate-y:0.125rem}.\32xl\:focus\:translate-y-1\.5:focus{--tw-translate-y:0.375rem}.\32xl\:focus\:translate-y-2\.5:focus{--tw-translate-y:0.625rem}.\32xl\:focus\:translate-y-3\.5:focus{--tw-translate-y:0.875rem}.\32xl\:focus\:-translate-y-0:focus{--tw-translate-y:0px}.\32xl\:focus\:-translate-y-1:focus{--tw-translate-y:-0.25rem}.\32xl\:focus\:-translate-y-2:focus{--tw-translate-y:-0.5rem}.\32xl\:focus\:-translate-y-3:focus{--tw-translate-y:-0.75rem}.\32xl\:focus\:-translate-y-4:focus{--tw-translate-y:-1rem}.\32xl\:focus\:-translate-y-5:focus{--tw-translate-y:-1.25rem}.\32xl\:focus\:-translate-y-6:focus{--tw-translate-y:-1.5rem}.\32xl\:focus\:-translate-y-7:focus{--tw-translate-y:-1.75rem}.\32xl\:focus\:-translate-y-8:focus{--tw-translate-y:-2rem}.\32xl\:focus\:-translate-y-9:focus{--tw-translate-y:-2.25rem}.\32xl\:focus\:-translate-y-10:focus{--tw-translate-y:-2.5rem}.\32xl\:focus\:-translate-y-11:focus{--tw-translate-y:-2.75rem}.\32xl\:focus\:-translate-y-12:focus{--tw-translate-y:-3rem}.\32xl\:focus\:-translate-y-14:focus{--tw-translate-y:-3.5rem}.\32xl\:focus\:-translate-y-16:focus{--tw-translate-y:-4rem}.\32xl\:focus\:-translate-y-20:focus{--tw-translate-y:-5rem}.\32xl\:focus\:-translate-y-24:focus{--tw-translate-y:-6rem}.\32xl\:focus\:-translate-y-28:focus{--tw-translate-y:-7rem}.\32xl\:focus\:-translate-y-32:focus{--tw-translate-y:-8rem}.\32xl\:focus\:-translate-y-36:focus{--tw-translate-y:-9rem}.\32xl\:focus\:-translate-y-40:focus{--tw-translate-y:-10rem}.\32xl\:focus\:-translate-y-44:focus{--tw-translate-y:-11rem}.\32xl\:focus\:-translate-y-48:focus{--tw-translate-y:-12rem}.\32xl\:focus\:-translate-y-52:focus{--tw-translate-y:-13rem}.\32xl\:focus\:-translate-y-56:focus{--tw-translate-y:-14rem}.\32xl\:focus\:-translate-y-60:focus{--tw-translate-y:-15rem}.\32xl\:focus\:-translate-y-64:focus{--tw-translate-y:-16rem}.\32xl\:focus\:-translate-y-72:focus{--tw-translate-y:-18rem}.\32xl\:focus\:-translate-y-80:focus{--tw-translate-y:-20rem}.\32xl\:focus\:-translate-y-96:focus{--tw-translate-y:-24rem}.\32xl\:focus\:-translate-y-px:focus{--tw-translate-y:-1px}.\32xl\:focus\:-translate-y-0\.5:focus{--tw-translate-y:-0.125rem}.\32xl\:focus\:-translate-y-1\.5:focus{--tw-translate-y:-0.375rem}.\32xl\:focus\:-translate-y-2\.5:focus{--tw-translate-y:-0.625rem}.\32xl\:focus\:-translate-y-3\.5:focus{--tw-translate-y:-0.875rem}.\32xl\:focus\:translate-y-1\/2:focus{--tw-translate-y:50%}.\32xl\:focus\:translate-y-1\/3:focus{--tw-translate-y:33.333333%}.\32xl\:focus\:translate-y-2\/3:focus{--tw-translate-y:66.666667%}.\32xl\:focus\:translate-y-1\/4:focus{--tw-translate-y:25%}.\32xl\:focus\:translate-y-2\/4:focus{--tw-translate-y:50%}.\32xl\:focus\:translate-y-3\/4:focus{--tw-translate-y:75%}.\32xl\:focus\:translate-y-full:focus{--tw-translate-y:100%}.\32xl\:focus\:-translate-y-1\/2:focus{--tw-translate-y:-50%}.\32xl\:focus\:-translate-y-1\/3:focus{--tw-translate-y:-33.333333%}.\32xl\:focus\:-translate-y-2\/3:focus{--tw-translate-y:-66.666667%}.\32xl\:focus\:-translate-y-1\/4:focus{--tw-translate-y:-25%}.\32xl\:focus\:-translate-y-2\/4:focus{--tw-translate-y:-50%}.\32xl\:focus\:-translate-y-3\/4:focus{--tw-translate-y:-75%}.\32xl\:focus\:-translate-y-full:focus{--tw-translate-y:-100%}.\32xl\:rotate-0{--tw-rotate:0deg}.\32xl\:rotate-1{--tw-rotate:1deg}.\32xl\:rotate-2{--tw-rotate:2deg}.\32xl\:rotate-3{--tw-rotate:3deg}.\32xl\:rotate-6{--tw-rotate:6deg}.\32xl\:rotate-12{--tw-rotate:12deg}.\32xl\:rotate-45{--tw-rotate:45deg}.\32xl\:rotate-90{--tw-rotate:90deg}.\32xl\:rotate-180{--tw-rotate:180deg}.\32xl\:-rotate-180{--tw-rotate:-180deg}.\32xl\:-rotate-90{--tw-rotate:-90deg}.\32xl\:-rotate-45{--tw-rotate:-45deg}.\32xl\:-rotate-12{--tw-rotate:-12deg}.\32xl\:-rotate-6{--tw-rotate:-6deg}.\32xl\:-rotate-3{--tw-rotate:-3deg}.\32xl\:-rotate-2{--tw-rotate:-2deg}.\32xl\:-rotate-1{--tw-rotate:-1deg}.\32xl\:hover\:rotate-0:hover{--tw-rotate:0deg}.\32xl\:hover\:rotate-1:hover{--tw-rotate:1deg}.\32xl\:hover\:rotate-2:hover{--tw-rotate:2deg}.\32xl\:hover\:rotate-3:hover{--tw-rotate:3deg}.\32xl\:hover\:rotate-6:hover{--tw-rotate:6deg}.\32xl\:hover\:rotate-12:hover{--tw-rotate:12deg}.\32xl\:hover\:rotate-45:hover{--tw-rotate:45deg}.\32xl\:hover\:rotate-90:hover{--tw-rotate:90deg}.\32xl\:hover\:rotate-180:hover{--tw-rotate:180deg}.\32xl\:hover\:-rotate-180:hover{--tw-rotate:-180deg}.\32xl\:hover\:-rotate-90:hover{--tw-rotate:-90deg}.\32xl\:hover\:-rotate-45:hover{--tw-rotate:-45deg}.\32xl\:hover\:-rotate-12:hover{--tw-rotate:-12deg}.\32xl\:hover\:-rotate-6:hover{--tw-rotate:-6deg}.\32xl\:hover\:-rotate-3:hover{--tw-rotate:-3deg}.\32xl\:hover\:-rotate-2:hover{--tw-rotate:-2deg}.\32xl\:hover\:-rotate-1:hover{--tw-rotate:-1deg}.\32xl\:focus\:rotate-0:focus{--tw-rotate:0deg}.\32xl\:focus\:rotate-1:focus{--tw-rotate:1deg}.\32xl\:focus\:rotate-2:focus{--tw-rotate:2deg}.\32xl\:focus\:rotate-3:focus{--tw-rotate:3deg}.\32xl\:focus\:rotate-6:focus{--tw-rotate:6deg}.\32xl\:focus\:rotate-12:focus{--tw-rotate:12deg}.\32xl\:focus\:rotate-45:focus{--tw-rotate:45deg}.\32xl\:focus\:rotate-90:focus{--tw-rotate:90deg}.\32xl\:focus\:rotate-180:focus{--tw-rotate:180deg}.\32xl\:focus\:-rotate-180:focus{--tw-rotate:-180deg}.\32xl\:focus\:-rotate-90:focus{--tw-rotate:-90deg}.\32xl\:focus\:-rotate-45:focus{--tw-rotate:-45deg}.\32xl\:focus\:-rotate-12:focus{--tw-rotate:-12deg}.\32xl\:focus\:-rotate-6:focus{--tw-rotate:-6deg}.\32xl\:focus\:-rotate-3:focus{--tw-rotate:-3deg}.\32xl\:focus\:-rotate-2:focus{--tw-rotate:-2deg}.\32xl\:focus\:-rotate-1:focus{--tw-rotate:-1deg}.\32xl\:skew-x-0{--tw-skew-x:0deg}.\32xl\:skew-x-1{--tw-skew-x:1deg}.\32xl\:skew-x-2{--tw-skew-x:2deg}.\32xl\:skew-x-3{--tw-skew-x:3deg}.\32xl\:skew-x-6{--tw-skew-x:6deg}.\32xl\:skew-x-12{--tw-skew-x:12deg}.\32xl\:-skew-x-12{--tw-skew-x:-12deg}.\32xl\:-skew-x-6{--tw-skew-x:-6deg}.\32xl\:-skew-x-3{--tw-skew-x:-3deg}.\32xl\:-skew-x-2{--tw-skew-x:-2deg}.\32xl\:-skew-x-1{--tw-skew-x:-1deg}.\32xl\:skew-y-0{--tw-skew-y:0deg}.\32xl\:skew-y-1{--tw-skew-y:1deg}.\32xl\:skew-y-2{--tw-skew-y:2deg}.\32xl\:skew-y-3{--tw-skew-y:3deg}.\32xl\:skew-y-6{--tw-skew-y:6deg}.\32xl\:skew-y-12{--tw-skew-y:12deg}.\32xl\:-skew-y-12{--tw-skew-y:-12deg}.\32xl\:-skew-y-6{--tw-skew-y:-6deg}.\32xl\:-skew-y-3{--tw-skew-y:-3deg}.\32xl\:-skew-y-2{--tw-skew-y:-2deg}.\32xl\:-skew-y-1{--tw-skew-y:-1deg}.\32xl\:hover\:skew-x-0:hover{--tw-skew-x:0deg}.\32xl\:hover\:skew-x-1:hover{--tw-skew-x:1deg}.\32xl\:hover\:skew-x-2:hover{--tw-skew-x:2deg}.\32xl\:hover\:skew-x-3:hover{--tw-skew-x:3deg}.\32xl\:hover\:skew-x-6:hover{--tw-skew-x:6deg}.\32xl\:hover\:skew-x-12:hover{--tw-skew-x:12deg}.\32xl\:hover\:-skew-x-12:hover{--tw-skew-x:-12deg}.\32xl\:hover\:-skew-x-6:hover{--tw-skew-x:-6deg}.\32xl\:hover\:-skew-x-3:hover{--tw-skew-x:-3deg}.\32xl\:hover\:-skew-x-2:hover{--tw-skew-x:-2deg}.\32xl\:hover\:-skew-x-1:hover{--tw-skew-x:-1deg}.\32xl\:hover\:skew-y-0:hover{--tw-skew-y:0deg}.\32xl\:hover\:skew-y-1:hover{--tw-skew-y:1deg}.\32xl\:hover\:skew-y-2:hover{--tw-skew-y:2deg}.\32xl\:hover\:skew-y-3:hover{--tw-skew-y:3deg}.\32xl\:hover\:skew-y-6:hover{--tw-skew-y:6deg}.\32xl\:hover\:skew-y-12:hover{--tw-skew-y:12deg}.\32xl\:hover\:-skew-y-12:hover{--tw-skew-y:-12deg}.\32xl\:hover\:-skew-y-6:hover{--tw-skew-y:-6deg}.\32xl\:hover\:-skew-y-3:hover{--tw-skew-y:-3deg}.\32xl\:hover\:-skew-y-2:hover{--tw-skew-y:-2deg}.\32xl\:hover\:-skew-y-1:hover{--tw-skew-y:-1deg}.\32xl\:focus\:skew-x-0:focus{--tw-skew-x:0deg}.\32xl\:focus\:skew-x-1:focus{--tw-skew-x:1deg}.\32xl\:focus\:skew-x-2:focus{--tw-skew-x:2deg}.\32xl\:focus\:skew-x-3:focus{--tw-skew-x:3deg}.\32xl\:focus\:skew-x-6:focus{--tw-skew-x:6deg}.\32xl\:focus\:skew-x-12:focus{--tw-skew-x:12deg}.\32xl\:focus\:-skew-x-12:focus{--tw-skew-x:-12deg}.\32xl\:focus\:-skew-x-6:focus{--tw-skew-x:-6deg}.\32xl\:focus\:-skew-x-3:focus{--tw-skew-x:-3deg}.\32xl\:focus\:-skew-x-2:focus{--tw-skew-x:-2deg}.\32xl\:focus\:-skew-x-1:focus{--tw-skew-x:-1deg}.\32xl\:focus\:skew-y-0:focus{--tw-skew-y:0deg}.\32xl\:focus\:skew-y-1:focus{--tw-skew-y:1deg}.\32xl\:focus\:skew-y-2:focus{--tw-skew-y:2deg}.\32xl\:focus\:skew-y-3:focus{--tw-skew-y:3deg}.\32xl\:focus\:skew-y-6:focus{--tw-skew-y:6deg}.\32xl\:focus\:skew-y-12:focus{--tw-skew-y:12deg}.\32xl\:focus\:-skew-y-12:focus{--tw-skew-y:-12deg}.\32xl\:focus\:-skew-y-6:focus{--tw-skew-y:-6deg}.\32xl\:focus\:-skew-y-3:focus{--tw-skew-y:-3deg}.\32xl\:focus\:-skew-y-2:focus{--tw-skew-y:-2deg}.\32xl\:focus\:-skew-y-1:focus{--tw-skew-y:-1deg}.\32xl\:scale-0{--tw-scale-x:0;--tw-scale-y:0}.\32xl\:scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.\32xl\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.\32xl\:scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.\32xl\:scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.\32xl\:scale-100{--tw-scale-x:1;--tw-scale-y:1}.\32xl\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.\32xl\:scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.\32xl\:scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.\32xl\:scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.\32xl\:hover\:scale-0:hover{--tw-scale-x:0;--tw-scale-y:0}.\32xl\:hover\:scale-50:hover{--tw-scale-x:.5;--tw-scale-y:.5}.\32xl\:hover\:scale-75:hover{--tw-scale-x:.75;--tw-scale-y:.75}.\32xl\:hover\:scale-90:hover{--tw-scale-x:.9;--tw-scale-y:.9}.\32xl\:hover\:scale-95:hover{--tw-scale-x:.95;--tw-scale-y:.95}.\32xl\:hover\:scale-100:hover{--tw-scale-x:1;--tw-scale-y:1}.\32xl\:hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05}.\32xl\:hover\:scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1}.\32xl\:hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25}.\32xl\:hover\:scale-150:hover{--tw-scale-x:1.5;--tw-scale-y:1.5}.\32xl\:focus\:scale-0:focus{--tw-scale-x:0;--tw-scale-y:0}.\32xl\:focus\:scale-50:focus{--tw-scale-x:.5;--tw-scale-y:.5}.\32xl\:focus\:scale-75:focus{--tw-scale-x:.75;--tw-scale-y:.75}.\32xl\:focus\:scale-90:focus{--tw-scale-x:.9;--tw-scale-y:.9}.\32xl\:focus\:scale-95:focus{--tw-scale-x:.95;--tw-scale-y:.95}.\32xl\:focus\:scale-100:focus{--tw-scale-x:1;--tw-scale-y:1}.\32xl\:focus\:scale-105:focus{--tw-scale-x:1.05;--tw-scale-y:1.05}.\32xl\:focus\:scale-110:focus{--tw-scale-x:1.1;--tw-scale-y:1.1}.\32xl\:focus\:scale-125:focus{--tw-scale-x:1.25;--tw-scale-y:1.25}.\32xl\:focus\:scale-150:focus{--tw-scale-x:1.5;--tw-scale-y:1.5}.\32xl\:scale-x-0{--tw-scale-x:0}.\32xl\:scale-x-50{--tw-scale-x:.5}.\32xl\:scale-x-75{--tw-scale-x:.75}.\32xl\:scale-x-90{--tw-scale-x:.9}.\32xl\:scale-x-95{--tw-scale-x:.95}.\32xl\:scale-x-100{--tw-scale-x:1}.\32xl\:scale-x-105{--tw-scale-x:1.05}.\32xl\:scale-x-110{--tw-scale-x:1.1}.\32xl\:scale-x-125{--tw-scale-x:1.25}.\32xl\:scale-x-150{--tw-scale-x:1.5}.\32xl\:scale-y-0{--tw-scale-y:0}.\32xl\:scale-y-50{--tw-scale-y:.5}.\32xl\:scale-y-75{--tw-scale-y:.75}.\32xl\:scale-y-90{--tw-scale-y:.9}.\32xl\:scale-y-95{--tw-scale-y:.95}.\32xl\:scale-y-100{--tw-scale-y:1}.\32xl\:scale-y-105{--tw-scale-y:1.05}.\32xl\:scale-y-110{--tw-scale-y:1.1}.\32xl\:scale-y-125{--tw-scale-y:1.25}.\32xl\:scale-y-150{--tw-scale-y:1.5}.\32xl\:hover\:scale-x-0:hover{--tw-scale-x:0}.\32xl\:hover\:scale-x-50:hover{--tw-scale-x:.5}.\32xl\:hover\:scale-x-75:hover{--tw-scale-x:.75}.\32xl\:hover\:scale-x-90:hover{--tw-scale-x:.9}.\32xl\:hover\:scale-x-95:hover{--tw-scale-x:.95}.\32xl\:hover\:scale-x-100:hover{--tw-scale-x:1}.\32xl\:hover\:scale-x-105:hover{--tw-scale-x:1.05}.\32xl\:hover\:scale-x-110:hover{--tw-scale-x:1.1}.\32xl\:hover\:scale-x-125:hover{--tw-scale-x:1.25}.\32xl\:hover\:scale-x-150:hover{--tw-scale-x:1.5}.\32xl\:hover\:scale-y-0:hover{--tw-scale-y:0}.\32xl\:hover\:scale-y-50:hover{--tw-scale-y:.5}.\32xl\:hover\:scale-y-75:hover{--tw-scale-y:.75}.\32xl\:hover\:scale-y-90:hover{--tw-scale-y:.9}.\32xl\:hover\:scale-y-95:hover{--tw-scale-y:.95}.\32xl\:hover\:scale-y-100:hover{--tw-scale-y:1}.\32xl\:hover\:scale-y-105:hover{--tw-scale-y:1.05}.\32xl\:hover\:scale-y-110:hover{--tw-scale-y:1.1}.\32xl\:hover\:scale-y-125:hover{--tw-scale-y:1.25}.\32xl\:hover\:scale-y-150:hover{--tw-scale-y:1.5}.\32xl\:focus\:scale-x-0:focus{--tw-scale-x:0}.\32xl\:focus\:scale-x-50:focus{--tw-scale-x:.5}.\32xl\:focus\:scale-x-75:focus{--tw-scale-x:.75}.\32xl\:focus\:scale-x-90:focus{--tw-scale-x:.9}.\32xl\:focus\:scale-x-95:focus{--tw-scale-x:.95}.\32xl\:focus\:scale-x-100:focus{--tw-scale-x:1}.\32xl\:focus\:scale-x-105:focus{--tw-scale-x:1.05}.\32xl\:focus\:scale-x-110:focus{--tw-scale-x:1.1}.\32xl\:focus\:scale-x-125:focus{--tw-scale-x:1.25}.\32xl\:focus\:scale-x-150:focus{--tw-scale-x:1.5}.\32xl\:focus\:scale-y-0:focus{--tw-scale-y:0}.\32xl\:focus\:scale-y-50:focus{--tw-scale-y:.5}.\32xl\:focus\:scale-y-75:focus{--tw-scale-y:.75}.\32xl\:focus\:scale-y-90:focus{--tw-scale-y:.9}.\32xl\:focus\:scale-y-95:focus{--tw-scale-y:.95}.\32xl\:focus\:scale-y-100:focus{--tw-scale-y:1}.\32xl\:focus\:scale-y-105:focus{--tw-scale-y:1.05}.\32xl\:focus\:scale-y-110:focus{--tw-scale-y:1.1}.\32xl\:focus\:scale-y-125:focus{--tw-scale-y:1.25}.\32xl\:focus\:scale-y-150:focus{--tw-scale-y:1.5}.\32xl\:animate-none{-webkit-animation:none;animation:none}.\32xl\:animate-spin{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}.\32xl\:animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.\32xl\:animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.\32xl\:animate-bounce{-webkit-animation:bounce 1s infinite;animation:bounce 1s infinite}.\32xl\:cursor-auto{cursor:auto}.\32xl\:cursor-default{cursor:default}.\32xl\:cursor-pointer{cursor:pointer}.\32xl\:cursor-wait{cursor:wait}.\32xl\:cursor-text{cursor:text}.\32xl\:cursor-move{cursor:move}.\32xl\:cursor-help{cursor:help}.\32xl\:cursor-not-allowed{cursor:not-allowed}.\32xl\:select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.\32xl\:select-text{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.\32xl\:select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.\32xl\:select-auto{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.\32xl\:resize-none{resize:none}.\32xl\:resize-y{resize:vertical}.\32xl\:resize-x{resize:horizontal}.\32xl\:resize{resize:both}.\32xl\:list-inside{list-style-position:inside}.\32xl\:list-outside{list-style-position:outside}.\32xl\:list-none{list-style-type:none}.\32xl\:list-disc{list-style-type:disc}.\32xl\:list-decimal{list-style-type:decimal}.\32xl\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\32xl\:auto-cols-auto{grid-auto-columns:auto}.\32xl\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.\32xl\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.\32xl\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.\32xl\:grid-flow-row{grid-auto-flow:row}.\32xl\:grid-flow-col{grid-auto-flow:column}.\32xl\:grid-flow-row-dense{grid-auto-flow:row dense}.\32xl\:grid-flow-col-dense{grid-auto-flow:column dense}.\32xl\:auto-rows-auto{grid-auto-rows:auto}.\32xl\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.\32xl\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.\32xl\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.\32xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\32xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\32xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\32xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.\32xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.\32xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.\32xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.\32xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.\32xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.\32xl\:grid-cols-none{grid-template-columns:none}.\32xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.\32xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.\32xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.\32xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.\32xl\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.\32xl\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.\32xl\:grid-rows-none{grid-template-rows:none}.\32xl\:flex-row{flex-direction:row}.\32xl\:flex-row-reverse{flex-direction:row-reverse}.\32xl\:flex-col{flex-direction:column}.\32xl\:flex-col-reverse{flex-direction:column-reverse}.\32xl\:flex-wrap{flex-wrap:wrap}.\32xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}.\32xl\:flex-nowrap{flex-wrap:nowrap}.\32xl\:place-content-center{place-content:center}.\32xl\:place-content-start{place-content:start}.\32xl\:place-content-end{place-content:end}.\32xl\:place-content-between{place-content:space-between}.\32xl\:place-content-around{place-content:space-around}.\32xl\:place-content-evenly{place-content:space-evenly}.\32xl\:place-content-stretch{place-content:stretch}.\32xl\:place-items-start{place-items:start}.\32xl\:place-items-end{place-items:end}.\32xl\:place-items-center{place-items:center}.\32xl\:place-items-stretch{place-items:stretch}.\32xl\:content-center{align-content:center}.\32xl\:content-start{align-content:flex-start}.\32xl\:content-end{align-content:flex-end}.\32xl\:content-between{align-content:space-between}.\32xl\:content-around{align-content:space-around}.\32xl\:content-evenly{align-content:space-evenly}.\32xl\:items-start{align-items:flex-start}.\32xl\:items-end{align-items:flex-end}.\32xl\:items-center{align-items:center}.\32xl\:items-baseline{align-items:baseline}.\32xl\:items-stretch{align-items:stretch}.\32xl\:justify-start{justify-content:flex-start}.\32xl\:justify-end{justify-content:flex-end}.\32xl\:justify-center{justify-content:center}.\32xl\:justify-between{justify-content:space-between}.\32xl\:justify-around{justify-content:space-around}.\32xl\:justify-evenly{justify-content:space-evenly}.\32xl\:justify-items-start{justify-items:start}.\32xl\:justify-items-end{justify-items:end}.\32xl\:justify-items-center{justify-items:center}.\32xl\:justify-items-stretch{justify-items:stretch}.\32xl\:gap-0{gap:0}.\32xl\:gap-1{gap:.25rem}.\32xl\:gap-2{gap:.5rem}.\32xl\:gap-3{gap:.75rem}.\32xl\:gap-4{gap:1rem}.\32xl\:gap-5{gap:1.25rem}.\32xl\:gap-6{gap:1.5rem}.\32xl\:gap-7{gap:1.75rem}.\32xl\:gap-8{gap:2rem}.\32xl\:gap-9{gap:2.25rem}.\32xl\:gap-10{gap:2.5rem}.\32xl\:gap-11{gap:2.75rem}.\32xl\:gap-12{gap:3rem}.\32xl\:gap-14{gap:3.5rem}.\32xl\:gap-16{gap:4rem}.\32xl\:gap-20{gap:5rem}.\32xl\:gap-24{gap:6rem}.\32xl\:gap-28{gap:7rem}.\32xl\:gap-32{gap:8rem}.\32xl\:gap-36{gap:9rem}.\32xl\:gap-40{gap:10rem}.\32xl\:gap-44{gap:11rem}.\32xl\:gap-48{gap:12rem}.\32xl\:gap-52{gap:13rem}.\32xl\:gap-56{gap:14rem}.\32xl\:gap-60{gap:15rem}.\32xl\:gap-64{gap:16rem}.\32xl\:gap-72{gap:18rem}.\32xl\:gap-80{gap:20rem}.\32xl\:gap-96{gap:24rem}.\32xl\:gap-px{gap:1px}.\32xl\:gap-0\.5{gap:.125rem}.\32xl\:gap-1\.5{gap:.375rem}.\32xl\:gap-2\.5{gap:.625rem}.\32xl\:gap-3\.5{gap:.875rem}.\32xl\:gap-x-0{-moz-column-gap:0;column-gap:0}.\32xl\:gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.\32xl\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.\32xl\:gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.\32xl\:gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.\32xl\:gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.\32xl\:gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.\32xl\:gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.\32xl\:gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.\32xl\:gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.\32xl\:gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.\32xl\:gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.\32xl\:gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.\32xl\:gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.\32xl\:gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.\32xl\:gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.\32xl\:gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.\32xl\:gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.\32xl\:gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.\32xl\:gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.\32xl\:gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.\32xl\:gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.\32xl\:gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.\32xl\:gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.\32xl\:gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.\32xl\:gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.\32xl\:gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.\32xl\:gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.\32xl\:gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.\32xl\:gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.\32xl\:gap-x-px{-moz-column-gap:1px;column-gap:1px}.\32xl\:gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.\32xl\:gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.\32xl\:gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.\32xl\:gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.\32xl\:gap-y-0{row-gap:0}.\32xl\:gap-y-1{row-gap:.25rem}.\32xl\:gap-y-2{row-gap:.5rem}.\32xl\:gap-y-3{row-gap:.75rem}.\32xl\:gap-y-4{row-gap:1rem}.\32xl\:gap-y-5{row-gap:1.25rem}.\32xl\:gap-y-6{row-gap:1.5rem}.\32xl\:gap-y-7{row-gap:1.75rem}.\32xl\:gap-y-8{row-gap:2rem}.\32xl\:gap-y-9{row-gap:2.25rem}.\32xl\:gap-y-10{row-gap:2.5rem}.\32xl\:gap-y-11{row-gap:2.75rem}.\32xl\:gap-y-12{row-gap:3rem}.\32xl\:gap-y-14{row-gap:3.5rem}.\32xl\:gap-y-16{row-gap:4rem}.\32xl\:gap-y-20{row-gap:5rem}.\32xl\:gap-y-24{row-gap:6rem}.\32xl\:gap-y-28{row-gap:7rem}.\32xl\:gap-y-32{row-gap:8rem}.\32xl\:gap-y-36{row-gap:9rem}.\32xl\:gap-y-40{row-gap:10rem}.\32xl\:gap-y-44{row-gap:11rem}.\32xl\:gap-y-48{row-gap:12rem}.\32xl\:gap-y-52{row-gap:13rem}.\32xl\:gap-y-56{row-gap:14rem}.\32xl\:gap-y-60{row-gap:15rem}.\32xl\:gap-y-64{row-gap:16rem}.\32xl\:gap-y-72{row-gap:18rem}.\32xl\:gap-y-80{row-gap:20rem}.\32xl\:gap-y-96{row-gap:24rem}.\32xl\:gap-y-px{row-gap:1px}.\32xl\:gap-y-0\.5{row-gap:.125rem}.\32xl\:gap-y-1\.5{row-gap:.375rem}.\32xl\:gap-y-2\.5{row-gap:.625rem}.\32xl\:gap-y-3\.5{row-gap:.875rem}.\32xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1px*var(--tw-space-x-reverse));margin-left:calc(1px*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.25rem*var(--tw-space-x-reverse));margin-left:calc(-.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem*var(--tw-space-x-reverse));margin-left:calc(-.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.75rem*var(--tw-space-x-reverse));margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1rem*var(--tw-space-x-reverse));margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.25rem*var(--tw-space-x-reverse));margin-left:calc(-1.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.5rem*var(--tw-space-x-reverse));margin-left:calc(-1.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1.75rem*var(--tw-space-x-reverse));margin-left:calc(-1.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2rem*var(--tw-space-x-reverse));margin-left:calc(-2rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.25rem*var(--tw-space-x-reverse));margin-left:calc(-2.25rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.5rem*var(--tw-space-x-reverse));margin-left:calc(-2.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-2.75rem*var(--tw-space-x-reverse));margin-left:calc(-2.75rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3rem*var(--tw-space-x-reverse));margin-left:calc(-3rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-3.5rem*var(--tw-space-x-reverse));margin-left:calc(-3.5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-4rem*var(--tw-space-x-reverse));margin-left:calc(-4rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-5rem*var(--tw-space-x-reverse));margin-left:calc(-5rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-6rem*var(--tw-space-x-reverse));margin-left:calc(-6rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-7rem*var(--tw-space-x-reverse));margin-left:calc(-7rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-8rem*var(--tw-space-x-reverse));margin-left:calc(-8rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-9rem*var(--tw-space-x-reverse));margin-left:calc(-9rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-10rem*var(--tw-space-x-reverse));margin-left:calc(-10rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-11rem*var(--tw-space-x-reverse));margin-left:calc(-11rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-12rem*var(--tw-space-x-reverse));margin-left:calc(-12rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-13rem*var(--tw-space-x-reverse));margin-left:calc(-13rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-14rem*var(--tw-space-x-reverse));margin-left:calc(-14rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-15rem*var(--tw-space-x-reverse));margin-left:calc(-15rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-16rem*var(--tw-space-x-reverse));margin-left:calc(-16rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-18rem*var(--tw-space-x-reverse));margin-left:calc(-18rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-20rem*var(--tw-space-x-reverse));margin-left:calc(-20rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-24rem*var(--tw-space-x-reverse));margin-left:calc(-24rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.125rem*var(--tw-space-x-reverse));margin-left:calc(-.125rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.375rem*var(--tw-space-x-reverse));margin-left:calc(-.375rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.625rem*var(--tw-space-x-reverse));margin-left:calc(-.625rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:-space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.875rem*var(--tw-space-x-reverse));margin-left:calc(-.875rem*(1 - var(--tw-space-x-reverse)))}.\32xl\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.\32xl\:space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.\32xl\:space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.\32xl\:space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.\32xl\:space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.\32xl\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.\32xl\:space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.\32xl\:space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.\32xl\:space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.\32xl\:space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.\32xl\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.\32xl\:space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.\32xl\:space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.\32xl\:space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.\32xl\:space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.\32xl\:space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.\32xl\:space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.\32xl\:space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.\32xl\:space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.\32xl\:space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.\32xl\:space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.\32xl\:space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.\32xl\:space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.\32xl\:space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.\32xl\:space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.\32xl\:space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.\32xl\:space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px*var(--tw-space-y-reverse))}.\32xl\:space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.\32xl\:space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.\32xl\:space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.\32xl\:space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.\32xl\:-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.25rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.75rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.25rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1.75rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.25rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-2.75rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-3.5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-4rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-5rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-6rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-7rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-8rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-9rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-10rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-11rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-12rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-13rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-14rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-15rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-16rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-18rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-20rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-24rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-1px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-1px*var(--tw-space-y-reverse))}.\32xl\:-space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.125rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.375rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.625rem*var(--tw-space-y-reverse))}.\32xl\:-space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(-.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(-.875rem*var(--tw-space-y-reverse))}.\32xl\:space-y-reverse>:not([hidden])~:not([hidden]){--tw-space-y-reverse:1}.\32xl\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}.\32xl\:divide-x-0>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(0px*var(--tw-divide-x-reverse));border-left-width:calc(0px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x-4>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(4px*var(--tw-divide-x-reverse));border-left-width:calc(4px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x-8>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(8px*var(--tw-divide-x-reverse));border-left-width:calc(8px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.\32xl\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(0px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-2>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(2px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(2px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-4>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(4px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(4px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-8>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(8px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(8px*var(--tw-divide-y-reverse))}.\32xl\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.\32xl\:divide-y-reverse>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:1}.\32xl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.\32xl\:divide-solid>:not([hidden])~:not([hidden]){border-style:solid}.\32xl\:divide-dashed>:not([hidden])~:not([hidden]){border-style:dashed}.\32xl\:divide-dotted>:not([hidden])~:not([hidden]){border-style:dotted}.\32xl\:divide-double>:not([hidden])~:not([hidden]){border-style:double}.\32xl\:divide-none>:not([hidden])~:not([hidden]){border-style:none}.\32xl\:divide-transparent>:not([hidden])~:not([hidden]){border-color:transparent}.\32xl\:divide-current>:not([hidden])~:not([hidden]){border-color:currentColor}.\32xl\:divide-black>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(0,0,0,var(--tw-divide-opacity))}.\32xl\:divide-white>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,255,255,var(--tw-divide-opacity))}.\32xl\:divide-gray-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,250,251,var(--tw-divide-opacity))}.\32xl\:divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(243,244,246,var(--tw-divide-opacity))}.\32xl\:divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(229,231,235,var(--tw-divide-opacity))}.\32xl\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,213,219,var(--tw-divide-opacity))}.\32xl\:divide-gray-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(156,163,175,var(--tw-divide-opacity))}.\32xl\:divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(107,114,128,var(--tw-divide-opacity))}.\32xl\:divide-gray-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(75,85,99,var(--tw-divide-opacity))}.\32xl\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,65,81,var(--tw-divide-opacity))}.\32xl\:divide-gray-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(31,41,55,var(--tw-divide-opacity))}.\32xl\:divide-gray-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(17,24,39,var(--tw-divide-opacity))}.\32xl\:divide-red-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,242,242,var(--tw-divide-opacity))}.\32xl\:divide-red-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,226,226,var(--tw-divide-opacity))}.\32xl\:divide-red-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,202,202,var(--tw-divide-opacity))}.\32xl\:divide-red-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,165,165,var(--tw-divide-opacity))}.\32xl\:divide-red-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(248,113,113,var(--tw-divide-opacity))}.\32xl\:divide-red-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,68,68,var(--tw-divide-opacity))}.\32xl\:divide-red-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(220,38,38,var(--tw-divide-opacity))}.\32xl\:divide-red-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(185,28,28,var(--tw-divide-opacity))}.\32xl\:divide-red-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(153,27,27,var(--tw-divide-opacity))}.\32xl\:divide-red-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(127,29,29,var(--tw-divide-opacity))}.\32xl\:divide-yellow-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(255,251,235,var(--tw-divide-opacity))}.\32xl\:divide-yellow-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(254,243,199,var(--tw-divide-opacity))}.\32xl\:divide-yellow-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,230,138,var(--tw-divide-opacity))}.\32xl\:divide-yellow-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,211,77,var(--tw-divide-opacity))}.\32xl\:divide-yellow-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,191,36,var(--tw-divide-opacity))}.\32xl\:divide-yellow-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,158,11,var(--tw-divide-opacity))}.\32xl\:divide-yellow-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(217,119,6,var(--tw-divide-opacity))}.\32xl\:divide-yellow-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(180,83,9,var(--tw-divide-opacity))}.\32xl\:divide-yellow-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(146,64,14,var(--tw-divide-opacity))}.\32xl\:divide-yellow-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(120,53,15,var(--tw-divide-opacity))}.\32xl\:divide-green-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,253,245,var(--tw-divide-opacity))}.\32xl\:divide-green-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(209,250,229,var(--tw-divide-opacity))}.\32xl\:divide-green-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,243,208,var(--tw-divide-opacity))}.\32xl\:divide-green-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(110,231,183,var(--tw-divide-opacity))}.\32xl\:divide-green-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(52,211,153,var(--tw-divide-opacity))}.\32xl\:divide-green-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(16,185,129,var(--tw-divide-opacity))}.\32xl\:divide-green-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(5,150,105,var(--tw-divide-opacity))}.\32xl\:divide-green-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(4,120,87,var(--tw-divide-opacity))}.\32xl\:divide-green-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,95,70,var(--tw-divide-opacity))}.\32xl\:divide-green-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(6,78,59,var(--tw-divide-opacity))}.\32xl\:divide-blue-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(239,246,255,var(--tw-divide-opacity))}.\32xl\:divide-blue-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,234,254,var(--tw-divide-opacity))}.\32xl\:divide-blue-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(191,219,254,var(--tw-divide-opacity))}.\32xl\:divide-blue-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(147,197,253,var(--tw-divide-opacity))}.\32xl\:divide-blue-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(96,165,250,var(--tw-divide-opacity))}.\32xl\:divide-blue-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(59,130,246,var(--tw-divide-opacity))}.\32xl\:divide-blue-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(37,99,235,var(--tw-divide-opacity))}.\32xl\:divide-blue-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(29,78,216,var(--tw-divide-opacity))}.\32xl\:divide-blue-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,64,175,var(--tw-divide-opacity))}.\32xl\:divide-blue-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(30,58,138,var(--tw-divide-opacity))}.\32xl\:divide-indigo-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(238,242,255,var(--tw-divide-opacity))}.\32xl\:divide-indigo-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(224,231,255,var(--tw-divide-opacity))}.\32xl\:divide-indigo-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(199,210,254,var(--tw-divide-opacity))}.\32xl\:divide-indigo-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(165,180,252,var(--tw-divide-opacity))}.\32xl\:divide-indigo-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(129,140,248,var(--tw-divide-opacity))}.\32xl\:divide-indigo-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(99,102,241,var(--tw-divide-opacity))}.\32xl\:divide-indigo-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(79,70,229,var(--tw-divide-opacity))}.\32xl\:divide-indigo-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(67,56,202,var(--tw-divide-opacity))}.\32xl\:divide-indigo-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(55,48,163,var(--tw-divide-opacity))}.\32xl\:divide-indigo-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(49,46,129,var(--tw-divide-opacity))}.\32xl\:divide-purple-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(245,243,255,var(--tw-divide-opacity))}.\32xl\:divide-purple-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(237,233,254,var(--tw-divide-opacity))}.\32xl\:divide-purple-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(221,214,254,var(--tw-divide-opacity))}.\32xl\:divide-purple-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(196,181,253,var(--tw-divide-opacity))}.\32xl\:divide-purple-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(167,139,250,var(--tw-divide-opacity))}.\32xl\:divide-purple-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(139,92,246,var(--tw-divide-opacity))}.\32xl\:divide-purple-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(124,58,237,var(--tw-divide-opacity))}.\32xl\:divide-purple-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(109,40,217,var(--tw-divide-opacity))}.\32xl\:divide-purple-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(91,33,182,var(--tw-divide-opacity))}.\32xl\:divide-purple-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(76,29,149,var(--tw-divide-opacity))}.\32xl\:divide-pink-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(253,242,248,var(--tw-divide-opacity))}.\32xl\:divide-pink-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(252,231,243,var(--tw-divide-opacity))}.\32xl\:divide-pink-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(251,207,232,var(--tw-divide-opacity))}.\32xl\:divide-pink-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(249,168,212,var(--tw-divide-opacity))}.\32xl\:divide-pink-400>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(244,114,182,var(--tw-divide-opacity))}.\32xl\:divide-pink-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(236,72,153,var(--tw-divide-opacity))}.\32xl\:divide-pink-600>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(219,39,119,var(--tw-divide-opacity))}.\32xl\:divide-pink-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(190,24,93,var(--tw-divide-opacity))}.\32xl\:divide-pink-800>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(157,23,77,var(--tw-divide-opacity))}.\32xl\:divide-pink-900>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(131,24,67,var(--tw-divide-opacity))}.\32xl\:divide-opacity-0>:not([hidden])~:not([hidden]){--tw-divide-opacity:0}.\32xl\:divide-opacity-5>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.05}.\32xl\:divide-opacity-10>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.1}.\32xl\:divide-opacity-20>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.2}.\32xl\:divide-opacity-25>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.25}.\32xl\:divide-opacity-30>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.3}.\32xl\:divide-opacity-40>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.4}.\32xl\:divide-opacity-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.5}.\32xl\:divide-opacity-60>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.6}.\32xl\:divide-opacity-70>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.7}.\32xl\:divide-opacity-75>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.75}.\32xl\:divide-opacity-80>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.8}.\32xl\:divide-opacity-90>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.9}.\32xl\:divide-opacity-95>:not([hidden])~:not([hidden]){--tw-divide-opacity:0.95}.\32xl\:divide-opacity-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1}.\32xl\:place-self-auto{place-self:auto}.\32xl\:place-self-start{place-self:start}.\32xl\:place-self-end{place-self:end}.\32xl\:place-self-center{place-self:center}.\32xl\:place-self-stretch{place-self:stretch}.\32xl\:self-auto{align-self:auto}.\32xl\:self-start{align-self:flex-start}.\32xl\:self-end{align-self:flex-end}.\32xl\:self-center{align-self:center}.\32xl\:self-stretch{align-self:stretch}.\32xl\:self-baseline{align-self:baseline}.\32xl\:justify-self-auto{justify-self:auto}.\32xl\:justify-self-start{justify-self:start}.\32xl\:justify-self-end{justify-self:end}.\32xl\:justify-self-center{justify-self:center}.\32xl\:justify-self-stretch{justify-self:stretch}.\32xl\:overflow-auto{overflow:auto}.\32xl\:overflow-hidden{overflow:hidden}.\32xl\:overflow-visible{overflow:visible}.\32xl\:overflow-scroll{overflow:scroll}.\32xl\:overflow-x-auto{overflow-x:auto}.\32xl\:overflow-y-auto{overflow-y:auto}.\32xl\:overflow-x-hidden{overflow-x:hidden}.\32xl\:overflow-y-hidden{overflow-y:hidden}.\32xl\:overflow-x-visible{overflow-x:visible}.\32xl\:overflow-y-visible{overflow-y:visible}.\32xl\:overflow-x-scroll{overflow-x:scroll}.\32xl\:overflow-y-scroll{overflow-y:scroll}.\32xl\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.\32xl\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.\32xl\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.\32xl\:overscroll-y-auto{overscroll-behavior-y:auto}.\32xl\:overscroll-y-contain{overscroll-behavior-y:contain}.\32xl\:overscroll-y-none{overscroll-behavior-y:none}.\32xl\:overscroll-x-auto{overscroll-behavior-x:auto}.\32xl\:overscroll-x-contain{overscroll-behavior-x:contain}.\32xl\:overscroll-x-none{overscroll-behavior-x:none}.\32xl\:truncate{overflow:hidden;white-space:nowrap}.\32xl\:overflow-ellipsis,.\32xl\:truncate{text-overflow:ellipsis}.\32xl\:overflow-clip{text-overflow:clip}.\32xl\:whitespace-normal{white-space:normal}.\32xl\:whitespace-nowrap{white-space:nowrap}.\32xl\:whitespace-pre{white-space:pre}.\32xl\:whitespace-pre-line{white-space:pre-line}.\32xl\:whitespace-pre-wrap{white-space:pre-wrap}.\32xl\:break-normal{overflow-wrap:normal;word-break:normal}.\32xl\:break-words{overflow-wrap:break-word}.\32xl\:break-all{word-break:break-all}.\32xl\:rounded-none{border-radius:0}.\32xl\:rounded-sm{border-radius:.125rem}.\32xl\:rounded{border-radius:.25rem}.\32xl\:rounded-md{border-radius:.375rem}.\32xl\:rounded-lg{border-radius:.5rem}.\32xl\:rounded-xl{border-radius:.75rem}.\32xl\:rounded-2xl{border-radius:1rem}.\32xl\:rounded-3xl{border-radius:1.5rem}.\32xl\:rounded-full{border-radius:9999px}.\32xl\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.\32xl\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.\32xl\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.\32xl\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.\32xl\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.\32xl\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.\32xl\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.\32xl\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.\32xl\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.\32xl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.\32xl\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.\32xl\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.\32xl\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.\32xl\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.\32xl\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.\32xl\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.\32xl\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.\32xl\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.\32xl\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.\32xl\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.\32xl\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.\32xl\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.\32xl\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.\32xl\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.\32xl\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.\32xl\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.\32xl\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.\32xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.\32xl\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.\32xl\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.\32xl\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.\32xl\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.\32xl\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.\32xl\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.\32xl\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.\32xl\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.\32xl\:rounded-tl-none{border-top-left-radius:0}.\32xl\:rounded-tl-sm{border-top-left-radius:.125rem}.\32xl\:rounded-tl{border-top-left-radius:.25rem}.\32xl\:rounded-tl-md{border-top-left-radius:.375rem}.\32xl\:rounded-tl-lg{border-top-left-radius:.5rem}.\32xl\:rounded-tl-xl{border-top-left-radius:.75rem}.\32xl\:rounded-tl-2xl{border-top-left-radius:1rem}.\32xl\:rounded-tl-3xl{border-top-left-radius:1.5rem}.\32xl\:rounded-tl-full{border-top-left-radius:9999px}.\32xl\:rounded-tr-none{border-top-right-radius:0}.\32xl\:rounded-tr-sm{border-top-right-radius:.125rem}.\32xl\:rounded-tr{border-top-right-radius:.25rem}.\32xl\:rounded-tr-md{border-top-right-radius:.375rem}.\32xl\:rounded-tr-lg{border-top-right-radius:.5rem}.\32xl\:rounded-tr-xl{border-top-right-radius:.75rem}.\32xl\:rounded-tr-2xl{border-top-right-radius:1rem}.\32xl\:rounded-tr-3xl{border-top-right-radius:1.5rem}.\32xl\:rounded-tr-full{border-top-right-radius:9999px}.\32xl\:rounded-br-none{border-bottom-right-radius:0}.\32xl\:rounded-br-sm{border-bottom-right-radius:.125rem}.\32xl\:rounded-br{border-bottom-right-radius:.25rem}.\32xl\:rounded-br-md{border-bottom-right-radius:.375rem}.\32xl\:rounded-br-lg{border-bottom-right-radius:.5rem}.\32xl\:rounded-br-xl{border-bottom-right-radius:.75rem}.\32xl\:rounded-br-2xl{border-bottom-right-radius:1rem}.\32xl\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.\32xl\:rounded-br-full{border-bottom-right-radius:9999px}.\32xl\:rounded-bl-none{border-bottom-left-radius:0}.\32xl\:rounded-bl-sm{border-bottom-left-radius:.125rem}.\32xl\:rounded-bl{border-bottom-left-radius:.25rem}.\32xl\:rounded-bl-md{border-bottom-left-radius:.375rem}.\32xl\:rounded-bl-lg{border-bottom-left-radius:.5rem}.\32xl\:rounded-bl-xl{border-bottom-left-radius:.75rem}.\32xl\:rounded-bl-2xl{border-bottom-left-radius:1rem}.\32xl\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.\32xl\:rounded-bl-full{border-bottom-left-radius:9999px}.\32xl\:border-0{border-width:0}.\32xl\:border-2{border-width:2px}.\32xl\:border-4{border-width:4px}.\32xl\:border-8{border-width:8px}.\32xl\:border{border-width:1px}.\32xl\:border-t-0{border-top-width:0}.\32xl\:border-t-2{border-top-width:2px}.\32xl\:border-t-4{border-top-width:4px}.\32xl\:border-t-8{border-top-width:8px}.\32xl\:border-t{border-top-width:1px}.\32xl\:border-r-0{border-right-width:0}.\32xl\:border-r-2{border-right-width:2px}.\32xl\:border-r-4{border-right-width:4px}.\32xl\:border-r-8{border-right-width:8px}.\32xl\:border-r{border-right-width:1px}.\32xl\:border-b-0{border-bottom-width:0}.\32xl\:border-b-2{border-bottom-width:2px}.\32xl\:border-b-4{border-bottom-width:4px}.\32xl\:border-b-8{border-bottom-width:8px}.\32xl\:border-b{border-bottom-width:1px}.\32xl\:border-l-0{border-left-width:0}.\32xl\:border-l-2{border-left-width:2px}.\32xl\:border-l-4{border-left-width:4px}.\32xl\:border-l-8{border-left-width:8px}.\32xl\:border-l{border-left-width:1px}.\32xl\:border-solid{border-style:solid}.\32xl\:border-dashed{border-style:dashed}.\32xl\:border-dotted{border-style:dotted}.\32xl\:border-double{border-style:double}.\32xl\:border-none{border-style:none}.\32xl\:border-transparent{border-color:transparent}.\32xl\:border-current{border-color:currentColor}.\32xl\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-transparent{border-color:transparent}.group:hover .\32xl\:group-hover\:border-current{border-color:currentColor}.group:hover .\32xl\:group-hover\:border-black{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-white{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-50{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-100{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-200{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-300{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-400{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-500{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-600{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-700{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-800{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-gray-900{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-50{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-100{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-300{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-400{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-500{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-600{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-700{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-800{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-red-900{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-50{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-100{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-200{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-300{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-400{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-500{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-600{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-700{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-800{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-yellow-900{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-50{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-100{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-200{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-300{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-400{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-500{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-600{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-700{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-800{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-green-900{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-50{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-100{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-200{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-300{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-400{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-500{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-600{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-700{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-800{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-blue-900{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-50{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-100{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-200{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-300{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-400{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-500{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-600{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-700{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-800{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-indigo-900{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-50{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-100{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-200{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-300{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-400{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-500{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-600{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-700{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-800{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-purple-900{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-50{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-100{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-200{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-300{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-400{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-500{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-600{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-700{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-800{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.group:hover .\32xl\:group-hover\:border-pink-900{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:focus-within\:border-transparent:focus-within{border-color:transparent}.\32xl\:focus-within\:border-current:focus-within{border-color:currentColor}.\32xl\:focus-within\:border-black:focus-within{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:focus-within\:border-white:focus-within{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-50:focus-within{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-100:focus-within{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-200:focus-within{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-300:focus-within{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-400:focus-within{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-500:focus-within{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-600:focus-within{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-700:focus-within{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-800:focus-within{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:focus-within\:border-gray-900:focus-within{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-50:focus-within{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-200:focus-within{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-400:focus-within{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-500:focus-within{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-600:focus-within{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-700:focus-within{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-800:focus-within{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:focus-within\:border-red-900:focus-within{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-50:focus-within{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-100:focus-within{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-200:focus-within{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-300:focus-within{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-400:focus-within{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-500:focus-within{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-600:focus-within{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-700:focus-within{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-800:focus-within{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:focus-within\:border-yellow-900:focus-within{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-50:focus-within{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-100:focus-within{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-200:focus-within{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-300:focus-within{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-400:focus-within{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-500:focus-within{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-600:focus-within{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-700:focus-within{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-800:focus-within{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:focus-within\:border-green-900:focus-within{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-50:focus-within{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-100:focus-within{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-200:focus-within{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-300:focus-within{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-400:focus-within{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-500:focus-within{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-600:focus-within{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-700:focus-within{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-800:focus-within{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:focus-within\:border-blue-900:focus-within{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-50:focus-within{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-100:focus-within{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-200:focus-within{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-300:focus-within{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-400:focus-within{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-500:focus-within{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-600:focus-within{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-700:focus-within{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-800:focus-within{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:focus-within\:border-indigo-900:focus-within{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-50:focus-within{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-100:focus-within{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-200:focus-within{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-300:focus-within{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-400:focus-within{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-500:focus-within{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-600:focus-within{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-700:focus-within{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-800:focus-within{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:focus-within\:border-purple-900:focus-within{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-50:focus-within{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-100:focus-within{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-200:focus-within{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-300:focus-within{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-400:focus-within{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-500:focus-within{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-600:focus-within{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-700:focus-within{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-800:focus-within{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:focus-within\:border-pink-900:focus-within{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:hover\:border-transparent:hover{border-color:transparent}.\32xl\:hover\:border-current:hover{border-color:currentColor}.\32xl\:hover\:border-black:hover{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:hover\:border-white:hover{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-50:hover{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-100:hover{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-400:hover{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-700:hover{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-800:hover{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:hover\:border-gray-900:hover{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:hover\:border-red-50:hover{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:hover\:border-red-100:hover{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:hover\:border-red-200:hover{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:hover\:border-red-300:hover{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:hover\:border-red-400:hover{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:hover\:border-red-500:hover{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:hover\:border-red-600:hover{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:hover\:border-red-700:hover{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:hover\:border-red-800:hover{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:hover\:border-red-900:hover{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-50:hover{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-100:hover{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-200:hover{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-300:hover{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-400:hover{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-500:hover{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-600:hover{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-700:hover{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-800:hover{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:hover\:border-yellow-900:hover{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:hover\:border-green-50:hover{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:hover\:border-green-100:hover{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:hover\:border-green-200:hover{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:hover\:border-green-300:hover{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:hover\:border-green-400:hover{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:hover\:border-green-500:hover{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:hover\:border-green-600:hover{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:hover\:border-green-700:hover{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:hover\:border-green-800:hover{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:hover\:border-green-900:hover{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-50:hover{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-100:hover{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-200:hover{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-300:hover{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-400:hover{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-500:hover{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-600:hover{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-700:hover{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-800:hover{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:hover\:border-blue-900:hover{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-50:hover{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-100:hover{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-200:hover{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-300:hover{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-400:hover{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-500:hover{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-600:hover{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-700:hover{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-800:hover{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:hover\:border-indigo-900:hover{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-50:hover{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-100:hover{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-200:hover{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-300:hover{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-400:hover{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-500:hover{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-600:hover{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-700:hover{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-800:hover{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:hover\:border-purple-900:hover{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-50:hover{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-100:hover{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-200:hover{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-300:hover{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-400:hover{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-500:hover{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-600:hover{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-700:hover{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-800:hover{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:hover\:border-pink-900:hover{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:focus\:border-transparent:focus{border-color:transparent}.\32xl\:focus\:border-current:focus{border-color:currentColor}.\32xl\:focus\:border-black:focus{--tw-border-opacity:1;border-color:rgba(0,0,0,var(--tw-border-opacity))}.\32xl\:focus\:border-white:focus{--tw-border-opacity:1;border-color:rgba(255,255,255,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-50:focus{--tw-border-opacity:1;border-color:rgba(249,250,251,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-100:focus{--tw-border-opacity:1;border-color:rgba(243,244,246,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-300:focus{--tw-border-opacity:1;border-color:rgba(209,213,219,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-400:focus{--tw-border-opacity:1;border-color:rgba(156,163,175,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-500:focus{--tw-border-opacity:1;border-color:rgba(107,114,128,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-600:focus{--tw-border-opacity:1;border-color:rgba(75,85,99,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-700:focus{--tw-border-opacity:1;border-color:rgba(55,65,81,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-800:focus{--tw-border-opacity:1;border-color:rgba(31,41,55,var(--tw-border-opacity))}.\32xl\:focus\:border-gray-900:focus{--tw-border-opacity:1;border-color:rgba(17,24,39,var(--tw-border-opacity))}.\32xl\:focus\:border-red-50:focus{--tw-border-opacity:1;border-color:rgba(254,242,242,var(--tw-border-opacity))}.\32xl\:focus\:border-red-100:focus{--tw-border-opacity:1;border-color:rgba(254,226,226,var(--tw-border-opacity))}.\32xl\:focus\:border-red-200:focus{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity))}.\32xl\:focus\:border-red-300:focus{--tw-border-opacity:1;border-color:rgba(252,165,165,var(--tw-border-opacity))}.\32xl\:focus\:border-red-400:focus{--tw-border-opacity:1;border-color:rgba(248,113,113,var(--tw-border-opacity))}.\32xl\:focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgba(239,68,68,var(--tw-border-opacity))}.\32xl\:focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgba(220,38,38,var(--tw-border-opacity))}.\32xl\:focus\:border-red-700:focus{--tw-border-opacity:1;border-color:rgba(185,28,28,var(--tw-border-opacity))}.\32xl\:focus\:border-red-800:focus{--tw-border-opacity:1;border-color:rgba(153,27,27,var(--tw-border-opacity))}.\32xl\:focus\:border-red-900:focus{--tw-border-opacity:1;border-color:rgba(127,29,29,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-50:focus{--tw-border-opacity:1;border-color:rgba(255,251,235,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-100:focus{--tw-border-opacity:1;border-color:rgba(254,243,199,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-200:focus{--tw-border-opacity:1;border-color:rgba(253,230,138,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-300:focus{--tw-border-opacity:1;border-color:rgba(252,211,77,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-400:focus{--tw-border-opacity:1;border-color:rgba(251,191,36,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-500:focus{--tw-border-opacity:1;border-color:rgba(245,158,11,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-600:focus{--tw-border-opacity:1;border-color:rgba(217,119,6,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-700:focus{--tw-border-opacity:1;border-color:rgba(180,83,9,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-800:focus{--tw-border-opacity:1;border-color:rgba(146,64,14,var(--tw-border-opacity))}.\32xl\:focus\:border-yellow-900:focus{--tw-border-opacity:1;border-color:rgba(120,53,15,var(--tw-border-opacity))}.\32xl\:focus\:border-green-50:focus{--tw-border-opacity:1;border-color:rgba(236,253,245,var(--tw-border-opacity))}.\32xl\:focus\:border-green-100:focus{--tw-border-opacity:1;border-color:rgba(209,250,229,var(--tw-border-opacity))}.\32xl\:focus\:border-green-200:focus{--tw-border-opacity:1;border-color:rgba(167,243,208,var(--tw-border-opacity))}.\32xl\:focus\:border-green-300:focus{--tw-border-opacity:1;border-color:rgba(110,231,183,var(--tw-border-opacity))}.\32xl\:focus\:border-green-400:focus{--tw-border-opacity:1;border-color:rgba(52,211,153,var(--tw-border-opacity))}.\32xl\:focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgba(16,185,129,var(--tw-border-opacity))}.\32xl\:focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgba(5,150,105,var(--tw-border-opacity))}.\32xl\:focus\:border-green-700:focus{--tw-border-opacity:1;border-color:rgba(4,120,87,var(--tw-border-opacity))}.\32xl\:focus\:border-green-800:focus{--tw-border-opacity:1;border-color:rgba(6,95,70,var(--tw-border-opacity))}.\32xl\:focus\:border-green-900:focus{--tw-border-opacity:1;border-color:rgba(6,78,59,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-50:focus{--tw-border-opacity:1;border-color:rgba(239,246,255,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-100:focus{--tw-border-opacity:1;border-color:rgba(219,234,254,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-200:focus{--tw-border-opacity:1;border-color:rgba(191,219,254,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-400:focus{--tw-border-opacity:1;border-color:rgba(96,165,250,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgba(59,130,246,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgba(37,99,235,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgba(29,78,216,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-800:focus{--tw-border-opacity:1;border-color:rgba(30,64,175,var(--tw-border-opacity))}.\32xl\:focus\:border-blue-900:focus{--tw-border-opacity:1;border-color:rgba(30,58,138,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-50:focus{--tw-border-opacity:1;border-color:rgba(238,242,255,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-100:focus{--tw-border-opacity:1;border-color:rgba(224,231,255,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-200:focus{--tw-border-opacity:1;border-color:rgba(199,210,254,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-300:focus{--tw-border-opacity:1;border-color:rgba(165,180,252,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-400:focus{--tw-border-opacity:1;border-color:rgba(129,140,248,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-500:focus{--tw-border-opacity:1;border-color:rgba(99,102,241,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-600:focus{--tw-border-opacity:1;border-color:rgba(79,70,229,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-700:focus{--tw-border-opacity:1;border-color:rgba(67,56,202,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-800:focus{--tw-border-opacity:1;border-color:rgba(55,48,163,var(--tw-border-opacity))}.\32xl\:focus\:border-indigo-900:focus{--tw-border-opacity:1;border-color:rgba(49,46,129,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-50:focus{--tw-border-opacity:1;border-color:rgba(245,243,255,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-100:focus{--tw-border-opacity:1;border-color:rgba(237,233,254,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-200:focus{--tw-border-opacity:1;border-color:rgba(221,214,254,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-300:focus{--tw-border-opacity:1;border-color:rgba(196,181,253,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-400:focus{--tw-border-opacity:1;border-color:rgba(167,139,250,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-500:focus{--tw-border-opacity:1;border-color:rgba(139,92,246,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-600:focus{--tw-border-opacity:1;border-color:rgba(124,58,237,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-700:focus{--tw-border-opacity:1;border-color:rgba(109,40,217,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-800:focus{--tw-border-opacity:1;border-color:rgba(91,33,182,var(--tw-border-opacity))}.\32xl\:focus\:border-purple-900:focus{--tw-border-opacity:1;border-color:rgba(76,29,149,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-50:focus{--tw-border-opacity:1;border-color:rgba(253,242,248,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-100:focus{--tw-border-opacity:1;border-color:rgba(252,231,243,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-200:focus{--tw-border-opacity:1;border-color:rgba(251,207,232,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-300:focus{--tw-border-opacity:1;border-color:rgba(249,168,212,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-400:focus{--tw-border-opacity:1;border-color:rgba(244,114,182,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-500:focus{--tw-border-opacity:1;border-color:rgba(236,72,153,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-600:focus{--tw-border-opacity:1;border-color:rgba(219,39,119,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-700:focus{--tw-border-opacity:1;border-color:rgba(190,24,93,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-800:focus{--tw-border-opacity:1;border-color:rgba(157,23,77,var(--tw-border-opacity))}.\32xl\:focus\:border-pink-900:focus{--tw-border-opacity:1;border-color:rgba(131,24,67,var(--tw-border-opacity))}.\32xl\:border-opacity-0{--tw-border-opacity:0}.\32xl\:border-opacity-5{--tw-border-opacity:0.05}.\32xl\:border-opacity-10{--tw-border-opacity:0.1}.\32xl\:border-opacity-20{--tw-border-opacity:0.2}.\32xl\:border-opacity-25{--tw-border-opacity:0.25}.\32xl\:border-opacity-30{--tw-border-opacity:0.3}.\32xl\:border-opacity-40{--tw-border-opacity:0.4}.\32xl\:border-opacity-50{--tw-border-opacity:0.5}.\32xl\:border-opacity-60{--tw-border-opacity:0.6}.\32xl\:border-opacity-70{--tw-border-opacity:0.7}.\32xl\:border-opacity-75{--tw-border-opacity:0.75}.\32xl\:border-opacity-80{--tw-border-opacity:0.8}.\32xl\:border-opacity-90{--tw-border-opacity:0.9}.\32xl\:border-opacity-95{--tw-border-opacity:0.95}.\32xl\:border-opacity-100{--tw-border-opacity:1}.group:hover .\32xl\:group-hover\:border-opacity-0{--tw-border-opacity:0}.group:hover .\32xl\:group-hover\:border-opacity-5{--tw-border-opacity:0.05}.group:hover .\32xl\:group-hover\:border-opacity-10{--tw-border-opacity:0.1}.group:hover .\32xl\:group-hover\:border-opacity-20{--tw-border-opacity:0.2}.group:hover .\32xl\:group-hover\:border-opacity-25{--tw-border-opacity:0.25}.group:hover .\32xl\:group-hover\:border-opacity-30{--tw-border-opacity:0.3}.group:hover .\32xl\:group-hover\:border-opacity-40{--tw-border-opacity:0.4}.group:hover .\32xl\:group-hover\:border-opacity-50{--tw-border-opacity:0.5}.group:hover .\32xl\:group-hover\:border-opacity-60{--tw-border-opacity:0.6}.group:hover .\32xl\:group-hover\:border-opacity-70{--tw-border-opacity:0.7}.group:hover .\32xl\:group-hover\:border-opacity-75{--tw-border-opacity:0.75}.group:hover .\32xl\:group-hover\:border-opacity-80{--tw-border-opacity:0.8}.group:hover .\32xl\:group-hover\:border-opacity-90{--tw-border-opacity:0.9}.group:hover .\32xl\:group-hover\:border-opacity-95{--tw-border-opacity:0.95}.group:hover .\32xl\:group-hover\:border-opacity-100{--tw-border-opacity:1}.\32xl\:focus-within\:border-opacity-0:focus-within{--tw-border-opacity:0}.\32xl\:focus-within\:border-opacity-5:focus-within{--tw-border-opacity:0.05}.\32xl\:focus-within\:border-opacity-10:focus-within{--tw-border-opacity:0.1}.\32xl\:focus-within\:border-opacity-20:focus-within{--tw-border-opacity:0.2}.\32xl\:focus-within\:border-opacity-25:focus-within{--tw-border-opacity:0.25}.\32xl\:focus-within\:border-opacity-30:focus-within{--tw-border-opacity:0.3}.\32xl\:focus-within\:border-opacity-40:focus-within{--tw-border-opacity:0.4}.\32xl\:focus-within\:border-opacity-50:focus-within{--tw-border-opacity:0.5}.\32xl\:focus-within\:border-opacity-60:focus-within{--tw-border-opacity:0.6}.\32xl\:focus-within\:border-opacity-70:focus-within{--tw-border-opacity:0.7}.\32xl\:focus-within\:border-opacity-75:focus-within{--tw-border-opacity:0.75}.\32xl\:focus-within\:border-opacity-80:focus-within{--tw-border-opacity:0.8}.\32xl\:focus-within\:border-opacity-90:focus-within{--tw-border-opacity:0.9}.\32xl\:focus-within\:border-opacity-95:focus-within{--tw-border-opacity:0.95}.\32xl\:focus-within\:border-opacity-100:focus-within{--tw-border-opacity:1}.\32xl\:hover\:border-opacity-0:hover{--tw-border-opacity:0}.\32xl\:hover\:border-opacity-5:hover{--tw-border-opacity:0.05}.\32xl\:hover\:border-opacity-10:hover{--tw-border-opacity:0.1}.\32xl\:hover\:border-opacity-20:hover{--tw-border-opacity:0.2}.\32xl\:hover\:border-opacity-25:hover{--tw-border-opacity:0.25}.\32xl\:hover\:border-opacity-30:hover{--tw-border-opacity:0.3}.\32xl\:hover\:border-opacity-40:hover{--tw-border-opacity:0.4}.\32xl\:hover\:border-opacity-50:hover{--tw-border-opacity:0.5}.\32xl\:hover\:border-opacity-60:hover{--tw-border-opacity:0.6}.\32xl\:hover\:border-opacity-70:hover{--tw-border-opacity:0.7}.\32xl\:hover\:border-opacity-75:hover{--tw-border-opacity:0.75}.\32xl\:hover\:border-opacity-80:hover{--tw-border-opacity:0.8}.\32xl\:hover\:border-opacity-90:hover{--tw-border-opacity:0.9}.\32xl\:hover\:border-opacity-95:hover{--tw-border-opacity:0.95}.\32xl\:hover\:border-opacity-100:hover{--tw-border-opacity:1}.\32xl\:focus\:border-opacity-0:focus{--tw-border-opacity:0}.\32xl\:focus\:border-opacity-5:focus{--tw-border-opacity:0.05}.\32xl\:focus\:border-opacity-10:focus{--tw-border-opacity:0.1}.\32xl\:focus\:border-opacity-20:focus{--tw-border-opacity:0.2}.\32xl\:focus\:border-opacity-25:focus{--tw-border-opacity:0.25}.\32xl\:focus\:border-opacity-30:focus{--tw-border-opacity:0.3}.\32xl\:focus\:border-opacity-40:focus{--tw-border-opacity:0.4}.\32xl\:focus\:border-opacity-50:focus{--tw-border-opacity:0.5}.\32xl\:focus\:border-opacity-60:focus{--tw-border-opacity:0.6}.\32xl\:focus\:border-opacity-70:focus{--tw-border-opacity:0.7}.\32xl\:focus\:border-opacity-75:focus{--tw-border-opacity:0.75}.\32xl\:focus\:border-opacity-80:focus{--tw-border-opacity:0.8}.\32xl\:focus\:border-opacity-90:focus{--tw-border-opacity:0.9}.\32xl\:focus\:border-opacity-95:focus{--tw-border-opacity:0.95}.\32xl\:focus\:border-opacity-100:focus{--tw-border-opacity:1}.\32xl\:bg-transparent{background-color:initial}.\32xl\:bg-current{background-color:currentColor}.\32xl\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-transparent{background-color:initial}.group:hover .\32xl\:group-hover\:bg-current{background-color:currentColor}.group:hover .\32xl\:group-hover\:bg-black{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-50{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-100{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-200{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-300{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-400{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-500{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-600{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-700{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-gray-900{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-100{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-200{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-300{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-400{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-500{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-600{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-700{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-800{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-red-900{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-100{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-200{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-300{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-500{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-700{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-800{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-yellow-900{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-50{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-100{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-200{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-300{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-400{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-500{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-600{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-700{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-800{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-green-900{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-50{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-100{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-200{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-300{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-400{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-500{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-600{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-700{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-800{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-blue-900{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-50{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-100{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-200{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-300{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-400{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-500{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-600{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-700{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-800{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-indigo-900{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-50{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-100{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-200{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-300{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-400{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-500{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-600{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-700{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-800{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-purple-900{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-50{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-100{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-200{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-300{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-400{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-500{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-600{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-700{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-800{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.group:hover .\32xl\:group-hover\:bg-pink-900{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-transparent:focus-within{background-color:initial}.\32xl\:focus-within\:bg-current:focus-within{background-color:currentColor}.\32xl\:focus-within\:bg-black:focus-within{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-white:focus-within{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-50:focus-within{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-100:focus-within{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-200:focus-within{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-300:focus-within{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-400:focus-within{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-500:focus-within{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-600:focus-within{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-700:focus-within{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-800:focus-within{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-gray-900:focus-within{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-50:focus-within{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-200:focus-within{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-400:focus-within{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-500:focus-within{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-600:focus-within{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-700:focus-within{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-800:focus-within{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-red-900:focus-within{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-50:focus-within{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-100:focus-within{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-200:focus-within{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-300:focus-within{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-400:focus-within{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-500:focus-within{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-600:focus-within{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-700:focus-within{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-800:focus-within{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-yellow-900:focus-within{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-50:focus-within{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-100:focus-within{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-200:focus-within{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-300:focus-within{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-400:focus-within{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-500:focus-within{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-600:focus-within{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-700:focus-within{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-800:focus-within{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-green-900:focus-within{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-50:focus-within{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-100:focus-within{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-200:focus-within{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-300:focus-within{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-400:focus-within{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-500:focus-within{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-600:focus-within{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-700:focus-within{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-800:focus-within{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-blue-900:focus-within{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-50:focus-within{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-100:focus-within{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-200:focus-within{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-300:focus-within{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-400:focus-within{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-500:focus-within{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-600:focus-within{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-700:focus-within{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-800:focus-within{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-indigo-900:focus-within{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-50:focus-within{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-100:focus-within{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-200:focus-within{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-300:focus-within{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-400:focus-within{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-500:focus-within{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-600:focus-within{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-700:focus-within{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-800:focus-within{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-purple-900:focus-within{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-50:focus-within{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-100:focus-within{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-200:focus-within{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-300:focus-within{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-400:focus-within{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-500:focus-within{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-600:focus-within{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-700:focus-within{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-800:focus-within{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:focus-within\:bg-pink-900:focus-within{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:hover\:bg-transparent:hover{background-color:initial}.\32xl\:hover\:bg-current:hover{background-color:currentColor}.\32xl\:hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-400:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-100:hover{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-300:hover{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-500:hover{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-100:hover{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-300:hover{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-700:hover{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-800:hover{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-50:hover{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-100:hover{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-300:hover{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-400:hover{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-500:hover{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-600:hover{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-300:hover{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-400:hover{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-600:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-50:hover{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-100:hover{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-300:hover{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-400:hover{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-600:hover{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-800:hover{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:hover\:bg-indigo-900:hover{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-50:hover{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-100:hover{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-300:hover{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-400:hover{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-500:hover{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-600:hover{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-700:hover{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:hover\:bg-purple-900:hover{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-50:hover{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-100:hover{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-300:hover{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-400:hover{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-500:hover{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-600:hover{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-700:hover{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-800:hover{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:hover\:bg-pink-900:hover{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:focus\:bg-transparent:focus{background-color:initial}.\32xl\:focus\:bg-current:focus{background-color:currentColor}.\32xl\:focus\:bg-black:focus{--tw-bg-opacity:1;background-color:rgba(0,0,0,var(--tw-bg-opacity))}.\32xl\:focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgba(249,250,251,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgba(243,244,246,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-200:focus{--tw-bg-opacity:1;background-color:rgba(229,231,235,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-300:focus{--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-400:focus{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-500:focus{--tw-bg-opacity:1;background-color:rgba(107,114,128,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-600:focus{--tw-bg-opacity:1;background-color:rgba(75,85,99,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-700:focus{--tw-bg-opacity:1;background-color:rgba(55,65,81,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-800:focus{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity))}.\32xl\:focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgba(17,24,39,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-50:focus{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-100:focus{--tw-bg-opacity:1;background-color:rgba(254,226,226,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-200:focus{--tw-bg-opacity:1;background-color:rgba(254,202,202,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-300:focus{--tw-bg-opacity:1;background-color:rgba(252,165,165,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-400:focus{--tw-bg-opacity:1;background-color:rgba(248,113,113,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-500:focus{--tw-bg-opacity:1;background-color:rgba(239,68,68,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-600:focus{--tw-bg-opacity:1;background-color:rgba(220,38,38,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-700:focus{--tw-bg-opacity:1;background-color:rgba(185,28,28,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-800:focus{--tw-bg-opacity:1;background-color:rgba(153,27,27,var(--tw-bg-opacity))}.\32xl\:focus\:bg-red-900:focus{--tw-bg-opacity:1;background-color:rgba(127,29,29,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-50:focus{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-100:focus{--tw-bg-opacity:1;background-color:rgba(254,243,199,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-200:focus{--tw-bg-opacity:1;background-color:rgba(253,230,138,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-300:focus{--tw-bg-opacity:1;background-color:rgba(252,211,77,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-400:focus{--tw-bg-opacity:1;background-color:rgba(251,191,36,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-500:focus{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-600:focus{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-800:focus{--tw-bg-opacity:1;background-color:rgba(146,64,14,var(--tw-bg-opacity))}.\32xl\:focus\:bg-yellow-900:focus{--tw-bg-opacity:1;background-color:rgba(120,53,15,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-50:focus{--tw-bg-opacity:1;background-color:rgba(236,253,245,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-100:focus{--tw-bg-opacity:1;background-color:rgba(209,250,229,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-200:focus{--tw-bg-opacity:1;background-color:rgba(167,243,208,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-300:focus{--tw-bg-opacity:1;background-color:rgba(110,231,183,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-400:focus{--tw-bg-opacity:1;background-color:rgba(52,211,153,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-500:focus{--tw-bg-opacity:1;background-color:rgba(16,185,129,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-600:focus{--tw-bg-opacity:1;background-color:rgba(5,150,105,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-700:focus{--tw-bg-opacity:1;background-color:rgba(4,120,87,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-800:focus{--tw-bg-opacity:1;background-color:rgba(6,95,70,var(--tw-bg-opacity))}.\32xl\:focus\:bg-green-900:focus{--tw-bg-opacity:1;background-color:rgba(6,78,59,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-50:focus{--tw-bg-opacity:1;background-color:rgba(239,246,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-100:focus{--tw-bg-opacity:1;background-color:rgba(219,234,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-200:focus{--tw-bg-opacity:1;background-color:rgba(191,219,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-300:focus{--tw-bg-opacity:1;background-color:rgba(147,197,253,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-400:focus{--tw-bg-opacity:1;background-color:rgba(96,165,250,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-500:focus{--tw-bg-opacity:1;background-color:rgba(59,130,246,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-600:focus{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-700:focus{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-800:focus{--tw-bg-opacity:1;background-color:rgba(30,64,175,var(--tw-bg-opacity))}.\32xl\:focus\:bg-blue-900:focus{--tw-bg-opacity:1;background-color:rgba(30,58,138,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-50:focus{--tw-bg-opacity:1;background-color:rgba(238,242,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-100:focus{--tw-bg-opacity:1;background-color:rgba(224,231,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-200:focus{--tw-bg-opacity:1;background-color:rgba(199,210,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-300:focus{--tw-bg-opacity:1;background-color:rgba(165,180,252,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-400:focus{--tw-bg-opacity:1;background-color:rgba(129,140,248,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-500:focus{--tw-bg-opacity:1;background-color:rgba(99,102,241,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-600:focus{--tw-bg-opacity:1;background-color:rgba(79,70,229,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-700:focus{--tw-bg-opacity:1;background-color:rgba(67,56,202,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-800:focus{--tw-bg-opacity:1;background-color:rgba(55,48,163,var(--tw-bg-opacity))}.\32xl\:focus\:bg-indigo-900:focus{--tw-bg-opacity:1;background-color:rgba(49,46,129,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-50:focus{--tw-bg-opacity:1;background-color:rgba(245,243,255,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-100:focus{--tw-bg-opacity:1;background-color:rgba(237,233,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-200:focus{--tw-bg-opacity:1;background-color:rgba(221,214,254,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-300:focus{--tw-bg-opacity:1;background-color:rgba(196,181,253,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-400:focus{--tw-bg-opacity:1;background-color:rgba(167,139,250,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-500:focus{--tw-bg-opacity:1;background-color:rgba(139,92,246,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-600:focus{--tw-bg-opacity:1;background-color:rgba(124,58,237,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-700:focus{--tw-bg-opacity:1;background-color:rgba(109,40,217,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-800:focus{--tw-bg-opacity:1;background-color:rgba(91,33,182,var(--tw-bg-opacity))}.\32xl\:focus\:bg-purple-900:focus{--tw-bg-opacity:1;background-color:rgba(76,29,149,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-50:focus{--tw-bg-opacity:1;background-color:rgba(253,242,248,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-100:focus{--tw-bg-opacity:1;background-color:rgba(252,231,243,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-200:focus{--tw-bg-opacity:1;background-color:rgba(251,207,232,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-300:focus{--tw-bg-opacity:1;background-color:rgba(249,168,212,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-400:focus{--tw-bg-opacity:1;background-color:rgba(244,114,182,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-500:focus{--tw-bg-opacity:1;background-color:rgba(236,72,153,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-600:focus{--tw-bg-opacity:1;background-color:rgba(219,39,119,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-700:focus{--tw-bg-opacity:1;background-color:rgba(190,24,93,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-800:focus{--tw-bg-opacity:1;background-color:rgba(157,23,77,var(--tw-bg-opacity))}.\32xl\:focus\:bg-pink-900:focus{--tw-bg-opacity:1;background-color:rgba(131,24,67,var(--tw-bg-opacity))}.\32xl\:bg-opacity-0{--tw-bg-opacity:0}.\32xl\:bg-opacity-5{--tw-bg-opacity:0.05}.\32xl\:bg-opacity-10{--tw-bg-opacity:0.1}.\32xl\:bg-opacity-20{--tw-bg-opacity:0.2}.\32xl\:bg-opacity-25{--tw-bg-opacity:0.25}.\32xl\:bg-opacity-30{--tw-bg-opacity:0.3}.\32xl\:bg-opacity-40{--tw-bg-opacity:0.4}.\32xl\:bg-opacity-50{--tw-bg-opacity:0.5}.\32xl\:bg-opacity-60{--tw-bg-opacity:0.6}.\32xl\:bg-opacity-70{--tw-bg-opacity:0.7}.\32xl\:bg-opacity-75{--tw-bg-opacity:0.75}.\32xl\:bg-opacity-80{--tw-bg-opacity:0.8}.\32xl\:bg-opacity-90{--tw-bg-opacity:0.9}.\32xl\:bg-opacity-95{--tw-bg-opacity:0.95}.\32xl\:bg-opacity-100{--tw-bg-opacity:1}.group:hover .\32xl\:group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .\32xl\:group-hover\:bg-opacity-5{--tw-bg-opacity:0.05}.group:hover .\32xl\:group-hover\:bg-opacity-10{--tw-bg-opacity:0.1}.group:hover .\32xl\:group-hover\:bg-opacity-20{--tw-bg-opacity:0.2}.group:hover .\32xl\:group-hover\:bg-opacity-25{--tw-bg-opacity:0.25}.group:hover .\32xl\:group-hover\:bg-opacity-30{--tw-bg-opacity:0.3}.group:hover .\32xl\:group-hover\:bg-opacity-40{--tw-bg-opacity:0.4}.group:hover .\32xl\:group-hover\:bg-opacity-50{--tw-bg-opacity:0.5}.group:hover .\32xl\:group-hover\:bg-opacity-60{--tw-bg-opacity:0.6}.group:hover .\32xl\:group-hover\:bg-opacity-70{--tw-bg-opacity:0.7}.group:hover .\32xl\:group-hover\:bg-opacity-75{--tw-bg-opacity:0.75}.group:hover .\32xl\:group-hover\:bg-opacity-80{--tw-bg-opacity:0.8}.group:hover .\32xl\:group-hover\:bg-opacity-90{--tw-bg-opacity:0.9}.group:hover .\32xl\:group-hover\:bg-opacity-95{--tw-bg-opacity:0.95}.group:hover .\32xl\:group-hover\:bg-opacity-100{--tw-bg-opacity:1}.\32xl\:focus-within\:bg-opacity-0:focus-within{--tw-bg-opacity:0}.\32xl\:focus-within\:bg-opacity-5:focus-within{--tw-bg-opacity:0.05}.\32xl\:focus-within\:bg-opacity-10:focus-within{--tw-bg-opacity:0.1}.\32xl\:focus-within\:bg-opacity-20:focus-within{--tw-bg-opacity:0.2}.\32xl\:focus-within\:bg-opacity-25:focus-within{--tw-bg-opacity:0.25}.\32xl\:focus-within\:bg-opacity-30:focus-within{--tw-bg-opacity:0.3}.\32xl\:focus-within\:bg-opacity-40:focus-within{--tw-bg-opacity:0.4}.\32xl\:focus-within\:bg-opacity-50:focus-within{--tw-bg-opacity:0.5}.\32xl\:focus-within\:bg-opacity-60:focus-within{--tw-bg-opacity:0.6}.\32xl\:focus-within\:bg-opacity-70:focus-within{--tw-bg-opacity:0.7}.\32xl\:focus-within\:bg-opacity-75:focus-within{--tw-bg-opacity:0.75}.\32xl\:focus-within\:bg-opacity-80:focus-within{--tw-bg-opacity:0.8}.\32xl\:focus-within\:bg-opacity-90:focus-within{--tw-bg-opacity:0.9}.\32xl\:focus-within\:bg-opacity-95:focus-within{--tw-bg-opacity:0.95}.\32xl\:focus-within\:bg-opacity-100:focus-within{--tw-bg-opacity:1}.\32xl\:hover\:bg-opacity-0:hover{--tw-bg-opacity:0}.\32xl\:hover\:bg-opacity-5:hover{--tw-bg-opacity:0.05}.\32xl\:hover\:bg-opacity-10:hover{--tw-bg-opacity:0.1}.\32xl\:hover\:bg-opacity-20:hover{--tw-bg-opacity:0.2}.\32xl\:hover\:bg-opacity-25:hover{--tw-bg-opacity:0.25}.\32xl\:hover\:bg-opacity-30:hover{--tw-bg-opacity:0.3}.\32xl\:hover\:bg-opacity-40:hover{--tw-bg-opacity:0.4}.\32xl\:hover\:bg-opacity-50:hover{--tw-bg-opacity:0.5}.\32xl\:hover\:bg-opacity-60:hover{--tw-bg-opacity:0.6}.\32xl\:hover\:bg-opacity-70:hover{--tw-bg-opacity:0.7}.\32xl\:hover\:bg-opacity-75:hover{--tw-bg-opacity:0.75}.\32xl\:hover\:bg-opacity-80:hover{--tw-bg-opacity:0.8}.\32xl\:hover\:bg-opacity-90:hover{--tw-bg-opacity:0.9}.\32xl\:hover\:bg-opacity-95:hover{--tw-bg-opacity:0.95}.\32xl\:hover\:bg-opacity-100:hover{--tw-bg-opacity:1}.\32xl\:focus\:bg-opacity-0:focus{--tw-bg-opacity:0}.\32xl\:focus\:bg-opacity-5:focus{--tw-bg-opacity:0.05}.\32xl\:focus\:bg-opacity-10:focus{--tw-bg-opacity:0.1}.\32xl\:focus\:bg-opacity-20:focus{--tw-bg-opacity:0.2}.\32xl\:focus\:bg-opacity-25:focus{--tw-bg-opacity:0.25}.\32xl\:focus\:bg-opacity-30:focus{--tw-bg-opacity:0.3}.\32xl\:focus\:bg-opacity-40:focus{--tw-bg-opacity:0.4}.\32xl\:focus\:bg-opacity-50:focus{--tw-bg-opacity:0.5}.\32xl\:focus\:bg-opacity-60:focus{--tw-bg-opacity:0.6}.\32xl\:focus\:bg-opacity-70:focus{--tw-bg-opacity:0.7}.\32xl\:focus\:bg-opacity-75:focus{--tw-bg-opacity:0.75}.\32xl\:focus\:bg-opacity-80:focus{--tw-bg-opacity:0.8}.\32xl\:focus\:bg-opacity-90:focus{--tw-bg-opacity:0.9}.\32xl\:focus\:bg-opacity-95:focus{--tw-bg-opacity:0.95}.\32xl\:focus\:bg-opacity-100:focus{--tw-bg-opacity:1}.\32xl\:bg-none{background-image:none}.\32xl\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.\32xl\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--tw-gradient-stops))}.\32xl\:from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:from-current{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:from-black{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:from-white{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:from-gray-100{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:from-gray-200{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:from-gray-300{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:from-gray-400{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:from-gray-500{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:from-gray-600{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:from-gray-700{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:from-gray-800{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:from-gray-900{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:from-red-50{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:from-red-100{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:from-red-200{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:from-red-300{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:from-red-400{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:from-red-500{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:from-red-600{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:from-red-700{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:from-red-800{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:from-red-900{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:from-yellow-50{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:from-yellow-100{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:from-yellow-200{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:from-yellow-300{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:from-yellow-400{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:from-yellow-500{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:from-yellow-600{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:from-yellow-700{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:from-yellow-800{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:from-yellow-900{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:from-green-50{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:from-green-100{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:from-green-200{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:from-green-300{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:from-green-400{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:from-green-500{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:from-green-600{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:from-green-700{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:from-green-800{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:from-green-900{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:from-blue-50{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:from-blue-100{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:from-blue-200{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:from-blue-300{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:from-blue-400{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:from-blue-500{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:from-blue-600{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:from-blue-700{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:from-blue-800{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:from-blue-900{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:from-indigo-50{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:from-indigo-100{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:from-indigo-200{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:from-indigo-300{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:from-indigo-400{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:from-indigo-500{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:from-indigo-600{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:from-indigo-700{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:from-indigo-800{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:from-indigo-900{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:from-purple-50{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:from-purple-100{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:from-purple-200{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:from-purple-300{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:from-purple-400{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:from-purple-500{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:from-purple-600{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:from-purple-700{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:from-purple-800{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:from-purple-900{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:from-pink-50{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:from-pink-100{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:from-pink-200{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:from-pink-300{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:from-pink-400{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:from-pink-500{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:from-pink-600{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:from-pink-700{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:from-pink-800{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:from-pink-900{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:hover\:from-transparent:hover{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:hover\:from-current:hover{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:from-black:hover{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:hover\:from-white:hover{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:from-gray-50:hover{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:hover\:from-gray-100:hover{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:hover\:from-gray-200:hover{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:hover\:from-gray-300:hover{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:hover\:from-gray-400:hover{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:hover\:from-gray-500:hover{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:hover\:from-gray-600:hover{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:hover\:from-gray-700:hover{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:hover\:from-gray-800:hover{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:hover\:from-gray-900:hover{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:hover\:from-red-50:hover{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:hover\:from-red-100:hover{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:hover\:from-red-200:hover{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:hover\:from-red-300:hover{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:hover\:from-red-400:hover{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:hover\:from-red-500:hover{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:hover\:from-red-600:hover{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:hover\:from-red-700:hover{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:hover\:from-red-800:hover{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:hover\:from-red-900:hover{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:hover\:from-yellow-50:hover{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:hover\:from-yellow-100:hover{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:hover\:from-yellow-200:hover{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:hover\:from-yellow-300:hover{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:hover\:from-yellow-400:hover{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:hover\:from-yellow-500:hover{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:hover\:from-yellow-600:hover{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:hover\:from-yellow-700:hover{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:hover\:from-yellow-800:hover{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:hover\:from-yellow-900:hover{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:hover\:from-green-50:hover{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:hover\:from-green-100:hover{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:hover\:from-green-200:hover{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:hover\:from-green-300:hover{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:hover\:from-green-400:hover{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:hover\:from-green-500:hover{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:hover\:from-green-600:hover{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:hover\:from-green-700:hover{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:hover\:from-green-800:hover{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:hover\:from-green-900:hover{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:hover\:from-blue-50:hover{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:hover\:from-blue-100:hover{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:hover\:from-blue-200:hover{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:hover\:from-blue-300:hover{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:hover\:from-blue-400:hover{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:hover\:from-blue-500:hover{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:hover\:from-blue-600:hover{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:hover\:from-blue-700:hover{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:hover\:from-blue-800:hover{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:hover\:from-blue-900:hover{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:hover\:from-indigo-50:hover{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:hover\:from-indigo-100:hover{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:hover\:from-indigo-200:hover{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:hover\:from-indigo-300:hover{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:hover\:from-indigo-400:hover{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:hover\:from-indigo-500:hover{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:hover\:from-indigo-600:hover{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:hover\:from-indigo-700:hover{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:hover\:from-indigo-800:hover{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:hover\:from-indigo-900:hover{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:hover\:from-purple-50:hover{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:hover\:from-purple-100:hover{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:hover\:from-purple-200:hover{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:hover\:from-purple-300:hover{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:hover\:from-purple-400:hover{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:hover\:from-purple-500:hover{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:hover\:from-purple-600:hover{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:hover\:from-purple-700:hover{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:hover\:from-purple-800:hover{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:hover\:from-purple-900:hover{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:hover\:from-pink-50:hover{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:hover\:from-pink-100:hover{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:hover\:from-pink-200:hover{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:hover\:from-pink-300:hover{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:hover\:from-pink-400:hover{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:hover\:from-pink-500:hover{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:hover\:from-pink-600:hover{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:hover\:from-pink-700:hover{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:hover\:from-pink-800:hover{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:hover\:from-pink-900:hover{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:focus\:from-transparent:focus{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:focus\:from-current:focus{--tw-gradient-from:currentColor;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:from-black:focus{--tw-gradient-from:#000;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,transparent)}.\32xl\:focus\:from-white:focus{--tw-gradient-from:#fff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:from-gray-50:focus{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:focus\:from-gray-100:focus{--tw-gradient-from:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:focus\:from-gray-200:focus{--tw-gradient-from:#e5e7eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:focus\:from-gray-300:focus{--tw-gradient-from:#d1d5db;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:focus\:from-gray-400:focus{--tw-gradient-from:#9ca3af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:focus\:from-gray-500:focus{--tw-gradient-from:#6b7280;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:focus\:from-gray-600:focus{--tw-gradient-from:#4b5563;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:focus\:from-gray-700:focus{--tw-gradient-from:#374151;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:focus\:from-gray-800:focus{--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:focus\:from-gray-900:focus{--tw-gradient-from:#111827;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:focus\:from-red-50:focus{--tw-gradient-from:#fef2f2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:focus\:from-red-100:focus{--tw-gradient-from:#fee2e2;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:focus\:from-red-200:focus{--tw-gradient-from:#fecaca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:focus\:from-red-300:focus{--tw-gradient-from:#fca5a5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:focus\:from-red-400:focus{--tw-gradient-from:#f87171;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:focus\:from-red-500:focus{--tw-gradient-from:#ef4444;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:focus\:from-red-600:focus{--tw-gradient-from:#dc2626;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:focus\:from-red-700:focus{--tw-gradient-from:#b91c1c;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:focus\:from-red-800:focus{--tw-gradient-from:#991b1b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:focus\:from-red-900:focus{--tw-gradient-from:#7f1d1d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:focus\:from-yellow-50:focus{--tw-gradient-from:#fffbeb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:focus\:from-yellow-100:focus{--tw-gradient-from:#fef3c7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:focus\:from-yellow-200:focus{--tw-gradient-from:#fde68a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:focus\:from-yellow-300:focus{--tw-gradient-from:#fcd34d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:focus\:from-yellow-400:focus{--tw-gradient-from:#fbbf24;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:focus\:from-yellow-500:focus{--tw-gradient-from:#f59e0b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:focus\:from-yellow-600:focus{--tw-gradient-from:#d97706;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:focus\:from-yellow-700:focus{--tw-gradient-from:#b45309;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:focus\:from-yellow-800:focus{--tw-gradient-from:#92400e;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:focus\:from-yellow-900:focus{--tw-gradient-from:#78350f;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:focus\:from-green-50:focus{--tw-gradient-from:#ecfdf5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:focus\:from-green-100:focus{--tw-gradient-from:#d1fae5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:focus\:from-green-200:focus{--tw-gradient-from:#a7f3d0;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:focus\:from-green-300:focus{--tw-gradient-from:#6ee7b7;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:focus\:from-green-400:focus{--tw-gradient-from:#34d399;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:focus\:from-green-500:focus{--tw-gradient-from:#10b981;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:focus\:from-green-600:focus{--tw-gradient-from:#059669;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:focus\:from-green-700:focus{--tw-gradient-from:#047857;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:focus\:from-green-800:focus{--tw-gradient-from:#065f46;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:focus\:from-green-900:focus{--tw-gradient-from:#064e3b;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:focus\:from-blue-50:focus{--tw-gradient-from:#eff6ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:focus\:from-blue-100:focus{--tw-gradient-from:#dbeafe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:focus\:from-blue-200:focus{--tw-gradient-from:#bfdbfe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:focus\:from-blue-300:focus{--tw-gradient-from:#93c5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:focus\:from-blue-400:focus{--tw-gradient-from:#60a5fa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:focus\:from-blue-500:focus{--tw-gradient-from:#3b82f6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:focus\:from-blue-600:focus{--tw-gradient-from:#2563eb;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:focus\:from-blue-700:focus{--tw-gradient-from:#1d4ed8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:focus\:from-blue-800:focus{--tw-gradient-from:#1e40af;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:focus\:from-blue-900:focus{--tw-gradient-from:#1e3a8a;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:focus\:from-indigo-50:focus{--tw-gradient-from:#eef2ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:focus\:from-indigo-100:focus{--tw-gradient-from:#e0e7ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:focus\:from-indigo-200:focus{--tw-gradient-from:#c7d2fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:focus\:from-indigo-300:focus{--tw-gradient-from:#a5b4fc;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:focus\:from-indigo-400:focus{--tw-gradient-from:#818cf8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:focus\:from-indigo-500:focus{--tw-gradient-from:#6366f1;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:focus\:from-indigo-600:focus{--tw-gradient-from:#4f46e5;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:focus\:from-indigo-700:focus{--tw-gradient-from:#4338ca;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:focus\:from-indigo-800:focus{--tw-gradient-from:#3730a3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:focus\:from-indigo-900:focus{--tw-gradient-from:#312e81;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:focus\:from-purple-50:focus{--tw-gradient-from:#f5f3ff;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:focus\:from-purple-100:focus{--tw-gradient-from:#ede9fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:focus\:from-purple-200:focus{--tw-gradient-from:#ddd6fe;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:focus\:from-purple-300:focus{--tw-gradient-from:#c4b5fd;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:focus\:from-purple-400:focus{--tw-gradient-from:#a78bfa;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:focus\:from-purple-500:focus{--tw-gradient-from:#8b5cf6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:focus\:from-purple-600:focus{--tw-gradient-from:#7c3aed;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:focus\:from-purple-700:focus{--tw-gradient-from:#6d28d9;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:focus\:from-purple-800:focus{--tw-gradient-from:#5b21b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:focus\:from-purple-900:focus{--tw-gradient-from:#4c1d95;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:focus\:from-pink-50:focus{--tw-gradient-from:#fdf2f8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:focus\:from-pink-100:focus{--tw-gradient-from:#fce7f3;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:focus\:from-pink-200:focus{--tw-gradient-from:#fbcfe8;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:focus\:from-pink-300:focus{--tw-gradient-from:#f9a8d4;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:focus\:from-pink-400:focus{--tw-gradient-from:#f472b6;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:focus\:from-pink-500:focus{--tw-gradient-from:#ec4899;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:focus\:from-pink-600:focus{--tw-gradient-from:#db2777;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:focus\:from-pink-700:focus{--tw-gradient-from:#be185d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:focus\:from-pink-800:focus{--tw-gradient-from:#9d174d;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:focus\:from-pink-900:focus{--tw-gradient-from:#831843;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:via-transparent{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.\32xl\:via-current{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:via-black{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.\32xl\:via-white{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:via-gray-50{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:via-gray-100{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:via-gray-200{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:via-gray-300{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:via-gray-400{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:via-gray-500{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:via-gray-600{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:via-gray-700{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:via-gray-800{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:via-gray-900{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:via-red-50{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:via-red-100{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:via-red-200{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:via-red-300{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:via-red-400{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:via-red-500{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:via-red-600{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:via-red-700{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:via-red-800{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:via-red-900{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:via-yellow-50{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:via-yellow-100{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:via-yellow-200{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:via-yellow-300{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:via-yellow-400{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:via-yellow-500{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:via-yellow-600{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:via-yellow-700{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:via-yellow-800{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:via-yellow-900{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:via-green-50{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:via-green-100{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:via-green-200{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:via-green-300{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:via-green-400{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:via-green-500{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:via-green-600{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:via-green-700{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:via-green-800{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:via-green-900{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:via-blue-50{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:via-blue-100{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:via-blue-200{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:via-blue-300{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:via-blue-400{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:via-blue-500{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:via-blue-600{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:via-blue-700{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:via-blue-800{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:via-blue-900{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:via-indigo-50{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:via-indigo-100{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:via-indigo-200{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:via-indigo-300{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:via-indigo-400{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:via-indigo-500{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:via-indigo-600{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:via-indigo-700{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:via-indigo-800{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:via-indigo-900{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:via-purple-50{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:via-purple-100{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:via-purple-200{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:via-purple-300{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:via-purple-400{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:via-purple-500{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:via-purple-600{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:via-purple-700{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:via-purple-800{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:via-purple-900{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:via-pink-50{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:via-pink-100{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:via-pink-200{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:via-pink-300{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:via-pink-400{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:via-pink-500{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:via-pink-600{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:via-pink-700{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:via-pink-800{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:via-pink-900{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:hover\:via-transparent:hover{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.\32xl\:hover\:via-current:hover{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:via-black:hover{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.\32xl\:hover\:via-white:hover{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:hover\:via-gray-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:hover\:via-gray-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:hover\:via-gray-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:hover\:via-gray-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:hover\:via-gray-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:hover\:via-gray-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:hover\:via-gray-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:hover\:via-gray-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:hover\:via-gray-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:hover\:via-gray-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:hover\:via-red-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:hover\:via-red-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:hover\:via-red-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:hover\:via-red-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:hover\:via-red-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:hover\:via-red-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:hover\:via-red-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:hover\:via-red-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:hover\:via-red-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:hover\:via-red-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:hover\:via-yellow-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:hover\:via-yellow-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:hover\:via-yellow-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:hover\:via-yellow-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:hover\:via-yellow-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:hover\:via-yellow-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:hover\:via-yellow-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:hover\:via-yellow-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:hover\:via-yellow-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:hover\:via-yellow-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:hover\:via-green-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:hover\:via-green-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:hover\:via-green-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:hover\:via-green-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:hover\:via-green-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:hover\:via-green-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:hover\:via-green-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:hover\:via-green-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:hover\:via-green-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:hover\:via-green-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:hover\:via-blue-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:hover\:via-blue-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:hover\:via-blue-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:hover\:via-blue-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:hover\:via-blue-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:hover\:via-blue-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:hover\:via-blue-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:hover\:via-blue-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:hover\:via-blue-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:hover\:via-blue-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:hover\:via-indigo-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:hover\:via-indigo-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:hover\:via-indigo-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:hover\:via-indigo-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:hover\:via-indigo-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:hover\:via-indigo-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:hover\:via-indigo-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:hover\:via-indigo-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:hover\:via-indigo-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:hover\:via-indigo-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:hover\:via-purple-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:hover\:via-purple-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:hover\:via-purple-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:hover\:via-purple-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:hover\:via-purple-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:hover\:via-purple-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:hover\:via-purple-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:hover\:via-purple-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:hover\:via-purple-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:hover\:via-purple-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:hover\:via-pink-50:hover{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:hover\:via-pink-100:hover{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:hover\:via-pink-200:hover{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:hover\:via-pink-300:hover{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:hover\:via-pink-400:hover{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:hover\:via-pink-500:hover{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:hover\:via-pink-600:hover{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:hover\:via-pink-700:hover{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:hover\:via-pink-800:hover{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:hover\:via-pink-900:hover{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:focus\:via-transparent:focus{--tw-gradient-stops:var(--tw-gradient-from),transparent,var(--tw-gradient-to,transparent)}.\32xl\:focus\:via-current:focus{--tw-gradient-stops:var(--tw-gradient-from),currentColor,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:via-black:focus{--tw-gradient-stops:var(--tw-gradient-from),#000,var(--tw-gradient-to,transparent)}.\32xl\:focus\:via-white:focus{--tw-gradient-stops:var(--tw-gradient-from),#fff,var(--tw-gradient-to,hsla(0,0%,100%,0))}.\32xl\:focus\:via-gray-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9fafb,var(--tw-gradient-to,rgba(249,250,251,0))}.\32xl\:focus\:via-gray-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#f3f4f6,var(--tw-gradient-to,rgba(243,244,246,0))}.\32xl\:focus\:via-gray-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#e5e7eb,var(--tw-gradient-to,rgba(229,231,235,0))}.\32xl\:focus\:via-gray-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1d5db,var(--tw-gradient-to,rgba(209,213,219,0))}.\32xl\:focus\:via-gray-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#9ca3af,var(--tw-gradient-to,rgba(156,163,175,0))}.\32xl\:focus\:via-gray-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6b7280,var(--tw-gradient-to,hsla(220,9%,46%,0))}.\32xl\:focus\:via-gray-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4b5563,var(--tw-gradient-to,rgba(75,85,99,0))}.\32xl\:focus\:via-gray-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#374151,var(--tw-gradient-to,rgba(55,65,81,0))}.\32xl\:focus\:via-gray-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1f2937,var(--tw-gradient-to,rgba(31,41,55,0))}.\32xl\:focus\:via-gray-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#111827,var(--tw-gradient-to,rgba(17,24,39,0))}.\32xl\:focus\:via-red-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef2f2,var(--tw-gradient-to,hsla(0,86%,97%,0))}.\32xl\:focus\:via-red-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fee2e2,var(--tw-gradient-to,hsla(0,93%,94%,0))}.\32xl\:focus\:via-red-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fecaca,var(--tw-gradient-to,hsla(0,96%,89%,0))}.\32xl\:focus\:via-red-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fca5a5,var(--tw-gradient-to,hsla(0,94%,82%,0))}.\32xl\:focus\:via-red-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f87171,var(--tw-gradient-to,hsla(0,91%,71%,0))}.\32xl\:focus\:via-red-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ef4444,var(--tw-gradient-to,rgba(239,68,68,0))}.\32xl\:focus\:via-red-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#dc2626,var(--tw-gradient-to,rgba(220,38,38,0))}.\32xl\:focus\:via-red-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b91c1c,var(--tw-gradient-to,rgba(185,28,28,0))}.\32xl\:focus\:via-red-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#991b1b,var(--tw-gradient-to,rgba(153,27,27,0))}.\32xl\:focus\:via-red-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#7f1d1d,var(--tw-gradient-to,rgba(127,29,29,0))}.\32xl\:focus\:via-yellow-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fffbeb,var(--tw-gradient-to,rgba(255,251,235,0))}.\32xl\:focus\:via-yellow-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fef3c7,var(--tw-gradient-to,hsla(48,96%,89%,0))}.\32xl\:focus\:via-yellow-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fde68a,var(--tw-gradient-to,hsla(48,97%,77%,0))}.\32xl\:focus\:via-yellow-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#fcd34d,var(--tw-gradient-to,rgba(252,211,77,0))}.\32xl\:focus\:via-yellow-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbbf24,var(--tw-gradient-to,rgba(251,191,36,0))}.\32xl\:focus\:via-yellow-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#f59e0b,var(--tw-gradient-to,rgba(245,158,11,0))}.\32xl\:focus\:via-yellow-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#d97706,var(--tw-gradient-to,rgba(217,119,6,0))}.\32xl\:focus\:via-yellow-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#b45309,var(--tw-gradient-to,rgba(180,83,9,0))}.\32xl\:focus\:via-yellow-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#92400e,var(--tw-gradient-to,rgba(146,64,14,0))}.\32xl\:focus\:via-yellow-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#78350f,var(--tw-gradient-to,rgba(120,53,15,0))}.\32xl\:focus\:via-green-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#ecfdf5,var(--tw-gradient-to,rgba(236,253,245,0))}.\32xl\:focus\:via-green-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#d1fae5,var(--tw-gradient-to,rgba(209,250,229,0))}.\32xl\:focus\:via-green-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#a7f3d0,var(--tw-gradient-to,rgba(167,243,208,0))}.\32xl\:focus\:via-green-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#6ee7b7,var(--tw-gradient-to,rgba(110,231,183,0))}.\32xl\:focus\:via-green-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#34d399,var(--tw-gradient-to,rgba(52,211,153,0))}.\32xl\:focus\:via-green-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#10b981,var(--tw-gradient-to,rgba(16,185,129,0))}.\32xl\:focus\:via-green-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#059669,var(--tw-gradient-to,rgba(5,150,105,0))}.\32xl\:focus\:via-green-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#047857,var(--tw-gradient-to,rgba(4,120,87,0))}.\32xl\:focus\:via-green-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#065f46,var(--tw-gradient-to,rgba(6,95,70,0))}.\32xl\:focus\:via-green-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#064e3b,var(--tw-gradient-to,rgba(6,78,59,0))}.\32xl\:focus\:via-blue-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eff6ff,var(--tw-gradient-to,rgba(239,246,255,0))}.\32xl\:focus\:via-blue-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#dbeafe,var(--tw-gradient-to,rgba(219,234,254,0))}.\32xl\:focus\:via-blue-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#bfdbfe,var(--tw-gradient-to,rgba(191,219,254,0))}.\32xl\:focus\:via-blue-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#93c5fd,var(--tw-gradient-to,rgba(147,197,253,0))}.\32xl\:focus\:via-blue-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#60a5fa,var(--tw-gradient-to,rgba(96,165,250,0))}.\32xl\:focus\:via-blue-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#3b82f6,var(--tw-gradient-to,rgba(59,130,246,0))}.\32xl\:focus\:via-blue-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#2563eb,var(--tw-gradient-to,rgba(37,99,235,0))}.\32xl\:focus\:via-blue-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#1d4ed8,var(--tw-gradient-to,rgba(29,78,216,0))}.\32xl\:focus\:via-blue-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e40af,var(--tw-gradient-to,rgba(30,64,175,0))}.\32xl\:focus\:via-blue-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#1e3a8a,var(--tw-gradient-to,rgba(30,58,138,0))}.\32xl\:focus\:via-indigo-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#eef2ff,var(--tw-gradient-to,rgba(238,242,255,0))}.\32xl\:focus\:via-indigo-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#e0e7ff,var(--tw-gradient-to,rgba(224,231,255,0))}.\32xl\:focus\:via-indigo-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#c7d2fe,var(--tw-gradient-to,rgba(199,210,254,0))}.\32xl\:focus\:via-indigo-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#a5b4fc,var(--tw-gradient-to,rgba(165,180,252,0))}.\32xl\:focus\:via-indigo-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#818cf8,var(--tw-gradient-to,rgba(129,140,248,0))}.\32xl\:focus\:via-indigo-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#6366f1,var(--tw-gradient-to,rgba(99,102,241,0))}.\32xl\:focus\:via-indigo-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#4f46e5,var(--tw-gradient-to,rgba(79,70,229,0))}.\32xl\:focus\:via-indigo-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#4338ca,var(--tw-gradient-to,rgba(67,56,202,0))}.\32xl\:focus\:via-indigo-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#3730a3,var(--tw-gradient-to,rgba(55,48,163,0))}.\32xl\:focus\:via-indigo-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#312e81,var(--tw-gradient-to,rgba(49,46,129,0))}.\32xl\:focus\:via-purple-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#f5f3ff,var(--tw-gradient-to,rgba(245,243,255,0))}.\32xl\:focus\:via-purple-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#ede9fe,var(--tw-gradient-to,rgba(237,233,254,0))}.\32xl\:focus\:via-purple-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#ddd6fe,var(--tw-gradient-to,rgba(221,214,254,0))}.\32xl\:focus\:via-purple-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#c4b5fd,var(--tw-gradient-to,rgba(196,181,253,0))}.\32xl\:focus\:via-purple-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#a78bfa,var(--tw-gradient-to,rgba(167,139,250,0))}.\32xl\:focus\:via-purple-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#8b5cf6,var(--tw-gradient-to,rgba(139,92,246,0))}.\32xl\:focus\:via-purple-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#7c3aed,var(--tw-gradient-to,rgba(124,58,237,0))}.\32xl\:focus\:via-purple-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#6d28d9,var(--tw-gradient-to,rgba(109,40,217,0))}.\32xl\:focus\:via-purple-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#5b21b6,var(--tw-gradient-to,rgba(91,33,182,0))}.\32xl\:focus\:via-purple-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#4c1d95,var(--tw-gradient-to,rgba(76,29,149,0))}.\32xl\:focus\:via-pink-50:focus{--tw-gradient-stops:var(--tw-gradient-from),#fdf2f8,var(--tw-gradient-to,rgba(253,242,248,0))}.\32xl\:focus\:via-pink-100:focus{--tw-gradient-stops:var(--tw-gradient-from),#fce7f3,var(--tw-gradient-to,rgba(252,231,243,0))}.\32xl\:focus\:via-pink-200:focus{--tw-gradient-stops:var(--tw-gradient-from),#fbcfe8,var(--tw-gradient-to,rgba(251,207,232,0))}.\32xl\:focus\:via-pink-300:focus{--tw-gradient-stops:var(--tw-gradient-from),#f9a8d4,var(--tw-gradient-to,rgba(249,168,212,0))}.\32xl\:focus\:via-pink-400:focus{--tw-gradient-stops:var(--tw-gradient-from),#f472b6,var(--tw-gradient-to,rgba(244,114,182,0))}.\32xl\:focus\:via-pink-500:focus{--tw-gradient-stops:var(--tw-gradient-from),#ec4899,var(--tw-gradient-to,rgba(236,72,153,0))}.\32xl\:focus\:via-pink-600:focus{--tw-gradient-stops:var(--tw-gradient-from),#db2777,var(--tw-gradient-to,rgba(219,39,119,0))}.\32xl\:focus\:via-pink-700:focus{--tw-gradient-stops:var(--tw-gradient-from),#be185d,var(--tw-gradient-to,rgba(190,24,93,0))}.\32xl\:focus\:via-pink-800:focus{--tw-gradient-stops:var(--tw-gradient-from),#9d174d,var(--tw-gradient-to,rgba(157,23,77,0))}.\32xl\:focus\:via-pink-900:focus{--tw-gradient-stops:var(--tw-gradient-from),#831843,var(--tw-gradient-to,rgba(131,24,67,0))}.\32xl\:to-transparent{--tw-gradient-to:transparent}.\32xl\:to-current{--tw-gradient-to:currentColor}.\32xl\:to-black{--tw-gradient-to:#000}.\32xl\:to-white{--tw-gradient-to:#fff}.\32xl\:to-gray-50{--tw-gradient-to:#f9fafb}.\32xl\:to-gray-100{--tw-gradient-to:#f3f4f6}.\32xl\:to-gray-200{--tw-gradient-to:#e5e7eb}.\32xl\:to-gray-300{--tw-gradient-to:#d1d5db}.\32xl\:to-gray-400{--tw-gradient-to:#9ca3af}.\32xl\:to-gray-500{--tw-gradient-to:#6b7280}.\32xl\:to-gray-600{--tw-gradient-to:#4b5563}.\32xl\:to-gray-700{--tw-gradient-to:#374151}.\32xl\:to-gray-800{--tw-gradient-to:#1f2937}.\32xl\:to-gray-900{--tw-gradient-to:#111827}.\32xl\:to-red-50{--tw-gradient-to:#fef2f2}.\32xl\:to-red-100{--tw-gradient-to:#fee2e2}.\32xl\:to-red-200{--tw-gradient-to:#fecaca}.\32xl\:to-red-300{--tw-gradient-to:#fca5a5}.\32xl\:to-red-400{--tw-gradient-to:#f87171}.\32xl\:to-red-500{--tw-gradient-to:#ef4444}.\32xl\:to-red-600{--tw-gradient-to:#dc2626}.\32xl\:to-red-700{--tw-gradient-to:#b91c1c}.\32xl\:to-red-800{--tw-gradient-to:#991b1b}.\32xl\:to-red-900{--tw-gradient-to:#7f1d1d}.\32xl\:to-yellow-50{--tw-gradient-to:#fffbeb}.\32xl\:to-yellow-100{--tw-gradient-to:#fef3c7}.\32xl\:to-yellow-200{--tw-gradient-to:#fde68a}.\32xl\:to-yellow-300{--tw-gradient-to:#fcd34d}.\32xl\:to-yellow-400{--tw-gradient-to:#fbbf24}.\32xl\:to-yellow-500{--tw-gradient-to:#f59e0b}.\32xl\:to-yellow-600{--tw-gradient-to:#d97706}.\32xl\:to-yellow-700{--tw-gradient-to:#b45309}.\32xl\:to-yellow-800{--tw-gradient-to:#92400e}.\32xl\:to-yellow-900{--tw-gradient-to:#78350f}.\32xl\:to-green-50{--tw-gradient-to:#ecfdf5}.\32xl\:to-green-100{--tw-gradient-to:#d1fae5}.\32xl\:to-green-200{--tw-gradient-to:#a7f3d0}.\32xl\:to-green-300{--tw-gradient-to:#6ee7b7}.\32xl\:to-green-400{--tw-gradient-to:#34d399}.\32xl\:to-green-500{--tw-gradient-to:#10b981}.\32xl\:to-green-600{--tw-gradient-to:#059669}.\32xl\:to-green-700{--tw-gradient-to:#047857}.\32xl\:to-green-800{--tw-gradient-to:#065f46}.\32xl\:to-green-900{--tw-gradient-to:#064e3b}.\32xl\:to-blue-50{--tw-gradient-to:#eff6ff}.\32xl\:to-blue-100{--tw-gradient-to:#dbeafe}.\32xl\:to-blue-200{--tw-gradient-to:#bfdbfe}.\32xl\:to-blue-300{--tw-gradient-to:#93c5fd}.\32xl\:to-blue-400{--tw-gradient-to:#60a5fa}.\32xl\:to-blue-500{--tw-gradient-to:#3b82f6}.\32xl\:to-blue-600{--tw-gradient-to:#2563eb}.\32xl\:to-blue-700{--tw-gradient-to:#1d4ed8}.\32xl\:to-blue-800{--tw-gradient-to:#1e40af}.\32xl\:to-blue-900{--tw-gradient-to:#1e3a8a}.\32xl\:to-indigo-50{--tw-gradient-to:#eef2ff}.\32xl\:to-indigo-100{--tw-gradient-to:#e0e7ff}.\32xl\:to-indigo-200{--tw-gradient-to:#c7d2fe}.\32xl\:to-indigo-300{--tw-gradient-to:#a5b4fc}.\32xl\:to-indigo-400{--tw-gradient-to:#818cf8}.\32xl\:to-indigo-500{--tw-gradient-to:#6366f1}.\32xl\:to-indigo-600{--tw-gradient-to:#4f46e5}.\32xl\:to-indigo-700{--tw-gradient-to:#4338ca}.\32xl\:to-indigo-800{--tw-gradient-to:#3730a3}.\32xl\:to-indigo-900{--tw-gradient-to:#312e81}.\32xl\:to-purple-50{--tw-gradient-to:#f5f3ff}.\32xl\:to-purple-100{--tw-gradient-to:#ede9fe}.\32xl\:to-purple-200{--tw-gradient-to:#ddd6fe}.\32xl\:to-purple-300{--tw-gradient-to:#c4b5fd}.\32xl\:to-purple-400{--tw-gradient-to:#a78bfa}.\32xl\:to-purple-500{--tw-gradient-to:#8b5cf6}.\32xl\:to-purple-600{--tw-gradient-to:#7c3aed}.\32xl\:to-purple-700{--tw-gradient-to:#6d28d9}.\32xl\:to-purple-800{--tw-gradient-to:#5b21b6}.\32xl\:to-purple-900{--tw-gradient-to:#4c1d95}.\32xl\:to-pink-50{--tw-gradient-to:#fdf2f8}.\32xl\:to-pink-100{--tw-gradient-to:#fce7f3}.\32xl\:to-pink-200{--tw-gradient-to:#fbcfe8}.\32xl\:to-pink-300{--tw-gradient-to:#f9a8d4}.\32xl\:to-pink-400{--tw-gradient-to:#f472b6}.\32xl\:to-pink-500{--tw-gradient-to:#ec4899}.\32xl\:to-pink-600{--tw-gradient-to:#db2777}.\32xl\:to-pink-700{--tw-gradient-to:#be185d}.\32xl\:to-pink-800{--tw-gradient-to:#9d174d}.\32xl\:to-pink-900{--tw-gradient-to:#831843}.\32xl\:hover\:to-transparent:hover{--tw-gradient-to:transparent}.\32xl\:hover\:to-current:hover{--tw-gradient-to:currentColor}.\32xl\:hover\:to-black:hover{--tw-gradient-to:#000}.\32xl\:hover\:to-white:hover{--tw-gradient-to:#fff}.\32xl\:hover\:to-gray-50:hover{--tw-gradient-to:#f9fafb}.\32xl\:hover\:to-gray-100:hover{--tw-gradient-to:#f3f4f6}.\32xl\:hover\:to-gray-200:hover{--tw-gradient-to:#e5e7eb}.\32xl\:hover\:to-gray-300:hover{--tw-gradient-to:#d1d5db}.\32xl\:hover\:to-gray-400:hover{--tw-gradient-to:#9ca3af}.\32xl\:hover\:to-gray-500:hover{--tw-gradient-to:#6b7280}.\32xl\:hover\:to-gray-600:hover{--tw-gradient-to:#4b5563}.\32xl\:hover\:to-gray-700:hover{--tw-gradient-to:#374151}.\32xl\:hover\:to-gray-800:hover{--tw-gradient-to:#1f2937}.\32xl\:hover\:to-gray-900:hover{--tw-gradient-to:#111827}.\32xl\:hover\:to-red-50:hover{--tw-gradient-to:#fef2f2}.\32xl\:hover\:to-red-100:hover{--tw-gradient-to:#fee2e2}.\32xl\:hover\:to-red-200:hover{--tw-gradient-to:#fecaca}.\32xl\:hover\:to-red-300:hover{--tw-gradient-to:#fca5a5}.\32xl\:hover\:to-red-400:hover{--tw-gradient-to:#f87171}.\32xl\:hover\:to-red-500:hover{--tw-gradient-to:#ef4444}.\32xl\:hover\:to-red-600:hover{--tw-gradient-to:#dc2626}.\32xl\:hover\:to-red-700:hover{--tw-gradient-to:#b91c1c}.\32xl\:hover\:to-red-800:hover{--tw-gradient-to:#991b1b}.\32xl\:hover\:to-red-900:hover{--tw-gradient-to:#7f1d1d}.\32xl\:hover\:to-yellow-50:hover{--tw-gradient-to:#fffbeb}.\32xl\:hover\:to-yellow-100:hover{--tw-gradient-to:#fef3c7}.\32xl\:hover\:to-yellow-200:hover{--tw-gradient-to:#fde68a}.\32xl\:hover\:to-yellow-300:hover{--tw-gradient-to:#fcd34d}.\32xl\:hover\:to-yellow-400:hover{--tw-gradient-to:#fbbf24}.\32xl\:hover\:to-yellow-500:hover{--tw-gradient-to:#f59e0b}.\32xl\:hover\:to-yellow-600:hover{--tw-gradient-to:#d97706}.\32xl\:hover\:to-yellow-700:hover{--tw-gradient-to:#b45309}.\32xl\:hover\:to-yellow-800:hover{--tw-gradient-to:#92400e}.\32xl\:hover\:to-yellow-900:hover{--tw-gradient-to:#78350f}.\32xl\:hover\:to-green-50:hover{--tw-gradient-to:#ecfdf5}.\32xl\:hover\:to-green-100:hover{--tw-gradient-to:#d1fae5}.\32xl\:hover\:to-green-200:hover{--tw-gradient-to:#a7f3d0}.\32xl\:hover\:to-green-300:hover{--tw-gradient-to:#6ee7b7}.\32xl\:hover\:to-green-400:hover{--tw-gradient-to:#34d399}.\32xl\:hover\:to-green-500:hover{--tw-gradient-to:#10b981}.\32xl\:hover\:to-green-600:hover{--tw-gradient-to:#059669}.\32xl\:hover\:to-green-700:hover{--tw-gradient-to:#047857}.\32xl\:hover\:to-green-800:hover{--tw-gradient-to:#065f46}.\32xl\:hover\:to-green-900:hover{--tw-gradient-to:#064e3b}.\32xl\:hover\:to-blue-50:hover{--tw-gradient-to:#eff6ff}.\32xl\:hover\:to-blue-100:hover{--tw-gradient-to:#dbeafe}.\32xl\:hover\:to-blue-200:hover{--tw-gradient-to:#bfdbfe}.\32xl\:hover\:to-blue-300:hover{--tw-gradient-to:#93c5fd}.\32xl\:hover\:to-blue-400:hover{--tw-gradient-to:#60a5fa}.\32xl\:hover\:to-blue-500:hover{--tw-gradient-to:#3b82f6}.\32xl\:hover\:to-blue-600:hover{--tw-gradient-to:#2563eb}.\32xl\:hover\:to-blue-700:hover{--tw-gradient-to:#1d4ed8}.\32xl\:hover\:to-blue-800:hover{--tw-gradient-to:#1e40af}.\32xl\:hover\:to-blue-900:hover{--tw-gradient-to:#1e3a8a}.\32xl\:hover\:to-indigo-50:hover{--tw-gradient-to:#eef2ff}.\32xl\:hover\:to-indigo-100:hover{--tw-gradient-to:#e0e7ff}.\32xl\:hover\:to-indigo-200:hover{--tw-gradient-to:#c7d2fe}.\32xl\:hover\:to-indigo-300:hover{--tw-gradient-to:#a5b4fc}.\32xl\:hover\:to-indigo-400:hover{--tw-gradient-to:#818cf8}.\32xl\:hover\:to-indigo-500:hover{--tw-gradient-to:#6366f1}.\32xl\:hover\:to-indigo-600:hover{--tw-gradient-to:#4f46e5}.\32xl\:hover\:to-indigo-700:hover{--tw-gradient-to:#4338ca}.\32xl\:hover\:to-indigo-800:hover{--tw-gradient-to:#3730a3}.\32xl\:hover\:to-indigo-900:hover{--tw-gradient-to:#312e81}.\32xl\:hover\:to-purple-50:hover{--tw-gradient-to:#f5f3ff}.\32xl\:hover\:to-purple-100:hover{--tw-gradient-to:#ede9fe}.\32xl\:hover\:to-purple-200:hover{--tw-gradient-to:#ddd6fe}.\32xl\:hover\:to-purple-300:hover{--tw-gradient-to:#c4b5fd}.\32xl\:hover\:to-purple-400:hover{--tw-gradient-to:#a78bfa}.\32xl\:hover\:to-purple-500:hover{--tw-gradient-to:#8b5cf6}.\32xl\:hover\:to-purple-600:hover{--tw-gradient-to:#7c3aed}.\32xl\:hover\:to-purple-700:hover{--tw-gradient-to:#6d28d9}.\32xl\:hover\:to-purple-800:hover{--tw-gradient-to:#5b21b6}.\32xl\:hover\:to-purple-900:hover{--tw-gradient-to:#4c1d95}.\32xl\:hover\:to-pink-50:hover{--tw-gradient-to:#fdf2f8}.\32xl\:hover\:to-pink-100:hover{--tw-gradient-to:#fce7f3}.\32xl\:hover\:to-pink-200:hover{--tw-gradient-to:#fbcfe8}.\32xl\:hover\:to-pink-300:hover{--tw-gradient-to:#f9a8d4}.\32xl\:hover\:to-pink-400:hover{--tw-gradient-to:#f472b6}.\32xl\:hover\:to-pink-500:hover{--tw-gradient-to:#ec4899}.\32xl\:hover\:to-pink-600:hover{--tw-gradient-to:#db2777}.\32xl\:hover\:to-pink-700:hover{--tw-gradient-to:#be185d}.\32xl\:hover\:to-pink-800:hover{--tw-gradient-to:#9d174d}.\32xl\:hover\:to-pink-900:hover{--tw-gradient-to:#831843}.\32xl\:focus\:to-transparent:focus{--tw-gradient-to:transparent}.\32xl\:focus\:to-current:focus{--tw-gradient-to:currentColor}.\32xl\:focus\:to-black:focus{--tw-gradient-to:#000}.\32xl\:focus\:to-white:focus{--tw-gradient-to:#fff}.\32xl\:focus\:to-gray-50:focus{--tw-gradient-to:#f9fafb}.\32xl\:focus\:to-gray-100:focus{--tw-gradient-to:#f3f4f6}.\32xl\:focus\:to-gray-200:focus{--tw-gradient-to:#e5e7eb}.\32xl\:focus\:to-gray-300:focus{--tw-gradient-to:#d1d5db}.\32xl\:focus\:to-gray-400:focus{--tw-gradient-to:#9ca3af}.\32xl\:focus\:to-gray-500:focus{--tw-gradient-to:#6b7280}.\32xl\:focus\:to-gray-600:focus{--tw-gradient-to:#4b5563}.\32xl\:focus\:to-gray-700:focus{--tw-gradient-to:#374151}.\32xl\:focus\:to-gray-800:focus{--tw-gradient-to:#1f2937}.\32xl\:focus\:to-gray-900:focus{--tw-gradient-to:#111827}.\32xl\:focus\:to-red-50:focus{--tw-gradient-to:#fef2f2}.\32xl\:focus\:to-red-100:focus{--tw-gradient-to:#fee2e2}.\32xl\:focus\:to-red-200:focus{--tw-gradient-to:#fecaca}.\32xl\:focus\:to-red-300:focus{--tw-gradient-to:#fca5a5}.\32xl\:focus\:to-red-400:focus{--tw-gradient-to:#f87171}.\32xl\:focus\:to-red-500:focus{--tw-gradient-to:#ef4444}.\32xl\:focus\:to-red-600:focus{--tw-gradient-to:#dc2626}.\32xl\:focus\:to-red-700:focus{--tw-gradient-to:#b91c1c}.\32xl\:focus\:to-red-800:focus{--tw-gradient-to:#991b1b}.\32xl\:focus\:to-red-900:focus{--tw-gradient-to:#7f1d1d}.\32xl\:focus\:to-yellow-50:focus{--tw-gradient-to:#fffbeb}.\32xl\:focus\:to-yellow-100:focus{--tw-gradient-to:#fef3c7}.\32xl\:focus\:to-yellow-200:focus{--tw-gradient-to:#fde68a}.\32xl\:focus\:to-yellow-300:focus{--tw-gradient-to:#fcd34d}.\32xl\:focus\:to-yellow-400:focus{--tw-gradient-to:#fbbf24}.\32xl\:focus\:to-yellow-500:focus{--tw-gradient-to:#f59e0b}.\32xl\:focus\:to-yellow-600:focus{--tw-gradient-to:#d97706}.\32xl\:focus\:to-yellow-700:focus{--tw-gradient-to:#b45309}.\32xl\:focus\:to-yellow-800:focus{--tw-gradient-to:#92400e}.\32xl\:focus\:to-yellow-900:focus{--tw-gradient-to:#78350f}.\32xl\:focus\:to-green-50:focus{--tw-gradient-to:#ecfdf5}.\32xl\:focus\:to-green-100:focus{--tw-gradient-to:#d1fae5}.\32xl\:focus\:to-green-200:focus{--tw-gradient-to:#a7f3d0}.\32xl\:focus\:to-green-300:focus{--tw-gradient-to:#6ee7b7}.\32xl\:focus\:to-green-400:focus{--tw-gradient-to:#34d399}.\32xl\:focus\:to-green-500:focus{--tw-gradient-to:#10b981}.\32xl\:focus\:to-green-600:focus{--tw-gradient-to:#059669}.\32xl\:focus\:to-green-700:focus{--tw-gradient-to:#047857}.\32xl\:focus\:to-green-800:focus{--tw-gradient-to:#065f46}.\32xl\:focus\:to-green-900:focus{--tw-gradient-to:#064e3b}.\32xl\:focus\:to-blue-50:focus{--tw-gradient-to:#eff6ff}.\32xl\:focus\:to-blue-100:focus{--tw-gradient-to:#dbeafe}.\32xl\:focus\:to-blue-200:focus{--tw-gradient-to:#bfdbfe}.\32xl\:focus\:to-blue-300:focus{--tw-gradient-to:#93c5fd}.\32xl\:focus\:to-blue-400:focus{--tw-gradient-to:#60a5fa}.\32xl\:focus\:to-blue-500:focus{--tw-gradient-to:#3b82f6}.\32xl\:focus\:to-blue-600:focus{--tw-gradient-to:#2563eb}.\32xl\:focus\:to-blue-700:focus{--tw-gradient-to:#1d4ed8}.\32xl\:focus\:to-blue-800:focus{--tw-gradient-to:#1e40af}.\32xl\:focus\:to-blue-900:focus{--tw-gradient-to:#1e3a8a}.\32xl\:focus\:to-indigo-50:focus{--tw-gradient-to:#eef2ff}.\32xl\:focus\:to-indigo-100:focus{--tw-gradient-to:#e0e7ff}.\32xl\:focus\:to-indigo-200:focus{--tw-gradient-to:#c7d2fe}.\32xl\:focus\:to-indigo-300:focus{--tw-gradient-to:#a5b4fc}.\32xl\:focus\:to-indigo-400:focus{--tw-gradient-to:#818cf8}.\32xl\:focus\:to-indigo-500:focus{--tw-gradient-to:#6366f1}.\32xl\:focus\:to-indigo-600:focus{--tw-gradient-to:#4f46e5}.\32xl\:focus\:to-indigo-700:focus{--tw-gradient-to:#4338ca}.\32xl\:focus\:to-indigo-800:focus{--tw-gradient-to:#3730a3}.\32xl\:focus\:to-indigo-900:focus{--tw-gradient-to:#312e81}.\32xl\:focus\:to-purple-50:focus{--tw-gradient-to:#f5f3ff}.\32xl\:focus\:to-purple-100:focus{--tw-gradient-to:#ede9fe}.\32xl\:focus\:to-purple-200:focus{--tw-gradient-to:#ddd6fe}.\32xl\:focus\:to-purple-300:focus{--tw-gradient-to:#c4b5fd}.\32xl\:focus\:to-purple-400:focus{--tw-gradient-to:#a78bfa}.\32xl\:focus\:to-purple-500:focus{--tw-gradient-to:#8b5cf6}.\32xl\:focus\:to-purple-600:focus{--tw-gradient-to:#7c3aed}.\32xl\:focus\:to-purple-700:focus{--tw-gradient-to:#6d28d9}.\32xl\:focus\:to-purple-800:focus{--tw-gradient-to:#5b21b6}.\32xl\:focus\:to-purple-900:focus{--tw-gradient-to:#4c1d95}.\32xl\:focus\:to-pink-50:focus{--tw-gradient-to:#fdf2f8}.\32xl\:focus\:to-pink-100:focus{--tw-gradient-to:#fce7f3}.\32xl\:focus\:to-pink-200:focus{--tw-gradient-to:#fbcfe8}.\32xl\:focus\:to-pink-300:focus{--tw-gradient-to:#f9a8d4}.\32xl\:focus\:to-pink-400:focus{--tw-gradient-to:#f472b6}.\32xl\:focus\:to-pink-500:focus{--tw-gradient-to:#ec4899}.\32xl\:focus\:to-pink-600:focus{--tw-gradient-to:#db2777}.\32xl\:focus\:to-pink-700:focus{--tw-gradient-to:#be185d}.\32xl\:focus\:to-pink-800:focus{--tw-gradient-to:#9d174d}.\32xl\:focus\:to-pink-900:focus{--tw-gradient-to:#831843}.\32xl\:decoration-slice{-webkit-box-decoration-break:slice;box-decoration-break:slice}.\32xl\:decoration-clone{-webkit-box-decoration-break:clone;box-decoration-break:clone}.\32xl\:bg-auto{background-size:auto}.\32xl\:bg-cover{background-size:cover}.\32xl\:bg-contain{background-size:contain}.\32xl\:bg-fixed{background-attachment:fixed}.\32xl\:bg-local{background-attachment:local}.\32xl\:bg-scroll{background-attachment:scroll}.\32xl\:bg-clip-border{background-clip:initial}.\32xl\:bg-clip-padding{background-clip:padding-box}.\32xl\:bg-clip-content{background-clip:content-box}.\32xl\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.\32xl\:bg-bottom{background-position:bottom}.\32xl\:bg-center{background-position:50%}.\32xl\:bg-left{background-position:0}.\32xl\:bg-left-bottom{background-position:0 100%}.\32xl\:bg-left-top{background-position:0 0}.\32xl\:bg-right{background-position:100%}.\32xl\:bg-right-bottom{background-position:100% 100%}.\32xl\:bg-right-top{background-position:100% 0}.\32xl\:bg-top{background-position:top}.\32xl\:bg-repeat{background-repeat:repeat}.\32xl\:bg-no-repeat{background-repeat:no-repeat}.\32xl\:bg-repeat-x{background-repeat:repeat-x}.\32xl\:bg-repeat-y{background-repeat:repeat-y}.\32xl\:bg-repeat-round{background-repeat:round}.\32xl\:bg-repeat-space{background-repeat:space}.\32xl\:bg-origin-border{background-origin:border-box}.\32xl\:bg-origin-padding{background-origin:initial}.\32xl\:bg-origin-content{background-origin:content-box}.\32xl\:fill-current{fill:currentColor}.\32xl\:stroke-current{stroke:currentColor}.\32xl\:stroke-0{stroke-width:0}.\32xl\:stroke-1{stroke-width:1}.\32xl\:stroke-2{stroke-width:2}.\32xl\:object-contain{-o-object-fit:contain;object-fit:contain}.\32xl\:object-cover{-o-object-fit:cover;object-fit:cover}.\32xl\:object-fill{-o-object-fit:fill;object-fit:fill}.\32xl\:object-none{-o-object-fit:none;object-fit:none}.\32xl\:object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.\32xl\:object-bottom{-o-object-position:bottom;object-position:bottom}.\32xl\:object-center{-o-object-position:center;object-position:center}.\32xl\:object-left{-o-object-position:left;object-position:left}.\32xl\:object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.\32xl\:object-left-top{-o-object-position:left top;object-position:left top}.\32xl\:object-right{-o-object-position:right;object-position:right}.\32xl\:object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.\32xl\:object-right-top{-o-object-position:right top;object-position:right top}.\32xl\:object-top{-o-object-position:top;object-position:top}.\32xl\:p-0{padding:0}.\32xl\:p-1{padding:.25rem}.\32xl\:p-2{padding:.5rem}.\32xl\:p-3{padding:.75rem}.\32xl\:p-4{padding:1rem}.\32xl\:p-5{padding:1.25rem}.\32xl\:p-6{padding:1.5rem}.\32xl\:p-7{padding:1.75rem}.\32xl\:p-8{padding:2rem}.\32xl\:p-9{padding:2.25rem}.\32xl\:p-10{padding:2.5rem}.\32xl\:p-11{padding:2.75rem}.\32xl\:p-12{padding:3rem}.\32xl\:p-14{padding:3.5rem}.\32xl\:p-16{padding:4rem}.\32xl\:p-20{padding:5rem}.\32xl\:p-24{padding:6rem}.\32xl\:p-28{padding:7rem}.\32xl\:p-32{padding:8rem}.\32xl\:p-36{padding:9rem}.\32xl\:p-40{padding:10rem}.\32xl\:p-44{padding:11rem}.\32xl\:p-48{padding:12rem}.\32xl\:p-52{padding:13rem}.\32xl\:p-56{padding:14rem}.\32xl\:p-60{padding:15rem}.\32xl\:p-64{padding:16rem}.\32xl\:p-72{padding:18rem}.\32xl\:p-80{padding:20rem}.\32xl\:p-96{padding:24rem}.\32xl\:p-px{padding:1px}.\32xl\:p-0\.5{padding:.125rem}.\32xl\:p-1\.5{padding:.375rem}.\32xl\:p-2\.5{padding:.625rem}.\32xl\:p-3\.5{padding:.875rem}.\32xl\:px-0{padding-left:0;padding-right:0}.\32xl\:px-1{padding-left:.25rem;padding-right:.25rem}.\32xl\:px-2{padding-left:.5rem;padding-right:.5rem}.\32xl\:px-3{padding-left:.75rem;padding-right:.75rem}.\32xl\:px-4{padding-left:1rem;padding-right:1rem}.\32xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.\32xl\:px-6{padding-left:1.5rem;padding-right:1.5rem}.\32xl\:px-7{padding-left:1.75rem;padding-right:1.75rem}.\32xl\:px-8{padding-left:2rem;padding-right:2rem}.\32xl\:px-9{padding-left:2.25rem;padding-right:2.25rem}.\32xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.\32xl\:px-11{padding-left:2.75rem;padding-right:2.75rem}.\32xl\:px-12{padding-left:3rem;padding-right:3rem}.\32xl\:px-14{padding-left:3.5rem;padding-right:3.5rem}.\32xl\:px-16{padding-left:4rem;padding-right:4rem}.\32xl\:px-20{padding-left:5rem;padding-right:5rem}.\32xl\:px-24{padding-left:6rem;padding-right:6rem}.\32xl\:px-28{padding-left:7rem;padding-right:7rem}.\32xl\:px-32{padding-left:8rem;padding-right:8rem}.\32xl\:px-36{padding-left:9rem;padding-right:9rem}.\32xl\:px-40{padding-left:10rem;padding-right:10rem}.\32xl\:px-44{padding-left:11rem;padding-right:11rem}.\32xl\:px-48{padding-left:12rem;padding-right:12rem}.\32xl\:px-52{padding-left:13rem;padding-right:13rem}.\32xl\:px-56{padding-left:14rem;padding-right:14rem}.\32xl\:px-60{padding-left:15rem;padding-right:15rem}.\32xl\:px-64{padding-left:16rem;padding-right:16rem}.\32xl\:px-72{padding-left:18rem;padding-right:18rem}.\32xl\:px-80{padding-left:20rem;padding-right:20rem}.\32xl\:px-96{padding-left:24rem;padding-right:24rem}.\32xl\:px-px{padding-left:1px;padding-right:1px}.\32xl\:px-0\.5{padding-left:.125rem;padding-right:.125rem}.\32xl\:px-1\.5{padding-left:.375rem;padding-right:.375rem}.\32xl\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.\32xl\:px-3\.5{padding-left:.875rem;padding-right:.875rem}.\32xl\:py-0{padding-top:0;padding-bottom:0}.\32xl\:py-1{padding-top:.25rem;padding-bottom:.25rem}.\32xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.\32xl\:py-3{padding-top:.75rem;padding-bottom:.75rem}.\32xl\:py-4{padding-top:1rem;padding-bottom:1rem}.\32xl\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.\32xl\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.\32xl\:py-7{padding-top:1.75rem;padding-bottom:1.75rem}.\32xl\:py-8{padding-top:2rem;padding-bottom:2rem}.\32xl\:py-9{padding-top:2.25rem;padding-bottom:2.25rem}.\32xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.\32xl\:py-11{padding-top:2.75rem;padding-bottom:2.75rem}.\32xl\:py-12{padding-top:3rem;padding-bottom:3rem}.\32xl\:py-14{padding-top:3.5rem;padding-bottom:3.5rem}.\32xl\:py-16{padding-top:4rem;padding-bottom:4rem}.\32xl\:py-20{padding-top:5rem;padding-bottom:5rem}.\32xl\:py-24{padding-top:6rem;padding-bottom:6rem}.\32xl\:py-28{padding-top:7rem;padding-bottom:7rem}.\32xl\:py-32{padding-top:8rem;padding-bottom:8rem}.\32xl\:py-36{padding-top:9rem;padding-bottom:9rem}.\32xl\:py-40{padding-top:10rem;padding-bottom:10rem}.\32xl\:py-44{padding-top:11rem;padding-bottom:11rem}.\32xl\:py-48{padding-top:12rem;padding-bottom:12rem}.\32xl\:py-52{padding-top:13rem;padding-bottom:13rem}.\32xl\:py-56{padding-top:14rem;padding-bottom:14rem}.\32xl\:py-60{padding-top:15rem;padding-bottom:15rem}.\32xl\:py-64{padding-top:16rem;padding-bottom:16rem}.\32xl\:py-72{padding-top:18rem;padding-bottom:18rem}.\32xl\:py-80{padding-top:20rem;padding-bottom:20rem}.\32xl\:py-96{padding-top:24rem;padding-bottom:24rem}.\32xl\:py-px{padding-top:1px;padding-bottom:1px}.\32xl\:py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.\32xl\:py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.\32xl\:py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.\32xl\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.\32xl\:pt-0{padding-top:0}.\32xl\:pt-1{padding-top:.25rem}.\32xl\:pt-2{padding-top:.5rem}.\32xl\:pt-3{padding-top:.75rem}.\32xl\:pt-4{padding-top:1rem}.\32xl\:pt-5{padding-top:1.25rem}.\32xl\:pt-6{padding-top:1.5rem}.\32xl\:pt-7{padding-top:1.75rem}.\32xl\:pt-8{padding-top:2rem}.\32xl\:pt-9{padding-top:2.25rem}.\32xl\:pt-10{padding-top:2.5rem}.\32xl\:pt-11{padding-top:2.75rem}.\32xl\:pt-12{padding-top:3rem}.\32xl\:pt-14{padding-top:3.5rem}.\32xl\:pt-16{padding-top:4rem}.\32xl\:pt-20{padding-top:5rem}.\32xl\:pt-24{padding-top:6rem}.\32xl\:pt-28{padding-top:7rem}.\32xl\:pt-32{padding-top:8rem}.\32xl\:pt-36{padding-top:9rem}.\32xl\:pt-40{padding-top:10rem}.\32xl\:pt-44{padding-top:11rem}.\32xl\:pt-48{padding-top:12rem}.\32xl\:pt-52{padding-top:13rem}.\32xl\:pt-56{padding-top:14rem}.\32xl\:pt-60{padding-top:15rem}.\32xl\:pt-64{padding-top:16rem}.\32xl\:pt-72{padding-top:18rem}.\32xl\:pt-80{padding-top:20rem}.\32xl\:pt-96{padding-top:24rem}.\32xl\:pt-px{padding-top:1px}.\32xl\:pt-0\.5{padding-top:.125rem}.\32xl\:pt-1\.5{padding-top:.375rem}.\32xl\:pt-2\.5{padding-top:.625rem}.\32xl\:pt-3\.5{padding-top:.875rem}.\32xl\:pr-0{padding-right:0}.\32xl\:pr-1{padding-right:.25rem}.\32xl\:pr-2{padding-right:.5rem}.\32xl\:pr-3{padding-right:.75rem}.\32xl\:pr-4{padding-right:1rem}.\32xl\:pr-5{padding-right:1.25rem}.\32xl\:pr-6{padding-right:1.5rem}.\32xl\:pr-7{padding-right:1.75rem}.\32xl\:pr-8{padding-right:2rem}.\32xl\:pr-9{padding-right:2.25rem}.\32xl\:pr-10{padding-right:2.5rem}.\32xl\:pr-11{padding-right:2.75rem}.\32xl\:pr-12{padding-right:3rem}.\32xl\:pr-14{padding-right:3.5rem}.\32xl\:pr-16{padding-right:4rem}.\32xl\:pr-20{padding-right:5rem}.\32xl\:pr-24{padding-right:6rem}.\32xl\:pr-28{padding-right:7rem}.\32xl\:pr-32{padding-right:8rem}.\32xl\:pr-36{padding-right:9rem}.\32xl\:pr-40{padding-right:10rem}.\32xl\:pr-44{padding-right:11rem}.\32xl\:pr-48{padding-right:12rem}.\32xl\:pr-52{padding-right:13rem}.\32xl\:pr-56{padding-right:14rem}.\32xl\:pr-60{padding-right:15rem}.\32xl\:pr-64{padding-right:16rem}.\32xl\:pr-72{padding-right:18rem}.\32xl\:pr-80{padding-right:20rem}.\32xl\:pr-96{padding-right:24rem}.\32xl\:pr-px{padding-right:1px}.\32xl\:pr-0\.5{padding-right:.125rem}.\32xl\:pr-1\.5{padding-right:.375rem}.\32xl\:pr-2\.5{padding-right:.625rem}.\32xl\:pr-3\.5{padding-right:.875rem}.\32xl\:pb-0{padding-bottom:0}.\32xl\:pb-1{padding-bottom:.25rem}.\32xl\:pb-2{padding-bottom:.5rem}.\32xl\:pb-3{padding-bottom:.75rem}.\32xl\:pb-4{padding-bottom:1rem}.\32xl\:pb-5{padding-bottom:1.25rem}.\32xl\:pb-6{padding-bottom:1.5rem}.\32xl\:pb-7{padding-bottom:1.75rem}.\32xl\:pb-8{padding-bottom:2rem}.\32xl\:pb-9{padding-bottom:2.25rem}.\32xl\:pb-10{padding-bottom:2.5rem}.\32xl\:pb-11{padding-bottom:2.75rem}.\32xl\:pb-12{padding-bottom:3rem}.\32xl\:pb-14{padding-bottom:3.5rem}.\32xl\:pb-16{padding-bottom:4rem}.\32xl\:pb-20{padding-bottom:5rem}.\32xl\:pb-24{padding-bottom:6rem}.\32xl\:pb-28{padding-bottom:7rem}.\32xl\:pb-32{padding-bottom:8rem}.\32xl\:pb-36{padding-bottom:9rem}.\32xl\:pb-40{padding-bottom:10rem}.\32xl\:pb-44{padding-bottom:11rem}.\32xl\:pb-48{padding-bottom:12rem}.\32xl\:pb-52{padding-bottom:13rem}.\32xl\:pb-56{padding-bottom:14rem}.\32xl\:pb-60{padding-bottom:15rem}.\32xl\:pb-64{padding-bottom:16rem}.\32xl\:pb-72{padding-bottom:18rem}.\32xl\:pb-80{padding-bottom:20rem}.\32xl\:pb-96{padding-bottom:24rem}.\32xl\:pb-px{padding-bottom:1px}.\32xl\:pb-0\.5{padding-bottom:.125rem}.\32xl\:pb-1\.5{padding-bottom:.375rem}.\32xl\:pb-2\.5{padding-bottom:.625rem}.\32xl\:pb-3\.5{padding-bottom:.875rem}.\32xl\:pl-0{padding-left:0}.\32xl\:pl-1{padding-left:.25rem}.\32xl\:pl-2{padding-left:.5rem}.\32xl\:pl-3{padding-left:.75rem}.\32xl\:pl-4{padding-left:1rem}.\32xl\:pl-5{padding-left:1.25rem}.\32xl\:pl-6{padding-left:1.5rem}.\32xl\:pl-7{padding-left:1.75rem}.\32xl\:pl-8{padding-left:2rem}.\32xl\:pl-9{padding-left:2.25rem}.\32xl\:pl-10{padding-left:2.5rem}.\32xl\:pl-11{padding-left:2.75rem}.\32xl\:pl-12{padding-left:3rem}.\32xl\:pl-14{padding-left:3.5rem}.\32xl\:pl-16{padding-left:4rem}.\32xl\:pl-20{padding-left:5rem}.\32xl\:pl-24{padding-left:6rem}.\32xl\:pl-28{padding-left:7rem}.\32xl\:pl-32{padding-left:8rem}.\32xl\:pl-36{padding-left:9rem}.\32xl\:pl-40{padding-left:10rem}.\32xl\:pl-44{padding-left:11rem}.\32xl\:pl-48{padding-left:12rem}.\32xl\:pl-52{padding-left:13rem}.\32xl\:pl-56{padding-left:14rem}.\32xl\:pl-60{padding-left:15rem}.\32xl\:pl-64{padding-left:16rem}.\32xl\:pl-72{padding-left:18rem}.\32xl\:pl-80{padding-left:20rem}.\32xl\:pl-96{padding-left:24rem}.\32xl\:pl-px{padding-left:1px}.\32xl\:pl-0\.5{padding-left:.125rem}.\32xl\:pl-1\.5{padding-left:.375rem}.\32xl\:pl-2\.5{padding-left:.625rem}.\32xl\:pl-3\.5{padding-left:.875rem}.\32xl\:text-left{text-align:left}.\32xl\:text-center{text-align:center}.\32xl\:text-right{text-align:right}.\32xl\:text-justify{text-align:justify}.\32xl\:align-baseline{vertical-align:initial}.\32xl\:align-top{vertical-align:top}.\32xl\:align-middle{vertical-align:middle}.\32xl\:align-bottom{vertical-align:bottom}.\32xl\:align-text-top{vertical-align:text-top}.\32xl\:align-text-bottom{vertical-align:text-bottom}.\32xl\:font-sans{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.\32xl\:font-serif{font-family:ui-serif,Georgia,Cambria,Times New Roman,Times,serif}.\32xl\:font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.\32xl\:text-xs{font-size:.75rem;line-height:1rem}.\32xl\:text-sm{font-size:.875rem;line-height:1.25rem}.\32xl\:text-base{font-size:1rem;line-height:1.5rem}.\32xl\:text-lg{font-size:1.125rem;line-height:1.75rem}.\32xl\:text-xl{font-size:1.25rem;line-height:1.75rem}.\32xl\:text-2xl{font-size:1.5rem;line-height:2rem}.\32xl\:text-3xl{font-size:1.875rem;line-height:2.25rem}.\32xl\:text-4xl{font-size:2.25rem;line-height:2.5rem}.\32xl\:text-5xl{font-size:3rem;line-height:1}.\32xl\:text-6xl{font-size:3.75rem;line-height:1}.\32xl\:text-7xl{font-size:4.5rem;line-height:1}.\32xl\:text-8xl{font-size:6rem;line-height:1}.\32xl\:text-9xl{font-size:8rem;line-height:1}.\32xl\:font-thin{font-weight:100}.\32xl\:font-extralight{font-weight:200}.\32xl\:font-light{font-weight:300}.\32xl\:font-normal{font-weight:400}.\32xl\:font-medium{font-weight:500}.\32xl\:font-semibold{font-weight:600}.\32xl\:font-bold{font-weight:700}.\32xl\:font-extrabold{font-weight:800}.\32xl\:font-black{font-weight:900}.\32xl\:uppercase{text-transform:uppercase}.\32xl\:lowercase{text-transform:lowercase}.\32xl\:capitalize{text-transform:capitalize}.\32xl\:normal-case{text-transform:none}.\32xl\:italic{font-style:italic}.\32xl\:not-italic{font-style:normal}.\32xl\:diagonal-fractions,.\32xl\:lining-nums,.\32xl\:oldstyle-nums,.\32xl\:ordinal,.\32xl\:proportional-nums,.\32xl\:slashed-zero,.\32xl\:stacked-fractions,.\32xl\:tabular-nums{--tw-ordinal:var(--tw-empty,/*!*/ /*!*/);--tw-slashed-zero:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-figure:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-spacing:var(--tw-empty,/*!*/ /*!*/);--tw-numeric-fraction:var(--tw-empty,/*!*/ /*!*/);font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.\32xl\:normal-nums{font-variant-numeric:normal}.\32xl\:ordinal{--tw-ordinal:ordinal}.\32xl\:slashed-zero{--tw-slashed-zero:slashed-zero}.\32xl\:lining-nums{--tw-numeric-figure:lining-nums}.\32xl\:oldstyle-nums{--tw-numeric-figure:oldstyle-nums}.\32xl\:proportional-nums{--tw-numeric-spacing:proportional-nums}.\32xl\:tabular-nums{--tw-numeric-spacing:tabular-nums}.\32xl\:diagonal-fractions{--tw-numeric-fraction:diagonal-fractions}.\32xl\:stacked-fractions{--tw-numeric-fraction:stacked-fractions}.\32xl\:leading-3{line-height:.75rem}.\32xl\:leading-4{line-height:1rem}.\32xl\:leading-5{line-height:1.25rem}.\32xl\:leading-6{line-height:1.5rem}.\32xl\:leading-7{line-height:1.75rem}.\32xl\:leading-8{line-height:2rem}.\32xl\:leading-9{line-height:2.25rem}.\32xl\:leading-10{line-height:2.5rem}.\32xl\:leading-none{line-height:1}.\32xl\:leading-tight{line-height:1.25}.\32xl\:leading-snug{line-height:1.375}.\32xl\:leading-normal{line-height:1.5}.\32xl\:leading-relaxed{line-height:1.625}.\32xl\:leading-loose{line-height:2}.\32xl\:tracking-tighter{letter-spacing:-.05em}.\32xl\:tracking-tight{letter-spacing:-.025em}.\32xl\:tracking-normal{letter-spacing:0}.\32xl\:tracking-wide{letter-spacing:.025em}.\32xl\:tracking-wider{letter-spacing:.05em}.\32xl\:tracking-widest{letter-spacing:.1em}.\32xl\:text-transparent{color:transparent}.\32xl\:text-current{color:currentColor}.\32xl\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-transparent{color:transparent}.group:hover .\32xl\:group-hover\:text-current{color:currentColor}.group:hover .\32xl\:group-hover\:text-black{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-50{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-100{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-200{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-300{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-400{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-600{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-700{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-800{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-gray-900{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-50{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-100{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-200{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-300{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-400{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-800{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-red-900{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-50{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-200{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-300{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-400{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-800{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-yellow-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-50{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-100{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-200{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-300{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-400{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-500{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-800{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-green-900{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-50{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-100{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-200{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-300{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-400{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-500{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-600{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-700{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-800{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-blue-900{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-50{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-100{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-200{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-300{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-400{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-500{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-600{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-700{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-800{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-indigo-900{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-50{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-100{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-200{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-300{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-400{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-500{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-600{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-700{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-800{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-purple-900{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-50{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-100{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-200{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-300{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-400{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-500{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-600{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-700{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-800{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.group:hover .\32xl\:group-hover\:text-pink-900{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:focus-within\:text-transparent:focus-within{color:transparent}.\32xl\:focus-within\:text-current:focus-within{color:currentColor}.\32xl\:focus-within\:text-black:focus-within{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:focus-within\:text-white:focus-within{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-50:focus-within{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-100:focus-within{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-200:focus-within{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-300:focus-within{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-400:focus-within{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-500:focus-within{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-600:focus-within{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-700:focus-within{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-800:focus-within{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:focus-within\:text-gray-900:focus-within{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-50:focus-within{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-100:focus-within{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-200:focus-within{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-300:focus-within{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-400:focus-within{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-500:focus-within{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-600:focus-within{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-700:focus-within{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-800:focus-within{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:focus-within\:text-red-900:focus-within{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-50:focus-within{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-100:focus-within{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-200:focus-within{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-300:focus-within{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-400:focus-within{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-500:focus-within{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-600:focus-within{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-700:focus-within{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-800:focus-within{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:focus-within\:text-yellow-900:focus-within{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-50:focus-within{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-100:focus-within{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-200:focus-within{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-300:focus-within{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-400:focus-within{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-500:focus-within{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-600:focus-within{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-700:focus-within{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-800:focus-within{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:focus-within\:text-green-900:focus-within{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-50:focus-within{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-100:focus-within{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-200:focus-within{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-300:focus-within{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-400:focus-within{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-500:focus-within{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-600:focus-within{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-700:focus-within{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-800:focus-within{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:focus-within\:text-blue-900:focus-within{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-50:focus-within{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-100:focus-within{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-200:focus-within{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-300:focus-within{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-400:focus-within{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-500:focus-within{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-600:focus-within{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-700:focus-within{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-800:focus-within{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:focus-within\:text-indigo-900:focus-within{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-50:focus-within{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-100:focus-within{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-200:focus-within{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-300:focus-within{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-400:focus-within{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-500:focus-within{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-600:focus-within{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-700:focus-within{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-800:focus-within{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:focus-within\:text-purple-900:focus-within{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-50:focus-within{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-100:focus-within{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-200:focus-within{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-300:focus-within{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-400:focus-within{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-500:focus-within{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-600:focus-within{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-700:focus-within{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-800:focus-within{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:focus-within\:text-pink-900:focus-within{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:hover\:text-transparent:hover{color:transparent}.\32xl\:hover\:text-current:hover{color:currentColor}.\32xl\:hover\:text-black:hover{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-50:hover{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-100:hover{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-300:hover{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:hover\:text-red-50:hover{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:hover\:text-red-100:hover{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:hover\:text-red-200:hover{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:hover\:text-red-300:hover{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:hover\:text-red-400:hover{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:hover\:text-red-500:hover{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:hover\:text-red-600:hover{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:hover\:text-red-700:hover{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:hover\:text-red-900:hover{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-50:hover{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-100:hover{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-200:hover{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-300:hover{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-600:hover{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-700:hover{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-800:hover{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:hover\:text-green-50:hover{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:hover\:text-green-100:hover{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:hover\:text-green-200:hover{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:hover\:text-green-300:hover{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:hover\:text-green-400:hover{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:hover\:text-green-500:hover{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:hover\:text-green-600:hover{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:hover\:text-green-800:hover{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:hover\:text-green-900:hover{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-50:hover{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-100:hover{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-200:hover{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-400:hover{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-500:hover{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-50:hover{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-100:hover{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-200:hover{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-300:hover{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-400:hover{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-600:hover{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-700:hover{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-800:hover{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-50:hover{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-100:hover{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-200:hover{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-400:hover{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-500:hover{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-600:hover{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-700:hover{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-800:hover{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-50:hover{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-100:hover{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-200:hover{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-300:hover{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-400:hover{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-500:hover{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-600:hover{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-700:hover{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-800:hover{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:focus\:text-transparent:focus{color:transparent}.\32xl\:focus\:text-current:focus{color:currentColor}.\32xl\:focus\:text-black:focus{--tw-text-opacity:1;color:rgba(0,0,0,var(--tw-text-opacity))}.\32xl\:focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-50:focus{--tw-text-opacity:1;color:rgba(249,250,251,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-100:focus{--tw-text-opacity:1;color:rgba(243,244,246,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-200:focus{--tw-text-opacity:1;color:rgba(229,231,235,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-300:focus{--tw-text-opacity:1;color:rgba(209,213,219,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-400:focus{--tw-text-opacity:1;color:rgba(156,163,175,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-500:focus{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-600:focus{--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(55,65,81,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-800:focus{--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}.\32xl\:focus\:text-gray-900:focus{--tw-text-opacity:1;color:rgba(17,24,39,var(--tw-text-opacity))}.\32xl\:focus\:text-red-50:focus{--tw-text-opacity:1;color:rgba(254,242,242,var(--tw-text-opacity))}.\32xl\:focus\:text-red-100:focus{--tw-text-opacity:1;color:rgba(254,226,226,var(--tw-text-opacity))}.\32xl\:focus\:text-red-200:focus{--tw-text-opacity:1;color:rgba(254,202,202,var(--tw-text-opacity))}.\32xl\:focus\:text-red-300:focus{--tw-text-opacity:1;color:rgba(252,165,165,var(--tw-text-opacity))}.\32xl\:focus\:text-red-400:focus{--tw-text-opacity:1;color:rgba(248,113,113,var(--tw-text-opacity))}.\32xl\:focus\:text-red-500:focus{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity))}.\32xl\:focus\:text-red-600:focus{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity))}.\32xl\:focus\:text-red-700:focus{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity))}.\32xl\:focus\:text-red-800:focus{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity))}.\32xl\:focus\:text-red-900:focus{--tw-text-opacity:1;color:rgba(127,29,29,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-50:focus{--tw-text-opacity:1;color:rgba(255,251,235,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-100:focus{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-200:focus{--tw-text-opacity:1;color:rgba(253,230,138,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-300:focus{--tw-text-opacity:1;color:rgba(252,211,77,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-400:focus{--tw-text-opacity:1;color:rgba(251,191,36,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-500:focus{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-600:focus{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-700:focus{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-800:focus{--tw-text-opacity:1;color:rgba(146,64,14,var(--tw-text-opacity))}.\32xl\:focus\:text-yellow-900:focus{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.\32xl\:focus\:text-green-50:focus{--tw-text-opacity:1;color:rgba(236,253,245,var(--tw-text-opacity))}.\32xl\:focus\:text-green-100:focus{--tw-text-opacity:1;color:rgba(209,250,229,var(--tw-text-opacity))}.\32xl\:focus\:text-green-200:focus{--tw-text-opacity:1;color:rgba(167,243,208,var(--tw-text-opacity))}.\32xl\:focus\:text-green-300:focus{--tw-text-opacity:1;color:rgba(110,231,183,var(--tw-text-opacity))}.\32xl\:focus\:text-green-400:focus{--tw-text-opacity:1;color:rgba(52,211,153,var(--tw-text-opacity))}.\32xl\:focus\:text-green-500:focus{--tw-text-opacity:1;color:rgba(16,185,129,var(--tw-text-opacity))}.\32xl\:focus\:text-green-600:focus{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity))}.\32xl\:focus\:text-green-700:focus{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity))}.\32xl\:focus\:text-green-800:focus{--tw-text-opacity:1;color:rgba(6,95,70,var(--tw-text-opacity))}.\32xl\:focus\:text-green-900:focus{--tw-text-opacity:1;color:rgba(6,78,59,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-50:focus{--tw-text-opacity:1;color:rgba(239,246,255,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-100:focus{--tw-text-opacity:1;color:rgba(219,234,254,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-200:focus{--tw-text-opacity:1;color:rgba(191,219,254,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-300:focus{--tw-text-opacity:1;color:rgba(147,197,253,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-400:focus{--tw-text-opacity:1;color:rgba(96,165,250,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-500:focus{--tw-text-opacity:1;color:rgba(59,130,246,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-600:focus{--tw-text-opacity:1;color:rgba(37,99,235,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgba(29,78,216,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-800:focus{--tw-text-opacity:1;color:rgba(30,64,175,var(--tw-text-opacity))}.\32xl\:focus\:text-blue-900:focus{--tw-text-opacity:1;color:rgba(30,58,138,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-50:focus{--tw-text-opacity:1;color:rgba(238,242,255,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-100:focus{--tw-text-opacity:1;color:rgba(224,231,255,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-200:focus{--tw-text-opacity:1;color:rgba(199,210,254,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-300:focus{--tw-text-opacity:1;color:rgba(165,180,252,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-400:focus{--tw-text-opacity:1;color:rgba(129,140,248,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-500:focus{--tw-text-opacity:1;color:rgba(99,102,241,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-600:focus{--tw-text-opacity:1;color:rgba(79,70,229,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-700:focus{--tw-text-opacity:1;color:rgba(67,56,202,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-800:focus{--tw-text-opacity:1;color:rgba(55,48,163,var(--tw-text-opacity))}.\32xl\:focus\:text-indigo-900:focus{--tw-text-opacity:1;color:rgba(49,46,129,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-50:focus{--tw-text-opacity:1;color:rgba(245,243,255,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-100:focus{--tw-text-opacity:1;color:rgba(237,233,254,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-200:focus{--tw-text-opacity:1;color:rgba(221,214,254,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-300:focus{--tw-text-opacity:1;color:rgba(196,181,253,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-400:focus{--tw-text-opacity:1;color:rgba(167,139,250,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-500:focus{--tw-text-opacity:1;color:rgba(139,92,246,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-600:focus{--tw-text-opacity:1;color:rgba(124,58,237,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-700:focus{--tw-text-opacity:1;color:rgba(109,40,217,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-800:focus{--tw-text-opacity:1;color:rgba(91,33,182,var(--tw-text-opacity))}.\32xl\:focus\:text-purple-900:focus{--tw-text-opacity:1;color:rgba(76,29,149,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-50:focus{--tw-text-opacity:1;color:rgba(253,242,248,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-100:focus{--tw-text-opacity:1;color:rgba(252,231,243,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-200:focus{--tw-text-opacity:1;color:rgba(251,207,232,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-300:focus{--tw-text-opacity:1;color:rgba(249,168,212,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-400:focus{--tw-text-opacity:1;color:rgba(244,114,182,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-500:focus{--tw-text-opacity:1;color:rgba(236,72,153,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-600:focus{--tw-text-opacity:1;color:rgba(219,39,119,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-700:focus{--tw-text-opacity:1;color:rgba(190,24,93,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-800:focus{--tw-text-opacity:1;color:rgba(157,23,77,var(--tw-text-opacity))}.\32xl\:focus\:text-pink-900:focus{--tw-text-opacity:1;color:rgba(131,24,67,var(--tw-text-opacity))}.\32xl\:text-opacity-0{--tw-text-opacity:0}.\32xl\:text-opacity-5{--tw-text-opacity:0.05}.\32xl\:text-opacity-10{--tw-text-opacity:0.1}.\32xl\:text-opacity-20{--tw-text-opacity:0.2}.\32xl\:text-opacity-25{--tw-text-opacity:0.25}.\32xl\:text-opacity-30{--tw-text-opacity:0.3}.\32xl\:text-opacity-40{--tw-text-opacity:0.4}.\32xl\:text-opacity-50{--tw-text-opacity:0.5}.\32xl\:text-opacity-60{--tw-text-opacity:0.6}.\32xl\:text-opacity-70{--tw-text-opacity:0.7}.\32xl\:text-opacity-75{--tw-text-opacity:0.75}.\32xl\:text-opacity-80{--tw-text-opacity:0.8}.\32xl\:text-opacity-90{--tw-text-opacity:0.9}.\32xl\:text-opacity-95{--tw-text-opacity:0.95}.\32xl\:text-opacity-100{--tw-text-opacity:1}.group:hover .\32xl\:group-hover\:text-opacity-0{--tw-text-opacity:0}.group:hover .\32xl\:group-hover\:text-opacity-5{--tw-text-opacity:0.05}.group:hover .\32xl\:group-hover\:text-opacity-10{--tw-text-opacity:0.1}.group:hover .\32xl\:group-hover\:text-opacity-20{--tw-text-opacity:0.2}.group:hover .\32xl\:group-hover\:text-opacity-25{--tw-text-opacity:0.25}.group:hover .\32xl\:group-hover\:text-opacity-30{--tw-text-opacity:0.3}.group:hover .\32xl\:group-hover\:text-opacity-40{--tw-text-opacity:0.4}.group:hover .\32xl\:group-hover\:text-opacity-50{--tw-text-opacity:0.5}.group:hover .\32xl\:group-hover\:text-opacity-60{--tw-text-opacity:0.6}.group:hover .\32xl\:group-hover\:text-opacity-70{--tw-text-opacity:0.7}.group:hover .\32xl\:group-hover\:text-opacity-75{--tw-text-opacity:0.75}.group:hover .\32xl\:group-hover\:text-opacity-80{--tw-text-opacity:0.8}.group:hover .\32xl\:group-hover\:text-opacity-90{--tw-text-opacity:0.9}.group:hover .\32xl\:group-hover\:text-opacity-95{--tw-text-opacity:0.95}.group:hover .\32xl\:group-hover\:text-opacity-100{--tw-text-opacity:1}.\32xl\:focus-within\:text-opacity-0:focus-within{--tw-text-opacity:0}.\32xl\:focus-within\:text-opacity-5:focus-within{--tw-text-opacity:0.05}.\32xl\:focus-within\:text-opacity-10:focus-within{--tw-text-opacity:0.1}.\32xl\:focus-within\:text-opacity-20:focus-within{--tw-text-opacity:0.2}.\32xl\:focus-within\:text-opacity-25:focus-within{--tw-text-opacity:0.25}.\32xl\:focus-within\:text-opacity-30:focus-within{--tw-text-opacity:0.3}.\32xl\:focus-within\:text-opacity-40:focus-within{--tw-text-opacity:0.4}.\32xl\:focus-within\:text-opacity-50:focus-within{--tw-text-opacity:0.5}.\32xl\:focus-within\:text-opacity-60:focus-within{--tw-text-opacity:0.6}.\32xl\:focus-within\:text-opacity-70:focus-within{--tw-text-opacity:0.7}.\32xl\:focus-within\:text-opacity-75:focus-within{--tw-text-opacity:0.75}.\32xl\:focus-within\:text-opacity-80:focus-within{--tw-text-opacity:0.8}.\32xl\:focus-within\:text-opacity-90:focus-within{--tw-text-opacity:0.9}.\32xl\:focus-within\:text-opacity-95:focus-within{--tw-text-opacity:0.95}.\32xl\:focus-within\:text-opacity-100:focus-within{--tw-text-opacity:1}.\32xl\:hover\:text-opacity-0:hover{--tw-text-opacity:0}.\32xl\:hover\:text-opacity-5:hover{--tw-text-opacity:0.05}.\32xl\:hover\:text-opacity-10:hover{--tw-text-opacity:0.1}.\32xl\:hover\:text-opacity-20:hover{--tw-text-opacity:0.2}.\32xl\:hover\:text-opacity-25:hover{--tw-text-opacity:0.25}.\32xl\:hover\:text-opacity-30:hover{--tw-text-opacity:0.3}.\32xl\:hover\:text-opacity-40:hover{--tw-text-opacity:0.4}.\32xl\:hover\:text-opacity-50:hover{--tw-text-opacity:0.5}.\32xl\:hover\:text-opacity-60:hover{--tw-text-opacity:0.6}.\32xl\:hover\:text-opacity-70:hover{--tw-text-opacity:0.7}.\32xl\:hover\:text-opacity-75:hover{--tw-text-opacity:0.75}.\32xl\:hover\:text-opacity-80:hover{--tw-text-opacity:0.8}.\32xl\:hover\:text-opacity-90:hover{--tw-text-opacity:0.9}.\32xl\:hover\:text-opacity-95:hover{--tw-text-opacity:0.95}.\32xl\:hover\:text-opacity-100:hover{--tw-text-opacity:1}.\32xl\:focus\:text-opacity-0:focus{--tw-text-opacity:0}.\32xl\:focus\:text-opacity-5:focus{--tw-text-opacity:0.05}.\32xl\:focus\:text-opacity-10:focus{--tw-text-opacity:0.1}.\32xl\:focus\:text-opacity-20:focus{--tw-text-opacity:0.2}.\32xl\:focus\:text-opacity-25:focus{--tw-text-opacity:0.25}.\32xl\:focus\:text-opacity-30:focus{--tw-text-opacity:0.3}.\32xl\:focus\:text-opacity-40:focus{--tw-text-opacity:0.4}.\32xl\:focus\:text-opacity-50:focus{--tw-text-opacity:0.5}.\32xl\:focus\:text-opacity-60:focus{--tw-text-opacity:0.6}.\32xl\:focus\:text-opacity-70:focus{--tw-text-opacity:0.7}.\32xl\:focus\:text-opacity-75:focus{--tw-text-opacity:0.75}.\32xl\:focus\:text-opacity-80:focus{--tw-text-opacity:0.8}.\32xl\:focus\:text-opacity-90:focus{--tw-text-opacity:0.9}.\32xl\:focus\:text-opacity-95:focus{--tw-text-opacity:0.95}.\32xl\:focus\:text-opacity-100:focus{--tw-text-opacity:1}.\32xl\:underline{text-decoration:underline}.\32xl\:line-through{text-decoration:line-through}.\32xl\:no-underline{text-decoration:none}.group:hover .\32xl\:group-hover\:underline{text-decoration:underline}.group:hover .\32xl\:group-hover\:line-through{text-decoration:line-through}.group:hover .\32xl\:group-hover\:no-underline{text-decoration:none}.\32xl\:focus-within\:underline:focus-within{text-decoration:underline}.\32xl\:focus-within\:line-through:focus-within{text-decoration:line-through}.\32xl\:focus-within\:no-underline:focus-within{text-decoration:none}.\32xl\:hover\:underline:hover{text-decoration:underline}.\32xl\:hover\:line-through:hover{text-decoration:line-through}.\32xl\:hover\:no-underline:hover{text-decoration:none}.\32xl\:focus\:underline:focus{text-decoration:underline}.\32xl\:focus\:line-through:focus{text-decoration:line-through}.\32xl\:focus\:no-underline:focus{text-decoration:none}.\32xl\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.\32xl\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.\32xl\:placeholder-transparent::-moz-placeholder{color:transparent}.\32xl\:placeholder-transparent:-ms-input-placeholder{color:transparent}.\32xl\:placeholder-transparent::placeholder{color:transparent}.\32xl\:placeholder-current::-moz-placeholder{color:currentColor}.\32xl\:placeholder-current:-ms-input-placeholder{color:currentColor}.\32xl\:placeholder-current::placeholder{color:currentColor}.\32xl\:placeholder-black::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:placeholder-black:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:placeholder-black::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:placeholder-white::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-white:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-white::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-50::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-100::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-200::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-300::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-600::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-700::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:placeholder-gray-900::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-50::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-200::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-400::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-500::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-600::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-800::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:placeholder-red-900::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-50::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-100::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-200::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-300::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-400::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-500::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-600::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-700::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-800::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:placeholder-yellow-900::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-50::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-100::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-200::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-300::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-400::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-500::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-600::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-800::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:placeholder-green-900::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-50::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-100::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-200::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-300::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-400::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-500::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-600::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-700::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-800::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-blue-900::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-50::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-100::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-200::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-300::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-400::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-500::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-600::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-700::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-800::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-indigo-900::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-50::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-100::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-200::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-300::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-400::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-500::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-600::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-700::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-800::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:placeholder-purple-900::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-50::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-50:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-50::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-100::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-100:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-100::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-200::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-200:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-200::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-300::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-300:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-300::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-400::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-500::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-600::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-600:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-600::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-700:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-700::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-800::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-800:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-800::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-900::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-900:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:placeholder-pink-900::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-transparent:focus::-moz-placeholder{color:transparent}.\32xl\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.\32xl\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.\32xl\:focus\:placeholder-current:focus::-moz-placeholder{color:currentColor}.\32xl\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.\32xl\:focus\:placeholder-current:focus::placeholder{color:currentColor}.\32xl\:focus\:placeholder-black:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-black:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-black:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(0,0,0,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-white:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-white:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-white:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,255,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,250,251,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(243,244,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(229,231,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,213,219,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(156,163,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(107,114,128,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(75,85,99,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,65,81,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(31,41,55,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-gray-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(17,24,39,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,242,242,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,226,226,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,202,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,165,165,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(248,113,113,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,68,68,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(220,38,38,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(185,28,28,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(153,27,27,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-red-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(127,29,29,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(255,251,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(254,243,199,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,230,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,211,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,191,36,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,158,11,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(217,119,6,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(180,83,9,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(146,64,14,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-yellow-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,53,15,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,253,245,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(209,250,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,243,208,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(110,231,183,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(52,211,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(16,185,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(5,150,105,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(4,120,87,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,95,70,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-green-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(6,78,59,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(239,246,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,234,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(191,219,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(147,197,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(96,165,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(59,130,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(37,99,235,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(29,78,216,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,64,175,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-blue-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(30,58,138,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(238,242,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(224,231,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(199,210,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(165,180,252,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(129,140,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(99,102,241,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(79,70,229,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(67,56,202,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(55,48,163,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-indigo-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(49,46,129,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(245,243,255,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(237,233,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(221,214,254,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(196,181,253,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(167,139,250,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(139,92,246,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(124,58,237,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(109,40,217,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(91,33,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-purple-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(76,29,149,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-50:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-50:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(253,242,248,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-100:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-100:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(252,231,243,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-200:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-200:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(251,207,232,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-300:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-300:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(249,168,212,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(244,114,182,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(236,72,153,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-600:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-600:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(219,39,119,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-700:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-700:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(190,24,93,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-800:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-800:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(157,23,77,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-900:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:focus\:placeholder-pink-900:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(131,24,67,var(--tw-placeholder-opacity))}.\32xl\:placeholder-opacity-0::-moz-placeholder{--tw-placeholder-opacity:0}.\32xl\:placeholder-opacity-0:-ms-input-placeholder{--tw-placeholder-opacity:0}.\32xl\:placeholder-opacity-0::placeholder{--tw-placeholder-opacity:0}.\32xl\:placeholder-opacity-5::-moz-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:placeholder-opacity-5:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:placeholder-opacity-5::placeholder{--tw-placeholder-opacity:0.05}.\32xl\:placeholder-opacity-10::-moz-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:placeholder-opacity-10:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:placeholder-opacity-10::placeholder{--tw-placeholder-opacity:0.1}.\32xl\:placeholder-opacity-20::-moz-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:placeholder-opacity-20:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:placeholder-opacity-20::placeholder{--tw-placeholder-opacity:0.2}.\32xl\:placeholder-opacity-25::-moz-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:placeholder-opacity-25:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:placeholder-opacity-25::placeholder{--tw-placeholder-opacity:0.25}.\32xl\:placeholder-opacity-30::-moz-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:placeholder-opacity-30:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:placeholder-opacity-30::placeholder{--tw-placeholder-opacity:0.3}.\32xl\:placeholder-opacity-40::-moz-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:placeholder-opacity-40:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:placeholder-opacity-40::placeholder{--tw-placeholder-opacity:0.4}.\32xl\:placeholder-opacity-50::-moz-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:placeholder-opacity-50:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:placeholder-opacity-50::placeholder{--tw-placeholder-opacity:0.5}.\32xl\:placeholder-opacity-60::-moz-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:placeholder-opacity-60:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:placeholder-opacity-60::placeholder{--tw-placeholder-opacity:0.6}.\32xl\:placeholder-opacity-70::-moz-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:placeholder-opacity-70:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:placeholder-opacity-70::placeholder{--tw-placeholder-opacity:0.7}.\32xl\:placeholder-opacity-75::-moz-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:placeholder-opacity-75:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:placeholder-opacity-75::placeholder{--tw-placeholder-opacity:0.75}.\32xl\:placeholder-opacity-80::-moz-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:placeholder-opacity-80:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:placeholder-opacity-80::placeholder{--tw-placeholder-opacity:0.8}.\32xl\:placeholder-opacity-90::-moz-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:placeholder-opacity-90:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:placeholder-opacity-90::placeholder{--tw-placeholder-opacity:0.9}.\32xl\:placeholder-opacity-95::-moz-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:placeholder-opacity-95:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:placeholder-opacity-95::placeholder{--tw-placeholder-opacity:0.95}.\32xl\:placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.\32xl\:placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.\32xl\:placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.\32xl\:focus\:placeholder-opacity-0:focus::-moz-placeholder{--tw-placeholder-opacity:0}.\32xl\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--tw-placeholder-opacity:0}.\32xl\:focus\:placeholder-opacity-0:focus::placeholder{--tw-placeholder-opacity:0}.\32xl\:focus\:placeholder-opacity-5:focus::-moz-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:focus\:placeholder-opacity-5:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.05}.\32xl\:focus\:placeholder-opacity-5:focus::placeholder{--tw-placeholder-opacity:0.05}.\32xl\:focus\:placeholder-opacity-10:focus::-moz-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:focus\:placeholder-opacity-10:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.1}.\32xl\:focus\:placeholder-opacity-10:focus::placeholder{--tw-placeholder-opacity:0.1}.\32xl\:focus\:placeholder-opacity-20:focus::-moz-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:focus\:placeholder-opacity-20:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.2}.\32xl\:focus\:placeholder-opacity-20:focus::placeholder{--tw-placeholder-opacity:0.2}.\32xl\:focus\:placeholder-opacity-25:focus::-moz-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.25}.\32xl\:focus\:placeholder-opacity-25:focus::placeholder{--tw-placeholder-opacity:0.25}.\32xl\:focus\:placeholder-opacity-30:focus::-moz-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:focus\:placeholder-opacity-30:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.3}.\32xl\:focus\:placeholder-opacity-30:focus::placeholder{--tw-placeholder-opacity:0.3}.\32xl\:focus\:placeholder-opacity-40:focus::-moz-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:focus\:placeholder-opacity-40:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.4}.\32xl\:focus\:placeholder-opacity-40:focus::placeholder{--tw-placeholder-opacity:0.4}.\32xl\:focus\:placeholder-opacity-50:focus::-moz-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.5}.\32xl\:focus\:placeholder-opacity-50:focus::placeholder{--tw-placeholder-opacity:0.5}.\32xl\:focus\:placeholder-opacity-60:focus::-moz-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:focus\:placeholder-opacity-60:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.6}.\32xl\:focus\:placeholder-opacity-60:focus::placeholder{--tw-placeholder-opacity:0.6}.\32xl\:focus\:placeholder-opacity-70:focus::-moz-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:focus\:placeholder-opacity-70:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.7}.\32xl\:focus\:placeholder-opacity-70:focus::placeholder{--tw-placeholder-opacity:0.7}.\32xl\:focus\:placeholder-opacity-75:focus::-moz-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.75}.\32xl\:focus\:placeholder-opacity-75:focus::placeholder{--tw-placeholder-opacity:0.75}.\32xl\:focus\:placeholder-opacity-80:focus::-moz-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:focus\:placeholder-opacity-80:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.8}.\32xl\:focus\:placeholder-opacity-80:focus::placeholder{--tw-placeholder-opacity:0.8}.\32xl\:focus\:placeholder-opacity-90:focus::-moz-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:focus\:placeholder-opacity-90:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.9}.\32xl\:focus\:placeholder-opacity-90:focus::placeholder{--tw-placeholder-opacity:0.9}.\32xl\:focus\:placeholder-opacity-95:focus::-moz-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:focus\:placeholder-opacity-95:focus:-ms-input-placeholder{--tw-placeholder-opacity:0.95}.\32xl\:focus\:placeholder-opacity-95:focus::placeholder{--tw-placeholder-opacity:0.95}.\32xl\:focus\:placeholder-opacity-100:focus::-moz-placeholder{--tw-placeholder-opacity:1}.\32xl\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--tw-placeholder-opacity:1}.\32xl\:focus\:placeholder-opacity-100:focus::placeholder{--tw-placeholder-opacity:1}.\32xl\:opacity-0{opacity:0}.\32xl\:opacity-5{opacity:.05}.\32xl\:opacity-10{opacity:.1}.\32xl\:opacity-20{opacity:.2}.\32xl\:opacity-25{opacity:.25}.\32xl\:opacity-30{opacity:.3}.\32xl\:opacity-40{opacity:.4}.\32xl\:opacity-50{opacity:.5}.\32xl\:opacity-60{opacity:.6}.\32xl\:opacity-70{opacity:.7}.\32xl\:opacity-75{opacity:.75}.\32xl\:opacity-80{opacity:.8}.\32xl\:opacity-90{opacity:.9}.\32xl\:opacity-95{opacity:.95}.\32xl\:opacity-100{opacity:1}.group:hover .\32xl\:group-hover\:opacity-0{opacity:0}.group:hover .\32xl\:group-hover\:opacity-5{opacity:.05}.group:hover .\32xl\:group-hover\:opacity-10{opacity:.1}.group:hover .\32xl\:group-hover\:opacity-20{opacity:.2}.group:hover .\32xl\:group-hover\:opacity-25{opacity:.25}.group:hover .\32xl\:group-hover\:opacity-30{opacity:.3}.group:hover .\32xl\:group-hover\:opacity-40{opacity:.4}.group:hover .\32xl\:group-hover\:opacity-50{opacity:.5}.group:hover .\32xl\:group-hover\:opacity-60{opacity:.6}.group:hover .\32xl\:group-hover\:opacity-70{opacity:.7}.group:hover .\32xl\:group-hover\:opacity-75{opacity:.75}.group:hover .\32xl\:group-hover\:opacity-80{opacity:.8}.group:hover .\32xl\:group-hover\:opacity-90{opacity:.9}.group:hover .\32xl\:group-hover\:opacity-95{opacity:.95}.group:hover .\32xl\:group-hover\:opacity-100{opacity:1}.\32xl\:focus-within\:opacity-0:focus-within{opacity:0}.\32xl\:focus-within\:opacity-5:focus-within{opacity:.05}.\32xl\:focus-within\:opacity-10:focus-within{opacity:.1}.\32xl\:focus-within\:opacity-20:focus-within{opacity:.2}.\32xl\:focus-within\:opacity-25:focus-within{opacity:.25}.\32xl\:focus-within\:opacity-30:focus-within{opacity:.3}.\32xl\:focus-within\:opacity-40:focus-within{opacity:.4}.\32xl\:focus-within\:opacity-50:focus-within{opacity:.5}.\32xl\:focus-within\:opacity-60:focus-within{opacity:.6}.\32xl\:focus-within\:opacity-70:focus-within{opacity:.7}.\32xl\:focus-within\:opacity-75:focus-within{opacity:.75}.\32xl\:focus-within\:opacity-80:focus-within{opacity:.8}.\32xl\:focus-within\:opacity-90:focus-within{opacity:.9}.\32xl\:focus-within\:opacity-95:focus-within{opacity:.95}.\32xl\:focus-within\:opacity-100:focus-within{opacity:1}.\32xl\:hover\:opacity-0:hover{opacity:0}.\32xl\:hover\:opacity-5:hover{opacity:.05}.\32xl\:hover\:opacity-10:hover{opacity:.1}.\32xl\:hover\:opacity-20:hover{opacity:.2}.\32xl\:hover\:opacity-25:hover{opacity:.25}.\32xl\:hover\:opacity-30:hover{opacity:.3}.\32xl\:hover\:opacity-40:hover{opacity:.4}.\32xl\:hover\:opacity-50:hover{opacity:.5}.\32xl\:hover\:opacity-60:hover{opacity:.6}.\32xl\:hover\:opacity-70:hover{opacity:.7}.\32xl\:hover\:opacity-75:hover{opacity:.75}.\32xl\:hover\:opacity-80:hover{opacity:.8}.\32xl\:hover\:opacity-90:hover{opacity:.9}.\32xl\:hover\:opacity-95:hover{opacity:.95}.\32xl\:hover\:opacity-100:hover{opacity:1}.\32xl\:focus\:opacity-0:focus{opacity:0}.\32xl\:focus\:opacity-5:focus{opacity:.05}.\32xl\:focus\:opacity-10:focus{opacity:.1}.\32xl\:focus\:opacity-20:focus{opacity:.2}.\32xl\:focus\:opacity-25:focus{opacity:.25}.\32xl\:focus\:opacity-30:focus{opacity:.3}.\32xl\:focus\:opacity-40:focus{opacity:.4}.\32xl\:focus\:opacity-50:focus{opacity:.5}.\32xl\:focus\:opacity-60:focus{opacity:.6}.\32xl\:focus\:opacity-70:focus{opacity:.7}.\32xl\:focus\:opacity-75:focus{opacity:.75}.\32xl\:focus\:opacity-80:focus{opacity:.8}.\32xl\:focus\:opacity-90:focus{opacity:.9}.\32xl\:focus\:opacity-95:focus{opacity:.95}.\32xl\:focus\:opacity-100:focus{opacity:1}.\32xl\:bg-blend-normal{background-blend-mode:normal}.\32xl\:bg-blend-multiply{background-blend-mode:multiply}.\32xl\:bg-blend-screen{background-blend-mode:screen}.\32xl\:bg-blend-overlay{background-blend-mode:overlay}.\32xl\:bg-blend-darken{background-blend-mode:darken}.\32xl\:bg-blend-lighten{background-blend-mode:lighten}.\32xl\:bg-blend-color-dodge{background-blend-mode:color-dodge}.\32xl\:bg-blend-color-burn{background-blend-mode:color-burn}.\32xl\:bg-blend-hard-light{background-blend-mode:hard-light}.\32xl\:bg-blend-soft-light{background-blend-mode:soft-light}.\32xl\:bg-blend-difference{background-blend-mode:difference}.\32xl\:bg-blend-exclusion{background-blend-mode:exclusion}.\32xl\:bg-blend-hue{background-blend-mode:hue}.\32xl\:bg-blend-saturation{background-blend-mode:saturation}.\32xl\:bg-blend-color{background-blend-mode:color}.\32xl\:bg-blend-luminosity{background-blend-mode:luminosity}.\32xl\:mix-blend-normal{mix-blend-mode:normal}.\32xl\:mix-blend-multiply{mix-blend-mode:multiply}.\32xl\:mix-blend-screen{mix-blend-mode:screen}.\32xl\:mix-blend-overlay{mix-blend-mode:overlay}.\32xl\:mix-blend-darken{mix-blend-mode:darken}.\32xl\:mix-blend-lighten{mix-blend-mode:lighten}.\32xl\:mix-blend-color-dodge{mix-blend-mode:color-dodge}.\32xl\:mix-blend-color-burn{mix-blend-mode:color-burn}.\32xl\:mix-blend-hard-light{mix-blend-mode:hard-light}.\32xl\:mix-blend-soft-light{mix-blend-mode:soft-light}.\32xl\:mix-blend-difference{mix-blend-mode:difference}.\32xl\:mix-blend-exclusion{mix-blend-mode:exclusion}.\32xl\:mix-blend-hue{mix-blend-mode:hue}.\32xl\:mix-blend-saturation{mix-blend-mode:saturation}.\32xl\:mix-blend-color{mix-blend-mode:color}.\32xl\:mix-blend-luminosity{mix-blend-mode:luminosity}.\32xl\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.\32xl\:shadow,.\32xl\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.\32xl\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.\32xl\:shadow-lg,.\32xl\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.\32xl\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.\32xl\:shadow-2xl,.\32xl\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.\32xl\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.\32xl\:shadow-inner,.\32xl\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:shadow-none{--tw-shadow:0 0 #0000}.group:hover .\32xl\:group-hover\:shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.group:hover .\32xl\:group-hover\:shadow,.group:hover .\32xl\:group-hover\:shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.group:hover .\32xl\:group-hover\:shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.group:hover .\32xl\:group-hover\:shadow-lg,.group:hover .\32xl\:group-hover\:shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.group:hover .\32xl\:group-hover\:shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.group:hover .\32xl\:group-hover\:shadow-2xl,.group:hover .\32xl\:group-hover\:shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.group:hover .\32xl\:group-hover\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.group:hover .\32xl\:group-hover\:shadow-inner,.group:hover .\32xl\:group-hover\:shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .\32xl\:group-hover\:shadow-none{--tw-shadow:0 0 #0000}.\32xl\:focus-within\:shadow-sm:focus-within{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow:focus-within{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-md:focus-within{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-lg:focus-within{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-xl:focus-within{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-2xl:focus-within{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-inner:focus-within{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus-within\:shadow-none:focus-within{--tw-shadow:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.\32xl\:hover\:shadow-sm:hover,.\32xl\:hover\:shadow:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.\32xl\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.\32xl\:hover\:shadow-lg:hover,.\32xl\:hover\:shadow-md:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.\32xl\:hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.\32xl\:hover\:shadow-2xl:hover,.\32xl\:hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.\32xl\:hover\:shadow-inner:hover{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.\32xl\:hover\:shadow-inner:hover,.\32xl\:hover\:shadow-none:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:hover\:shadow-none:hover{--tw-shadow:0 0 #0000}.\32xl\:focus\:shadow-sm:focus{--tw-shadow:0 1px 2px 0 rgba(0,0,0,0.05)}.\32xl\:focus\:shadow-sm:focus,.\32xl\:focus\:shadow:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow:focus{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px 0 rgba(0,0,0,0.06)}.\32xl\:focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px rgba(0,0,0,0.1),0 2px 4px -1px rgba(0,0,0,0.06)}.\32xl\:focus\:shadow-lg:focus,.\32xl\:focus\:shadow-md:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -2px rgba(0,0,0,0.05)}.\32xl\:focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px rgba(0,0,0,0.1),0 10px 10px -5px rgba(0,0,0,0.04)}.\32xl\:focus\:shadow-2xl:focus,.\32xl\:focus\:shadow-xl:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow-2xl:focus{--tw-shadow:0 25px 50px -12px rgba(0,0,0,0.25)}.\32xl\:focus\:shadow-inner:focus{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,0.06)}.\32xl\:focus\:shadow-inner:focus,.\32xl\:focus\:shadow-none:focus{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.\32xl\:focus\:shadow-none:focus{--tw-shadow:0 0 #0000}.\32xl\:outline-none{outline:2px solid transparent;outline-offset:2px}.\32xl\:outline-white{outline:2px dotted #fff;outline-offset:2px}.\32xl\:outline-black{outline:2px dotted #000;outline-offset:2px}.\32xl\:focus-within\:outline-none:focus-within{outline:2px solid transparent;outline-offset:2px}.\32xl\:focus-within\:outline-white:focus-within{outline:2px dotted #fff;outline-offset:2px}.\32xl\:focus-within\:outline-black:focus-within{outline:2px dotted #000;outline-offset:2px}.\32xl\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.\32xl\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.\32xl\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.\32xl\:ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-0,.\32xl\:ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-2,.\32xl\:ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring,.\32xl\:ring-8{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus-within\:ring-0:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-4:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring-8:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus-within\:ring:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-0:focus,.\32xl\:focus\:ring-1:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-2:focus,.\32xl\:focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-8:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:focus\:ring-8:focus,.\32xl\:focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.\32xl\:focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.\32xl\:ring-inset{--tw-ring-inset:inset}.\32xl\:focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.\32xl\:focus\:ring-inset:focus{--tw-ring-inset:inset}.\32xl\:ring-transparent{--tw-ring-color:transparent}.\32xl\:ring-current{--tw-ring-color:currentColor}.\32xl\:ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.\32xl\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.\32xl\:ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.\32xl\:ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.\32xl\:ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.\32xl\:ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.\32xl\:ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.\32xl\:ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.\32xl\:ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.\32xl\:ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.\32xl\:ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.\32xl\:ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.\32xl\:ring-red-50{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.\32xl\:ring-red-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.\32xl\:ring-red-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.\32xl\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.\32xl\:ring-red-400{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.\32xl\:ring-red-500{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.\32xl\:ring-red-600{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.\32xl\:ring-red-700{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.\32xl\:ring-red-800{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.\32xl\:ring-red-900{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.\32xl\:ring-yellow-50{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.\32xl\:ring-yellow-100{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.\32xl\:ring-yellow-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.\32xl\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.\32xl\:ring-yellow-400{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.\32xl\:ring-yellow-500{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.\32xl\:ring-yellow-600{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.\32xl\:ring-yellow-700{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.\32xl\:ring-yellow-800{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.\32xl\:ring-yellow-900{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.\32xl\:ring-green-50{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.\32xl\:ring-green-100{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.\32xl\:ring-green-200{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.\32xl\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.\32xl\:ring-green-400{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.\32xl\:ring-green-500{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.\32xl\:ring-green-600{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.\32xl\:ring-green-700{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.\32xl\:ring-green-800{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.\32xl\:ring-green-900{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.\32xl\:ring-blue-50{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.\32xl\:ring-blue-100{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.\32xl\:ring-blue-200{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.\32xl\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.\32xl\:ring-blue-400{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.\32xl\:ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.\32xl\:ring-blue-600{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.\32xl\:ring-blue-700{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.\32xl\:ring-blue-800{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.\32xl\:ring-blue-900{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.\32xl\:ring-indigo-50{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.\32xl\:ring-indigo-100{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.\32xl\:ring-indigo-200{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.\32xl\:ring-indigo-300{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.\32xl\:ring-indigo-400{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.\32xl\:ring-indigo-500{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.\32xl\:ring-indigo-600{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.\32xl\:ring-indigo-700{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.\32xl\:ring-indigo-800{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.\32xl\:ring-indigo-900{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.\32xl\:ring-purple-50{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.\32xl\:ring-purple-100{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.\32xl\:ring-purple-200{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.\32xl\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.\32xl\:ring-purple-400{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.\32xl\:ring-purple-500{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.\32xl\:ring-purple-600{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.\32xl\:ring-purple-700{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.\32xl\:ring-purple-800{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.\32xl\:ring-purple-900{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.\32xl\:ring-pink-50{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.\32xl\:ring-pink-100{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.\32xl\:ring-pink-200{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.\32xl\:ring-pink-300{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.\32xl\:ring-pink-400{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.\32xl\:ring-pink-500{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.\32xl\:ring-pink-600{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.\32xl\:ring-pink-700{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.\32xl\:ring-pink-800{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.\32xl\:ring-pink-900{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-transparent:focus-within{--tw-ring-color:transparent}.\32xl\:focus-within\:ring-current:focus-within{--tw-ring-color:currentColor}.\32xl\:focus-within\:ring-black:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-white:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-gray-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-red-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-yellow-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-green-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-blue-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-indigo-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-purple-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-50:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-100:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-200:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-300:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-400:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-500:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-700:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-800:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.\32xl\:focus-within\:ring-pink-900:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.\32xl\:focus\:ring-transparent:focus{--tw-ring-color:transparent}.\32xl\:focus\:ring-current:focus{--tw-ring-color:currentColor}.\32xl\:focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(0,0,0,var(--tw-ring-opacity))}.\32xl\:focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,250,251,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(243,244,246,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(229,231,235,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,213,219,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(156,163,175,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(107,114,128,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(75,85,99,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,65,81,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(31,41,55,var(--tw-ring-opacity))}.\32xl\:focus\:ring-gray-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(17,24,39,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,242,242,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,226,226,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,202,202,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,165,165,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(248,113,113,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,68,68,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(220,38,38,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(185,28,28,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(153,27,27,var(--tw-ring-opacity))}.\32xl\:focus\:ring-red-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(127,29,29,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,251,235,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,243,199,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,211,77,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,191,36,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,158,11,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(217,119,6,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(180,83,9,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(146,64,14,var(--tw-ring-opacity))}.\32xl\:focus\:ring-yellow-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(120,53,15,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,253,245,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(209,250,229,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,243,208,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(110,231,183,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(52,211,153,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(16,185,129,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(5,150,105,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(4,120,87,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,95,70,var(--tw-ring-opacity))}.\32xl\:focus\:ring-green-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(6,78,59,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(239,246,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,234,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(147,197,253,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(96,165,250,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(59,130,246,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(37,99,235,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(29,78,216,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,64,175,var(--tw-ring-opacity))}.\32xl\:focus\:ring-blue-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(30,58,138,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(238,242,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(224,231,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(199,210,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(165,180,252,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(129,140,248,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(99,102,241,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(79,70,229,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(67,56,202,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(55,48,163,var(--tw-ring-opacity))}.\32xl\:focus\:ring-indigo-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(49,46,129,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(245,243,255,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(237,233,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(221,214,254,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(196,181,253,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(167,139,250,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(139,92,246,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(124,58,237,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(109,40,217,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(91,33,182,var(--tw-ring-opacity))}.\32xl\:focus\:ring-purple-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(76,29,149,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(253,242,248,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(252,231,243,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(251,207,232,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(249,168,212,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(244,114,182,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(236,72,153,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(219,39,119,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(190,24,93,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-800:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(157,23,77,var(--tw-ring-opacity))}.\32xl\:focus\:ring-pink-900:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(131,24,67,var(--tw-ring-opacity))}.\32xl\:ring-opacity-0{--tw-ring-opacity:0}.\32xl\:ring-opacity-5{--tw-ring-opacity:0.05}.\32xl\:ring-opacity-10{--tw-ring-opacity:0.1}.\32xl\:ring-opacity-20{--tw-ring-opacity:0.2}.\32xl\:ring-opacity-25{--tw-ring-opacity:0.25}.\32xl\:ring-opacity-30{--tw-ring-opacity:0.3}.\32xl\:ring-opacity-40{--tw-ring-opacity:0.4}.\32xl\:ring-opacity-50{--tw-ring-opacity:0.5}.\32xl\:ring-opacity-60{--tw-ring-opacity:0.6}.\32xl\:ring-opacity-70{--tw-ring-opacity:0.7}.\32xl\:ring-opacity-75{--tw-ring-opacity:0.75}.\32xl\:ring-opacity-80{--tw-ring-opacity:0.8}.\32xl\:ring-opacity-90{--tw-ring-opacity:0.9}.\32xl\:ring-opacity-95{--tw-ring-opacity:0.95}.\32xl\:ring-opacity-100{--tw-ring-opacity:1}.\32xl\:focus-within\:ring-opacity-0:focus-within{--tw-ring-opacity:0}.\32xl\:focus-within\:ring-opacity-5:focus-within{--tw-ring-opacity:0.05}.\32xl\:focus-within\:ring-opacity-10:focus-within{--tw-ring-opacity:0.1}.\32xl\:focus-within\:ring-opacity-20:focus-within{--tw-ring-opacity:0.2}.\32xl\:focus-within\:ring-opacity-25:focus-within{--tw-ring-opacity:0.25}.\32xl\:focus-within\:ring-opacity-30:focus-within{--tw-ring-opacity:0.3}.\32xl\:focus-within\:ring-opacity-40:focus-within{--tw-ring-opacity:0.4}.\32xl\:focus-within\:ring-opacity-50:focus-within{--tw-ring-opacity:0.5}.\32xl\:focus-within\:ring-opacity-60:focus-within{--tw-ring-opacity:0.6}.\32xl\:focus-within\:ring-opacity-70:focus-within{--tw-ring-opacity:0.7}.\32xl\:focus-within\:ring-opacity-75:focus-within{--tw-ring-opacity:0.75}.\32xl\:focus-within\:ring-opacity-80:focus-within{--tw-ring-opacity:0.8}.\32xl\:focus-within\:ring-opacity-90:focus-within{--tw-ring-opacity:0.9}.\32xl\:focus-within\:ring-opacity-95:focus-within{--tw-ring-opacity:0.95}.\32xl\:focus-within\:ring-opacity-100:focus-within{--tw-ring-opacity:1}.\32xl\:focus\:ring-opacity-0:focus{--tw-ring-opacity:0}.\32xl\:focus\:ring-opacity-5:focus{--tw-ring-opacity:0.05}.\32xl\:focus\:ring-opacity-10:focus{--tw-ring-opacity:0.1}.\32xl\:focus\:ring-opacity-20:focus{--tw-ring-opacity:0.2}.\32xl\:focus\:ring-opacity-25:focus{--tw-ring-opacity:0.25}.\32xl\:focus\:ring-opacity-30:focus{--tw-ring-opacity:0.3}.\32xl\:focus\:ring-opacity-40:focus{--tw-ring-opacity:0.4}.\32xl\:focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.\32xl\:focus\:ring-opacity-60:focus{--tw-ring-opacity:0.6}.\32xl\:focus\:ring-opacity-70:focus{--tw-ring-opacity:0.7}.\32xl\:focus\:ring-opacity-75:focus{--tw-ring-opacity:0.75}.\32xl\:focus\:ring-opacity-80:focus{--tw-ring-opacity:0.8}.\32xl\:focus\:ring-opacity-90:focus{--tw-ring-opacity:0.9}.\32xl\:focus\:ring-opacity-95:focus{--tw-ring-opacity:0.95}.\32xl\:focus\:ring-opacity-100:focus{--tw-ring-opacity:1}.\32xl\:ring-offset-0{--tw-ring-offset-width:0px}.\32xl\:ring-offset-1{--tw-ring-offset-width:1px}.\32xl\:ring-offset-2{--tw-ring-offset-width:2px}.\32xl\:ring-offset-4{--tw-ring-offset-width:4px}.\32xl\:ring-offset-8{--tw-ring-offset-width:8px}.\32xl\:focus-within\:ring-offset-0:focus-within{--tw-ring-offset-width:0px}.\32xl\:focus-within\:ring-offset-1:focus-within{--tw-ring-offset-width:1px}.\32xl\:focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px}.\32xl\:focus-within\:ring-offset-4:focus-within{--tw-ring-offset-width:4px}.\32xl\:focus-within\:ring-offset-8:focus-within{--tw-ring-offset-width:8px}.\32xl\:focus\:ring-offset-0:focus{--tw-ring-offset-width:0px}.\32xl\:focus\:ring-offset-1:focus{--tw-ring-offset-width:1px}.\32xl\:focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.\32xl\:focus\:ring-offset-4:focus{--tw-ring-offset-width:4px}.\32xl\:focus\:ring-offset-8:focus{--tw-ring-offset-width:8px}.\32xl\:ring-offset-transparent{--tw-ring-offset-color:transparent}.\32xl\:ring-offset-current{--tw-ring-offset-color:currentColor}.\32xl\:ring-offset-black{--tw-ring-offset-color:#000}.\32xl\:ring-offset-white{--tw-ring-offset-color:#fff}.\32xl\:ring-offset-gray-50{--tw-ring-offset-color:#f9fafb}.\32xl\:ring-offset-gray-100{--tw-ring-offset-color:#f3f4f6}.\32xl\:ring-offset-gray-200{--tw-ring-offset-color:#e5e7eb}.\32xl\:ring-offset-gray-300{--tw-ring-offset-color:#d1d5db}.\32xl\:ring-offset-gray-400{--tw-ring-offset-color:#9ca3af}.\32xl\:ring-offset-gray-500{--tw-ring-offset-color:#6b7280}.\32xl\:ring-offset-gray-600{--tw-ring-offset-color:#4b5563}.\32xl\:ring-offset-gray-700{--tw-ring-offset-color:#374151}.\32xl\:ring-offset-gray-800{--tw-ring-offset-color:#1f2937}.\32xl\:ring-offset-gray-900{--tw-ring-offset-color:#111827}.\32xl\:ring-offset-red-50{--tw-ring-offset-color:#fef2f2}.\32xl\:ring-offset-red-100{--tw-ring-offset-color:#fee2e2}.\32xl\:ring-offset-red-200{--tw-ring-offset-color:#fecaca}.\32xl\:ring-offset-red-300{--tw-ring-offset-color:#fca5a5}.\32xl\:ring-offset-red-400{--tw-ring-offset-color:#f87171}.\32xl\:ring-offset-red-500{--tw-ring-offset-color:#ef4444}.\32xl\:ring-offset-red-600{--tw-ring-offset-color:#dc2626}.\32xl\:ring-offset-red-700{--tw-ring-offset-color:#b91c1c}.\32xl\:ring-offset-red-800{--tw-ring-offset-color:#991b1b}.\32xl\:ring-offset-red-900{--tw-ring-offset-color:#7f1d1d}.\32xl\:ring-offset-yellow-50{--tw-ring-offset-color:#fffbeb}.\32xl\:ring-offset-yellow-100{--tw-ring-offset-color:#fef3c7}.\32xl\:ring-offset-yellow-200{--tw-ring-offset-color:#fde68a}.\32xl\:ring-offset-yellow-300{--tw-ring-offset-color:#fcd34d}.\32xl\:ring-offset-yellow-400{--tw-ring-offset-color:#fbbf24}.\32xl\:ring-offset-yellow-500{--tw-ring-offset-color:#f59e0b}.\32xl\:ring-offset-yellow-600{--tw-ring-offset-color:#d97706}.\32xl\:ring-offset-yellow-700{--tw-ring-offset-color:#b45309}.\32xl\:ring-offset-yellow-800{--tw-ring-offset-color:#92400e}.\32xl\:ring-offset-yellow-900{--tw-ring-offset-color:#78350f}.\32xl\:ring-offset-green-50{--tw-ring-offset-color:#ecfdf5}.\32xl\:ring-offset-green-100{--tw-ring-offset-color:#d1fae5}.\32xl\:ring-offset-green-200{--tw-ring-offset-color:#a7f3d0}.\32xl\:ring-offset-green-300{--tw-ring-offset-color:#6ee7b7}.\32xl\:ring-offset-green-400{--tw-ring-offset-color:#34d399}.\32xl\:ring-offset-green-500{--tw-ring-offset-color:#10b981}.\32xl\:ring-offset-green-600{--tw-ring-offset-color:#059669}.\32xl\:ring-offset-green-700{--tw-ring-offset-color:#047857}.\32xl\:ring-offset-green-800{--tw-ring-offset-color:#065f46}.\32xl\:ring-offset-green-900{--tw-ring-offset-color:#064e3b}.\32xl\:ring-offset-blue-50{--tw-ring-offset-color:#eff6ff}.\32xl\:ring-offset-blue-100{--tw-ring-offset-color:#dbeafe}.\32xl\:ring-offset-blue-200{--tw-ring-offset-color:#bfdbfe}.\32xl\:ring-offset-blue-300{--tw-ring-offset-color:#93c5fd}.\32xl\:ring-offset-blue-400{--tw-ring-offset-color:#60a5fa}.\32xl\:ring-offset-blue-500{--tw-ring-offset-color:#3b82f6}.\32xl\:ring-offset-blue-600{--tw-ring-offset-color:#2563eb}.\32xl\:ring-offset-blue-700{--tw-ring-offset-color:#1d4ed8}.\32xl\:ring-offset-blue-800{--tw-ring-offset-color:#1e40af}.\32xl\:ring-offset-blue-900{--tw-ring-offset-color:#1e3a8a}.\32xl\:ring-offset-indigo-50{--tw-ring-offset-color:#eef2ff}.\32xl\:ring-offset-indigo-100{--tw-ring-offset-color:#e0e7ff}.\32xl\:ring-offset-indigo-200{--tw-ring-offset-color:#c7d2fe}.\32xl\:ring-offset-indigo-300{--tw-ring-offset-color:#a5b4fc}.\32xl\:ring-offset-indigo-400{--tw-ring-offset-color:#818cf8}.\32xl\:ring-offset-indigo-500{--tw-ring-offset-color:#6366f1}.\32xl\:ring-offset-indigo-600{--tw-ring-offset-color:#4f46e5}.\32xl\:ring-offset-indigo-700{--tw-ring-offset-color:#4338ca}.\32xl\:ring-offset-indigo-800{--tw-ring-offset-color:#3730a3}.\32xl\:ring-offset-indigo-900{--tw-ring-offset-color:#312e81}.\32xl\:ring-offset-purple-50{--tw-ring-offset-color:#f5f3ff}.\32xl\:ring-offset-purple-100{--tw-ring-offset-color:#ede9fe}.\32xl\:ring-offset-purple-200{--tw-ring-offset-color:#ddd6fe}.\32xl\:ring-offset-purple-300{--tw-ring-offset-color:#c4b5fd}.\32xl\:ring-offset-purple-400{--tw-ring-offset-color:#a78bfa}.\32xl\:ring-offset-purple-500{--tw-ring-offset-color:#8b5cf6}.\32xl\:ring-offset-purple-600{--tw-ring-offset-color:#7c3aed}.\32xl\:ring-offset-purple-700{--tw-ring-offset-color:#6d28d9}.\32xl\:ring-offset-purple-800{--tw-ring-offset-color:#5b21b6}.\32xl\:ring-offset-purple-900{--tw-ring-offset-color:#4c1d95}.\32xl\:ring-offset-pink-50{--tw-ring-offset-color:#fdf2f8}.\32xl\:ring-offset-pink-100{--tw-ring-offset-color:#fce7f3}.\32xl\:ring-offset-pink-200{--tw-ring-offset-color:#fbcfe8}.\32xl\:ring-offset-pink-300{--tw-ring-offset-color:#f9a8d4}.\32xl\:ring-offset-pink-400{--tw-ring-offset-color:#f472b6}.\32xl\:ring-offset-pink-500{--tw-ring-offset-color:#ec4899}.\32xl\:ring-offset-pink-600{--tw-ring-offset-color:#db2777}.\32xl\:ring-offset-pink-700{--tw-ring-offset-color:#be185d}.\32xl\:ring-offset-pink-800{--tw-ring-offset-color:#9d174d}.\32xl\:ring-offset-pink-900{--tw-ring-offset-color:#831843}.\32xl\:focus-within\:ring-offset-transparent:focus-within{--tw-ring-offset-color:transparent}.\32xl\:focus-within\:ring-offset-current:focus-within{--tw-ring-offset-color:currentColor}.\32xl\:focus-within\:ring-offset-black:focus-within{--tw-ring-offset-color:#000}.\32xl\:focus-within\:ring-offset-white:focus-within{--tw-ring-offset-color:#fff}.\32xl\:focus-within\:ring-offset-gray-50:focus-within{--tw-ring-offset-color:#f9fafb}.\32xl\:focus-within\:ring-offset-gray-100:focus-within{--tw-ring-offset-color:#f3f4f6}.\32xl\:focus-within\:ring-offset-gray-200:focus-within{--tw-ring-offset-color:#e5e7eb}.\32xl\:focus-within\:ring-offset-gray-300:focus-within{--tw-ring-offset-color:#d1d5db}.\32xl\:focus-within\:ring-offset-gray-400:focus-within{--tw-ring-offset-color:#9ca3af}.\32xl\:focus-within\:ring-offset-gray-500:focus-within{--tw-ring-offset-color:#6b7280}.\32xl\:focus-within\:ring-offset-gray-600:focus-within{--tw-ring-offset-color:#4b5563}.\32xl\:focus-within\:ring-offset-gray-700:focus-within{--tw-ring-offset-color:#374151}.\32xl\:focus-within\:ring-offset-gray-800:focus-within{--tw-ring-offset-color:#1f2937}.\32xl\:focus-within\:ring-offset-gray-900:focus-within{--tw-ring-offset-color:#111827}.\32xl\:focus-within\:ring-offset-red-50:focus-within{--tw-ring-offset-color:#fef2f2}.\32xl\:focus-within\:ring-offset-red-100:focus-within{--tw-ring-offset-color:#fee2e2}.\32xl\:focus-within\:ring-offset-red-200:focus-within{--tw-ring-offset-color:#fecaca}.\32xl\:focus-within\:ring-offset-red-300:focus-within{--tw-ring-offset-color:#fca5a5}.\32xl\:focus-within\:ring-offset-red-400:focus-within{--tw-ring-offset-color:#f87171}.\32xl\:focus-within\:ring-offset-red-500:focus-within{--tw-ring-offset-color:#ef4444}.\32xl\:focus-within\:ring-offset-red-600:focus-within{--tw-ring-offset-color:#dc2626}.\32xl\:focus-within\:ring-offset-red-700:focus-within{--tw-ring-offset-color:#b91c1c}.\32xl\:focus-within\:ring-offset-red-800:focus-within{--tw-ring-offset-color:#991b1b}.\32xl\:focus-within\:ring-offset-red-900:focus-within{--tw-ring-offset-color:#7f1d1d}.\32xl\:focus-within\:ring-offset-yellow-50:focus-within{--tw-ring-offset-color:#fffbeb}.\32xl\:focus-within\:ring-offset-yellow-100:focus-within{--tw-ring-offset-color:#fef3c7}.\32xl\:focus-within\:ring-offset-yellow-200:focus-within{--tw-ring-offset-color:#fde68a}.\32xl\:focus-within\:ring-offset-yellow-300:focus-within{--tw-ring-offset-color:#fcd34d}.\32xl\:focus-within\:ring-offset-yellow-400:focus-within{--tw-ring-offset-color:#fbbf24}.\32xl\:focus-within\:ring-offset-yellow-500:focus-within{--tw-ring-offset-color:#f59e0b}.\32xl\:focus-within\:ring-offset-yellow-600:focus-within{--tw-ring-offset-color:#d97706}.\32xl\:focus-within\:ring-offset-yellow-700:focus-within{--tw-ring-offset-color:#b45309}.\32xl\:focus-within\:ring-offset-yellow-800:focus-within{--tw-ring-offset-color:#92400e}.\32xl\:focus-within\:ring-offset-yellow-900:focus-within{--tw-ring-offset-color:#78350f}.\32xl\:focus-within\:ring-offset-green-50:focus-within{--tw-ring-offset-color:#ecfdf5}.\32xl\:focus-within\:ring-offset-green-100:focus-within{--tw-ring-offset-color:#d1fae5}.\32xl\:focus-within\:ring-offset-green-200:focus-within{--tw-ring-offset-color:#a7f3d0}.\32xl\:focus-within\:ring-offset-green-300:focus-within{--tw-ring-offset-color:#6ee7b7}.\32xl\:focus-within\:ring-offset-green-400:focus-within{--tw-ring-offset-color:#34d399}.\32xl\:focus-within\:ring-offset-green-500:focus-within{--tw-ring-offset-color:#10b981}.\32xl\:focus-within\:ring-offset-green-600:focus-within{--tw-ring-offset-color:#059669}.\32xl\:focus-within\:ring-offset-green-700:focus-within{--tw-ring-offset-color:#047857}.\32xl\:focus-within\:ring-offset-green-800:focus-within{--tw-ring-offset-color:#065f46}.\32xl\:focus-within\:ring-offset-green-900:focus-within{--tw-ring-offset-color:#064e3b}.\32xl\:focus-within\:ring-offset-blue-50:focus-within{--tw-ring-offset-color:#eff6ff}.\32xl\:focus-within\:ring-offset-blue-100:focus-within{--tw-ring-offset-color:#dbeafe}.\32xl\:focus-within\:ring-offset-blue-200:focus-within{--tw-ring-offset-color:#bfdbfe}.\32xl\:focus-within\:ring-offset-blue-300:focus-within{--tw-ring-offset-color:#93c5fd}.\32xl\:focus-within\:ring-offset-blue-400:focus-within{--tw-ring-offset-color:#60a5fa}.\32xl\:focus-within\:ring-offset-blue-500:focus-within{--tw-ring-offset-color:#3b82f6}.\32xl\:focus-within\:ring-offset-blue-600:focus-within{--tw-ring-offset-color:#2563eb}.\32xl\:focus-within\:ring-offset-blue-700:focus-within{--tw-ring-offset-color:#1d4ed8}.\32xl\:focus-within\:ring-offset-blue-800:focus-within{--tw-ring-offset-color:#1e40af}.\32xl\:focus-within\:ring-offset-blue-900:focus-within{--tw-ring-offset-color:#1e3a8a}.\32xl\:focus-within\:ring-offset-indigo-50:focus-within{--tw-ring-offset-color:#eef2ff}.\32xl\:focus-within\:ring-offset-indigo-100:focus-within{--tw-ring-offset-color:#e0e7ff}.\32xl\:focus-within\:ring-offset-indigo-200:focus-within{--tw-ring-offset-color:#c7d2fe}.\32xl\:focus-within\:ring-offset-indigo-300:focus-within{--tw-ring-offset-color:#a5b4fc}.\32xl\:focus-within\:ring-offset-indigo-400:focus-within{--tw-ring-offset-color:#818cf8}.\32xl\:focus-within\:ring-offset-indigo-500:focus-within{--tw-ring-offset-color:#6366f1}.\32xl\:focus-within\:ring-offset-indigo-600:focus-within{--tw-ring-offset-color:#4f46e5}.\32xl\:focus-within\:ring-offset-indigo-700:focus-within{--tw-ring-offset-color:#4338ca}.\32xl\:focus-within\:ring-offset-indigo-800:focus-within{--tw-ring-offset-color:#3730a3}.\32xl\:focus-within\:ring-offset-indigo-900:focus-within{--tw-ring-offset-color:#312e81}.\32xl\:focus-within\:ring-offset-purple-50:focus-within{--tw-ring-offset-color:#f5f3ff}.\32xl\:focus-within\:ring-offset-purple-100:focus-within{--tw-ring-offset-color:#ede9fe}.\32xl\:focus-within\:ring-offset-purple-200:focus-within{--tw-ring-offset-color:#ddd6fe}.\32xl\:focus-within\:ring-offset-purple-300:focus-within{--tw-ring-offset-color:#c4b5fd}.\32xl\:focus-within\:ring-offset-purple-400:focus-within{--tw-ring-offset-color:#a78bfa}.\32xl\:focus-within\:ring-offset-purple-500:focus-within{--tw-ring-offset-color:#8b5cf6}.\32xl\:focus-within\:ring-offset-purple-600:focus-within{--tw-ring-offset-color:#7c3aed}.\32xl\:focus-within\:ring-offset-purple-700:focus-within{--tw-ring-offset-color:#6d28d9}.\32xl\:focus-within\:ring-offset-purple-800:focus-within{--tw-ring-offset-color:#5b21b6}.\32xl\:focus-within\:ring-offset-purple-900:focus-within{--tw-ring-offset-color:#4c1d95}.\32xl\:focus-within\:ring-offset-pink-50:focus-within{--tw-ring-offset-color:#fdf2f8}.\32xl\:focus-within\:ring-offset-pink-100:focus-within{--tw-ring-offset-color:#fce7f3}.\32xl\:focus-within\:ring-offset-pink-200:focus-within{--tw-ring-offset-color:#fbcfe8}.\32xl\:focus-within\:ring-offset-pink-300:focus-within{--tw-ring-offset-color:#f9a8d4}.\32xl\:focus-within\:ring-offset-pink-400:focus-within{--tw-ring-offset-color:#f472b6}.\32xl\:focus-within\:ring-offset-pink-500:focus-within{--tw-ring-offset-color:#ec4899}.\32xl\:focus-within\:ring-offset-pink-600:focus-within{--tw-ring-offset-color:#db2777}.\32xl\:focus-within\:ring-offset-pink-700:focus-within{--tw-ring-offset-color:#be185d}.\32xl\:focus-within\:ring-offset-pink-800:focus-within{--tw-ring-offset-color:#9d174d}.\32xl\:focus-within\:ring-offset-pink-900:focus-within{--tw-ring-offset-color:#831843}.\32xl\:focus\:ring-offset-transparent:focus{--tw-ring-offset-color:transparent}.\32xl\:focus\:ring-offset-current:focus{--tw-ring-offset-color:currentColor}.\32xl\:focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.\32xl\:focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.\32xl\:focus\:ring-offset-gray-50:focus{--tw-ring-offset-color:#f9fafb}.\32xl\:focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:#f3f4f6}.\32xl\:focus\:ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.\32xl\:focus\:ring-offset-gray-300:focus{--tw-ring-offset-color:#d1d5db}.\32xl\:focus\:ring-offset-gray-400:focus{--tw-ring-offset-color:#9ca3af}.\32xl\:focus\:ring-offset-gray-500:focus{--tw-ring-offset-color:#6b7280}.\32xl\:focus\:ring-offset-gray-600:focus{--tw-ring-offset-color:#4b5563}.\32xl\:focus\:ring-offset-gray-700:focus{--tw-ring-offset-color:#374151}.\32xl\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.\32xl\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:#111827}.\32xl\:focus\:ring-offset-red-50:focus{--tw-ring-offset-color:#fef2f2}.\32xl\:focus\:ring-offset-red-100:focus{--tw-ring-offset-color:#fee2e2}.\32xl\:focus\:ring-offset-red-200:focus{--tw-ring-offset-color:#fecaca}.\32xl\:focus\:ring-offset-red-300:focus{--tw-ring-offset-color:#fca5a5}.\32xl\:focus\:ring-offset-red-400:focus{--tw-ring-offset-color:#f87171}.\32xl\:focus\:ring-offset-red-500:focus{--tw-ring-offset-color:#ef4444}.\32xl\:focus\:ring-offset-red-600:focus{--tw-ring-offset-color:#dc2626}.\32xl\:focus\:ring-offset-red-700:focus{--tw-ring-offset-color:#b91c1c}.\32xl\:focus\:ring-offset-red-800:focus{--tw-ring-offset-color:#991b1b}.\32xl\:focus\:ring-offset-red-900:focus{--tw-ring-offset-color:#7f1d1d}.\32xl\:focus\:ring-offset-yellow-50:focus{--tw-ring-offset-color:#fffbeb}.\32xl\:focus\:ring-offset-yellow-100:focus{--tw-ring-offset-color:#fef3c7}.\32xl\:focus\:ring-offset-yellow-200:focus{--tw-ring-offset-color:#fde68a}.\32xl\:focus\:ring-offset-yellow-300:focus{--tw-ring-offset-color:#fcd34d}.\32xl\:focus\:ring-offset-yellow-400:focus{--tw-ring-offset-color:#fbbf24}.\32xl\:focus\:ring-offset-yellow-500:focus{--tw-ring-offset-color:#f59e0b}.\32xl\:focus\:ring-offset-yellow-600:focus{--tw-ring-offset-color:#d97706}.\32xl\:focus\:ring-offset-yellow-700:focus{--tw-ring-offset-color:#b45309}.\32xl\:focus\:ring-offset-yellow-800:focus{--tw-ring-offset-color:#92400e}.\32xl\:focus\:ring-offset-yellow-900:focus{--tw-ring-offset-color:#78350f}.\32xl\:focus\:ring-offset-green-50:focus{--tw-ring-offset-color:#ecfdf5}.\32xl\:focus\:ring-offset-green-100:focus{--tw-ring-offset-color:#d1fae5}.\32xl\:focus\:ring-offset-green-200:focus{--tw-ring-offset-color:#a7f3d0}.\32xl\:focus\:ring-offset-green-300:focus{--tw-ring-offset-color:#6ee7b7}.\32xl\:focus\:ring-offset-green-400:focus{--tw-ring-offset-color:#34d399}.\32xl\:focus\:ring-offset-green-500:focus{--tw-ring-offset-color:#10b981}.\32xl\:focus\:ring-offset-green-600:focus{--tw-ring-offset-color:#059669}.\32xl\:focus\:ring-offset-green-700:focus{--tw-ring-offset-color:#047857}.\32xl\:focus\:ring-offset-green-800:focus{--tw-ring-offset-color:#065f46}.\32xl\:focus\:ring-offset-green-900:focus{--tw-ring-offset-color:#064e3b}.\32xl\:focus\:ring-offset-blue-50:focus{--tw-ring-offset-color:#eff6ff}.\32xl\:focus\:ring-offset-blue-100:focus{--tw-ring-offset-color:#dbeafe}.\32xl\:focus\:ring-offset-blue-200:focus{--tw-ring-offset-color:#bfdbfe}.\32xl\:focus\:ring-offset-blue-300:focus{--tw-ring-offset-color:#93c5fd}.\32xl\:focus\:ring-offset-blue-400:focus{--tw-ring-offset-color:#60a5fa}.\32xl\:focus\:ring-offset-blue-500:focus{--tw-ring-offset-color:#3b82f6}.\32xl\:focus\:ring-offset-blue-600:focus{--tw-ring-offset-color:#2563eb}.\32xl\:focus\:ring-offset-blue-700:focus{--tw-ring-offset-color:#1d4ed8}.\32xl\:focus\:ring-offset-blue-800:focus{--tw-ring-offset-color:#1e40af}.\32xl\:focus\:ring-offset-blue-900:focus{--tw-ring-offset-color:#1e3a8a}.\32xl\:focus\:ring-offset-indigo-50:focus{--tw-ring-offset-color:#eef2ff}.\32xl\:focus\:ring-offset-indigo-100:focus{--tw-ring-offset-color:#e0e7ff}.\32xl\:focus\:ring-offset-indigo-200:focus{--tw-ring-offset-color:#c7d2fe}.\32xl\:focus\:ring-offset-indigo-300:focus{--tw-ring-offset-color:#a5b4fc}.\32xl\:focus\:ring-offset-indigo-400:focus{--tw-ring-offset-color:#818cf8}.\32xl\:focus\:ring-offset-indigo-500:focus{--tw-ring-offset-color:#6366f1}.\32xl\:focus\:ring-offset-indigo-600:focus{--tw-ring-offset-color:#4f46e5}.\32xl\:focus\:ring-offset-indigo-700:focus{--tw-ring-offset-color:#4338ca}.\32xl\:focus\:ring-offset-indigo-800:focus{--tw-ring-offset-color:#3730a3}.\32xl\:focus\:ring-offset-indigo-900:focus{--tw-ring-offset-color:#312e81}.\32xl\:focus\:ring-offset-purple-50:focus{--tw-ring-offset-color:#f5f3ff}.\32xl\:focus\:ring-offset-purple-100:focus{--tw-ring-offset-color:#ede9fe}.\32xl\:focus\:ring-offset-purple-200:focus{--tw-ring-offset-color:#ddd6fe}.\32xl\:focus\:ring-offset-purple-300:focus{--tw-ring-offset-color:#c4b5fd}.\32xl\:focus\:ring-offset-purple-400:focus{--tw-ring-offset-color:#a78bfa}.\32xl\:focus\:ring-offset-purple-500:focus{--tw-ring-offset-color:#8b5cf6}.\32xl\:focus\:ring-offset-purple-600:focus{--tw-ring-offset-color:#7c3aed}.\32xl\:focus\:ring-offset-purple-700:focus{--tw-ring-offset-color:#6d28d9}.\32xl\:focus\:ring-offset-purple-800:focus{--tw-ring-offset-color:#5b21b6}.\32xl\:focus\:ring-offset-purple-900:focus{--tw-ring-offset-color:#4c1d95}.\32xl\:focus\:ring-offset-pink-50:focus{--tw-ring-offset-color:#fdf2f8}.\32xl\:focus\:ring-offset-pink-100:focus{--tw-ring-offset-color:#fce7f3}.\32xl\:focus\:ring-offset-pink-200:focus{--tw-ring-offset-color:#fbcfe8}.\32xl\:focus\:ring-offset-pink-300:focus{--tw-ring-offset-color:#f9a8d4}.\32xl\:focus\:ring-offset-pink-400:focus{--tw-ring-offset-color:#f472b6}.\32xl\:focus\:ring-offset-pink-500:focus{--tw-ring-offset-color:#ec4899}.\32xl\:focus\:ring-offset-pink-600:focus{--tw-ring-offset-color:#db2777}.\32xl\:focus\:ring-offset-pink-700:focus{--tw-ring-offset-color:#be185d}.\32xl\:focus\:ring-offset-pink-800:focus{--tw-ring-offset-color:#9d174d}.\32xl\:focus\:ring-offset-pink-900:focus{--tw-ring-offset-color:#831843}.\32xl\:filter{--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\32xl\:filter-none{filter:none}.\32xl\:blur-0,.\32xl\:blur-none{--tw-blur:blur(0)}.\32xl\:blur-sm{--tw-blur:blur(4px)}.\32xl\:blur{--tw-blur:blur(8px)}.\32xl\:blur-md{--tw-blur:blur(12px)}.\32xl\:blur-lg{--tw-blur:blur(16px)}.\32xl\:blur-xl{--tw-blur:blur(24px)}.\32xl\:blur-2xl{--tw-blur:blur(40px)}.\32xl\:blur-3xl{--tw-blur:blur(64px)}.\32xl\:brightness-0{--tw-brightness:brightness(0)}.\32xl\:brightness-50{--tw-brightness:brightness(.5)}.\32xl\:brightness-75{--tw-brightness:brightness(.75)}.\32xl\:brightness-90{--tw-brightness:brightness(.9)}.\32xl\:brightness-95{--tw-brightness:brightness(.95)}.\32xl\:brightness-100{--tw-brightness:brightness(1)}.\32xl\:brightness-105{--tw-brightness:brightness(1.05)}.\32xl\:brightness-110{--tw-brightness:brightness(1.1)}.\32xl\:brightness-125{--tw-brightness:brightness(1.25)}.\32xl\:brightness-150{--tw-brightness:brightness(1.5)}.\32xl\:brightness-200{--tw-brightness:brightness(2)}.\32xl\:contrast-0{--tw-contrast:contrast(0)}.\32xl\:contrast-50{--tw-contrast:contrast(.5)}.\32xl\:contrast-75{--tw-contrast:contrast(.75)}.\32xl\:contrast-100{--tw-contrast:contrast(1)}.\32xl\:contrast-125{--tw-contrast:contrast(1.25)}.\32xl\:contrast-150{--tw-contrast:contrast(1.5)}.\32xl\:contrast-200{--tw-contrast:contrast(2)}.\32xl\:drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,0.05))}.\32xl\:drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,0.1)) drop-shadow(0 1px 1px rgba(0,0,0,0.06))}.\32xl\:drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,0.07)) drop-shadow(0 2px 2px rgba(0,0,0,0.06))}.\32xl\:drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1))}.\32xl\:drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,0.03)) drop-shadow(0 8px 5px rgba(0,0,0,0.08))}.\32xl\:drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,0.15))}.\32xl\:drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.\32xl\:grayscale-0{--tw-grayscale:grayscale(0)}.\32xl\:grayscale{--tw-grayscale:grayscale(100%)}.\32xl\:hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg)}.\32xl\:hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg)}.\32xl\:hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg)}.\32xl\:hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg)}.\32xl\:hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg)}.\32xl\:hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg)}.\32xl\:-hue-rotate-180{--tw-hue-rotate:hue-rotate(-180deg)}.\32xl\:-hue-rotate-90{--tw-hue-rotate:hue-rotate(-90deg)}.\32xl\:-hue-rotate-60{--tw-hue-rotate:hue-rotate(-60deg)}.\32xl\:-hue-rotate-30{--tw-hue-rotate:hue-rotate(-30deg)}.\32xl\:-hue-rotate-15{--tw-hue-rotate:hue-rotate(-15deg)}.\32xl\:invert-0{--tw-invert:invert(0)}.\32xl\:invert{--tw-invert:invert(100%)}.\32xl\:saturate-0{--tw-saturate:saturate(0)}.\32xl\:saturate-50{--tw-saturate:saturate(.5)}.\32xl\:saturate-100{--tw-saturate:saturate(1)}.\32xl\:saturate-150{--tw-saturate:saturate(1.5)}.\32xl\:saturate-200{--tw-saturate:saturate(2)}.\32xl\:sepia-0{--tw-sepia:sepia(0)}.\32xl\:sepia{--tw-sepia:sepia(100%)}.\32xl\:backdrop-filter{--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.\32xl\:backdrop-filter-none{-webkit-backdrop-filter:none;backdrop-filter:none}.\32xl\:backdrop-blur-0,.\32xl\:backdrop-blur-none{--tw-backdrop-blur:blur(0)}.\32xl\:backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.\32xl\:backdrop-blur{--tw-backdrop-blur:blur(8px)}.\32xl\:backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.\32xl\:backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.\32xl\:backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.\32xl\:backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.\32xl\:backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.\32xl\:backdrop-brightness-0{--tw-backdrop-brightness:brightness(0)}.\32xl\:backdrop-brightness-50{--tw-backdrop-brightness:brightness(.5)}.\32xl\:backdrop-brightness-75{--tw-backdrop-brightness:brightness(.75)}.\32xl\:backdrop-brightness-90{--tw-backdrop-brightness:brightness(.9)}.\32xl\:backdrop-brightness-95{--tw-backdrop-brightness:brightness(.95)}.\32xl\:backdrop-brightness-100{--tw-backdrop-brightness:brightness(1)}.\32xl\:backdrop-brightness-105{--tw-backdrop-brightness:brightness(1.05)}.\32xl\:backdrop-brightness-110{--tw-backdrop-brightness:brightness(1.1)}.\32xl\:backdrop-brightness-125{--tw-backdrop-brightness:brightness(1.25)}.\32xl\:backdrop-brightness-150{--tw-backdrop-brightness:brightness(1.5)}.\32xl\:backdrop-brightness-200{--tw-backdrop-brightness:brightness(2)}.\32xl\:backdrop-contrast-0{--tw-backdrop-contrast:contrast(0)}.\32xl\:backdrop-contrast-50{--tw-backdrop-contrast:contrast(.5)}.\32xl\:backdrop-contrast-75{--tw-backdrop-contrast:contrast(.75)}.\32xl\:backdrop-contrast-100{--tw-backdrop-contrast:contrast(1)}.\32xl\:backdrop-contrast-125{--tw-backdrop-contrast:contrast(1.25)}.\32xl\:backdrop-contrast-150{--tw-backdrop-contrast:contrast(1.5)}.\32xl\:backdrop-contrast-200{--tw-backdrop-contrast:contrast(2)}.\32xl\:backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0)}.\32xl\:backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%)}.\32xl\:backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg)}.\32xl\:backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg)}.\32xl\:backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg)}.\32xl\:backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg)}.\32xl\:backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg)}.\32xl\:backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg)}.\32xl\:-backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(-180deg)}.\32xl\:-backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(-90deg)}.\32xl\:-backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(-60deg)}.\32xl\:-backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(-30deg)}.\32xl\:-backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(-15deg)}.\32xl\:backdrop-invert-0{--tw-backdrop-invert:invert(0)}.\32xl\:backdrop-invert{--tw-backdrop-invert:invert(100%)}.\32xl\:backdrop-opacity-0{--tw-backdrop-opacity:opacity(0)}.\32xl\:backdrop-opacity-5{--tw-backdrop-opacity:opacity(0.05)}.\32xl\:backdrop-opacity-10{--tw-backdrop-opacity:opacity(0.1)}.\32xl\:backdrop-opacity-20{--tw-backdrop-opacity:opacity(0.2)}.\32xl\:backdrop-opacity-25{--tw-backdrop-opacity:opacity(0.25)}.\32xl\:backdrop-opacity-30{--tw-backdrop-opacity:opacity(0.3)}.\32xl\:backdrop-opacity-40{--tw-backdrop-opacity:opacity(0.4)}.\32xl\:backdrop-opacity-50{--tw-backdrop-opacity:opacity(0.5)}.\32xl\:backdrop-opacity-60{--tw-backdrop-opacity:opacity(0.6)}.\32xl\:backdrop-opacity-70{--tw-backdrop-opacity:opacity(0.7)}.\32xl\:backdrop-opacity-75{--tw-backdrop-opacity:opacity(0.75)}.\32xl\:backdrop-opacity-80{--tw-backdrop-opacity:opacity(0.8)}.\32xl\:backdrop-opacity-90{--tw-backdrop-opacity:opacity(0.9)}.\32xl\:backdrop-opacity-95{--tw-backdrop-opacity:opacity(0.95)}.\32xl\:backdrop-opacity-100{--tw-backdrop-opacity:opacity(1)}.\32xl\:backdrop-saturate-0{--tw-backdrop-saturate:saturate(0)}.\32xl\:backdrop-saturate-50{--tw-backdrop-saturate:saturate(.5)}.\32xl\:backdrop-saturate-100{--tw-backdrop-saturate:saturate(1)}.\32xl\:backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.\32xl\:backdrop-saturate-200{--tw-backdrop-saturate:saturate(2)}.\32xl\:backdrop-sepia-0{--tw-backdrop-sepia:sepia(0)}.\32xl\:backdrop-sepia{--tw-backdrop-sepia:sepia(100%)}.\32xl\:transition-none{transition-property:none}.\32xl\:transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-colors{transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\32xl\:delay-75{transition-delay:75ms}.\32xl\:delay-100{transition-delay:.1s}.\32xl\:delay-150{transition-delay:.15s}.\32xl\:delay-200{transition-delay:.2s}.\32xl\:delay-300{transition-delay:.3s}.\32xl\:delay-500{transition-delay:.5s}.\32xl\:delay-700{transition-delay:.7s}.\32xl\:delay-1000{transition-delay:1s}.\32xl\:duration-75{transition-duration:75ms}.\32xl\:duration-100{transition-duration:.1s}.\32xl\:duration-150{transition-duration:.15s}.\32xl\:duration-200{transition-duration:.2s}.\32xl\:duration-300{transition-duration:.3s}.\32xl\:duration-500{transition-duration:.5s}.\32xl\:duration-700{transition-duration:.7s}.\32xl\:duration-1000{transition-duration:1s}.\32xl\:ease-linear{transition-timing-function:linear}.\32xl\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.\32xl\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\32xl\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}} \ No newline at end of file diff --git a/fastlane b/fastlane deleted file mode 120000 index 94746b0d7f..0000000000 --- a/fastlane +++ /dev/null @@ -1 +0,0 @@ -./android/fastlane \ No newline at end of file diff --git a/fonts/NotoEmoji/NotoColorEmoji.ttf b/fonts/NotoEmoji/NotoColorEmoji.ttf deleted file mode 100644 index b836e93f27..0000000000 Binary files a/fonts/NotoEmoji/NotoColorEmoji.ttf and /dev/null differ diff --git a/fonts/NotoEmoji/NotoEmoji-Regular.ttf b/fonts/NotoEmoji/NotoEmoji-Regular.ttf deleted file mode 100644 index 19b7badf4a..0000000000 Binary files a/fonts/NotoEmoji/NotoEmoji-Regular.ttf and /dev/null differ diff --git a/fonts/Roboto/LICENSE.txt b/fonts/Roboto/LICENSE.txt deleted file mode 100644 index 75b52484ea..0000000000 --- a/fonts/Roboto/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/fonts/Roboto/Roboto-Black.ttf b/fonts/Roboto/Roboto-Black.ttf deleted file mode 100644 index 43a00e0df0..0000000000 Binary files a/fonts/Roboto/Roboto-Black.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-BlackItalic.ttf b/fonts/Roboto/Roboto-BlackItalic.ttf deleted file mode 100644 index 5082cdc4e8..0000000000 Binary files a/fonts/Roboto/Roboto-BlackItalic.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Bold.ttf b/fonts/Roboto/Roboto-Bold.ttf deleted file mode 100644 index 3742457900..0000000000 Binary files a/fonts/Roboto/Roboto-Bold.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-BoldItalic.ttf b/fonts/Roboto/Roboto-BoldItalic.ttf deleted file mode 100644 index e85e7fb9e3..0000000000 Binary files a/fonts/Roboto/Roboto-BoldItalic.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Italic.ttf b/fonts/Roboto/Roboto-Italic.ttf deleted file mode 100644 index c9df607a4d..0000000000 Binary files a/fonts/Roboto/Roboto-Italic.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Light.ttf b/fonts/Roboto/Roboto-Light.ttf deleted file mode 100644 index 0e977514ff..0000000000 Binary files a/fonts/Roboto/Roboto-Light.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-LightItalic.ttf b/fonts/Roboto/Roboto-LightItalic.ttf deleted file mode 100644 index 3ad14fa7c4..0000000000 Binary files a/fonts/Roboto/Roboto-LightItalic.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Medium.ttf b/fonts/Roboto/Roboto-Medium.ttf deleted file mode 100644 index e89b0b79a2..0000000000 Binary files a/fonts/Roboto/Roboto-Medium.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-MediumItalic.ttf b/fonts/Roboto/Roboto-MediumItalic.ttf deleted file mode 100644 index a5a41d3d00..0000000000 Binary files a/fonts/Roboto/Roboto-MediumItalic.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Regular.ttf b/fonts/Roboto/Roboto-Regular.ttf deleted file mode 100644 index 3d6861b423..0000000000 Binary files a/fonts/Roboto/Roboto-Regular.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-Thin.ttf b/fonts/Roboto/Roboto-Thin.ttf deleted file mode 100644 index 7d084aed88..0000000000 Binary files a/fonts/Roboto/Roboto-Thin.ttf and /dev/null differ diff --git a/fonts/Roboto/Roboto-ThinItalic.ttf b/fonts/Roboto/Roboto-ThinItalic.ttf deleted file mode 100644 index c17338960c..0000000000 Binary files a/fonts/Roboto/Roboto-ThinItalic.ttf and /dev/null differ diff --git a/integration_test/.gitignore b/integration_test/.gitignore index 539d882e4a..3284fe008c 100644 --- a/integration_test/.gitignore +++ b/integration_test/.gitignore @@ -1 +1,6 @@ synapse/data/homeserver.db +dendrite/data/server.* +dendrite/data/matrix_key.pem +dendrite/data/logs +dendrite/data/jetstream +dendrite/data/*.db \ No newline at end of file diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart deleted file mode 100644 index 0ba99b2146..0000000000 --- a/integration_test/app_test.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'dart:developer'; - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:http/http.dart'; -import 'package:integration_test/integration_test.dart'; - -import 'package:fluffychat/main.dart' as app; - -import 'users.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - group('Integration Test', () { - test('Check server availability', () async { - final response = await get(Uri.parse('$homeserver/_matrix/static/')); - expect(response.statusCode, 200); - }, timeout: const Timeout(Duration(seconds: 10))); - testWidgets('Test if the app starts', (WidgetTester tester) async { - app.main(); - await tester.pumpAndSettle(); - - await Future.delayed(const Duration(seconds: 10)); - - await tester.pumpAndSettle(); - - expect(find.text('Connect'), findsOneWidget); - - final input = find.byType(TextField); - - expect(input, findsOneWidget); - - await tester.enterText(input, homeserver); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); - - // in case registration is allowed - try { - await tester.tap(find.text('Login')); - await tester.pumpAndSettle(); - } catch (e) { - log('Registration is not allowed. Proceeding with login...'); - } - await tester.pumpAndSettle(); - - final inputs = find.byType(TextField); - - await tester.enterText(inputs.first, Users.alice.name); - await tester.enterText(inputs.last, Users.alice.password); - await tester.testTextInput.receiveAction(TextInputAction.done); - }); - }); -} diff --git a/integration_test/data/environment_constants.dart b/integration_test/data/environment_constants.dart new file mode 100644 index 0000000000..4636f4fc3b --- /dev/null +++ b/integration_test/data/environment_constants.dart @@ -0,0 +1,19 @@ +const homeserver = String.fromEnvironment( + 'HOMESERVER', + defaultValue: '10.0.2.2', +); +const user1Name = String.fromEnvironment('USER1_NAME', defaultValue: 'alice'); +const user1Pw = String.fromEnvironment( + 'USER1_PW', + defaultValue: 'AliceInWonderland', +); +const user2Name = String.fromEnvironment('USER2_NAME', defaultValue: 'bob'); +const user2Pw = String.fromEnvironment( + 'USER2_PW', + defaultValue: 'JoWirSchaffenDas', +); + +const passphrase1 = String.fromEnvironment( + 'PASSPHRASE_1', + defaultValue: '1234567890aB%', +); diff --git a/integration_test/data/integration_users.env b/integration_test/data/integration_users.env new file mode 100644 index 0000000000..455ce84712 --- /dev/null +++ b/integration_test/data/integration_users.env @@ -0,0 +1,5 @@ +HOMESERVER=localhost +USER1_NAME=alice +USER1_PW=AliceInWonderland +USER2_NAME=bob +USER2_PW=JoWirSchaffenDas \ No newline at end of file diff --git a/integration_test/flows/auth_flows.dart b/integration_test/flows/auth_flows.dart new file mode 100644 index 0000000000..281e8018d3 --- /dev/null +++ b/integration_test/flows/auth_flows.dart @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../data/environment_constants.dart'; +import '../utils/fluffy_chat_tester.dart'; + +Future finalLogout(WidgetTester widgetTester) => + widgetTester.startFluffyChatTest().then((tester) => tester.logout()); + +extension AuthFlows on FluffyChatTester { + Future initCryptoIdentity({String username = user1Name}) async { + final passphrase = userPassphrases[username]; + if (passphrase != null) { + await waitFor('Restore Crypto Identity'); + await enterText(TextField, passphrase); + await tapOn('Unlock'); + } else { + await waitFor('Set Up Crypto Identity'); + await enterText(TextField, passphrase1, index: 0); + await enterText(TextField, passphrase1, index: 1); + await tapOn('Continue'); + await tapOn('Continue'); + userPassphrases[username] = passphrase1; + } + } + + Future login({ + String username = user1Name, + String password = user1Pw, + }) async { + await waitFor('Sign in'); + await tapOn('Sign in'); + await enterText(TextField, 'http://$homeserver', index: 0); + await tapOn(RadioListTile, index: 0); + await tapOn('Continue'); + await waitFor('Log in to http://$homeserver'); + await enterText(TextField, username, index: 0); + await enterText(TextField, password, index: 1); + await tapOn('Login'); + } + + Future logout() async { + await ensureLoggedIn(); + await tapOn(Key('accounts_and_settings_buttons')); + await tapOn('Settings'); + await scrollUntilVisible('Logout'); + await tapOn('Logout'); + await tapOn(Key('ok_cancel_alert_dialog_ok_button')); + await waitFor('Sign in'); + } + + Future skipNoNotificationsDialog() async { + if (await isVisible('Push notifications not available')) { + await tapOn('Do not show again'); + } + } + + static final Map userPassphrases = {}; + + Future ensureLoggedIn() async { + if (await isVisible('Sign in') == false) return false; + + await login(); + await initCryptoIdentity(); + + await skipNoNotificationsDialog(); + return true; + } +} diff --git a/integration_test/flows/basic_messaging.dart b/integration_test/flows/basic_messaging.dart new file mode 100644 index 0000000000..44b4e5631f --- /dev/null +++ b/integration_test/flows/basic_messaging.dart @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; +import 'chat_flows.dart'; + +Future basicMessaging(WidgetTester widgetTester) => widgetTester + .startFluffyChatTest() + .then((tester) => tester._basicMessaging()); + +extension on FluffyChatTester { + Future _basicMessaging() async { + await ensureLoggedIn(); + await ensureGroupChatCreated(); + + await tapOn(ChatFlows.groupChatName); + const testMessage = 'Hello from integration test!'; + await enterText(Key('chat_input_field'), testMessage); + await tapOn(Key('send_button')); + await waitFor(testMessage); + await goBack(); + } +} diff --git a/integration_test/flows/chat_flows.dart b/integration_test/flows/chat_flows.dart new file mode 100644 index 0000000000..e6bd940496 --- /dev/null +++ b/integration_test/flows/chat_flows.dart @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future archiveChats(WidgetTester widgetTester) => + widgetTester.startFluffyChatTest().then((tester) => tester._archiveChats()); + +extension ChatFlows on FluffyChatTester { + static const String groupChatName = 'Test Group 01'; + + Future ensureGroupChatCreated() async { + if (await isVisible(groupChatName)) return; + await tapOn(FloatingActionButton); + await tapOn('Create group'); + await enterText(TextField, groupChatName); + await scrollUntilVisible('Create a group and invite users'); + await tapOn('Create a group and invite users'); + await waitFor('Invite contact'); + await goBack(); + await goBack(); + } + + Future _archiveChats() async { + await ensureLoggedIn(); + await ensureGroupChatCreated(); + await tapOn(groupChatName); + await tapOn(ChatSettingsPopupMenu); + await tapOn('Leave'); + await waitFor('Are you sure?'); + await tapOn('Leave'); + await waitFor(ChatList); + } +} diff --git a/integration_test/flows/login_and_chat_backup.dart b/integration_test/flows/login_and_chat_backup.dart new file mode 100644 index 0000000000..0902cdde34 --- /dev/null +++ b/integration_test/flows/login_and_chat_backup.dart @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../data/environment_constants.dart'; +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future loginAndChatBackup(WidgetTester widgetTester) => widgetTester + .startFluffyChatTest() + .then((tester) => tester._loginAndChatBackup()); + +extension on FluffyChatTester { + Future _loginAndChatBackup() async { + // Set up with only recovery key: + await login(); + await tapOn('Skip', pumpAndSettle: false); + await tapOn('Store in Android KeyStore'); + await tapOn('Continue'); + await skipNoNotificationsDialog(); + await logout(); + + // Restore with recovery key from keystore: + await login(); + await tapOn('Unlock'); + await skipNoNotificationsDialog(); + await logout(); + + // Reset with passphrase: + await login(); + await waitFor('Restore Crypto Identity'); + await tapOn('Reset account'); + await tapOn('Reset account', index: 1); + await enterText(TextField, passphrase1, index: 0); + await enterText(TextField, passphrase1, index: 1); + await tapOn('Continue', pumpAndSettle: false); + await waitFor('Please enter your password'); + await enterText(DialogTextField, user1Pw, pumpAndSettle: false); + await tapOn('Ok'); + await tapOn('Continue'); + AuthFlows.userPassphrases[user1Name] = passphrase1; + await logout(); + + // Restore with passphrase: + await ensureLoggedIn(); + + // Reset passphrase + await tapOn(Key('accounts_and_settings_buttons')); + await tapOn('Settings'); + await tapOn('Chat backup'); + await tapOn('Reset recovery key'); + await enterText(TextField, passphrase1, index: 0); + await enterText(TextField, passphrase1, index: 1); + await tapOn('Continue', pumpAndSettle: false); + await waitFor('You are ready to start!'); + await tapOn('Continue'); + AuthFlows.userPassphrases[user1Name] = passphrase1; + } +} diff --git a/integration_test/flows/multi_account.dart b/integration_test/flows/multi_account.dart new file mode 100644 index 0000000000..fea23829b8 --- /dev/null +++ b/integration_test/flows/multi_account.dart @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../data/environment_constants.dart'; +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future multiAccount(WidgetTester widgetTester) => widgetTester + .startFluffyChatTest() + .then((tester) => tester._multiAccountAndNotifications()); + +extension on FluffyChatTester { + Future _multiAccountAndNotifications() async { + await ensureLoggedIn(); + + // Login user 2 + await tapOn(Key('accounts_and_settings_buttons')); + await tapOn('Add account'); + await login(username: user2Name, password: user2Pw); + await initCryptoIdentity(username: user2Name); + + // Logout user 2 + await tapOn(Key('accounts_and_settings_buttons')); + await tapOn(user2Name); + await tapOn(Key('accounts_and_settings_buttons')); + await tapOn('Settings'); + await scrollUntilVisible('Logout'); + await tapOn('Logout'); + await tapOn(Key('ok_cancel_alert_dialog_ok_button')); + await waitFor('One of your clients has been logged out'); + } +} diff --git a/integration_test/mobile_test.dart b/integration_test/mobile_test.dart new file mode 100644 index 0000000000..a1161e46b8 --- /dev/null +++ b/integration_test/mobile_test.dart @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'flows/auth_flows.dart'; +import 'flows/basic_messaging.dart'; +import 'flows/chat_flows.dart'; +import 'flows/login_and_chat_backup.dart'; +import 'flows/multi_account.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('FluffyChat Integration Tests', () { + testWidgets('Login and logout flow', loginAndChatBackup); + testWidgets('Basic Messaging', basicMessaging); + testWidgets('Multi-Account', multiAccount); + testWidgets('Archive chats', archiveChats); + testWidgets('Final logout', finalLogout); + }); +} diff --git a/integration_test/synapse/data/homeserver.yaml b/integration_test/synapse/data/homeserver.yaml index 091aa63d98..b6963fd477 100644 --- a/integration_test/synapse/data/homeserver.yaml +++ b/integration_test/synapse/data/homeserver.yaml @@ -297,7 +297,7 @@ listeners: # If you plan to use a reverse proxy, please see # https://matrix-org.github.io/synapse/latest/reverse_proxy.html. # - - port: 8008 + - port: 80 tls: false type: http x_forwarded: false diff --git a/integration_test/users.dart b/integration_test/users.dart deleted file mode 100644 index e3ec06a65d..0000000000 --- a/integration_test/users.dart +++ /dev/null @@ -1,16 +0,0 @@ -abstract class Users { - const Users._(); - static const alice = User('alice', 'AliceInWonderland'); - static const bob = User('bob', 'JoWirSchaffenDas'); - static const trudy = User('trudy', 'HaveIBeenPwned'); -} - -class User { - final String name; - final String password; - - const User(this.name, this.password); -} - -// https://stackoverflow.com/a/33088657 -const homeserver = 'http://10.0.2.2:8008'; diff --git a/integration_test/utils/fluffy_chat_tester.dart b/integration_test/utils/fluffy_chat_tester.dart new file mode 100644 index 0000000000..3937fb1667 --- /dev/null +++ b/integration_test/utils/fluffy_chat_tester.dart @@ -0,0 +1,128 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/main.dart' as app; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; + +extension type FluffyChatTester(WidgetTester tester) { + static int _printCounter = 1; + + void _print(String message) { + debugPrint( + '[INTEGRATION TEST] ${DateTime.now().toIso8601String()} | Step ${_printCounter++} - $message', + ); + } + + Future isVisible( + Object object, { + Duration timeout = const Duration(seconds: 3), + }) async { + final end = DateTime.now().add(timeout); + while (object.toFinder().evaluate().isEmpty) { + if (DateTime.now().isAfter(end)) { + return false; + } + await tester.pump(const Duration(milliseconds: 500)); + } + return true; + } + + Future waitFor( + Object object, { + Duration timeout = const Duration(seconds: 30), + }) async { + _print('👀 Waiting for "$object" (${timeout.inSeconds}s)'); + final end = DateTime.now().add(timeout); + while (object.toFinder().evaluate().isEmpty) { + if (DateTime.now().isAfter(end)) { + throw Exception('⏱️ Timed out waiting for "$object"!'); + } + await tester.pump(const Duration(milliseconds: 500)); + } + } + + Future _ensureVisible(Object object, {int? index}) async { + var finder = object.toFinder(); + if (finder.evaluate().isEmpty) await waitFor(object); + + if (finder.evaluate().length > 1) { + if (index == null) { + throw Exception( + '⚠️ Found ${finder.evaluate().length} "$object" objects. Please specify an index!', + ); + } + if (finder.evaluate().length <= index) { + throw Exception( + '⚠️ Found ${finder.evaluate().length} "$object" objects. So index $index does not exist!', + ); + } + finder = finder.at(index); + } + return finder; + } + + Future tapOn( + Object object, { + int? index, + bool pumpAndSettle = true, + }) async { + final finder = await _ensureVisible(object, index: index); + + _print('👆 Tapping on "$object"'); + await tester.tap(finder); + if (pumpAndSettle) await tester.pumpAndSettle(); + } + + Future goBack() => tapOn(find.byTooltip('Back')); + + Future enterText( + Object object, + String text, { + int? index, + bool pumpAndSettle = true, + }) async { + final finder = await _ensureVisible(object, index: index); + + _print('⌨️ Enter "$text" into "$object"'); + await tester.enterText(finder, text); + FocusManager.instance.primaryFocus?.unfocus(); + if (pumpAndSettle) await tester.pumpAndSettle(); + } + + Future scrollUntilVisible( + Object object, { + int? index, + Object? scrollable, + }) async { + _print('📜 Scrolling to "$object"'); + await tester.scrollUntilVisible( + object.toFinder(), + 500.0, + scrollable: scrollable?.toFinder() ?? find.byType(Scrollable).last, + ); + await tester.pumpAndSettle(); + } +} + +extension on Object { + Finder toFinder() => switch (this) { + final Finder finder => finder, + final String string => find.text(string), + final Key key => find.byKey(key), + final IconData icon => find.byIcon(icon), + final Type type => find.byType(type), + final Widget widget => find.byWidget(widget), + _ => throw Exception('Unsupported finder type: $runtimeType'), + }; +} + +extension StartTest on WidgetTester { + Future startFluffyChatTest() async { + app.main(['integration_test']); + + return FluffyChatTester(this); + } +} diff --git a/ios/FluffyChat Share/Info.plist b/ios/FluffyChat Share/Info.plist index d3a136ec52..876e559574 100644 --- a/ios/FluffyChat Share/Info.plist +++ b/ios/FluffyChat Share/Info.plist @@ -27,11 +27,11 @@ NSExtensionActivationRule NSExtensionActivationSupportsFileWithMaxCount - 1 + 10 NSExtensionActivationSupportsImageWithMaxCount - 1 + 10 NSExtensionActivationSupportsMovieWithMaxCount - 1 + 10 NSExtensionActivationSupportsText NSExtensionActivationSupportsWebURLWithMaxCount diff --git a/ios/FluffyChat Share/ShareViewController.swift b/ios/FluffyChat Share/ShareViewController.swift index 96d921432f..f0f85c277c 100644 --- a/ios/FluffyChat Share/ShareViewController.swift +++ b/ios/FluffyChat Share/ShareViewController.swift @@ -1,335 +1,28 @@ -import UIKit -import Social -import MobileCoreServices -import Photos - -class ShareViewController: SLComposeServiceViewController { - // TODO: IMPORTANT: This should be your host app bundle identifier - let hostAppBundleIdentifier = "im.fluffychat.app" - let sharedKey = "ShareKey" - var sharedMedia: [SharedMediaFile] = [] - var sharedText: [String] = [] - let imageContentType = kUTTypeImage as String - let videoContentType = kUTTypeMovie as String - let textContentType = kUTTypeText as String - let urlContentType = kUTTypeURL as String - let fileURLType = kUTTypeFileURL as String; - - override func isContentValid() -> Bool { - return true - } - - override func viewDidLoad() { - super.viewDidLoad(); - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - - // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. - if let content = extensionContext!.inputItems[0] as? NSExtensionItem { - if let contents = content.attachments { - for (index, attachment) in (contents).enumerated() { - if attachment.hasItemConformingToTypeIdentifier(imageContentType) { - handleImages(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(textContentType) { - handleText(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(fileURLType) { - handleFiles(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(urlContentType) { - handleUrl(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(videoContentType) { - handleVideos(content: content, attachment: attachment, index: index) - } - } - } - } - } - - override func didSelectPost() { - print("didSelectPost"); - } - - override func configurationItems() -> [Any]! { - // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here. - return [] - } - - private func handleText (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: textContentType, options: nil) { [weak self] data, error in - - if error == nil, let item = data as? String, let this = self { - - this.sharedText.append(item) - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.sharedText, forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .text) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleUrl (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: urlContentType, options: nil) { [weak self] data, error in - - if error == nil, let item = data as? URL, let this = self { - - this.sharedText.append(item.absoluteString) - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.sharedText, forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .text) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleImages (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: imageContentType, options: nil) { [weak self] data, error in - - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from: url, type: .image) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if(copied) { - this.sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .image)) - } - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .media) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleVideos (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: videoContentType, options: nil) { [weak self] data, error in - - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from: url, type: .video) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if(copied) { - guard let sharedFile = this.getSharedMediaFile(forVideo: newPath) else { - return - } - this.sharedMedia.append(sharedFile) - } - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .media) - } - - } else { - self?.dismissWithError() - } - } - } - - private func handleFiles (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: fileURLType, options: nil) { [weak self] data, error in - - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from :url, type: .file) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if (copied) { - this.sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .file)) - } - - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .file) - } - - } else { - self?.dismissWithError() - } - } - } - - private func dismissWithError() { - print("[ERROR] Error loading data!") - let alert = UIAlertController(title: "Error", message: "Error loading data", preferredStyle: .alert) - - let action = UIAlertAction(title: "Error", style: .cancel) { _ in - self.dismiss(animated: true, completion: nil) - } - - alert.addAction(action) - present(alert, animated: true, completion: nil) - extensionContext!.completeRequest(returningItems: [], completionHandler: nil) - } - - private func redirectToHostApp(type: RedirectType) { - let url = URL(string: "ShareMedia://dataUrl=\(sharedKey)#\(type)") - var responder = self as UIResponder? - let selectorOpenURL = sel_registerName("openURL:") - - while (responder != nil) { - if (responder?.responds(to: selectorOpenURL))! { - let _ = responder?.perform(selectorOpenURL, with: url) - } - responder = responder!.next - } - extensionContext!.completeRequest(returningItems: [], completionHandler: nil) - } - - enum RedirectType { - case media - case text - case file - } - - func getExtension(from url: URL, type: SharedMediaType) -> String { - let parts = url.lastPathComponent.components(separatedBy: ".") - var ex: String? = nil - if (parts.count > 1) { - ex = parts.last - } - - if (ex == nil) { - switch type { - case .image: - ex = "PNG" - case .video: - ex = "MP4" - case .file: - ex = "TXT" - } - } - return ex ?? "Unknown" - } - - func getFileName(from url: URL, type: SharedMediaType) -> String { - var name = url.lastPathComponent - - if (name.isEmpty) { - name = UUID().uuidString + "." + getExtension(from: url, type: type) - } - - return name - } - - func copyFile(at srcURL: URL, to dstURL: URL) -> Bool { - do { - if FileManager.default.fileExists(atPath: dstURL.path) { - try FileManager.default.removeItem(at: dstURL) - } - try FileManager.default.copyItem(at: srcURL, to: dstURL) - } catch (let error) { - print("Cannot copy item at \(srcURL) to \(dstURL): \(error)") - return false - } - return true - } - - private func getSharedMediaFile(forVideo: URL) -> SharedMediaFile? { - let asset = AVAsset(url: forVideo) - let duration = (CMTimeGetSeconds(asset.duration) * 1000).rounded() - let thumbnailPath = getThumbnailPath(for: forVideo) - - if FileManager.default.fileExists(atPath: thumbnailPath.path) { - return SharedMediaFile(path: forVideo.absoluteString, thumbnail: thumbnailPath.absoluteString, duration: duration, type: .video) - } - - var saved = false - let assetImgGenerate = AVAssetImageGenerator(asset: asset) - assetImgGenerate.appliesPreferredTrackTransform = true - // let scale = UIScreen.main.scale - assetImgGenerate.maximumSize = CGSize(width: 360, height: 360) - do { - let img = try assetImgGenerate.copyCGImage(at: CMTimeMakeWithSeconds(600, preferredTimescale: Int32(1.0)), actualTime: nil) - try UIImage.pngData(UIImage(cgImage: img))()?.write(to: thumbnailPath) - saved = true - } catch { - saved = false - } - - return saved ? SharedMediaFile(path: forVideo.absoluteString, thumbnail: thumbnailPath.absoluteString, duration: duration, type: .video) : nil - - } - - private func getThumbnailPath(for url: URL) -> URL { - let fileName = Data(url.lastPathComponent.utf8).base64EncodedString().replacingOccurrences(of: "==", with: "") - let path = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(hostAppBundleIdentifier)")! - .appendingPathComponent("\(fileName).jpg") - return path - } - - class SharedMediaFile: Codable { - var path: String; // can be image, video or url path. It can also be text content - var thumbnail: String?; // video thumbnail - var duration: Double?; // video duration in milliseconds - var type: SharedMediaType; - - - init(path: String, thumbnail: String?, duration: Double?, type: SharedMediaType) { - self.path = path - self.thumbnail = thumbnail - self.duration = duration - self.type = type - } - - // Debug method to print out SharedMediaFile details in the console - func toString() { - print("[SharedMediaFile] \n\tpath: \(self.path)\n\tthumbnail: \(self.thumbnail)\n\tduration: \(self.duration)\n\ttype: \(self.type)") - } - } - - enum SharedMediaType: Int, Codable { - case image - case video - case file - } - - func toData(data: [SharedMediaFile]) -> Data { - let encodedData = try? JSONEncoder().encode(data) - return encodedData! - } +// If you get no such module 'receive_sharing_intent' error. +// Go to Build Phases of your Runner target and +// move `Embed Foundation Extension` to the top of `Thin Binary`. +import receive_sharing_intent + +class ShareViewController: RSIShareViewController { + + // Use this method to return false if you don't want to redirect to host app automatically. + // Default is true + override func shouldAutoRedirect() -> Bool { + return false + } + + // Workaround to not display post dialog from + // https://github.com/KasemJaffer/receive_sharing_intent/issues/207#issuecomment-2024329619 + open override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + // Auto-trigger completion for URLs/text content + // The parent class processes attachments, but we need to ensure completion + // when view is hidden, especially for text/URL content + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in + // Small delay to allow parent processing to complete + // Then trigger post to ensure extension completes + self?.didSelectPost() + } + } + } - -extension Array { - subscript (safe index: UInt) -> Element? { - return Int(index) < count ? self[Int(index)] : nil - } -} \ No newline at end of file diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index f2872cf474..ab8e063fe8 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -20,7 +20,5 @@ ???? CFBundleVersion 1.0 - MinimumOSVersion - 9.0 diff --git a/ios/Gemfile b/ios/Gemfile index 7a118b49be..0bc467d85c 100644 --- a/ios/Gemfile +++ b/ios/Gemfile @@ -1,3 +1,8 @@ source "https://rubygems.org" gem "fastlane" + +# Workaround for ruby 3.4 https://github.com/fastlane/fastlane/issues/29183 +gem "abbrev" +gem "mutex_m" +gem "ostruct" \ No newline at end of file diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index e97e9654c8..ba9562951f 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -2,27 +2,33 @@ GEM remote: https://rubygems.org/ specs: CFPropertyList (3.0.3) - addressable (2.7.0) - public_suffix (>= 2.0.2, < 5.0) + abbrev (0.1.2) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.1) - aws-partitions (1.469.0) - aws-sdk-core (3.114.3) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) - aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.44.0) - aws-sdk-core (~> 3, >= 3.112.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.96.1) - aws-sdk-core (~> 3, >= 3.112.0) + aws-eventstream (1.4.0) + aws-partitions (1.1213.0) + aws-sdk-core (3.242.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal + jmespath (~> 1, >= 1.6.1) + logger + aws-sdk-kms (1.121.0) + aws-sdk-core (~> 3, >= 3.241.4) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.208.0) + aws-sdk-core (~> 3, >= 3.234.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.3) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.3.0) + bigdecimal (4.0.1) claide (1.0.3) colored (1.2) colored2 (3.1.2) @@ -36,22 +42,32 @@ GEM dotenv (2.7.6) emoji_regex (3.2.2) excon (0.82.0) - faraday (1.4.2) + faraday (1.10.6) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) - multipart-post (>= 1.2, < 3) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.2.0) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.4) faraday_middleware (1.0.0) faraday (~> 1.0) fastimage (2.2.4) @@ -137,28 +153,32 @@ GEM http-cookie (1.0.4) domain_name (~> 0.5) httpclient (2.8.3) - jmespath (1.4.0) + jmespath (1.6.2) json (2.5.1) - jwt (2.2.3) + jwt (2.10.3) + base64 + logger (1.7.0) memoist (0.16.2) mini_magick (4.11.0) mini_mime (1.1.0) multi_json (1.15.0) multipart-post (2.0.0) + mutex_m (0.3.0) nanaimo (0.3.0) naturally (2.2.1) os (1.1.1) + ostruct (0.6.3) plist (3.6.0) - public_suffix (4.0.6) + public_suffix (7.0.5) rake (13.0.3) representable (3.1.1) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.4.2) rouge (2.0.7) - ruby2_keywords (0.0.4) + ruby2_keywords (0.0.5) rubyzip (2.3.0) security (0.1.3) signet (0.15.0) @@ -182,7 +202,7 @@ GEM unf_ext unf_ext (0.0.7.7) unicode-display_width (1.7.0) - webrick (1.7.0) + webrick (1.8.2) word_wrap (1.0.0) xcodeproj (1.19.0) CFPropertyList (>= 2.3.3, < 4.0) @@ -199,7 +219,10 @@ PLATFORMS ruby DEPENDENCIES + abbrev fastlane + mutex_m + ostruct BUNDLED WITH 2.1.4 diff --git a/ios/Localizable.xcstrings b/ios/Localizable.xcstrings new file mode 100644 index 0000000000..7895903adb --- /dev/null +++ b/ios/Localizable.xcstrings @@ -0,0 +1,58 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "%lld unread messages" : { + "comment" : "Default notification title", + "localizations" : { + "de" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ungelesene Nachricht" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%lld ungelesene nachrichten" + } + } + } + } + }, + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unread message" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%lld unread messages" + } + } + } + } + } + } + }, + "New message - open app to read" : { + "comment" : "Default notification body", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neue Nachricht - App öffnen zum lesen" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/ios/Notification Service Extension/Info.plist b/ios/Notification Service Extension/Info.plist new file mode 100644 index 0000000000..57421ebf9b --- /dev/null +++ b/ios/Notification Service Extension/Info.plist @@ -0,0 +1,13 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).NotificationService + + + diff --git a/ios/Notification Service Extension/Notification Service Extension.entitlements b/ios/Notification Service Extension/Notification Service Extension.entitlements new file mode 100644 index 0000000000..932f3e01e8 --- /dev/null +++ b/ios/Notification Service Extension/Notification Service Extension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.im.fluffychat.app + + + diff --git a/ios/Notification Service Extension/NotificationService.swift b/ios/Notification Service Extension/NotificationService.swift new file mode 100644 index 0000000000..9d464e127c --- /dev/null +++ b/ios/Notification Service Extension/NotificationService.swift @@ -0,0 +1,63 @@ +// +// NotificationService.swift +// Notification Extension +// +// Created by Christian Pauly on 26.08.25. +// + +import UserNotifications +import os + +class NotificationService: UNNotificationServiceExtension { + + var contentHandler: ((UNNotificationContent) -> Void)? + var bestAttemptContent: UNMutableNotificationContent? + + override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + self.contentHandler = contentHandler + bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) + + if let bestAttemptContent = bestAttemptContent { + // Uncomment to read the push message payload: + // os_log("[FluffyChatPushHelper] New message received: %{public}@", log: .default, type: .error, bestAttemptContent.userInfo) + os_log("[FluffyChatPushHelper] New message received") + + guard let roomId = bestAttemptContent.userInfo["room_id"] as? String, + let eventId = bestAttemptContent.userInfo["event_id"] as? String else { + os_log("[FluffyChatPushHelper] Room ID or Event ID is missing!") + let emptyContent = UNMutableNotificationContent() + contentHandler(emptyContent) + return + } + bestAttemptContent.threadIdentifier = roomId + + if + let jsonString = bestAttemptContent.userInfo["counts"] as? String, + let jsonData = jsonString.data(using: .utf8), + let jsonMap = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any], + let unread = jsonMap["unread"] as? Int { + bestAttemptContent.title = String( + localized: "\(unread) unread messages", + comment: "Default notification title" + ) + bestAttemptContent.badge = NSNumber(integerLiteral: unread) + } + + // TODO: Download and decrypt event to display a better body: + bestAttemptContent.body = String( + localized: "New message - open app to read", + comment: "Default notification body" + ) + + contentHandler(bestAttemptContent) + } + } + + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) + } + } +} diff --git a/ios/Podfile b/ios/Podfile index beb55ecd5b..0394f2cc82 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '10.0' +platform :ios, '15.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -32,19 +32,35 @@ target 'Runner' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + # From package https://pub.dev/packages/receive_sharing_intent + target 'FluffyChat Share' do + inherit! :search_paths + end end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| + # ensure all dependencies are using SQLCipher instead of SQLite + xcconfig_path = config.base_configuration_reference.real_path + xcconfig = File.read(xcconfig_path) + new_xcconfig = xcconfig.sub(' -l"sqlite3"', '') + File.open(xcconfig_path, "w") { |file| file << new_xcconfig } + config.build_settings['ENABLE_BITCODE'] = 'NO' - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0' - # https://github.com/flutter-webrtc/flutter-webrtc/issues/713 - if target.name == "flutter_webrtc" || target.name == "WebRTC-SDK" - config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES' - end + # see https://github.com/flutter-webrtc/flutter-webrtc/issues/1054 + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = 'arm64 i386' + + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + # dart: PermissionGroup.microphone + 'PERMISSION_MICROPHONE=1', + ] end end + flutter_post_install(installer) if defined?(flutter_post_install) end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index dfc4598c2a..174f711671 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,12 +3,13 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 609046320A2D7D2B0D36583B /* Pods_FluffyChat_Share.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; @@ -17,7 +18,13 @@ C1005C45261071B5002F4F32 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1005C44261071B5002F4F32 /* ShareViewController.swift */; }; C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1005C46261071B5002F4F32 /* MainInterface.storyboard */; }; C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C137635E2AD1446100A8F905 /* notification.caf in Resources */ = {isa = PBXBuildFile; fileRef = C137635D2AD1446100A8F905 /* notification.caf */; }; + C14695592E642D400075F2F7 /* Notification Service Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C14695522E642D400075F2F7 /* Notification Service Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C14695662E642E450075F2F7 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C14695652E642E450075F2F7 /* Localizable.xcstrings */; }; + C14695672E642E450075F2F7 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C14695652E642E450075F2F7 /* Localizable.xcstrings */; }; + C14695682E642E450075F2F7 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C14695652E642E450075F2F7 /* Localizable.xcstrings */; }; C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C149567B25C7274F00A16396 /* GoogleService-Info.plist */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -28,6 +35,13 @@ remoteGlobalIDString = C1005C41261071B5002F4F32; remoteInfo = "FluffyChat Share"; }; + C14695572E642D400075F2F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = C14695512E642D400075F2F7; + remoteInfo = "Notification Service Extension"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -48,6 +62,7 @@ dstSubfolderSpec = 13; files = ( C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */, + C14695592E642D400075F2F7 /* Notification Service Extension.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -55,10 +70,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.debug.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.debug.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.profile.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; @@ -76,21 +93,57 @@ C1005C47261071B5002F4F32 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; C1005C49261071B5002F4F32 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "FluffyChat Share.entitlements"; sourceTree = ""; }; + C137635D2AD1446100A8F905 /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notification.caf; sourceTree = ""; }; + C14695522E642D400075F2F7 /* Notification Service Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Notification Service Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + C14695652E642E450075F2F7 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; C149567B25C7274F00A16396 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; C149567D25C7276200A16396 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FluffyChat_Share.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.release.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.release.xcconfig"; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + C146955D2E642D400075F2F7 /* Exceptions for "Notification Service Extension" folder in "Notification Service Extension" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = C14695512E642D400075F2F7 /* Notification Service Extension */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + C14695532E642D400075F2F7 /* Notification Service Extension */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + C146955D2E642D400075F2F7 /* Exceptions for "Notification Service Extension" folder in "Notification Service Extension" target */, + ); + path = "Notification Service Extension"; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; C1005C3F261071B5002F4F32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 609046320A2D7D2B0D36583B /* Pods_FluffyChat_Share.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C146954F2E642D400075F2F7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -104,6 +157,7 @@ isa = PBXGroup; children = ( 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */, + C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */, ); name = Frameworks; sourceTree = ""; @@ -111,6 +165,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -122,9 +177,11 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + C14695652E642E450075F2F7 /* Localizable.xcstrings */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, C1005C43261071B5002F4F32 /* FluffyChat Share */, + C14695532E642D400075F2F7 /* Notification Service Extension */, 97C146EF1CF9000F007C117D /* Products */, E89DCAC000D371640E94E65B /* Pods */, 075EE1BE25359E34308E0B78 /* Frameworks */, @@ -136,6 +193,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, C1005C42261071B5002F4F32 /* FluffyChat Share.appex */, + C14695522E642D400075F2F7 /* Notification Service Extension.appex */, ); name = Products; sourceTree = ""; @@ -150,6 +208,7 @@ 97C147021CF9000F007C117D /* Info.plist */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, C149567B25C7274F00A16396 /* GoogleService-Info.plist */, + C137635D2AD1446100A8F905 /* notification.caf */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, @@ -174,6 +233,9 @@ 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */, EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */, 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */, + 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */, + F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */, + 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -182,6 +244,9 @@ /* Begin PBXNativeTarget section */ 97C146ED1CF9000F007C117D /* Runner */ = { + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -190,15 +255,16 @@ 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, + C1005C4D261071B5002F4F32 /* Embed App Extensions */, 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */, - C1005C4D261071B5002F4F32 /* Embed App Extensions */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ); buildRules = ( ); dependencies = ( C1005C4B261071B5002F4F32 /* PBXTargetDependency */, + C14695582E642D400075F2F7 /* PBXTargetDependency */, ); name = Runner; productName = Runner; @@ -209,6 +275,7 @@ isa = PBXNativeTarget; buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */; buildPhases = ( + 67579C1EA0B5C7B918473158 /* [CP] Check Pods Manifest.lock */, C1005C3E261071B5002F4F32 /* Sources */, C1005C3F261071B5002F4F32 /* Frameworks */, C1005C40261071B5002F4F32 /* Resources */, @@ -222,14 +289,37 @@ productReference = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; productType = "com.apple.product-type.app-extension"; }; + C14695512E642D400075F2F7 /* Notification Service Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = C146955E2E642D400075F2F7 /* Build configuration list for PBXNativeTarget "Notification Service Extension" */; + buildPhases = ( + C146954E2E642D400075F2F7 /* Sources */, + C146954F2E642D400075F2F7 /* Frameworks */, + C14695502E642D400075F2F7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + C14695532E642D400075F2F7 /* Notification Service Extension */, + ); + name = "Notification Service Extension"; + productName = "Notification Service Extension"; + productReference = C14695522E642D400075F2F7 /* Notification Service Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1240; - LastUpgradeCheck = 1300; + LastSwiftUpdateCheck = 1640; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -239,23 +329,28 @@ C1005C41261071B5002F4F32 = { CreatedOnToolsVersion = 12.4; }; + C14695512E642D400075F2F7 = { + CreatedOnToolsVersion = 16.4; + }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, + de, ); mainGroup = 97C146E51CF9000F007C117D; + preferredProjectObjectVersion = 77; productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, C1005C41261071B5002F4F32 /* FluffyChat Share */, + C14695512E642D400075F2F7 /* Notification Service Extension */, ); }; /* End PBXProject section */ @@ -268,7 +363,9 @@ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */, + C137635E2AD1446100A8F905 /* notification.caf in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + C14695672E642E450075F2F7 /* Localizable.xcstrings in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -277,26 +374,59 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C14695682E642E450075F2F7 /* Localizable.xcstrings in Resources */, C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; + C14695502E642D400075F2F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C14695662E642E450075F2F7 /* Localizable.xcstrings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; + }; + 67579C1EA0B5C7B918473158 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-FluffyChat Share-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -322,6 +452,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -332,7 +463,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -371,6 +502,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C146954E2E642D400075F2F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -379,6 +517,11 @@ target = C1005C41261071B5002F4F32 /* FluffyChat Share */; targetProxy = C1005C4A261071B5002F4F32 /* PBXContainerItemProxy */; }; + C14695582E642D400075F2F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C14695512E642D400075F2F7 /* Notification Service Extension */; + targetProxy = C14695572E642D400075F2F7 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -450,10 +593,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -467,6 +611,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 4NXF6Z997G; ENABLE_BITCODE = NO; @@ -475,6 +621,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -486,6 +633,7 @@ MARKETING_VERSION = 0.32.1; PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.app; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -539,10 +687,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -588,11 +737,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -607,6 +757,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 4NXF6Z997G; ENABLE_BITCODE = NO; @@ -615,6 +767,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -626,6 +779,7 @@ MARKETING_VERSION = 0.32.1; PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.app; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -641,6 +795,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 4NXF6Z997G; ENABLE_BITCODE = NO; @@ -649,6 +805,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -660,6 +817,7 @@ MARKETING_VERSION = 0.32.1; PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.app; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -668,6 +826,7 @@ }; C1005C4E261071B5002F4F32 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 09545B0C8C397F94966EA956 /* Pods-FluffyChat Share.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -681,7 +840,7 @@ DEVELOPMENT_TEAM = 4NXF6Z997G; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "FluffyChat Share/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.4; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -694,6 +853,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -702,6 +862,7 @@ }; C1005C4F261071B5002F4F32 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -715,7 +876,7 @@ DEVELOPMENT_TEAM = 4NXF6Z997G; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "FluffyChat Share/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.4; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -726,6 +887,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.FluffyChat-Share"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -733,6 +895,7 @@ }; C1005C50261071B5002F4F32 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 58F7B95D036AD8E67B27588D /* Pods-FluffyChat Share.profile.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -746,7 +909,7 @@ DEVELOPMENT_TEAM = 4NXF6Z997G; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "FluffyChat Share/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.4; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -757,6 +920,127 @@ PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.FluffyChat-Share"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; + C146955A2E642D400075F2F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Notification Service Extension/Notification Service Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Notification Service Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Notification Service Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C146955B2E642D400075F2F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Notification Service Extension/Notification Service Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Notification Service Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Notification Service Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C146955C2E642D400075F2F7 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Notification Service Extension/Notification Service Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Notification Service Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Notification Service Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -795,7 +1079,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C146955E2E642D400075F2F7 /* Build configuration list for PBXNativeTarget "Notification Service Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C146955A2E642D400075F2F7 /* Debug */, + C146955B2E642D400075F2F7 /* Release */, + C146955C2E642D400075F2F7 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 3db53b6e1f..0bd6d42276 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,10 +1,28 @@ + + + + + + + + + + @@ -45,11 +64,13 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 9413c69718..6fc5538a79 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,16 +1,18 @@ import UIKit import Flutter -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { +@main +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - if #available(iOS 10.0, *) { - UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate - } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + + // From https://pub.dev/packages/flutter_local_notifications#-ios-setup + UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fab2d..d0d98aa177 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index fb1434bfef..594166632c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index c1316a046f..497580fced 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 614e86e702..db6d7d362e 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 6470c4af25..1db7f9cab5 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 67e871887d..a20d2901ad 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 82f590cb44..d6090ea748 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 82e64450f8..74dc9651fa 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 614e86e702..db6d7d362e 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 4cea61db84..fcf16012a0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index a526a33e47..4632a7fe14 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png index bbf764529b..2f1fad693b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png index cd6906568a..8675f18874 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png index f3dd408e39..7e42c849a5 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png index 37766e74a0..f57322ecc3 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a526a33e47..4632a7fe14 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index a21531ac06..1ab5734344 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png index 477aa9700d..d17b8e5134 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png index 9d3aaf7db3..547f4bb158 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index f02c1af0df..0f776d9715 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index ba0bc949a9..cff034b350 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 93bc652362..10bdca0c49 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json deleted file mode 100644 index fa3132785b..0000000000 --- a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "images" : [ - { - "filename" : "background.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "darkbackground.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png deleted file mode 100644 index e29b3b59f9..0000000000 Binary files a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png deleted file mode 100644 index 1b5df34e7b..0000000000 Binary files a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 00cabce836..0bedcf2fd4 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -1,23 +1,23 @@ { "images" : [ { - "filename" : "LaunchImage.png", "idiom" : "universal", + "filename" : "LaunchImage.png", "scale" : "1x" }, { - "filename" : "LaunchImage@2x.png", "idiom" : "universal", + "filename" : "LaunchImage@2x.png", "scale" : "2x" }, { - "filename" : "LaunchImage@3x.png", "idiom" : "universal", + "filename" : "LaunchImage@3x.png", "scale" : "3x" } ], "info" : { - "author" : "xcode", - "version" : 1 + "version" : 1, + "author" : "xcode" } } diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png index f4c0bdb922..9da19eacad 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png index dafa3b7070..9da19eacad 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png index b627f52801..9da19eacad 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index fdc5a5e564..f2e259c7c9 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -16,19 +16,13 @@ - - + + - - - - - - - - + + @@ -38,7 +32,6 @@ - - + - \ No newline at end of file + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 559712dbe5..51765d1c99 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -33,7 +33,7 @@ im.fluffychat.app.uris CFBundleURLSchemes - ShareMedia + ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) im.fluffychat matrix @@ -63,6 +63,8 @@ Share your location with your contacts in FluffyChat. NSLocationWhenInUseUsageDescription Share your location with your contacts in FluffyChat. + NSLocationAlwaysAndWhenInUseUsageDescription + Share your location with your contacts in FluffyChat. NSMicrophoneUsageDescription Record voice message and share them with your contacts on FluffyChat. NSMotionUsageDescription @@ -108,5 +110,28 @@ CADisableMinimumFrameDurationOnPhone + UIApplicationSupportsIndirectInputEvents + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + diff --git a/ios/Runner/notification.caf b/ios/Runner/notification.caf new file mode 100644 index 0000000000..20fa944a4b Binary files /dev/null and b/ios/Runner/notification.caf differ diff --git a/ios/fastlane/Appfile b/ios/fastlane/Appfile deleted file mode 100644 index 5401ca9f72..0000000000 --- a/ios/fastlane/Appfile +++ /dev/null @@ -1,8 +0,0 @@ -app_identifier("im.fluffychat.app") # The bundle identifier of your app -apple_id("christian.pauly@wtal.de") # Your Apple email address - -itc_team_id("122628977") # App Store Connect Team ID -team_id("4NXF6Z997G") # Developer Portal Team ID - -# For more information about the Appfile, see: -# https://docs.fastlane.tools/advanced/#appfile diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile deleted file mode 100644 index c2bac8f3e0..0000000000 --- a/ios/fastlane/Fastfile +++ /dev/null @@ -1,40 +0,0 @@ -# This file contains the fastlane.tools configuration -# You can find the documentation at https://docs.fastlane.tools -# -# For a list of all available actions, check out -# -# https://docs.fastlane.tools/actions -# -# For a list of all available plugins, check out -# -# https://docs.fastlane.tools/plugins/available-plugins -# - -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane - -default_platform(:ios) - -platform :ios do - desc "Push a new beta build to TestFlight" - lane :beta do - increment_build_number( - xcodeproj: "Runner.xcodeproj", - build_number: latest_testflight_build_number + 1 - ) - re = /version:\s([0-9]*\.[0-9]*\.[0-9]*)\+[0-9]*/i - config = File.read("../../pubspec.yaml") - version_name = config.match(re).captures[0] - increment_version_number(version_number: version_name) - build_app(workspace: "Runner.xcworkspace", scheme: "Runner") - upload_to_testflight(distribute_external: true, groups: "FluffyChat Betatest") - end -end - -lane :release do - capture_screenshots # generate new screenshots for the App Store - sync_code_signing(type: "appstore") # see code signing guide for more information - build_app(scheme: "Runner") - upload_to_app_store # upload your app to App Store Connect - slack(message: "Successfully uploaded a new App Store build") -end diff --git a/ios/fastlane/README.md b/ios/fastlane/README.md deleted file mode 100644 index c7d6f91354..0000000000 --- a/ios/fastlane/README.md +++ /dev/null @@ -1,37 +0,0 @@ -fastlane documentation -================ -# Installation - -Make sure you have the latest version of the Xcode command line tools installed: - -``` -xcode-select --install -``` - -Install _fastlane_ using -``` -[sudo] gem install fastlane -NV -``` -or alternatively using `brew install fastlane` - -# Available Actions -### release -``` -fastlane release -``` - - ----- - -## iOS -### ios beta -``` -fastlane ios beta -``` -Push a new beta build to TestFlight - ----- - -This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. -More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). -The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml deleted file mode 100644 index aa3917be78..0000000000 --- a/ios/fastlane/report.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/l10n.yaml b/l10n.yaml index a714613ee0..b6b32b0f0e 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -1,5 +1,12 @@ -arb-dir: assets/l10n +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +arb-dir: lib/l10n template-arb-file: intl_en.arb output-localization-file: l10n.dart output-class: L10n preferred-supported-locales: ["en"] +use-deferred-loading: true +nullable-getter: false \ No newline at end of file diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index de99da9b4b..f29bd6d7dd 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -1,99 +1,63 @@ -import 'dart:ui'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:matrix/matrix.dart'; +import 'dart:ui'; abstract class AppConfig { - static String _applicationName = 'FluffyChat'; - static String get applicationName => _applicationName; - static String? _applicationWelcomeMessage; - static String? get applicationWelcomeMessage => _applicationWelcomeMessage; - static String _defaultHomeserver = 'matrix.org'; - static String get defaultHomeserver => _defaultHomeserver; - static double bubbleSizeFactor = 1; - static double fontSizeFactor = 1; + static const Color primaryColor = Color(0xFF261386); + static const Color chatColor = primaryColor; - static Color? colorSchemeSeed = primaryColor; - static const double messageFontSize = 15.75; + static const double messageFontSize = 16.0; static const bool allowOtherHomeservers = true; static const bool enableRegistration = true; - static const Color primaryColor = Color(0xFF5625BA); - static const Color primaryColorLight = Color(0xFFCCBDEA); - static const Color secondaryColor = Color(0xFF41a2bc); - static String _privacyUrl = - 'https://gitlab.com/famedly/fluffychat/-/blob/main/PRIVACY.md'; - static String get privacyUrl => _privacyUrl; - static const String enablePushTutorial = - 'https://www.reddit.com/r/fluffychat/comments/qn6liu/enable_push_notifications_without_google_services/'; - static const String appId = 'im.fluffychat.FluffyChat'; - static const String appOpenUrlScheme = 'im.fluffychat'; - static String _webBaseUrl = 'https://fluffychat.im/web'; - static String get webBaseUrl => _webBaseUrl; - static const String sourceCodeUrl = 'https://gitlab.com/famedly/fluffychat'; - static const String supportUrl = - 'https://gitlab.com/famedly/fluffychat/issues'; - static const bool enableSentry = true; - static const String sentryDns = - 'https://8591d0d863b646feb4f3dda7e5dcab38@o256755.ingest.sentry.io/5243143'; - static bool renderHtml = true; - static bool hideRedactedEvents = false; - static bool hideUnknownEvents = true; - static bool showDirectChatsInSpaces = true; - static bool separateChatTypes = false; - static bool autoplayImages = true; - static bool sendOnEnter = false; - static bool experimentalVoip = false; static const bool hideTypingUsernames = false; - static const bool hideAllStateEvents = false; + static const String inviteLinkPrefix = 'https://matrix.to/#/'; static const String deepLinkPrefix = 'im.fluffychat://chat/'; static const String schemePrefix = 'matrix:'; static const String pushNotificationsChannelId = 'fluffychat_push'; - static const String pushNotificationsChannelName = 'FluffyChat push channel'; - static const String pushNotificationsChannelDescription = - 'Push notifications for FluffyChat'; static const String pushNotificationsAppId = 'chat.fluffy.fluffychat'; - static const String pushNotificationsGatewayUrl = - 'https://push.fluffychat.im/_matrix/push/v1/notify'; - static const String pushNotificationsPusherFormat = 'event_id_only'; - static const String emojiFontName = 'Noto Emoji'; - static const String emojiFontUrl = - 'https://github.com/googlefonts/noto-emoji/'; - static const double borderRadius = 16.0; + static const double borderRadius = 18.0; + static const double spaceBorderRadius = 11.0; static const double columnWidth = 360.0; - static void loadFromJson(Map json) { - if (json['chat_color'] != null) { - try { - colorSchemeSeed = Color(json['chat_color']); - } catch (e) { - Logs().w( - 'Invalid color in config.json! Please make sure to define the color in this format: "0xffdd0000"', - e); - } - } - if (json['application_name'] is String) { - _applicationName = json['application_name']; - } - if (json['application_welcome_message'] is String) { - _applicationWelcomeMessage = json['application_welcome_message']; - } - if (json['default_homeserver'] is String) { - _defaultHomeserver = json['default_homeserver']; - } - if (json['privacy_url'] is String) { - _webBaseUrl = json['privacy_url']; - } - if (json['web_base_url'] is String) { - _privacyUrl = json['web_base_url']; - } - if (json['render_html'] is bool) { - renderHtml = json['render_html']; - } - if (json['hide_redacted_events'] is bool) { - hideRedactedEvents = json['hide_redacted_events']; - } - if (json['hide_unknown_events'] is bool) { - hideUnknownEvents = json['hide_unknown_events']; - } - } + static const String enablePushTutorial = + 'https://fluffychat.im/faq/#push_without_google_services'; + static const String encryptionTutorial = + 'https://fluffychat.im/faq/#how_to_use_end_to_end_encryption'; + static const String startChatTutorial = + 'https://fluffychat.im/faq/#how_do_i_find_other_users'; + static const String howDoIGetStickersTutorial = + 'https://fluffychat.im/faq/#how_do_i_get_stickers'; + static const String appId = 'im.fluffychat.FluffyChat'; + static const String appOpenUrlScheme = 'im.fluffychat'; + static const String appSsoUrlScheme = 'im.fluffychat.auth'; + + static const String sourceCodeUrl = + 'https://github.com/krille-chan/fluffychat'; + static const String supportUrl = + 'https://github.com/krille-chan/fluffychat/issues'; + static const String changelogUrl = 'https://fluffychat.im/changelog/'; + static const String helpUrl = + 'https://fluffychat.im/faq/#how_can_i_support_fluffychat'; + + static const Set defaultReactions = {'👍', '❤️', '😂', '😮', '😢'}; + + static final Uri newIssueUrl = Uri( + scheme: 'https', + host: 'github.com', + path: '/krille-chan/fluffychat/issues/new', + ); + + static final Uri homeserverList = Uri( + scheme: 'https', + host: 'raw.githubusercontent.com', + path: 'krille-chan/fluffychat/refs/heads/main/recommended_homeservers.json', + ); + + static const String mainIsolatePortName = 'main_isolate'; + static const String pushIsolatePortName = 'push_isolate'; + static const String pushHelperCrashReportKey = 'push_helper_crash_report'; } diff --git a/lib/config/app_emojis.dart b/lib/config/app_emojis.dart deleted file mode 100644 index 3c38e2fa87..0000000000 --- a/lib/config/app_emojis.dart +++ /dev/null @@ -1,30 +0,0 @@ -abstract class AppEmojis { - static const List emojis = [ - '👍', - '😊', - '😀', - '❤️', - '😍', - '😘', - '😇', - '😅', - '😭', - '😜', - '😱', - '😆', - '😉', - '😡', - '👋', - '🤔', - '🙁', - '🥳', - '😟', - '😄', - '😁', - '🙄', - '😂', - '🤣', - '😌', - '😬', - ]; -} diff --git a/lib/config/isrg_x1.dart b/lib/config/isrg_x1.dart index 6a6d0ac2d4..bc901bf771 100644 --- a/lib/config/isrg_x1.dart +++ b/lib/config/isrg_x1.dart @@ -1,5 +1,10 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + // ignore: constant_identifier_names -const String ISRG_X1 = """-----BEGIN CERTIFICATE----- +const String ISRG_X1 = '''-----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 @@ -29,4 +34,4 @@ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE-----"""; +-----END CERTIFICATE-----'''; diff --git a/lib/config/isrg_x2.dart b/lib/config/isrg_x2.dart new file mode 100644 index 0000000000..2d0f798acc --- /dev/null +++ b/lib/config/isrg_x2.dart @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +// ignore: constant_identifier_names +const String ISRG_X2 = '''-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE-----'''; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 6eb061a674..c1b5b915c3 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,397 +1,527 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:vrouter/vrouter.dart'; +import 'dart:async'; -import 'package:fluffychat/pages/add_story/add_story.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/archive/archive.dart'; +import 'package:fluffychat/pages/bootstrap/bootstrap_page.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/chat_members/chat_members.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; -import 'package:fluffychat/pages/connect/connect_page.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; import 'package:fluffychat/pages/device_settings/device_settings.dart'; -import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart'; +import 'package:fluffychat/pages/intro/intro_page_presenter.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; import 'package:fluffychat/pages/login/login.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat.dart'; -import 'package:fluffychat/pages/new_space/new_space.dart'; import 'package:fluffychat/pages/settings/settings.dart'; import 'package:fluffychat/pages/settings_3pid/settings_3pid.dart'; -import 'package:fluffychat/pages/settings_account/settings_account.dart'; import 'package:fluffychat/pages/settings_chat/settings_chat.dart'; import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; +import 'package:fluffychat/pages/settings_homeserver/settings_homeserver.dart'; import 'package:fluffychat/pages/settings_ignore_list/settings_ignore_list.dart'; -import 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes.dart'; import 'package:fluffychat/pages/settings_notifications/settings_notifications.dart'; +import 'package:fluffychat/pages/settings_password/settings_password.dart'; import 'package:fluffychat/pages/settings_security/settings_security.dart'; -import 'package:fluffychat/pages/settings_stories/settings_stories.dart'; import 'package:fluffychat/pages/settings_style/settings_style.dart'; -import 'package:fluffychat/pages/sign_up/signup.dart'; -import 'package:fluffychat/pages/story/story_page.dart'; +import 'package:fluffychat/pages/sign_in/sign_in_page.dart'; +import 'package:fluffychat/widgets/config_viewer.dart'; import 'package:fluffychat/widgets/layouts/empty_page.dart'; -import 'package:fluffychat/widgets/layouts/loading_view.dart'; -import 'package:fluffychat/widgets/layouts/side_view_layout.dart'; import 'package:fluffychat/widgets/layouts/two_column_layout.dart'; import 'package:fluffychat/widgets/log_view.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; -class AppRoutes { - final bool columnMode; +abstract class AppRoutes { + static FutureOr loggedInRedirect( + BuildContext context, + GoRouterState state, + ) => Matrix.of(context).widget.clients.any((client) => client.isLogged()) + ? '/rooms' + : null; - AppRoutes(this.columnMode); + static FutureOr loggedOutRedirect( + BuildContext context, + GoRouterState state, + ) => Matrix.of(context).widget.clients.any((client) => client.isLogged()) + ? null + : '/home'; - List get routes => [ - ..._homeRoutes, - if (columnMode) ..._tabletRoutes, - if (!columnMode) ..._mobileRoutes, - ]; + AppRoutes(); - List get _mobileRoutes => [ - VWidget( + static final List routes = [ + GoRoute( + path: '/', + redirect: (context, state) => + Matrix.of(context).widget.clients.any((client) => client.isLogged()) + ? '/rooms' + : '/home', + ), + GoRoute( + path: '/home', + pageBuilder: (context, state) => + defaultPageBuilder(context, state, const IntroPagePresenter()), + redirect: loggedInRedirect, + routes: [ + GoRoute( + path: 'sign_in', + pageBuilder: (context, state) => + defaultPageBuilder(context, state, SignInPage(signUp: false)), + redirect: loggedInRedirect, + ), + GoRoute( + path: 'sign_up', + pageBuilder: (context, state) => + defaultPageBuilder(context, state, SignInPage(signUp: true)), + redirect: loggedInRedirect, + ), + GoRoute( + path: 'login', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + Login(client: state.extra as Client), + ), + redirect: loggedInRedirect, + ), + ], + ), + GoRoute( + path: '/logs', + pageBuilder: (context, state) => + defaultPageBuilder(context, state, const LogViewer()), + ), + GoRoute( + path: '/configs', + pageBuilder: (context, state) => + defaultPageBuilder(context, state, const ConfigViewer()), + ), + GoRoute( + path: '/backup', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + BootstrapPage(reset: state.uri.queryParameters['reset'] == 'true'), + ), + ), + ShellRoute( + // Never use a transition on the shell route. Changing the PageBuilder + // here based on a MediaQuery causes the child to briefly be rendered + // twice with the same GlobalKey, blowing up the rendering. + pageBuilder: (context, state, child) => noTransitionPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) && + state.fullPath?.startsWith('/rooms/settings') == false + ? TwoColumnLayout( + mainView: ChatList( + activeChat: state.pathParameters['roomid'], + activeSpace: state.uri.queryParameters['spaceId'], + displayNavigationRail: + state.path?.startsWith('/rooms/settings') != true, + ), + sideView: child, + ) + : child, + ), + routes: [ + GoRoute( path: '/rooms', - widget: const ChatList(), - stackedRoutes: [ - VWidget( - path: '/stories/create', - widget: const AddStoryPage(), - ), - VWidget( - path: '/stories/:roomid', - widget: const StoryPage(), - stackedRoutes: [ - VWidget( - path: 'share', - widget: const AddStoryPage(), + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? const EmptyPage() + : ChatList( + activeChat: state.pathParameters['roomid'], + activeSpace: state.uri.queryParameters['spaceId'], + ), + ), + routes: [ + GoRoute( + path: 'archive', + pageBuilder: (context, state) => + defaultPageBuilder(context, state, const Archive()), + routes: [ + GoRoute( + path: ':roomid', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatPage( + roomId: state.pathParameters['roomid']!, + eventId: state.uri.queryParameters['event'], + ), + ), + redirect: loggedOutRedirect, ), ], + redirect: loggedOutRedirect, ), - VWidget( - path: '/spaces/:roomid', - widget: const ChatDetails(), - stackedRoutes: _chatDetailsRoutes, - ), - VWidget(path: ':roomid', widget: const Chat(), stackedRoutes: [ - VWidget( - path: 'encryption', - widget: const ChatEncryptionSettings(), - ), - VWidget( - path: 'invite', - widget: const InvitationSelection(), - ), - VWidget( - path: 'details', - widget: const ChatDetails(), - stackedRoutes: _chatDetailsRoutes, + GoRoute( + path: 'newprivatechat', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + NewPrivateChat( + key: ValueKey('new_chat_${state.uri.fragment}'), + deeplink: state.uri.fragment, + ), ), - ]), - VWidget( - path: '/settings', - widget: const Settings(), - stackedRoutes: _settingsRoutes, - ), - VWidget( - path: '/archive', - widget: const Archive(), + redirect: loggedOutRedirect, ), - VWidget( - path: '/newprivatechat', - widget: const NewPrivateChat(), - ), - VWidget( - path: '/newgroup', - widget: const NewGroup(), - ), - VWidget( - path: '/newspace', - widget: const NewSpace(), + GoRoute( + path: 'newgroup', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + NewGroup(spaceId: state.uri.queryParameters['space_id']), + ), + redirect: loggedOutRedirect, ), - ], - ), - ]; - List get _tabletRoutes => [ - VNester( - path: '/rooms', - widgetBuilder: (child) => TwoColumnLayout( - mainView: const ChatList(), - sideView: child, - ), - buildTransition: _fadeTransition, - nestedRoutes: [ - VWidget( - path: '', - widget: const EmptyPage(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: '/stories/create', - buildTransition: _fadeTransition, - widget: const AddStoryPage(), - ), - VWidget( - path: '/stories/:roomid', - buildTransition: _fadeTransition, - widget: const StoryPage(), - stackedRoutes: [ - VWidget( - path: 'share', - widget: const AddStoryPage(), - ), - ], - ), - VWidget( - path: '/spaces/:roomid', - widget: const ChatDetails(), - buildTransition: _fadeTransition, - stackedRoutes: _chatDetailsRoutes, - ), - VWidget( - path: '/newprivatechat', - widget: const NewPrivateChat(), - buildTransition: _fadeTransition, - ), - VWidget( - path: '/newgroup', - widget: const NewGroup(), - buildTransition: _fadeTransition, + GoRoute( + path: 'newspace', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + NewGroup( + createGroupType: CreateGroupType.space, + spaceId: state.uri.queryParameters['space_id'], ), - VWidget( - path: '/newspace', - widget: const NewSpace(), - buildTransition: _fadeTransition, - ), - VNester( - path: ':roomid', - widgetBuilder: (child) => SideViewLayout( - mainView: const Chat(), - sideView: child, + ), + redirect: loggedOutRedirect, + ), + ShellRoute( + pageBuilder: (context, state, child) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? TwoColumnLayout( + mainView: Settings(key: state.pageKey), + sideView: child, + hasNavigationRail: false, + ) + : child, + ), + routes: [ + GoRoute( + path: 'settings', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + FluffyThemes.isColumnMode(context) + ? const EmptyPage() + : const Settings(), ), - buildTransition: _fadeTransition, - nestedRoutes: [ - VWidget( - path: '', - widget: const Chat(), - buildTransition: _fadeTransition, + routes: [ + GoRoute( + path: 'notifications', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsNotifications(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: 'encryption', - widget: const ChatEncryptionSettings(), - buildTransition: _fadeTransition, + GoRoute( + path: 'style', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsStyle(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: 'details', - widget: const ChatDetails(), - buildTransition: _fadeTransition, - stackedRoutes: _chatDetailsRoutes, + GoRoute( + path: 'devices', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const DevicesSettings(), + ), + redirect: loggedOutRedirect, ), - VWidget( - path: 'invite', - widget: const InvitationSelection(), - buildTransition: _fadeTransition, + GoRoute( + path: 'chat', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsChat(), + ), + routes: [ + GoRoute( + path: 'emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + EmotesSettings( + roomId: state.pathParameters['roomid'], + ), + ), + ), + ], + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'addaccount', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const IntroPagePresenter(), + ), + routes: [ + GoRoute( + path: 'sign_in', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + SignInPage(signUp: false), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'sign_up', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + SignInPage(signUp: true), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'login', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + Login(client: state.extra as Client), + ), + redirect: loggedOutRedirect, + ), + ], + ), + GoRoute( + path: 'homeserver', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + const SettingsHomeserver(), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'security', + redirect: loggedOutRedirect, + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const SettingsSecurity(), + ), + routes: [ + GoRoute( + path: 'password', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + const SettingsPassword(), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'ignorelist', + pageBuilder: (context, state) { + return defaultPageBuilder( + context, + state, + SettingsIgnoreList( + initialUserId: state.extra?.toString(), + ), + ); + }, + redirect: loggedOutRedirect, + ), + GoRoute( + path: '3pid', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const Settings3Pid(), + ), + redirect: loggedOutRedirect, + ), + ], ), ], + redirect: loggedOutRedirect, ), ], ), - ], - ), - VWidget( - path: '/rooms', - widget: const TwoColumnLayout( - mainView: ChatList(), - sideView: EmptyPage(), - ), - buildTransition: _fadeTransition, - stackedRoutes: [ - VNester( - path: '/settings', - widgetBuilder: (child) => TwoColumnLayout( - mainView: const Settings(), - sideView: child, - ), - buildTransition: _dynamicTransition, - nestedRoutes: [ - VWidget( - path: '', - widget: const EmptyPage(), - buildTransition: _dynamicTransition, - stackedRoutes: _settingsRoutes, + GoRoute( + path: ':roomid', + pageBuilder: (context, state) { + final body = state.uri.queryParameters['body']; + var shareItems = state.extra is List + ? state.extra as List + : null; + if (body != null && body.isNotEmpty) { + shareItems ??= []; + shareItems.add(TextShareItem(body)); + } + return defaultPageBuilder( + context, + state, + ChatPage( + roomId: state.pathParameters['roomid']!, + shareItems: shareItems, + eventId: state.uri.queryParameters['event'], + ), + ); + }, + redirect: loggedOutRedirect, + routes: [ + GoRoute( + path: 'search', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatSearchPage(roomId: state.pathParameters['roomid']!), + ), + redirect: loggedOutRedirect, ), - ], - ), - VWidget( - path: '/archive', - widget: const TwoColumnLayout( - mainView: Archive(), - sideView: EmptyPage(), - ), - buildTransition: _fadeTransition, - ), - ], - ), - ]; - - List get _homeRoutes => [ - VWidget(path: '/', widget: const LoadingView()), - VWidget( - path: '/home', - widget: const HomeserverPicker(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, - ), - VWidget( - path: 'connect', - widget: const ConnectPage(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, + GoRoute( + path: 'encryption', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ChatEncryptionSettings(), ), - VWidget( - path: 'signup', - widget: const SignupPage(), - buildTransition: _fadeTransition, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'invite', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + InvitationSelection( + roomId: state.pathParameters['roomid']!, + ), ), - ]), - VWidget( - path: 'logs', - widget: const LogViewer(), - buildTransition: _dynamicTransition, - ), - ], - ), - ]; - - List get _chatDetailsRoutes => [ - VWidget( - path: 'permissions', - widget: const ChatPermissionsSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'invite', - widget: const InvitationSelection(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'multiple_emotes', - widget: const MultipleEmotesSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'emotes', - widget: const EmotesSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'emotes/:state_key', - widget: const EmotesSettings(), - buildTransition: _dynamicTransition, - ), - ]; - - List get _settingsRoutes => [ - VWidget( - path: 'notifications', - widget: const SettingsNotifications(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'style', - widget: const SettingsStyle(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'devices', - widget: const DevicesSettings(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'chat', - widget: const SettingsChat(), - buildTransition: _dynamicTransition, - stackedRoutes: [ - VWidget( - path: 'emotes', - widget: const EmotesSettings(), - buildTransition: _dynamicTransition, - ), - ], - ), - VWidget( - path: 'account', - widget: const SettingsAccount(), - buildTransition: _dynamicTransition, - stackedRoutes: [ - VWidget( - path: 'add', - widget: const HomeserverPicker(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, + redirect: loggedOutRedirect, ), - VWidget( - path: 'connect', - widget: const ConnectPage(), - buildTransition: _fadeTransition, - stackedRoutes: [ - VWidget( - path: 'login', - widget: const Login(), - buildTransition: _fadeTransition, + GoRoute( + path: 'details', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatDetails(roomId: state.pathParameters['roomid']!), + ), + routes: [ + GoRoute( + path: 'access', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatAccessSettings( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'members', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + ChatMembersPage( + roomId: state.pathParameters['roomid']!, + ), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'permissions', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const ChatPermissionsSettings(), + ), + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'invite', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + InvitationSelection( + roomId: state.pathParameters['roomid']!, + ), ), - VWidget( - path: 'signup', - widget: const SignupPage(), - buildTransition: _fadeTransition, + redirect: loggedOutRedirect, + ), + GoRoute( + path: 'emotes', + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + EmotesSettings(roomId: state.pathParameters['roomid']), ), - ]), + redirect: loggedOutRedirect, + ), + ], + redirect: loggedOutRedirect, + ), ], ), ], ), - VWidget( - path: 'security', - widget: const SettingsSecurity(), - buildTransition: _dynamicTransition, - stackedRoutes: [ - VWidget( - path: 'stories', - widget: const SettingsStories(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: 'ignorelist', - widget: const SettingsIgnoreList(), - buildTransition: _dynamicTransition, - ), - VWidget( - path: '3pid', - widget: const Settings3Pid(), - buildTransition: _dynamicTransition, - ), - ], - ), - VWidget( - path: 'logs', - widget: const LogViewer(), - buildTransition: _dynamicTransition, - ), - ]; + ], + ), + ]; - FadeTransition Function(dynamic, dynamic, dynamic)? get _dynamicTransition => - columnMode ? _fadeTransition : null; + static Page noTransitionPageBuilder( + BuildContext context, + GoRouterState state, + Widget child, + ) => NoTransitionPage( + key: state.pageKey, + restorationId: state.pageKey.value, + child: child, + ); - FadeTransition _fadeTransition(animation1, _, child) => - FadeTransition(opacity: animation1, child: child); + static Page defaultPageBuilder( + BuildContext context, + GoRouterState state, + Widget child, + ) { + final clientName = state.uri.queryParameters['client']; + if (clientName != null) { + final matrix = Matrix.of(context); + final client = matrix.getClientByName(clientName); + if (client != null) matrix.setActiveClient(client); + } + return FluffyThemes.isColumnMode(context) + ? noTransitionPageBuilder(context, state, child) + : MaterialPage( + key: state.pageKey, + restorationId: state.pageKey.value, + child: child, + ); + } } diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 94f4ab07e9..040a088f41 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -1,30 +1,215 @@ -abstract class SettingKeys { - static const String wallpaper = 'chat.fluffy.wallpaper'; - static const String renderHtml = 'chat.fluffy.renderHtml'; - static const String hideRedactedEvents = 'chat.fluffy.hideRedactedEvents'; - static const String hideUnknownEvents = 'chat.fluffy.hideUnknownEvents'; - static const String showDirectChatsInSpaces = - 'chat.fluffy.showDirectChatsInSpaces'; - static const String separateChatTypes = 'chat.fluffy.separateChatTypes'; - static const String chatColor = 'chat.fluffy.chat_color'; - static const String sentry = 'sentry'; - static const String theme = 'theme'; - static const String amoledEnabled = 'amoled_enabled'; - static const String codeLanguage = 'code_language'; - static const String showNoGoogle = 'chat.fluffy.show_no_google'; - static const String bubbleSizeFactor = 'chat.fluffy.bubble_size_factor'; - static const String fontSizeFactor = 'chat.fluffy.font_size_factor'; - static const String showNoPid = 'chat.fluffy.show_no_pid'; - static const String databasePassword = 'database-password'; - static const String appLockKey = 'chat.fluffy.app_lock'; - static const String unifiedPushRegistered = - 'chat.fluffy.unifiedpush.registered'; - static const String unifiedPushEndpoint = 'chat.fluffy.unifiedpush.endpoint'; - static const String notificationCurrentIds = 'chat.fluffy.notification_ids'; - static const String ownStatusMessage = 'chat.fluffy.status_msg'; - static const String dontAskForBootstrapKey = - 'chat.fluffychat.dont_ask_bootstrap'; - static const String autoplayImages = 'chat.fluffy.autoplay_images'; - static const String sendOnEnter = 'chat.fluffy.send_on_enter'; - static const String experimentalVoip = 'chat.fluffy.experimental_voip'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; + +import 'package:async/async.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart' as http; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +enum AppSettings { + textMessageMaxLength('textMessageMaxLength', 16384), + + /// Max lines for unselected HTML/text bubbles; 0 = unlimited (no fade). + messagePreviewMaxLines('chat.fluffy.message_preview_max_lines', 25), + audioRecordingNumChannels('audioRecordingNumChannels', 1), + audioRecordingAutoGain('audioRecordingAutoGain', true), + audioRecordingEchoCancel('audioRecordingEchoCancel', false), + audioRecordingNoiseSuppress('audioRecordingNoiseSuppress', true), + audioRecordingBitRate('audioRecordingBitRate', 64000), + audioRecordingSamplingRate('audioRecordingSamplingRate', 44100), + showNoGoogle('chat.fluffy.show_no_google', false), + unifiedPushRegistered('chat.fluffy.unifiedpush.registered', false), + unifiedPushEndpoint('chat.fluffy.unifiedpush.endpoint', ''), + pushNotificationsGatewayUrl( + 'pushNotificationsGatewayUrl', + 'https://push.fluffychat.im/_matrix/push/v1/notify', + ), + pushNotificationsPusherFormat( + 'pushNotificationsPusherFormat', + 'event_id_only', + ), + renderHtml('chat.fluffy.renderHtml', true), + fontSizeFactor('chat.fluffy.font_size_factor', 1.0), + hideRedactedEvents('chat.fluffy.hideRedactedEvents', false), + hideUnknownEvents('chat.fluffy.hideUnknownEvents', true), + autoplayImages('chat.fluffy.autoplay_images', true), + sendTypingNotifications('chat.fluffy.send_typing_notifications', true), + sendPublicReadReceipts('chat.fluffy.send_public_read_receipts', true), + swipeRightToLeftToReply('chat.fluffy.swipeRightToLeftToReply', true), + sendOnEnter('chat.fluffy.send_on_enter', false), + displayNavigationRail('chat.fluffy.display_navigation_rail', false), + experimentalVoip('chat.fluffy.experimental_voip', false), + shareKeysWith('chat.fluffy.share_keys_with_2', 'all'), + noEncryptionWarningShown( + 'chat.fluffy.no_encryption_warning_shown', + false, + ), + displayChatDetailsColumn('chat.fluffy.display_chat_details_column', false), + // AppConfig-mirrored settings + applicationName('chat.fluffy.application_name', 'FluffyChat'), + defaultHomeserver('chat.fluffy.default_homeserver', 'matrix.org'), + // colorSchemeSeed stored as ARGB int + colorSchemeSeedInt('chat.fluffy.color_scheme_seed', 0xFF5625BA), + emojiSuggestionLocale('emoji_suggestion_locale', ''), + enableSoftLogout('chat.fluffy.enable_soft_logout', false), + enableMatrixNativeOIDC('chat.fluffy.enable_matrix_native_oidc', false), + presetHomeserver('chat.fluffy.preset_homeserver', ''), + welcomeText('chat.fluffy.welcome_text', ''), + website('chat.fluffy.website_url', 'https://fluffychat.im'), + logoUrl( + 'chat.fluffy.logo_url', + 'https://fluffychat.im/assets/favicon.png', + ), + privacyPolicy( + 'chat.fluffy.privacy_policy_url', + 'https://fluffychat.im/privacy', + ), + tos('chat.fluffy.tos_url', 'https://fluffychat.im/tos'), + sendTimelineEventTimeout('chat.fluffy.send_timeline_event_timeout', 15), + webNotificationSound('chat.fluffy.web_notification_sound', true), + chatFilter('chat.fluffy.chat_filter', 'allChats'), + hideRoomsInSpaces('chat.fluffy.hideRoomsInSpaces', false), + showThumbnailsInTimeline('chat.fluffy.showThumbnailsInTimeline', true); + + final String key; + final T defaultValue; + + const AppSettings(this.key, this.defaultValue); + + static SharedPreferences get store => _store!; + static SharedPreferences? _store; + + static Future reset({bool loadWebConfigFile = true}) async { + await AppSettings._store!.clear(); + await init(loadWebConfigFile: loadWebConfigFile); + } + + static Future init({bool loadWebConfigFile = true}) async { + if (AppSettings._store != null) return AppSettings.store; + + final store = AppSettings._store = await SharedPreferences.getInstance(); + + // Migrate wrong datatype for fontSizeFactor + final fontSizeFactorString = Result( + () => store.getString(AppSettings.fontSizeFactor.key), + ).asValue?.value; + if (fontSizeFactorString != null) { + Logs().i('Migrate wrong datatype for fontSizeFactor!'); + await store.remove(AppSettings.fontSizeFactor.key); + final fontSizeFactor = double.tryParse(fontSizeFactorString); + if (fontSizeFactor != null) { + await store.setDouble(AppSettings.fontSizeFactor.key, fontSizeFactor); + } + } + + if (store.getBool(AppSettings.sendOnEnter.key) == null) { + await store.setBool(AppSettings.sendOnEnter.key, !PlatformInfos.isMobile); + } + if (kIsWeb && loadWebConfigFile) { + try { + final configJsonString = utf8.decode( + (await http.get(Uri.parse('config.json'))).bodyBytes, + ); + final configJson = + json.decode(configJsonString) as Map; + for (final setting in AppSettings.values) { + if (store.get(setting.key) != null) continue; + final configValue = configJson[setting.name]; + if (configValue == null) continue; + if (configValue is bool) { + await store.setBool(setting.key, configValue); + } + if (configValue is String) { + await store.setString(setting.key, configValue); + } + if (configValue is int) { + await store.setInt(setting.key, configValue); + } + if (configValue is double) { + await store.setDouble(setting.key, configValue); + } + } + } on FormatException catch (_) { + Logs().v('[ConfigLoader] config.json not found'); + } catch (e) { + Logs().v('[ConfigLoader] config.json not found', e); + } + } + + return store; + } +} + +extension AppSettingsBoolExtension on AppSettings { + bool get value { + final value = Result(() => AppSettings.store.getBool(key)); + final error = value.asError; + if (error != null) { + Logs().e( + 'Unable to fetch $key from storage. Removing entry...', + error.error, + error.stackTrace, + ); + } + return value.asValue?.value ?? defaultValue; + } + + Future setItem(bool value) => AppSettings.store.setBool(key, value); +} + +extension AppSettingsStringExtension on AppSettings { + String get value { + final value = Result(() => AppSettings.store.getString(key)); + final error = value.asError; + if (error != null) { + Logs().e( + 'Unable to fetch $key from storage. Removing entry...', + error.error, + error.stackTrace, + ); + } + return value.asValue?.value ?? defaultValue; + } + + Future setItem(String value) => AppSettings.store.setString(key, value); +} + +extension AppSettingsIntExtension on AppSettings { + int get value { + final value = Result(() => AppSettings.store.getInt(key)); + final error = value.asError; + if (error != null) { + Logs().e( + 'Unable to fetch $key from storage. Removing entry...', + error.error, + error.stackTrace, + ); + } + return value.asValue?.value ?? defaultValue; + } + + Future setItem(int value) => AppSettings.store.setInt(key, value); +} + +extension AppSettingsDoubleExtension on AppSettings { + double get value { + final value = Result(() => AppSettings.store.getDouble(key)); + final error = value.asError; + if (error != null) { + Logs().e( + 'Unable to fetch $key from storage. Removing entry...', + error.error, + error.stackTrace, + ); + } + return value.asValue?.value ?? defaultValue; + } + + Future setItem(double value) => AppSettings.store.setDouble(key, value); } diff --git a/lib/config/themes.dart b/lib/config/themes.dart index 9ca9f686b2..17594b67e4 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -1,118 +1,155 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'app_config.dart'; - abstract class FluffyThemes { - static const double columnWidth = 360.0; + static const double columnWidth = 380.0; + + static const double maxTimelineWidth = columnWidth * 2; + + static const double navRailWidth = 80.0; + + static bool isColumnModeByWidth(double width) => + width > columnWidth * 2 + navRailWidth; + static bool isColumnMode(BuildContext context) => - MediaQuery.of(context).size.width > columnWidth * 2; + isColumnModeByWidth(MediaQuery.sizeOf(context).width); - static const fallbackTextStyle = TextStyle( - fontFamily: 'Roboto', - fontFamilyFallback: ['NotoEmoji'], - ); + static bool isThreeColumnMode(BuildContext context) => + MediaQuery.sizeOf(context).width > FluffyThemes.columnWidth * 3.5; - static var fallbackTextTheme = const TextTheme( - bodyText1: fallbackTextStyle, - bodyText2: fallbackTextStyle, - button: fallbackTextStyle, - caption: fallbackTextStyle, - overline: fallbackTextStyle, - headline1: fallbackTextStyle, - headline2: fallbackTextStyle, - headline3: fallbackTextStyle, - headline4: fallbackTextStyle, - headline5: fallbackTextStyle, - headline6: fallbackTextStyle, - subtitle1: fallbackTextStyle, - subtitle2: fallbackTextStyle, - ); + static LinearGradient backgroundGradient(BuildContext context, int alpha) { + final colorScheme = Theme.of(context).colorScheme; + return LinearGradient( + begin: Alignment.topCenter, + colors: [ + colorScheme.primaryContainer.withAlpha(alpha), + colorScheme.secondaryContainer.withAlpha(alpha), + colorScheme.tertiaryContainer.withAlpha(alpha), + colorScheme.primaryContainer.withAlpha(alpha), + ], + ); + } - static ThemeData light([ColorScheme? colorScheme]) => ThemeData( - visualDensity: VisualDensity.standard, - useMaterial3: true, - brightness: Brightness.light, - colorSchemeSeed: AppConfig.colorSchemeSeed ?? - colorScheme?.primary ?? - AppConfig.chatColor, - textTheme: PlatformInfos.isDesktop - ? Typography.material2018().black.merge(fallbackTextTheme) - : null, - snackBarTheme: const SnackBarThemeData( - behavior: SnackBarBehavior.floating, - ), - pageTransitionsTheme: const PageTransitionsTheme( - builders: { - TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(), - TargetPlatform.android: ZoomPageTransitionsBuilder(), - TargetPlatform.linux: CupertinoPageTransitionsBuilder(), - TargetPlatform.macOS: CupertinoPageTransitionsBuilder(), - TargetPlatform.windows: CupertinoPageTransitionsBuilder(), - TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), - }, + static const Duration animationDuration = Duration(milliseconds: 250); + static const Curve animationCurve = Curves.easeInOut; + + static ThemeData buildTheme( + BuildContext context, + Brightness brightness, [ + Color? seed, + ]) { + final colorScheme = ColorScheme.fromSeed( + brightness: brightness, + seedColor: seed ?? Color(AppSettings.colorSchemeSeedInt.value), + dynamicSchemeVariant: DynamicSchemeVariant.rainbow, + ); + final isColumnMode = FluffyThemes.isColumnMode(context); + final dividerColor = brightness == Brightness.dark + ? colorScheme.surfaceContainerHighest + : colorScheme.surfaceContainer; + return ThemeData( + visualDensity: VisualDensity.standard, + useMaterial3: true, + brightness: brightness, + colorScheme: colorScheme, + dividerColor: dividerColor, + segmentedButtonTheme: SegmentedButtonThemeData( + style: SegmentedButton.styleFrom( + iconColor: colorScheme.onSurface, + disabledIconColor: colorScheme.onSurface, ), - dividerColor: Colors.blueGrey.shade50, - inputDecorationTheme: const InputDecorationTheme( - border: UnderlineInputBorder(borderSide: BorderSide(width: 1)), - filled: true, + ), + textSelectionTheme: TextSelectionThemeData( + selectionColor: colorScheme.onSurface.withAlpha(128), + selectionHandleColor: colorScheme.secondary, + ), + inputDecorationTheme: InputDecorationTheme( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), ), - appBarTheme: const AppBarTheme( - systemOverlayStyle: SystemUiOverlayStyle.dark, + contentPadding: const EdgeInsets.all(12), + ), + chipTheme: ChipThemeData( + showCheckmark: false, + backgroundColor: colorScheme.surfaceContainer, + side: BorderSide.none, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), ), - ); - - static ThemeData dark([ColorScheme? colorScheme]) => ThemeData( - visualDensity: VisualDensity.standard, - useMaterial3: true, - brightness: Brightness.dark, - colorSchemeSeed: AppConfig.colorSchemeSeed ?? - colorScheme?.primary ?? - AppConfig.chatColor, - textTheme: PlatformInfos.isDesktop - ? Typography.material2018().white.merge(fallbackTextTheme) + ), + appBarTheme: AppBarTheme( + toolbarHeight: isColumnMode ? 72 : 56, + surfaceTintColor: isColumnMode ? colorScheme.surface : null, + backgroundColor: isColumnMode ? colorScheme.surface : null, + actionsPadding: isColumnMode + ? const EdgeInsets.symmetric(horizontal: 16.0) : null, - snackBarTheme: - const SnackBarThemeData(behavior: SnackBarBehavior.floating), - pageTransitionsTheme: const PageTransitionsTheme( - builders: { - TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(), - TargetPlatform.android: ZoomPageTransitionsBuilder(), - TargetPlatform.linux: CupertinoPageTransitionsBuilder(), - TargetPlatform.macOS: CupertinoPageTransitionsBuilder(), - TargetPlatform.windows: CupertinoPageTransitionsBuilder(), - TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), - }, + systemOverlayStyle: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarIconBrightness: brightness.reversed, + statusBarBrightness: brightness, + systemNavigationBarIconBrightness: brightness.reversed, + systemNavigationBarColor: colorScheme.surface, ), - inputDecorationTheme: const InputDecorationTheme( - border: UnderlineInputBorder(borderSide: BorderSide(width: 1)), - filled: true, + ), + outlinedButtonTheme: OutlinedButtonThemeData( + style: OutlinedButton.styleFrom( + side: BorderSide(width: 1, color: colorScheme.primary), + shape: RoundedRectangleBorder( + side: BorderSide(color: colorScheme.primary), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), ), - dividerColor: Colors.blueGrey.shade900, - ); - - static Color blackWhiteColor(BuildContext context) => - Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.black; - - static Color darken(Color color, [double amount = .1]) { - assert(amount >= 0 && amount <= 1); - - final hsl = HSLColor.fromColor(color); - final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0)); - - return hslDark.toColor(); + ), + progressIndicatorTheme: ProgressIndicatorThemeData( + strokeCap: StrokeCap.round, + color: colorScheme.primary, + refreshBackgroundColor: colorScheme.primaryContainer, + ), + snackBarTheme: isColumnMode + ? const SnackBarThemeData( + showCloseIcon: true, + behavior: SnackBarBehavior.floating, + width: FluffyThemes.columnWidth * 1.5, + ) + : const SnackBarThemeData(behavior: SnackBarBehavior.floating), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.secondaryContainer, + foregroundColor: colorScheme.onSecondaryContainer, + elevation: 0, + padding: const EdgeInsets.all(16), + textStyle: const TextStyle(fontSize: 16), + ), + ), + ); } +} - static Color lighten(Color color, [double amount = .1]) { - assert(amount >= 0 && amount <= 1); +extension on Brightness { + Brightness get reversed => + this == Brightness.dark ? Brightness.light : Brightness.dark; +} - final hsl = HSLColor.fromColor(color); - final hslLight = - hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0)); +extension BubbleColorTheme on ThemeData { + Color get bubbleColor => brightness == Brightness.light + ? colorScheme.primary + : colorScheme.primaryContainer; - return hslLight.toColor(); - } + Color get onBubbleColor => brightness == Brightness.light + ? colorScheme.onPrimary + : colorScheme.onPrimaryContainer; + + Color get secondaryBubbleColor => HSLColor.fromColor( + brightness == Brightness.light + ? colorScheme.tertiary + : colorScheme.tertiaryContainer, + ).withSaturation(0.5).toColor(); } diff --git a/lib/l10n/intl_ar.arb b/lib/l10n/intl_ar.arb new file mode 100644 index 0000000000..82add904dd --- /dev/null +++ b/lib/l10n/intl_ar.arb @@ -0,0 +1,2378 @@ +{ + "@@locale": "ar", + "@@last_modified": "2021-08-14 12:41:10.156221", + "about": "حول", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "أقبل", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} قبل الدعوة", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "الحساب", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 تم تنشيط {username} التشفير من طرف إلى طرف", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "المدير", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "اللقب", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} أجاب على المكالمة", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "يمكن لأي أحد الدخول", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "الأرشيف", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "هل يُسمح للزوار الدخول", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "أمتأكد؟", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "لتتمكن من التأكد من الشخص الآخر، يرجى إدخال عبارة المرور أو مفتاح الاسترداد.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "أتقبل طلب تحقق {username}؟", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "حظر من المحادثة", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "محظور", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} حظر {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "أُحظر الجهاز", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "ألغِ", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "غيَّر {username} صورة المحادثة", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "غيَّر {username} أذون المحادثة", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} غير إسمه العلني إلى: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "غيّر {username} قواعد وصول الزوار", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "غيّر {username} قواعد وصول الزوار الى: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "غيَّر {username} مرئية التأريخ", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "غيَّر {username} مرئية التأريخ الى: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "غيَّر {username} قواعد الانضمام", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "غيَّر {username} قواعد الانضمام الى: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "غيّر {username} صورته الشخصية", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "غيّر {username} ألقاب الغرف", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "غيّر {username} رابط الدعوة", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "غيّر الخادم", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "غيّر أسلوبك", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "غيِّر اسم المجموعة", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "فسُد التشفير", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "محادثة", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "تفاصيل المحادثة", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "اختر كلمة سر قوية", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "اغلق", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "يرجى مقارنة الرموز التعبيرية", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "الرجاء مقارنة الأرقام", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "دعيَ المراسل للمجموعة", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "نُسخ للحافظة", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "انسخ", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "تعذر فك تشفير الرسالة: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} منتسبا", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "أنشئ", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 أنشأ {username} المحادثة", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "نشطٌ حاليا", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "داكن", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "لا مجال للعودة، أتأكد تعطيل حسابك؟", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "احذف", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "احذف الحساب", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "حذف الرسالة", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "الأجهزة", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "غُيِّر الاسم العلني", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "نزِّل الملف", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "حرر الاسم العلني", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "الانفعالة موجودة مسبقا!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "رمز الانفعالة غير صالح!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "اعدادات الانفعالات", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "رمز الانفعالة", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "محادثة فارغة", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "لن يمكنك تعطيل التشفير أبدا، أمتأكد؟", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "التشفير", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "التشفير معطل", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "أنهى {senderName} المكالمة", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "forward": "أعد التوجيه", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "من بعد الانضمام", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "من بعد الدعوة", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "المجموعة", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "المجموعة عامة", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "في مجموعة مع {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "يمنع الزوار", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "يمكن للزوار الانضمام", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "سحب {username} دعوة {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "المساعدة", + "@help": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "المستخدمون المتجاهلون", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "عبارة مرور أو مفتاح استرداد خطأ", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "دعوة مراسل", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "أدعو مراسلا الى {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "دُعيَ", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} دعا {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "المستخدمون المدعوون فقط", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "دعاك {username} إلى FluffyChat.\n1. قم بزيارة موقع fluffychat.im وقم بتثبيت التطبيق\n2. قم بإنشاءحساب أو تسجيل الدخول\n3. افتح رابط الدعوة:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "يكتب…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 انضم {username} إلى المحادثة", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "انضم للمحادثة", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ركل {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ركل وحظر {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "طرد من المحادثة", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "آخر نشاط: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "غادر", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "غادر المحادثة", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "فاتح", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "حمِّل {count} منتسبًا إضافيًا", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "يحمّل… يرجى الانتظار.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "حمِّل المزيد…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "لِج", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "لِج ل {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "اخرج", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "مشرف", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "أكتم الماحدثة", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 رسالة جديدة في FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "طلب تحقق جديد!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "لا", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "لم يُعثر على انفعالة. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "يبدو أن خدمة Firebase Cloud Messaging غير متاحة على جهازك. لمواصلة تلقي الإشعارات، نوصي بتثبيت ntfy. باستخدام ntfy أو أي مزود خدمة Unified Push آخر، يمكنك تلقي إشعارات الدفع بطريقة آمنة للبيانات. يمكنك تنزيل ntfy من PlayStore أو من F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "بدون اذن", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "لم يُعثر على غرف…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "موافق", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "تم تفعيل النسخ الاحتياطي للمفاتيح عبر الإنترنت", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "عفوًا، حدث خطأ ما…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "افتح التطبيق لقراءة الرسائل", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "افتح الكميرا", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "عبارة المرور أو مفتاح الاستعادة", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "كلمة السر", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "غُيّرت كلمة السر", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pin": "ثبِّت", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "أدخل كلمة السر", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "أدخل اسم المستخدم", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "الخصوصية", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "الغرف العامة", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "حذف {username} حدثًا", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "رفض", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "رفض {username} الدعوة", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "أزِل", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "أزِل كل الأجهزة الأخرى", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "فك حجبه من المحادثة", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "ردّ", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "رُقيّت الغرفة", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "send": "أرسل", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "أرسل رسالة", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "أرسل ملفًا صوتيًا", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "أرسل ملف", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "أرسل صورة", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "أرسل فيديو", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 أرسل {username} ملفا", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 أرسل {username} ملفا صوتيا", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} أرسل صورة", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 أرسل {username} ملصقا", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 أرسل {username} مقطع فيديو", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "أرسل {senderName} معلومات مكالمة", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "عيّن الحالة", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "الإعدادات", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "شارك", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "شارك {username} موقعه", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "تخط", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "الشفرة المصدرية", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "بدأ {senderName} مكالمة", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "ماهو وضعك؟", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "أرسل", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "النظام", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "لا يتطبقان", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "متطبقان", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "حاول إعادة الارسال", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "ألغى {username} حظر {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "ألغ حظر الجهاز", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "جهز مجهول", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "خوارزمية تشفير مجهولة", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "حدث مجهول '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "ألغِ كتم المحادثة", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "ألغِ التثبيت", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} و {count} أخرون يكتبون…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} و {username2} يكتبان…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} يكتب…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} غادر المحادثة", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "أرسل {username} حدث {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "ابدأ التحقق", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "تُحقق منك بنجاح!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "يتحقق من الحساب الآخر", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "مكالمة فيديو", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "مرئية تأريخ المحادثة", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "مرئي لكل المنتسبين", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "مرئي للجميع", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "رسالة صوتية", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "ينتظر قبول الشريك للطلب…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "ينتظر قبول الشريك لإيموجي…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "ينتظر قبول الشريك للأرقام…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "تحذير!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "من يسمح له الانضمام للمجموعة", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "اكتب رسالة…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "نعم", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "انت", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "لم تعد منتسبا لهذه المحادثة", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "حُظرت من هذه المحادثة", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "امسح رمز الاستجابة السريعة", + "noMatrixServer": "{server1} ليس خادم ماتريكس، بدلًا منه أتريد استخدام {server2}؟", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "انقطع الاتصال بالخادم", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "next": "التالي", + "@next": { + "type": "String", + "placeholders": {} + }, + "newChat": "محادثة جديدة", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "messages": "الرسائل", + "@messages": { + "type": "String", + "placeholders": {} + }, + "mention": "اذكر", + "@mention": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "نقرت على الرابط", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "ignore": "تجاهل", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "اخف الأحداث المجهولة", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "groups": "المجموعات", + "@groups": { + "type": "String", + "placeholders": {} + }, + "fontSize": "حجم الخط", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "أدخل عنوان بريد إلكتروني", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "encrypted": "مشفر", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "فعّل التشفير", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "عدّل الصورة الرمزية للغرفة", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "عدّل الخوادم المحجوبة", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "edit": "عدّل", + "@edit": { + "type": "String", + "placeholders": {} + }, + "directChats": "محادثات مباشرة", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "مساحة جديدة", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "انسخ الى الحافظة", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "أّرسل الابلاغ الى مدير الخادم", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} ليس بأمر.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "أمر غير صالح", + "@commandInvalid": { + "type": "String" + }, + "commandHint_unban": "فك الحظر عن المستخدم المذكور في هذه الغرفة", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "أرسل نصًا", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "أرسل ردًا كتفاعل", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "أرسل نصًا غير منسق", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "عين مستوى نفوذ المستخدم في هذه الغرفة (الافتراضي: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "عين اسمًا لك مخصص لهذه الغرفة", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_me": "صف نفسك", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "تغادر هذه الغرفة", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "يزيل المستخدم المذكور من الغرفة", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "تنضم الى الغرفة المذكورة", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "يدعو المستخدم المذكور الى الغرفة", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_html": "أرسل نصًا بتنسيق HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "يحظر المستخدم المذكور من هذه الغرفة", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "clearArchive": "امسح الأرشيف", + "chats": "المحادثات", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "النسخ الاحتياطي للمحادثات", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "غيّر الصورة الرمزية", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changePassword": "غيّر كلمة السر", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "غيّر اسم الجهاز", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "تعذر فتح المسار {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "blocked": "محجوب", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "أرسل عند الدخول", + "autoplayImages": "شغِّل الملصقات والوجوه المتحركة تلقائيا", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "areYouSureYouWantToLogout": "أمتأكد من الخروج؟", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "appLock": "قفل التطبيق", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "all": "الكل", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "أضف إلى المساحة", + "addEmail": "أضف بريدًا إلكترونيًا", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "لم تضف أي طريقة لاستعادة كلمة السر.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "notifications": "الإشعارات", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "reason": "السبب", + "@reason": { + "type": "String", + "placeholders": {} + }, + "search": "ابحث", + "@search": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "خدمات الموقع معطلة. مكنها لتتمكن من مشاركة موقعك.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "خطأ أثناء الحصول على الموقع: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editRoomAliases": "عدّل الاسم المميز للغرفة", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "configureChat": "ضبط المحادثة", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "شارك الموقع", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "اختر رمز المرور", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "استعادة كلمة السر", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "نسيتَ كلمة السر", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "participant": "منتسب", + "@participant": { + "type": "String", + "placeholders": {} + }, + "or": "أو", + "@or": { + "type": "String", + "placeholders": {} + }, + "link": "رابط", + "openInMaps": "افتح في الخريطة", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "bundleName": "اسم الحزمة", + "removeFromBundle": "أزله من الحزمة", + "addToBundle": "أضفه الى حزمة", + "editBundlesForAccount": "عدّل حزم هذا الحساب", + "addAccount": "أضف حسابًا", + "numUsersTyping": "{count} يكتبون…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "spaceIsPublic": "عام في المساحة", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "لماذا تريد الإبلاغ عنه؟", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "يمكنك استعادة كلمة السر بهذه العناوين.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "verified": "موثّق", + "@verified": { + "type": "String", + "placeholders": {} + }, + "spaceName": "اسم المساحة", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "يُزامن… يرجى الانتظار.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "طابات كثيرة. حاول مجددًا لاحقًا!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "أرسلنا لك رسالة بالبريد الإلكتروني", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "مفتاحك العمومي", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "status": "الحالة", + "@status": { + "type": "String", + "placeholders": {} + }, + "saveFile": "احفظ الملف", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "security": "الأمان", + "@security": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "أزل الصورة الرمزية", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "أرسل نصًا", + "@sendAsText": { + "type": "String" + }, + "sendMessages": "إرسال رسائل", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "استبدل الغرفة باصدار أحدث", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "يحصل على الموقع…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "مستوى الأذونات الافتراضية للمستخدمين الجدد", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "أُ خرج أحد العملاء الذي تسختدمها", + "redactMessage": "احذف رسالة", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "أبلغ عن الرسالة", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "إصدار الغرفة", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "كرّر كلمة السر", + "removeFromSpace": "أزل من المساحة", + "unverified": "غير مؤكد", + "whoCanPerformWhichAction": "من يستطيع القيام بأي عمل", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "معلومات الرسالة", + "sender": "المرسل", + "openGallery": "افتخ المعرض", + "time": "الوقت", + "badServerLoginTypesException": "يدعم الخادم المستخدم أنواع تسجيل الدخول التالية:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "commandHint_clearcache": "مسح الذاكرة المؤقتة", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "enableEmotesGlobally": "تفعيل حزمة التعبيرات بشكل عام", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "إنهاء الجلسة", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "locationPermissionDeniedNotice": "تم رفض إذن الموقع. الرجاء منح الإذن للقدرة على مشاركة موقعك.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "يمكنك فقط تفعيل التشفير عندما تصبح الغرفة غير متاحة للعامة.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "emojis": "إيموجي", + "voiceCall": "مكالمة صوتية", + "unsupportedAndroidVersion": "نسخة أندرويد غير مدعومة", + "unsupportedAndroidVersionLong": "تتطلب هذه الميزة إصدار Android أحدث. يرجى التحقق من وجود تحديثات أو دعم Lineage OS.", + "experimentalVideoCalls": "مكالمات الفيديو التجريبية", + "commandHint_create": "أنشأ محادثة جماعية فارغة\nاستخدم --لا-تشفير لتعطيل التشفير", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "إبدأ محادثة مباشرة\nاستخدم --لا-تشفير لتعطيل التشفير", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "oopsPushError": "عذراً! للأسف، حدث خطأ أثناء إعداد الإشعارات.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "يرجى اتباع التعليمات الموجودة على الموقع والنقر على التالي.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "حدد صورتك لهذه الغرفة (عن طريق mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "videoCallsBetaWarning": "يرجى ملاحظة أن مكالمات الفيديو حالياً في مرحلة تجريبية. قد لا تعمل كما هو متوقع أو تعمل على الإطلاق على جميع المنصات.", + "placeCall": "إجراء مكالمة", + "setAsCanonicalAlias": "تعيين كاسم مستعار رئيسي", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "يرجى النقر على الرابط الموجود في البريد الإلكتروني ثم المتابعة.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "الرجاء إدخال رقم التعريف الشخصي الخاص بك", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} تفاعل ب {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "markAsRead": "حدد كمقروء", + "reportUser": "التبيلغ عن المستخدم", + "pinMessage": "تثبيت في الغرفة", + "confirmEventUnpin": "هل أنت متأكد من إلغاء تثبيت الحدث بشكل دائم؟", + "fileHasBeenSavedAt": "تم حفظ الملف في {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "user": "مستخدم", + "custom": "مُخصّص", + "googlyEyesContent": "{senderName} يرسل لك عيون googly", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "confirmMatrixId": "يرجى تأكيد معرف Matrix الخاص بك من أجل حذف حسابك.", + "supposedMxid": "يجب أن يكون هذا {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_googly": "أرسل بعض عيون googly", + "commandHint_cuddle": "أرسل عناق", + "commandHint_hug": "إرسال حضن", + "cuddleContent": "{senderName} يحتضنك", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasdm": "وضع علامة على أنها غرفة رسائل مباشرة لمعرف المصفوفة", + "dehydrate": "تصدير الجلسة ومسح الجهاز", + "dehydrateWarning": "لا يمكن التراجع عن هذا الإجراء. تأكد من تخزين ملف النسخ الاحتياطي بأمان.", + "hydrate": "استعادة من ملف النسخ الاحتياطي", + "youRejectedTheInvitation": "لقد رفضت الدعوة", + "youJoinedTheChat": "لقد انضممت إلى المحادثة", + "youAcceptedTheInvitation": "👍 لقد قبلت الدعوة", + "youBannedUser": "لقد حظرت {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "لقد سحبت الدعوة لـ {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 لقد تمت دعوتك من قبل {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "تخزين في سجل مفاتيح اندرويد", + "storeInAppleKeyChain": "تخزين في سلسلة مفاتيح ابل", + "storeSecurlyOnThisDevice": "احفظه بأمان على هذا الجهاز", + "countFiles": "ملفات {count}", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "foregroundServiceRunning": "يظهر هذا الإشعار عند تشغيل الخدمة الأمامية.", + "screenSharingTitle": "مشاركة الشاشة", + "whyIsThisMessageEncrypted": "لماذا هذه الرسالة غير قابلة للقراءة؟", + "encryptThisChat": "تشفير هذه المحادثة", + "screenSharingDetail": "أنت تشارك شاشتك في FuffyChat", + "youKicked": "👞 لقد ركلت {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "مساحة جديدة", + "commandHint_markasgroup": "وضع علامة كمجموعة", + "hugContent": "{senderName} يعانقك", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 لقد ركلت وحظرت {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "قمت بإلغاء الحظر {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 قمت بدعوة {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "المستخدمون", + "jump": "قفز", + "report": "الإبلاغ", + "noKeyForThisMessage": "يمكن أن يحدث هذا إذا تم إرسال الرسالة قبل تسجيل الدخول إلى حسابك على هذا الجهاز.\n\nمن الممكن أيضا أن يكون المرسل قد حظر جهازك أو حدث خطأ ما في الاتصال بالإنترنت.\n\nهل يمكنك قراءة الرسالة في جلسة أخرى؟ ثم يمكنك نقل الرسالة منه! انتقل إلى الإعدادات > الأجهزة وتأكد من أن أجهزتك قد تحققت من بعضها البعض. عندما تفتح الغرفة في المرة التالية وتكون كلتا الجلستين في المقدمة ، سيتم إرسال المفاتيح تلقائيا.\n\nألا تريد أن تفقد المفاتيح عند تسجيل الخروج أو تبديل الأجهزة؟ تأكد من تمكين النسخ الاحتياطي للدردشة في الإعدادات.", + "doNotShowAgain": "لا تظهر مرة أخرى", + "wasDirectChatDisplayName": "محادثة فارغة (كانت {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "لأسباب أمنية ، لا يمكنك تعطيل التشفير في المحادثة ، حيث تم تمكينه من قبل.", + "reportErrorDescription": "😭 أوه لا. هناك خطأ ما. إذا كنت تريد، يمكنك الإبلاغ عن هذا الخطأ إلى المطورين.", + "newSpaceDescription": "يسمح لك تطبيق المساحات بتوحيد دردشاتك وبناء مجتمعات خاصة أو عامة.", + "sorryThatsNotPossible": "معذرة... هذا غير ممكن", + "openLinkInBrowser": "فتح الرابط في المتصفح", + "reopenChat": "إعادة فتح المحادثة", + "noBackupWarning": "تحذير! بدون تمكين النسخ الاحتياطي للدردشة ، ستفقد الوصول إلى رسائلك المشفرة. يوصى بشدة بتمكين النسخ الاحتياطي للدردشة أولاً قبل تسجيل الخروج.", + "noOtherDevicesFound": "لم يتم العثور على أجهزة أخرى", + "fileIsTooBigForServer": "تعذر الإرسال! لا يدعم الخادم سوى المرفقات التي تصل إلى {max}.", + "jumpToLastReadMessage": "الانتقال إلى آخر رسالة مقروءة", + "readUpToHere": "اقرأ حتى هنا", + "importNow": "استيراد الآن", + "importEmojis": "استيراد الرموز التعبيرية", + "exportEmotePack": "تصدير حزمة الرموز التعبيرية بتنسيق zip", + "notAnImage": "ليس ملف صورة.", + "importFromZipFile": "الاستيراد من ملف .zip", + "replace": "استبدال", + "sendTypingNotifications": "إرسال إشعارات الكتابة", + "createGroup": "إنشاء مجموعة", + "messagesStyle": "الرسائل:", + "shareInviteLink": "شارك رابط الدعوة", + "setColorTheme": "تعيين لون السمة:", + "tryAgain": "أعد المحاولة", + "redactMessageDescription": "سيتم تنقيح الرسالة لجميع المشاركين في هذه المحادثة. هذا لا يمكن التراجع عنها.", + "optionalRedactReason": "(اختياري) سبب تنقيح هذه الرسالة ...", + "redactedBy": "منقح بواسطة {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "تم حجبه بواسطة {username} بسبب: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "invite": "دعوة", + "chatPermissions": "صلاحيات المحادثة", + "chatDescription": "وصف المحادثة", + "chatDescriptionHasBeenChanged": "تغير وصف المجموعة", + "noChatDescriptionYet": "لم يتم إنشاء وصف للمحادثة حتى الآن.", + "invalidServerName": "اسم الخادم غير متاح", + "setChatDescription": "تعيين وصفًا للدردشة", + "directChat": "محادثة مباشرة", + "inviteGroupChat": "📨 دعوة للمحادثة الجماعية", + "emoteKeyboardNoRecents": "التعبيرات المستخدمة مؤخرًا ستظهر هنا ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "مدخل غير صالح!", + "wrongPinEntered": "تم إدخال رمز خاطئ! حاول مرة أخرى خلال {seconds} ثانية...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "hasKnocked": "🚪 لقد طرق {user}", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "الرجاء إدخال رقم أكبر من 0", + "banUserDescription": "سيتم حظر المستخدم من المحادثة ولن يتمكن من الدخول إلى المحادثة مرة أخرى حتى يتم رفع الحظر عنه.", + "removeDevicesDescription": "سيتم تسجيل خروجك من هذا الجهاز ولن تتمكن بعد ذلك من تلقي الرسائل.", + "unbanUserDescription": "سيتمكن المستخدم من الدخول إلى المحادثة مرة أخرى إذا حاول.", + "pushNotificationsNotAvailable": "دفع الإخطارات غير متوفرة", + "makeAdminDescription": "بمجرد تعيين هذا المستخدم كمسؤول، قد لا تتمكن من التراجع عن هذا لأنه سيكون لديه نفس الأذونات التي تتمتع بها.", + "archiveRoomDescription": "سيتم نقل المحادثة إلى الأرشيف. سيتمكن المستخدمون الآخرون من رؤية أنك غادرت المحادثة.", + "learnMore": "تعلم المزيد", + "roomUpgradeDescription": "سيتم بعد ذلك إعادة إنشاء المحادثة باستخدام إصدار الغرفة الجديد. سيتم إخطار جميع المشاركين بأنهم بحاجة إلى التبديل إلى المحادثة الجديدة. يمكنك معرفة المزيد حول إصدارات الغرف على https://spec.matrix.org/latest/rooms/", + "kickUserDescription": "يتم طرد المستخدم من المحادثة ولكن لا يتم حظره. في المحادثات العامة، يمكن للمستخدم الانضمام مرة أخرى في أي وقت.", + "createGroupAndInviteUsers": "إنشاء مجموعة ودعوة المستخدمين", + "groupCanBeFoundViaSearch": "يمكن العثور على المجموعة عبر البحث", + "noUsersFoundWithQuery": "لسوء الحظ، لا يمكن العثور على مستخدم لديه \"{query}\". يرجى التحقق مما إذا كنت قد ارتكبت خطأ كتابي.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "معرف المستخدم العمومي الخاص بك هو: ", + "groupName": "أسم المجموعة", + "searchChatsRooms": "ابحث عن #الدردشات، @المستخدمين...", + "commandHint_sendraw": "إرسال جيسون الخام", + "wrongRecoveryKey": "عذرًا... لا يبدو أن هذا هو مفتاح الاسترداد الصحيح.", + "blockListDescription": "يمكنك حظر المستخدمين الذين يزعجونك. لن تتمكن من تلقي أي رسائل أو دعوات للغرفة من المستخدمين الموجودين في قائمة الحظر الشخصية الخاصة بك.", + "blockedUsers": "المستخدمون المحظورون", + "block": "حظر", + "blockUsername": "تجاهل اسم المستخدم", + "databaseMigrationTitle": "تم تحسين قاعدة البيانات", + "databaseMigrationBody": "انتظر من فضلك. قد يستغرق ذلك بعض الوقت.", + "thisDevice": "هذا الجهاز:", + "publicSpaces": "مساحة عامة", + "passwordIsWrong": "كلمة السر للدخول خاطئة", + "pleaseEnterYourCurrentPassword": "من فضلك أدخل كلمة السر الحالية", + "nothingFound": "لم نجد شيئاً.", + "newPassword": "كلمة المرور الجديدة", + "passwordsDoNotMatch": "كلمات المرور لا تتطابق", + "select": "اختر", + "pleaseChooseAStrongPassword": "الرجاء اختيار كلمة مرور قوية", + "addChatOrSubSpace": "إضافة دردشة أو مساحة فرعية", + "leaveEmptyToClearStatus": "اتركه فارغًا لمسح حالتك.", + "joinSpace": "انضم إلى المساحة", + "searchForUsers": "ابحث عن @users...", + "initAppError": "حدث خطأ بداخل التطبيق", + "sessionLostBody": "جلستك مفقودة يرجى إبلاغ المطورين بهذا الخطأ في {url}. رسالة الخطأ هي: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "يحاول التطبيق الآن استعادة جلستك من النسخة الاحتياطية. الرجاء الإبلاغ عن هذا الخطأ للمطورين على {url}. رسالة الخطأ هي:{error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "completedKeyVerification": "أكمل {sender} عملية التحقق من المفتاح", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "طلب {sender} التحقق من المفتاح", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "عرض محتوى الرسالة الغنية مثل النص الغامق باستخدام الماركداون.", + "verifyOtherUserDescription": "إذا قمت بالتحقق من مستخدم آخر، فيمكنك التأكد من أنك تعرف من تكتب إليه حقًا. 💪\n\nعند بدء عملية التحقق، سترى أنت والمستخدم الآخر نافذة منبثقة في التطبيق. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض.\n\nأفضل طريقة للقيام بذلك هي الالتقاء أو بدء مكالمة فيديو. 👭", + "verifyOtherDeviceDescription": "عند التحقق من جهاز آخر، يمكن لهذه الأجهزة تبادل المفاتيح، مما يزيد من أمانك بشكل عام. 💪 عند بدء عملية التحقق، ستظهر نافذة منبثقة في التطبيق على كلا الجهازين. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض. من الأفضل أن يكون كلا الجهازين في متناول يديك قبل بدء عملية التحقق. 🤳", + "formattedMessages": "رسائل منسقة", + "sendReadReceipts": "إرسال بالقراءة", + "verifyOtherDevice": "🔐 التحقق من الجهاز الآخر", + "sendTypingNotificationsDescription": "يستطيع المشاركون الآخرون في المحادثة رؤيتك عند كتابة رسالة جديدة.", + "sendReadReceiptsDescription": "يمكن للمشاركين الآخرين في المحادثة معرفة متى قرأت الرسالة.", + "verifyOtherUser": "🔐 التحقق من المستخدم الآخر", + "acceptedKeyVerification": "وافق {sender} على التحقق من المفتاح", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "قام {sender} بإلغاء التحقق من المفتاح", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} جاهز للتحقق من المفتاح", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "بدأ {sender} عملية التحقق من المفتاح", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "الرسائل الواردة", + "stickers": "الملصقات", + "discover": "استكشف", + "commandHint_ignore": "تجاهل معرف المصفوفة المعطى", + "commandHint_unignore": "إلغاء تجاهل معرف المصفوفة المحدد", + "unreadChatsInApp": "{appname}: {unread} الدردشات غير المقروءة", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "تشفير قاعدة البيانات غير مدعوم على هذا النظام الأساسي", + "appLockDescription": "قفل التطبيق عند عدم استخدامه بالرمز السري", + "accessAndVisibility": "الوصول والرؤية", + "calls": "المكالمات", + "customEmojisAndStickers": "الرموز التعبيرية والملصقات المخصصة", + "hideRedactedMessagesBody": "إذا قام شخص ما بتنقيح رسالة، فلن تكون هذه الرسالة مرئية في المحادثة بعد الآن.", + "hideInvalidOrUnknownMessageFormats": "إخفاء تنسيقات الرسائل غير الصالحة أو غير المعروفة", + "passwordRecoverySettings": "إعدادات استعادة كلمة المرور", + "globalChatId": "معرف المحادثة العامة", + "accessAndVisibilityDescription": "من المسموح له بالانضمام إلى هذه المحادثة وكيف يمكن اكتشاف المحادثة.", + "customEmojisAndStickersBody": "قم بإضافة أو مشاركة الرموز التعبيرية أو الملصقات المخصصة التي يمكن استخدامها في أي دردشة.", + "hideRedactedMessages": "إخفاء الرسائل المكررة", + "usersMustKnock": "المستخدم يجب أن يطرق الباب", + "chatCanBeDiscoveredViaSearchOnServer": "يمكن اكتشاف الشات عن طريق البحث في {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "noOneCanJoin": "لا أحد يستطيع الانضمام", + "knocking": "طرق", + "knock": "دق", + "thereAreCountUsersBlocked": "يوجد حاليًا {count} من المستخدمين المحظورين.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicChatAddresses": "عناوين المحادثة العامة", + "createNewAddress": "إنشاء عنوان جديد", + "searchIn": "بحث في {chat}...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "الملفات", + "searchMore": "ابحث أكثر...", + "gallery": "المعرض", + "swipeRightToLeftToReply": "اسحب من اليمين إلى اليسار للرد", + "noMoreChatsFound": "لم يتم العثور على دردشات...", + "unread": "غير المقروءة", + "space": "المساحة", + "markAsUnread": "تحديد كغير مقروء", + "goToSpace": "انتقل إلى المساحة: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "userLevel": "{level} - مستخدم", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - مشرف", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - مدير", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "تغيير إعدادات الدردشة العامة", + "inviteOtherUsers": "دعوة مستخدمين آخرين إلى هذه الدردشة", + "changeTheChatPermissions": "تغيير أذونات الدردشة", + "changeTheVisibilityOfChatHistory": "تغيير رؤية سجل الدردشة", + "changeTheCanonicalRoomAlias": "تغيير عنوان الدردشة العامة الرئيسي", + "sendRoomNotifications": "إرسال إشعارات @room", + "changeTheDescriptionOfTheGroup": "تغيير وصف الدردشة", + "chatPermissionsDescription": "‪حدد مستوى الصلاحية الضروري لإجراءات معينة في هذه الدردشة. عادة ما تمثل مستويات الصلاحية 0 و 50 و 100 المستخدمين والمشرفين ولكن أي تدرج ممكن.", + "changelog": "سجل التغييرات", + "updateInstalled": "تم تثبيت🎉 تحديث {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "تم إلغاء الإرسال", + "noChatsFoundHere": "لم يتم العثور على دردشات هنا حتى الآن. ابدأ محادثة جديدة مع شخص ما باستخدام الزر أدناه. ⤵️", + "loginWithMatrixId": "تسجيل الدخول باستخدام معرف ماتريكس", + "doesNotSeemToBeAValidHomeserver": "لا يبدو أنه خادم منزلي متوافق. عنوان URL غير صحيح ؟", + "calculatingFileSize": "جارٍ حساب حجم الملف...", + "sendingAttachment": "جارٍ إرسال المرفق...", + "oneOfYourDevicesIsNotVerified": "لم يتم التحقق من أحد أجهزتك", + "noticeChatBackupDeviceVerification": "ملاحظة: عند توصيل جميع أجهزتك بنسخة احتياطية للدردشة، يتم التحقق منها تلقائيًا.", + "continueText": "استمرار", + "blur": "الضبابية:", + "setWallpaper": "تعيين الخلفية", + "opacity": "التعتيم:", + "manageAccount": "‫إدارة الحساب‬", + "noContactInformationProvided": "لا يقدم السيرفر أي معلومات اتصال صحيحة", + "contactServerAdmin": "اتصل بمسؤول الخادم", + "contactServerSecurity": "الاتصال بمسؤول أمان ااخادم", + "supportPage": "صفحة الدعم", + "serverInformation": "معلومات الخادم:", + "name": "الإسم", + "version": "اﻹصدار", + "website": "الموقع اﻹلكتروني", + "aboutHomeserver": "حول {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "boldText": "خط غامق", + "italicText": "خط مائل", + "strikeThrough": "يتوسطه خط", + "invalidUrl": "رابط غير صحيح", + "addLink": "إضافة رابط", + "pleaseFillOut": "من فضلك قم بتعبئته", + "unableToJoinChat": "يتعذر الانضمام إلى الدردشة. ربما يكون الطرف الآخر قد أغلق المحادثة بالفعل.", + "sendImages": "إرسال {count} صورة", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "ضغط", + "previous": "السابق", + "otherPartyNotLoggedIn": "لم يقم الطرف الآخر بتسجيل الدخول حالياً وبالتالي لا يمكنه تلقي الرسائل!", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_az.arb b/lib/l10n/intl_az.arb new file mode 100644 index 0000000000..c5633df725 --- /dev/null +++ b/lib/l10n/intl_az.arb @@ -0,0 +1,14 @@ +{ + "repeatPassword": "Şifrəni təkrarlayın", + "notAnImage": "Şəkil faylı deyil.", + "remove": "çıxarın", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "İndi idxal edin", + "importEmojis": "Emojiləri idxal edin", + "importFromZipFile": ".zip faylından idxal edin", + "exportEmotePack": "Emote paketini .zip formatında ixrac edin", + "replace": "Əvəz et" +} \ No newline at end of file diff --git a/lib/l10n/intl_be.arb b/lib/l10n/intl_be.arb new file mode 100644 index 0000000000..89f8867d99 --- /dev/null +++ b/lib/l10n/intl_be.arb @@ -0,0 +1,2515 @@ +{ + "repeatPassword": "Паўтарыце пароль", + "notAnImage": "Не файл выявы.", + "remove": "Прыбраць", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Імпартаваць зараз", + "importEmojis": "Імпартаваць эмодзі", + "importFromZipFile": "Імпартаваць з файла .zip", + "exportEmotePack": "Экспартаваць пак эмодзі як .zip", + "replace": "Замяніць", + "about": "Пра праграму", + "aboutHomeserver": "Пра {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Прыняць", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} прыняў запрашэнне", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Уліковы запіс", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} актывіраваў end to end шыфраванне", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Дадаць email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Калі ласка, спраўдзіце свой Matrix ID перад выдаленнем свайго ўліковага запісу.", + "supposedMxid": "Гэта павінна быць накшталт {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Дадаць у прастору", + "admin": "Адмін", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "псеўданім", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Усё", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Абнавіце гэты пакой да згаданай версіі", + "commandHint_googly": "Даслаць смешныя вочы", + "commandHint_cuddle": "Даслаць усмешку", + "commandHint_hug": "Даслаць абдымашкі", + "googlyEyesContent": "{senderName} даслаў(-ла) вам смешныя вочы", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} усміхаецца вам", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} абдымае вас", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} адказаў(-ла) на выклік", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Усе могуць далучыцца", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Код-пароль", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Блакіруе праграму, пакуль вы не ўвядзіце пін-код", + "archive": "Архіў", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Ці дазволена карыстальнікам-гасцям далучыцца?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Вы ўпэўнены?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Вы ўпэўнены, што хаціце выйсці?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Каб спраўдзіць іншага чалавека, калі ласка, увядзіце фразу-пароль ці ключ аднаўлення.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Прыняць запрос на верыфікацыю ад {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Аўтаматычна прайграваць аніміраваныя стыкеры і эмодзі", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Хатні сервер падтрымлівае наступныя метады ўваходу:\n{serverVersions}\nАле гэта праграма падтрымлівае толькі:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Дасылаць паведамленне пра друк", + "swipeRightToLeftToReply": "Змахніце ўлева, каб адказаць", + "sendOnEnter": "Дасылаць на enter", + "noMoreChatsFound": "Болей чатаў не знойдзена...", + "noChatsFoundHere": "Здаецца, тут пуста. Пачніце новы чат з кімсьці праз кнопку ніжэй. ⤵️", + "unread": "Непрачытаные", + "space": "Прастора", + "banFromChat": "Заблакіраваць ў чаце", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Заблакіраваны", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} заблакіраваў {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Заблакіраваць прыладу", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Заблакіравана", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Скасаваць", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Немагчыма адкрыць URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Змяніць назву прылады", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} змяніў выяву чата", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} змяніў дазволы чата", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} змяніў адлюстроўваемае імя на: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} змяніў правілы гасцявога доступу", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} змяніў правілы гасцявога доступу на: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} змяніў бачнасць гісторыі", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} змяніў бачнасць гісторыі на: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} змяніў правілы падлучэння", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} змяніў правілы падлучэння на: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} змяніў свой аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "noMessagesYet": "Паведамленняў пакуль што няма", + "changedTheRoomAliases": "{username} змяніў псеўданімы пакою", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} змяніў(-ла) запрашальную спасылку", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Змяніць пароль", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Змяніць дамашні сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Змяніць ваш стыль", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Змяніць назву групы", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Змяніць вашу выяву", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шыфраванне было сапсавана", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Чат", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Рэзервовае капіраванне чатаў", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Дэталі чата", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Чаты", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Стварыце надзейны пароль", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Ачысціць архіў", + "close": "Закрыць", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Пазначыць як пакой асабоных паведамленняў для дадання Matrix ID", + "commandHint_markasgroup": "Пазначыць як групу", + "commandHint_ban": "Заблакіраваць карыстальніка у гэтым пакое", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Ачысціць кэш", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Стварыць пусты групавы чат.\nВыкарыстоўвайце --no-encryption каб адключыць шыфраванне", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Спыніць сеанс", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Пачаць асобны чат.\nВыкарыстоўвайце --no-encryption, каб адключыць шыфраванне", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Даслаць тэкст з разметкай HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Запрасіць карыстальніка ў гэты пакой", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Далучыцца да гэтага пакою", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Выдаліць карыстальніка з гэтага пакою", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Пакінуць гэты пакой", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Апішыце сябе", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Задаць выяву гэтага пакою (ад mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Задайце адлюстроўваемае імя для гэтага пакою", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Задайце ўзровень правоў гэтага карыстальніка (па змаўчанні: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Даслаць неадфарматыраваны тэкст", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Даслаць адказ як рэакцыю", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Даслаць тэкст", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Разблакіраваць карыстальніка ў гэтым пакое", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Няслушная каманда", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} не каманда.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Калі ласка, параўнайце эмодзі", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Калі ласка, параўнайце лічбы", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Наладзіць чат", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Кантакт быў запрошаны ў групу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Пра кантэнт было паведамлена адміністратарам сервера", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Скапіравана ў буфер", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Капіраваць", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Скапіраваць у буфер", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Немагчыма расшыфраваць паведамленне: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "checkList": "Кантрольны спіс", + "countParticipants": "{count} удзельніка(-ў)", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countInvited": "Запрошана {count}", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Стварыць", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} стварыў(-ла) чат", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Стварыць групу", + "createNewSpace": "Новая прастора", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Зараз актыўны", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Цёмная", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Гэта дэактывіруе ваш уліковы запіс. Гэта дзеянне не можа быць адменена! Вы ўпэўнены?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Узровень дазволаў для новых карыстальнікаў па змаўчанні", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Выдаліць", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Выдаліць уліковы запіс", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Выдаліць паведамленне", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Прылады", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Асобныя чаты", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Адлюстроўваемае імя было зменена", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Спампаваць файл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Змяніць", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Змяніць заблакіраваныя сервера", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Дазволы чату", + "editDisplayname": "Змяніць адлюстроўваемае імя", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Змяніць псеўданімы пакою", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Змяніць выяву пакою", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Эмодзі ўжо існуе!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Недапушчальнае скарачэнне эмодзі!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Нядаўна ўжытыя эмодзі паявяцца тут...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Налады эмодзі", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "ID габальнага чату", + "accessAndVisibility": "Даступнасць і бачнасць", + "accessAndVisibilityDescription": "Каму дазволена далучацца да гэтага чату і як ён можа быць знойдзены.", + "calls": "Выклікі", + "customEmojisAndStickers": "Карыстальніцкія эмодзі і стыкеры", + "customEmojisAndStickersBody": "Дадаць ці падзяліцца карыстальніцкімі эмодзі ці стыкерамі, што могуць быць ужыты ў любым чаце.", + "emoteShortcode": "Скарачэнне эмодзі", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Пусты чат", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Уключыць набор эмодзі глабальна", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Уключыць шыфраванне", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Вы больш не зможаце адключыць шыфраванне. Вы ўпэўнены?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Зашыфравана", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шыфраванне", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шыфраванне не ўключана", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} скончыў выклік", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Увядзіце электроную пошту (email)", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Памылка атрымання месцазнаходжання: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Памер шрыфту", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Пераслаць", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "З далучэння", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "З запрашэння", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Група", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Апісанне чату", + "chatDescriptionHasBeenChanged": "Апісанне чату зменена", + "groupIsPublic": "Група публічная", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Групы", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Групы з {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Госці забаронены", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Госці могуць далучацца", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} адазваў запрашэнне для {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Дапамога", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedMessages": "Схаваць адрэдагаваныя паведамленні", + "hideRedactedMessagesBody": "Калі хтосьці рэдагуе паведамленне, яно будзе схавана ў чаце.", + "hideInvalidOrUnknownMessageFormats": "Хаваць памылковыя ці невядомыя фарматы паведамленняў", + "block": "Заблакіраваць", + "blockedUsers": "Заблакіраваныя карыстальнікі", + "blockListDescription": "Вы можаце заблакіраваць карыстальнікаў, якія вам перашкаджаюць. Вы не атрымаеце ад іх ні паведамленняў, ні запрашэнняў.", + "blockUsername": "Ігнараваць імя карыстальніка", + "iHaveClickedOnLink": "Я перайшоў па спасылцы", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Няслушныя фраза-пароль ці ключ аднаўлення", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Запрасіць кантакт", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Запрасіць кантакт да {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Апісанне чату яшчэ няма.", + "tryAgain": "Паспрабуйце зноў", + "invalidServerName": "Недапушчальная назва сервера", + "invited": "Запрошаны", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "Гэта паведамленне будзе адрэдагавана для усіх карыстальнікаў. Вы не зможаце яго адмяніць.", + "optionalRedactReason": "(Неабавязкова) Прычына рэдагавання паведамлення...", + "invitedUser": "📩 {username} запрасіў(-ла) {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Толькі запрошаныя карыстальнікі", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} запрасіў вас у FluffyChat.\n1. Перайдзіце на fluffychat.im і ўстанавіце праграму\n2. Зарэгестрыруйцесь альбо ўвайдзіце\n3. Перайдзіце па запрашальнай спасылцы:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "піша…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} далучыўся(лася) да чату", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Далучыцца да пакою", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} выгнаў(-ла) {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} выгнаў(-ла) і заблакіраваў(-ла) {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Выгнаць з чату", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Апошняя актыўнасць: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Выйсці", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Выйсці з чату", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Светлая", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Загрузіць яшчэ {count} удзельнікаў", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Экспарт сеансу і ачыстка прылады", + "dehydrateWarning": "Гэта дзеянне не можа быць адменена. Пераканайцеся, што вы бяспечна захавалі файл рэзервовай копіі.", + "hydrate": "Аднавіць з рэзервовай копіі", + "loadingPleaseWait": "Загрузка... Калі ласка, пачакайце.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Загрузіць больш…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Сервісы месцазнаходжанн, адключаны. Калі ласка, уключыце іх, каб зноў дзяліцца месцазнаходжаннем.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Дазвол атрымання месцазнаходжання скасаваны. Калі ласка, дайце яго каб дзяліцца месцазнаходжаннем.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Логін", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Увайсці ў {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Выйсці", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Згадаць", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Паведамленні", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Паведамленні:", + "moderator": "Мадэратар", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Заглушыць чат", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Новы чат", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Новае паведамленне ў FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Новы запыт на верыфікацыю!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Далей", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Не", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Няма злучэння з серверам", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Эмодзі не знойдзены. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Вы зможаце актывіраваць шыфраванне як толькі пакой перастане быць агульнадаступным.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Здаецца, на вашай прыладзе няма ці недаступны Firebase Cloud Messaging. Каб далей атрымліваць паведамленні, мы прапануем усталяваць ntfy ці іншы правайдар паведамленняў, каб атрымліваць іх бяспечна. Вы можаце спампаваць ntfy з PlayStore ці F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} не з'яўляецца серверам matrix. Выкарыстоўваць {server2} замест яго?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Падзяліцца запрашальнай спасылкай", + "scanQrCode": "Сканіраваць QR-код", + "noPasswordRecoveryDescription": "Вы яшчэ не дадалі метад аднаўлення пароля.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Няма дазволу", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Пакоі не знойдзены…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Паведамленні", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Задаць апісанне чату", + "setStatus": "Задаць статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Налады", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Падзяліцца", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} падзяліўся(-лася) сваім месцазнаходжаннем", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Падзяліцца месцазнаходжаннем", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Прапусціць", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Зыходны код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Прастора публічна", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Назва прасторы", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} пачаў выклік", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Статус", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Як вашыя справы?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Дастасаваць", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Сінхранізацыя... Калі ласка, пачакайце.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Сінхарнізацыя… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "Сістэма", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Яны не супадаюць", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Яны супадаюць", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Бачна ўсім", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Галасавое паведамленне", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Чакаем, калі партнёр прыме запыт…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Чакаем, калі партнёр прыме эмодзі…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Чакаем, калі партнёр зацвердзіць лічбы…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Увага!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Мы даслалі вам ліст на email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Хто якія дзеянні можа выконваць", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Каму дазволена далучацца да гэтай группы", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Чаму вы хаціце паскардзіцца?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "З гэтымі адрасамі, вы сожаце аднавіць свой пароль.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Напісать паведамленне…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Так", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Вы", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Вы больш не ўдзельнічаеце ў гэтым чаце", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Вы былі заблакіраваны ў гэтым чаце", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш публічны ключ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Інфармацыя пра паведамленне", + "time": "Час", + "sender": "Адпраўшчык", + "openGallery": "Адкрыць галерэю", + "removeFromSpace": "Выдаліць з прасторы", + "markAsRead": "Адзначыць як прачытанае", + "reportUser": "Паскардзіцца на карыстальніка", + "reactedWith": "{sender} рэагуе з {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Прымацаваць да пакою", + "confirmEventUnpin": "Вы ўпэўнены ў тым, што хаціце назаўсёды адмацаваць гэту падзею?", + "emojis": "Эмодзі", + "placeCall": "Здзейсніць выклік", + "voiceCall": "Галасавы выклік", + "unsupportedAndroidVersion": "Непадтрымліваемая версія Android", + "unsupportedAndroidVersionLong": "Гэта функцыя патрабуе навейшай версіі Android. Калі ласка, праверце наяўнасць абнаўленняў ці падтрымку Linage OS.", + "videoCallsBetaWarning": "Звярніце ўвагу, што відэа выклікі знаходзяцца ў бэце. Яны могуць працаваць некарэктна ці не на ўсіх платформах.", + "experimentalVideoCalls": "Эксперыментальныя відэа выклікі", + "youRejectedTheInvitation": "Вы скасавалі запрашэнне", + "youJoinedTheChat": "Вы далучыліся да чату", + "youAcceptedTheInvitation": "👍 Вы прынялі запрашэнне", + "youBannedUser": "Вы заблакіравалі {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Вы адазвалі запрашэнне для {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Вы былі запрошаны карыстальнікам {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Вы запрасілі {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Вы выгналі {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Вы выгналі і заблакіравалі {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Вы разблакіравалі {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} пагрукаўся", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Карыстальнікі абавязаны пагрукацца", + "noOneCanJoin": "Ніхто не можа далучыцца", + "knock": "Пагрукацца", + "users": "Карыстальнікі", + "storeInAndroidKeystore": "Захаваць у Android KeyStore", + "storeInAppleKeyChain": "Захаваць у Apple KeyChain", + "storeSecurlyOnThisDevice": "Захаваць на гэтай прыладзе", + "countFiles": "{count} файлаў", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Карыстальнік", + "custom": "Карыстальніцкае", + "foregroundServiceRunning": "Гэта паведамленне з'явіцца, калі асноўныя службы запрацуюць.", + "screenSharingTitle": "падзяліцца экранам", + "screenSharingDetail": "Вы дзеліцеся экранам у FluffyChat", + "whyIsThisMessageEncrypted": "Чаму гэта паведамленне нельга прачытаць?", + "noKeyForThisMessage": "Гэта можа здарыцца з-за таго, што паведамленне было даслана да таго, як вы увайшлі ў уліковы запіс на гэтай прыладзе.\n\nТаксама верагодна, што адпраўшчык заблакіраваў вашу прыладу ці ў вас хібы з інтэрнэтам.\n\nВы можаце чытаць гэта паведамленне з іншага сеансу? Тад дашліце паведамленне адтуль! Перайдзіце ў Налады > Прылады і пераканайцеся ў тым, што вашы прылады верыфікавалі адна адну. Калі вы адкрыеце пакой наступны раз і абодве сэсіі будуць запушчаны, ключы павінны сінхранізавацца аўтаматычна.\n\nВы не хаціце згубіць клбчы, калі будзеце выходзіць ці змяняць прылады? Пераканайцеся ў тым, што вы уключылі рэзервовае капіраванне чатаў у наладах.", + "newSpace": "Новая прастора", + "doNotShowAgain": "Не паказваць зноў", + "wasDirectChatDisplayName": "Пусты чат (быў {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Прасторы дазваляюць аб'ядноўваць вашы чаты і ствараць агульныя ці асобныя супольнасці.", + "encryptThisChat": "Шыфраваць гэты чат", + "disableEncryptionWarning": "У мэтах бяспекі, вы не можаце адклбчауь шыфраванне ў гэтым чаце, дзе яно было ўключана.", + "sorryThatsNotPossible": "Прабачце... Гэта немагчыма", + "reopenChat": "Адкрыць чат зноў", + "noBackupWarning": "Увага! Без уключэння рэзервовага капіравання чатаў, вы страціце доступ да вашых зашыфраваных паведамленняў. Настойліва рэкамендуецца уключыць фукнцыю да таго, як выйсці.", + "noOtherDevicesFound": "Іншыя прылады не знойдзены", + "fileIsTooBigForServer": "Немагчыма даслаць! Сервер падтрымлівае файлы да {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Файл быў захаваны ў {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Перайсці да апошняга паведамлення", + "readUpToHere": "Чытаць тут", + "jump": "Перайсці", + "openLinkInBrowser": "Адкрыць спасылку ў браўзеры", + "reportErrorDescription": "😭 О не, штосьці пайшло не так. Калі жадаеце, можаце падаць справаздачу аб памылке распрауоўшчыкам.", + "report": "паскардзіцца", + "manageAccount": "Кіраванне ўліковым запісам", + "noContactInformationProvided": "Сервер не мае ніякай вернай кантактнай інфармацыі", + "contactServerAdmin": "Звязацца з адміністратарам сервера", + "contactServerSecurity": "Звязацца з сервернай бяспекай", + "supportPage": "Падтрымка", + "serverInformation": "Серверная інфармацыя:", + "name": "Імя", + "version": "Версія", + "website": "Сайт", + "compress": "Сцісканне", + "boldText": "Цёмны", + "italicText": "Курсіў", + "strikeThrough": "Перакрэслены", + "pleaseFillOut": "Калі ласка, запоўніце", + "invalidUrl": "Няслушны url", + "addLink": "Дадаць спасылку", + "unableToJoinChat": "Немагчыма далучыцца да чату. Магчыма, іншы бок ужо скончыў размову.", + "previous": "Мінулы", + "otherPartyNotLoggedIn": "Іншы бок зараз не увайшоў, таму не можа атрымліваць паведамленні!", + "appWantsToUseForLogin": "Выкарыстоўваць '{server}' для ўвахода", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Тым самым, вы дазваляеце праграме і сайту дзяліцца інфармацыяй пра вас.", + "open": "Адкрыць", + "waitingForServer": "Чаканне сервера...", + "newChatRequest": "📩 Запыт новага чату", + "contentNotificationSettings": "Налады паведамленняў кантэнту", + "generalNotificationSettings": "Агульныя налады паведамленняў", + "roomNotificationSettings": "Налады паведамленняў пакою", + "userSpecificNotificationSettings": "Налады паведамленняў карыстальніка", + "otherNotificationSettings": "Іншыя налады паведамленняў", + "notificationRuleContainsUserName": "Змяшчае імя карыстальніка", + "notificationRuleContainsUserNameDescription": "Паведамляе пра тое, што паведамленне мае імя карыстальніка.", + "notificationRuleMaster": "Заглушыць усе паведамленні", + "notificationRuleMasterDescription": "Перазапісвае ўсе іншыя правілы і адключае паведамленні.", + "notificationRuleSuppressNotices": "Адключыць аўтаматычныя паведамленні", + "notificationRuleSuppressNoticesDescription": "Адключыць паведамленні ад аўтаматызаваных кліентаў, накшталт ботаў.", + "notificationRuleInviteForMe": "Запрашэнне мяне", + "notificationRuleInviteForMeDescription": "Паведамляе карыстальніка, калі яго запрашаюць у пакой.", + "allDevices": "Усе прылады", + "crossVerifiedDevicesIfEnabled": "Перакрыжавана спраўджаныя прылады, калі ўключаны", + "crossVerifiedDevices": "Перакрыжавана спраўджаныя прылады", + "verifiedDevicesOnly": "Толькі спраўджаныя прылады", + "takeAPhoto": "Зрабіць здымак", + "recordAVideo": "Запісаць відэа", + "optionalMessage": "(Апцыянальна) паведамленне...", + "notSupportedOnThisDevice": "Не падтрымліваецца на гэтай прыладзе", + "enterNewChat": "Увядзіце новы чат", + "approve": "Пацвердзіць", + "youHaveKnocked": "Вы былі выгнаны", + "pleaseWaitUntilInvited": "Калі ласка, пачакайце, пакуль хтосьці з пакою вас не запрасіць.", + "commandHint_logout": "Выйсці з бягуяай прылады", + "commandHint_logoutall": "Выйсці на ўсіх актыўных прыладах", + "displayNavigationRail": "Паказваць навігацыйны след на тэлефоне", + "customReaction": "Карыстальніцкая рэакцыя", + "moreEvents": "Больш падзей", + "declineInvitation": "Скасаваць запрашэнне", + "numUsersTyping": "{count} карыстальнікаў пішуць…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Атрыманне месцазнаходжання…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ок", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Рэзервовае капіраванне ключэй уключана", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Упс! На жаль, пры наладжванні пуш-паведамленняў, адбылася памылка.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Упс, штосьці пайшло не так…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Адкройце праграму, каб прачытаць паведамленні", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Адкрыць камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Адзін з вашых кліентаў выйшаў", + "addAccount": "Дадаць уліковы запіс", + "editBundlesForAccount": "Змяніць пакеты для гэтага ўліковага запісу", + "addToBundle": "Дадаць у пакет", + "removeFromBundle": "Выдаліць з пакета", + "bundleName": "Назва пакета", + "openInMaps": "Адкрыць на картах", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Спасылка", + "or": "Ці", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Удзельнік", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "фраза-пароль ці ключ аднаўлення", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Пароль", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Не памятаю пароль", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Пароль быў зменены", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecoverySettings": "Налады скіду пароля", + "passwordRecovery": "Аднаўленне пароля", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Замацаваць", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Калі ласка, выберыце код доступу", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Калі ласка, націсніце на спасылку ў лісце на email, каб працягнуць.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Калі ласка, увядзіце ваш пароль", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Калі ласка, увядзіце пін-код", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Калі ласка, увядзіце імя карыстальніка", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Калі ласка, сачыце за інстуркцыямі ў браўзеры і націсніце \"Далей\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Прыватнасць", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Публічныя пакоі", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Прычына", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "Адрэдагавана {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Асобны чат", + "redactedByBecause": "Адрэдагавана {username}, прычына: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} адрэдагаваў(-ла) падзею", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Адрэдагаваць паведамленне", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Адмовіць", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} адмовіў запрашэнне", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Выдаліць усе іншыя прылады", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Разблакіраваць у чаце", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Выдаліць выяву ўліковага запісу", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Замяніць пакой навейшай версіяй", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Адказаць", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Паведаміць пра паведамленне", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Пакой быў абноўлены", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Версія пакою", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Захаваць файл", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Пошук", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Бяспека", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Даслаць", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Даслаць паведамленне", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Даслаць як тэкст", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Даслаць аўдыё", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Даслаць файл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Даслаць выяву", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Даслаць {count} выяў(-вы)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Даслаць паведамленні", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Даслаць відэа", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} даслаў файл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} даслаў аўдыё", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} даслаў выяву", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} даслаў стыкер", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} даслаў відэа", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} даслаў інфрамацыю пра выклік", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Задаць як асноўны псеўданім", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Занадта шмат запытаў. Паспрабуйце пазней!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Паспрабуйце даслаць зноў", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} разблакіраваў {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Разблакіраваць прыладу", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Невядомая прылада", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Невядомы алгарытм шыфравання", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Невядомая падзея '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Уключыць павдеамленні чата", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Адмацаваць", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} і {count} іншых удзельнікаў пішуць…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} і {username2} пішуць…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} піша…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} пакінуў(-ла) чат", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} даслаў падзею {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Не спраўджана", + "verified": "Спраўджана", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Пачаць спраўджванне", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Вы паспяхова спраўджаны!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Спраўдзіць іншы ўліковы запіс", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Відэа выклік", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyOtherUserDescription": "Калі вы спраўдзілі іншага карыстальніка, вы можаце быць упэўненым з кім вы сапраўды перапісваецеся.💪\n\nКалі вы пачнеце спраўджванне, вы і іншы карыстальнік, убачыце ўсплывальнае акно ў праграме. У ім вы ўбачыце некалькі эмодзі ці лічб, якія вы павінны параўнаць адзін з адным.\n\nЛепшы метад зрабіць гэта - пачаць відэа выклік. 👭", + "pleaseEnterANumber": "Калі ласка, увядзіце лічбу большую за 0", + "verifyOtherDeviceDescription": "Калі вы спраўдзіце другую прыладу, яны абмяняюцца ключамі, якія ўзмоцняць вашу бяспеку. 💪 Калі вы пачнеце спраўджванне, у праграмах прылад з'явіцца ўсплывальнае паведамленне. Потым, вы ўбачыце некалькі эмодзі ці лічбаў, якія вы павінны параўнаць паміж сабой. Прасцей за ўсё гэта зрабіць, маючы дзве прылады побач. 🤳", + "verifyOtherUser": "🔐 Спраўдзіць іншага карыстальніка", + "verifyOtherDevice": "🔐 Спраўдзіць іншую прыладу", + "changeTheCanonicalRoomAlias": "Змяніць публічны адрас чату", + "wrongRecoveryKey": "Прабачце... гэта не выглядае як ключ аднаўлення.", + "restoreSessionBody": "Праграма спрабуе аднавіць вашу сесію з рэзервовай копіі. Калі ласка, паведаміце пра памылку распрацоўшчыкам па спасылцы {url}. Паведамленне памылкі: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "longPressToRecordVoiceMessage": "Доўга цісніце, каб запісаць галасавое паведамленне.", + "visibilityOfTheChatHistory": "Бачнасць гісторыі чату", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Бачна для ўсіх удзельнікаў", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "setColorTheme": "Каляровая схема:", + "invite": "Запрасіць", + "inviteGroupChat": "📨 Запрашэнне ў групавы чат", + "invalidInput": "Недапушчальны ўвод!", + "wrongPinEntered": "Няверны пін-код! Паспрабуйце праз {seconds} секунд...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "Чат перамясціцца ў архіў. Іншыя карыстальнікі будуць бачыць гэта так, быццам вы выйшлі з чату.", + "roomUpgradeDescription": "Чат будзе пераствораны з новай версіяй пакою. Усе ўдзельнікі будуць паведамлены пра неабходнасць перайсці ў новы чат. Вы можаце даведацца пра версіі пакояў тут: https://spec.matrix.org/latest/rooms/", + "removeDevicesDescription": "Вы выйдзеце з гэтай прылады і больш не будзеце атрымліваць паведамленні.", + "sendTypingNotificationsDescription": "Іншыя ўдзельнікі чату могуць бачыць, калі вы пішаце новае паведамленне.", + "continueText": "Працягнуць", + "banUserDescription": "Карыстальнік будзе заблакіраваны з чату і больш не зможа ўвайсці, пакуль вы яго не разблакіруеце.", + "unbanUserDescription": "Карыстальнік зможа зноў далучыцца да чату.", + "kickUserDescription": "Карыстальнік будзе выгнаны, але не заблакіраваны. У публічных чатах, ён зможа далучыцца зноў у любы час.", + "makeAdminDescription": "Калі вы зробіце карыстальніка адміністратарам, вы не зможаце адмяніць гэта дзеянне, бо ён будзе мець такія ж правы, як і вы.", + "pushNotificationsNotAvailable": "Пуш-паведамленні недаступны", + "learnMore": "Даведацца больш", + "yourGlobalUserIdIs": "Ваш глабальны ID-карыстальніка: ", + "noUsersFoundWithQuery": "На жаль, мы не змаглі знайсці карыстальніка з імём \"{query}\". Калі ласка, праверце наяўнасць памылак.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Грукацца", + "spaceMemberOfCanKnock": "Удзельнікі прасторы з {spaces} могуць грукацца", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "Чат можа быць знойдзены праз пошук у {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Пошук #чатаў, @карыстальнікаў...", + "nothingFound": "Нічога не знойдзена...", + "groupName": "Назва групы", + "createGroupAndInviteUsers": "Стварыць групу і запрасіць карыстальнікаў", + "groupCanBeFoundViaSearch": "Група можа быць знойдзена праз пошук", + "commandHint_sendraw": "Даслаць толькі json", + "databaseMigrationTitle": "База даных аптымізавана", + "databaseMigrationBody": "Калі ласка, пачакайце. Гэта можа заняць некаторы час.", + "leaveEmptyToClearStatus": "Пакіньце пустым, каб ачысціць свой статус.", + "select": "Выбраць", + "searchForUsers": "Пошук @карыстальнікаў...", + "pleaseEnterYourCurrentPassword": "Калі ласка, увядзіце свой бягучы пароль", + "newPassword": "Новы пароль", + "pleaseChooseAStrongPassword": "Калі ласка, падбярыце больш надзейны пароль", + "passwordsDoNotMatch": "Паролі не супадаюць", + "passwordIsWrong": "Вы ўвялі няверны пароль", + "publicChatAddresses": "Публічныя адрасы чату", + "createNewAddress": "Стварыць новы адрас", + "joinSpace": "Далучыцца да прасторы", + "publicSpaces": "Публічныя прасторы", + "addChatOrSubSpace": "Дадаць чат ці пад-прастору", + "thisDevice": "Гэта прылада:", + "initAppError": "Адбылася памылка пры ініцыялізацыі праграмы", + "searchIn": "Пошук у чаце \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Шукаць яшчэ...", + "gallery": "Галерэя", + "files": "Файлы", + "sessionLostBody": "Ваш сеанс страчаны. Калі ласка, паведаміце пра гэта распрацоўшчыкам: {url}. Паведамленне памылкі: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Дасылаць адзнаку аб чытанні", + "sendReadReceiptsDescription": "Іншыя карыстальнікі чатаў будуць бачыць, калі вы прачыталі паведамленні.", + "formattedMessages": "Фармаціраваныя паведамленні", + "formattedMessagesDescription": "Адлюстроўваць пашыраныя паведамленні разметкай markdown.", + "acceptedKeyVerification": "{sender} прыняў(-ла) спраўджванне ключэй", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} адхіліў(-ла) спраўджванне ключэй", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} скочныў(-ла) спраўджванне ключэй", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} гатовы(-а) да спраўджвання ключэй", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} запрасіў(-ла) спраўджванне ключэй", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} пачаў(-ла) спраўджванне ключэй", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Уваходныя паведамленні", + "stickers": "Стыкеры", + "discover": "Даследаваць", + "commandHint_ignore": "Ігнараваць дадзены matrix ID", + "commandHint_unignore": "Перастаць ігнараваць дадзены matrix ID", + "unreadChatsInApp": "{appname}: {unread} непрачытаных чатаў", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Шыфраванне базы даных не падтрымліваецца гэтай платформай", + "thereAreCountUsersBlocked": "На гэты момант, {count} карыстальнікаў заблакіравана.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Перайсці да прасторы: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Адзначыць як непрачытанае", + "userLevel": "{level} - Карыстальнік", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Мадэратар", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Адміністратар", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Змяніць агульныя налады чату", + "inviteOtherUsers": "Запрасіць іншых карыстальнікаў у гэты чат", + "changeTheChatPermissions": "Змяніць дазволы чату", + "changeTheVisibilityOfChatHistory": "Змяніць бачнасць гісторыі чату", + "sendRoomNotifications": "Дасылаць паведамленні @room", + "changeTheDescriptionOfTheGroup": "Змяніць апісанне чату", + "chatPermissionsDescription": "Задаць узровень дазволаў, які неабходны для некаторых дзеянняў у чаце. Узроўні 0, 50 і 100 звычайна адлюстроўваюць карыстальнікаў, мадэратараў і адміністратараў, але любая градацыя магчыма.", + "updateInstalled": "🎉 Абнаўленне {version} усталявана!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Спіс змен", + "sendCanceled": "Адпраўка скасавана", + "loginWithMatrixId": "Увайсці з Matrix-ID", + "doesNotSeemToBeAValidHomeserver": "Гэта не выглядае як дамашні сервер. Няслушны URL?", + "calculatingFileSize": "Вылічэнне памеру файла...", + "sendingAttachment": "Адпраўка прыкладання...", + "oneOfYourDevicesIsNotVerified": "Адна з вашых прылад не спраўджана", + "noticeChatBackupDeviceVerification": "Заўвага: Калі вы падключыце ўсе свае прылады да рэзервовага капіравання, яны аўтаматычна спраўдзяцца.", + "blur": "Размыццё:", + "opacity": "Празрыстасць:", + "setWallpaper": "Задаць шпалеры", + "notificationRuleMemberEvent": "Падзеі ўдзельніцтва", + "notificationRuleMemberEventDescription": "Спыніць усе паведамленні пра ўдзельніцтва.", + "notificationRuleIsUserMention": "Згадванні карыстальніка", + "notificationRuleIsUserMentionDescription": "Паведамляе, калі карыстальніка згадалі ў паведамленні.", + "notificationRuleContainsDisplayName": "Мае адлюстроўваемае імя", + "notificationRuleContainsDisplayNameDescription": "Паведамляе, калі паведамленне мае іх адлюстроўваемае імя.", + "notificationRuleIsRoomMention": "Згадванні пакою", + "notificationRuleIsRoomMentionDescription": "Паведамляе карыстальніка, калі згадваюць пакой.", + "notificationRuleRoomnotif": "Паведамленні пакою", + "notificationRuleRoomnotifDescription": "Паведамляе пра згадванні '@room'.", + "notificationRuleTombstone": "Помнік", + "notificationRuleTombstoneDescription": "Паведамляе пра дэактывацыю пакою.", + "notificationRuleReaction": "Рэакцыя", + "notificationRuleReactionDescription": "Адключыць усе паведамленні пра рэакцыі.", + "notificationRuleRoomServerAcl": "ACL сервера пакою", + "notificationRuleRoomServerAclDescription": "Адключыць паведамленні пра серверныя спісы кантролю пакою (ACL).", + "notificationRuleSuppressEdits": "Заглушыць змены", + "notificationRuleSuppressEditsDescription": "Заглушыць паведамленні пра адрэдагаваныя паведамленні.", + "notificationRuleCall": "Выклік", + "notificationRuleCallDescription": "Паведамляе пра выклікі.", + "notificationRuleEncryptedRoomOneToOne": "Шыфраваны пакой One-to-One", + "notificationRuleEncryptedRoomOneToOneDescription": "Паведамляе пра паведамленні ў шыфраваных one-to-one пакоях.", + "notificationRuleRoomOneToOne": "Пакой One-to-One", + "notificationRuleRoomOneToOneDescription": "Паведамляе пра паведамленні ў пакоях one-to-one.", + "notificationRuleMessage": "Паведамленне", + "notificationRuleMessageDescription": "Паведамляе пра звычайныя паведамленні.", + "notificationRuleEncrypted": "Зашыфравана", + "notificationRuleEncryptedDescription": "Паведамляе пра паведамленні ў зашыфраваных пакоях.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Паведамляе пра падзеі віджэту Jitsi.", + "notificationRuleServerAcl": "Заглушыць серверныя падзеі ACL", + "notificationRuleServerAclDescription": "Заглушыць паведамленні пра серверныя падзеі ACL.", + "unknownPushRule": "Невядомае правіла пуша '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️{duration} - Галасавое паведамленне ад {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Калі вы выдаліце гэтыя налады паведамленняў, гэта не можа быць адменена.", + "more": "Больш", + "shareKeysWith": "Падзяліцца ключамі з...", + "shareKeysWithDescription": "Якім прыладам вы давяраеце настолькі, каб яны маглі чытаць вашыя зашыфраваныя паведамленні?", + "pause": "Паўза", + "resume": "Працягнуць", + "removeFromSpaceDescription": "Гэты чат будзе выдалены з прасторы, але з'явіцца ў вашым спісе чатаў.", + "countChats": "{chats} чатаў", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Удзельнік прасторы {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Пачаць апытанне", + "endPoll": "Скончыць апытанне", + "answersVisible": "Адказы бачны", + "pollQuestion": "Пытанне апытання", + "answerOption": "Варыянт адказу", + "addAnswerOption": "Дадаць варыянт адказу", + "allowMultipleAnswers": "Дазволіць некалькі адказаў", + "pollHasBeenEnded": "Апытанне было скончана", + "countVotes": "{count, plural, =1{Адзін голас} other{{count} галасы(-оў)}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Вынікі будуць бачны, калі апытанне скончыцца", + "replyInThread": "Адказаць у гутарку", + "countReplies": "{count, plural, =1{Адзін адказ} other{{count} адказа(-ў)}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Гутарка", + "backToMainChat": "Вярнуцца ў галоўны чат", + "saveChanges": "Захаваць змены", + "createSticker": "Стварыць стыкер ці эмадзі", + "useAsSticker": "Ужыць як стыкер", + "useAsEmoji": "Ужыць як эмадзі", + "stickerPackNameAlreadyExists": "Назва набору стыкераў ужо існуе", + "newStickerPack": "Новы набор стыкераў", + "stickerPackName": "Назва набору стыкераў", + "attribution": "Атрыбуцыя", + "skipChatBackup": "Прапусціць рэзервовае капіраванне чатаў", + "skipChatBackupWarning": "Вы ўпэўнены? Без наладжвання рэзервовага капіравання чатаў, вы можаце згубіць доступ да ўсіх вашых чатаў, калі вы зменіце прыладу.", + "changedTheChatDescription": "{username} змяніў апісанне чата", + "changedTheChatName": "{username} змяніў назву чата", + "noMoreResultsFound": "Нічога не знойдзена", + "chatSearchedUntil": "Пошук у чаце да {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Асноўны URL федэрацыі", + "clientWellKnownInformation": "Client-Well-Known інфармацыя:", + "baseUrl": "Базавы URL", + "identityServer": "Сервер профілей:", + "versionWithNumber": "Версія: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Логі", + "advancedConfigs": "Пашыраныя налады", + "advancedConfigurations": "Пашыраная канфігурацыя", + "signIn": "Увайсці", + "createNewAccount": "Стварыць новы ўліковы запіс", + "signUpGreeting": "FluffyChat дэцэнтралізаваны! Выберыце свой сервер, дзе вы хаціце стварыць уліковы запіс і прайягвайце!", + "signInGreeting": "Вы ўжо маеце ўліковы запіс у Matrix? З вяртаннем! Выберыце свой хатні сервер і аўтарызуйцеся.", + "theProcessWasCanceled": "Працэс быў скасаваны.", + "join": "Далучыцца", + "searchOrEnterHomeserverAddress": "Пашукайце ці ўвядзіце адрас хатняга сервера", + "matrixId": "Matrix ID", + "setPowerLevel": "Прызначыць узровень магчымасцей", + "makeModerator": "Прызначыць мадэратарам", + "makeAdmin": "Прызначыць адміністратарам", + "removeModeratorRights": "Адабраць правы мадэратара", + "removeAdminRights": "Прыбраць адміністратарскія правы", + "powerLevel": "Узровень дазволаў", + "setPowerLevelDescription": "Узровень дазволаў вызначае, што ўдзельнік можа рабіць у пакое і звычайна знаходзіцца паміж 0 і 100.", + "owner": "Уладальнік", + "mute": "Сцішыць", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Стварыць новы чат", + "reset": "Скінуць", + "supportFluffyChat": "Падтрымаць FluffyChat", + "support": "Падтрымаць", + "setLowPriority": "Прызначыць нізкі прыярытэт", + "unsetLowPriority": "Скасаваць нізкі прыярытэт", + "playSoundOnNotification": "Прайграваць гук апавяшчэння", + "addTag": "Дадаць тэг", + "removeTag": "Выдаліць тэг", + "tagName": "Назва тэга", + "createNewTag": "Стварыць новы тэг" +} \ No newline at end of file diff --git a/lib/l10n/intl_bn.arb b/lib/l10n/intl_bn.arb new file mode 100644 index 0000000000..c6de67b5b3 --- /dev/null +++ b/lib/l10n/intl_bn.arb @@ -0,0 +1,1865 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.154280", + "about": "সম্পর্কে", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "স্বীকার করি", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "অ্যাকাউন্ট", + "@account": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "পাসওয়ার্ড আবার লিখো", + "notAnImage": "ইমেজ ফাইল না।", + "admin": "অ্যাডমিস", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "অ্যালিয়াস", + "@alias": { + "type": "String", + "placeholders": {} + }, + "archive": "আর্কাইভ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "banned": "ব্যানড", + "@banned": { + "type": "String", + "placeholders": {} + }, + "cancel": "বাতিল", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "chat": "চ্যাট", + "@chat": { + "type": "String", + "placeholders": {} + }, + "close": "বন্ধ", + "@close": { + "type": "String", + "placeholders": {} + }, + "copy": "অনুলিপি", + "@copy": { + "type": "String", + "placeholders": {} + }, + "create": "তৈরি", + "@create": { + "type": "String", + "placeholders": {} + }, + "delete": "অপসারণ", + "@delete": { + "type": "String", + "placeholders": {} + }, + "devices": "ডিভাইস", + "@devices": { + "type": "String", + "placeholders": {} + }, + "notifications": "বিজ্ঞপ্তি", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "edit": "সম্পাদন", + "@edit": { + "type": "String", + "placeholders": {} + }, + "encryption": "এনক্রিপশন", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "এনক্রিপ্টকৃত", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "forward": "ফরওয়ার্ড", + "@forward": { + "type": "String", + "placeholders": {} + }, + "group": "গ্রুপ", + "@group": { + "type": "String", + "placeholders": {} + }, + "help": "সাহায্য", + "@help": { + "type": "String", + "placeholders": {} + }, + "invited": "আমন্ত্রিত", + "@invited": { + "type": "String", + "placeholders": {} + }, + "leave": "ছেড়ে যাও", + "@leave": { + "type": "String", + "placeholders": {} + }, + "logout": "প্রস্থান", + "@logout": { + "type": "String", + "placeholders": {} + }, + "login": "প্রবেশ", + "@login": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_bo.arb b/lib/l10n/intl_bo.arb new file mode 100644 index 0000000000..ed79a3fb99 --- /dev/null +++ b/lib/l10n/intl_bo.arb @@ -0,0 +1,1974 @@ +{ + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@none": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@account": { + "type": "String", + "placeholders": {} + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb new file mode 100644 index 0000000000..e82322e73b --- /dev/null +++ b/lib/l10n/intl_ca.arb @@ -0,0 +1,2523 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.145728", + "about": "Quant a", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accepta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ha acceptat la invitació", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Compte", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ha activat el xifratge d’extrem a extrem", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administració", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "àlies", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ha respost a la trucada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualsevol pot unir-se", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blocatge de l’aplicació", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arxiu", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Es pot entrar al xat com a convidadi?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "N’esteu seguri?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Voleu acceptar aquesta sol·licitud de verificació de: {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Veta del xat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetadi", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} ha vetat a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloca el dispositiu", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancel·la", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "No es pot obrir l’URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Canvia el nom del dispositiu", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ha canviat la imatge del xat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ha canviat els permisos del xat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ha canviat les normes d’accés dels convidats", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ha canviat les normes d’accés dels convidats a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ha canviat la visibilitat de l’historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ha canviat la visibilitat de l’historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ha canviat les normes d’unió", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ha canviat les normes d’unió a: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ha canviat la seva imatge de perfil", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ha canviat l’àlies de la sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ha canviat l’enllaç per a convidar", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Canvia la contrasenya", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Canvia el servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Canvia l’estil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Canvia el nom del grup", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "El xifratge s’ha corromput", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Xat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalls del xat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Xats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Trieu una contrasenya forta", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Tanca", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Envia text en format HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_leave": "Abandona aquesta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_op": "Estableix el nivell d'autoritat d'uni usuàriï (per defecte: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Envia text sense format", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Envia text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "compareEmojiMatch": "Compareu aquests emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compareu aquests números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "S’ha copiat al porta-retalls", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copia", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "No s'ha pogut desxifrar el missatge: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participants", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crea", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} ha creat el xat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Actiu actualment", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Fosc", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Suprimeix", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Suprimeix el compte", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Suprimeix el missatge", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositius", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Xats directes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Ha canviat l'àlies", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Baixa el fitxer", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edita", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edita l'àlies", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "L'emoticona ja existeix!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Codi d'emoticona invàlid!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Paràmetres de les emoticones", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Codi d'emoticona", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Xat buit", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activa el paquet d'emoticones global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "No podreu desactivar el xifratge mai més. N’esteu segur?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Xifrat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Xifratge", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "El xifratge no s’ha activat", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ha finalitzat la trucada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Introduïu una adreça electrònica", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenvia", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Des de la unió", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Des de la invitació", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "El grup és públic", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grup amb {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Els convidats no poden unir-se", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Els convidats es poden unir", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha retirat la invitació de {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Amaga els esdeveniments desconeguts", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuaris ignorats", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "He fet clic a l'enllaç", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de seguretat o clau de recuperació incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convida contacte", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convida contacte a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} ha convidat a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Només usuàriïs convidadis", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l'app\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "escrivint…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} s'ha unit al xat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Uneix-te a la sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ha expulsat a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ha expulsat i vetat a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsa del xat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Actiu per última vegada: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abandona", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ha marxat del xat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Clar", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carrega {count} participants més", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "S’està carregant… Espereu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carrega’n més…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "S’han desactivat els serveis d’ubicació. Activeu-los per a compartir la vostra ubicació.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "S’ha rebutjat el permís d’ubicació. Atorgueu-lo per a poder compartir la vostra ubicació.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Inicia la sessió", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Inicia sessió a {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Finalitza la sessió", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Menciona", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silencia el xat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Missatge nou al FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova sol·licitud de verificació!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sense connexió al servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "No s’ha trobat cap emoticona. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem instaŀlar ntfy. Amb ntfy o qualsevol altre proveïdor de Unified Push, pots rebre notificacions de forma segura i lliure. Pots instaŀlar ntfy des de la PlayStore o des de F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Encara no heu afegit cap mètode per a poder recuperar la contrasenya.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sense permís", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "No s’ha trobat cap sala…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificacions", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuàriïs escrivint…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "D'acord", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La còpia de seguretat de claus en línia està activada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Alguna cosa ha anat malament…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Obre l'aplicació per llegir els missatges", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Obre la càmera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "contrasenya o clau de recuperació", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasenya", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contrasenya oblidada", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La contrasenya ha canviat", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperació de contrassenya", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixa", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Tria un codi d'accés", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Fes clic a l'enllaç del correu i, després, segueix.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Introdueix la teva contrasenya", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Introdueix el teu nom d'usuàriï", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privadesa", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Sales públiques", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ha estripat un esdeveniment", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Rebutja", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} ha rebutjat la invitació", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Elimina", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Elimina tots els altres dispositius", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Aixeca el veto", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Respon", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La sala s'ha actualitzat", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "security": "Seguretat", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Envia", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Envia un missatge", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Envia com a text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Envia un àudio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Envia un fitxer", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Envia una imatge", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Envia un vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ha enviat un fitxer", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ha enviat un àudio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ha enviat una imatge", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} ha enviat un adhesiu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ha enviat un vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} ha enviat informació de trucada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "Defineix l’estat", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Paràmetres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Comparteix", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} n’ha compartit la ubicació", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Omet", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codi font", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ha iniciat una trucada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Com us sentiu avui?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Envia", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "No coincideixen", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Coincideixen", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Massa sol·licituds. Torna-ho a provar més tard!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Intenta tornar a enviar", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} ha aixecat el veto a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloqueja dispositiu", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositiu desconegut", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "L’algorisme de xifratge és desconegut", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Esdeveniment desconegut '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Deixa de silenciar el xat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Deixa de fixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} estan escrivint…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} està escrivint…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} ha marxat del xat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} ha enviat un esdeveniment {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Inicia la verificació", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "T'has verificat correctament!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificant un altre compte", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videotrucada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilitat de l’historial del xat", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible per a tots els participants", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible per a tothom", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Missatge de veu", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "S’està esperant que l’altre accepti l’emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "S’està esperant que l’altre accepti els nombres…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Atenció!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Us hem enviat un missatge de correu electrònic", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Qui pot unir-se a aquest grup", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Amb aquestes adreces, si ho necessiteu, podeu recuperar la vostra contrasenya.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escriviu un missatge…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sí", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vós", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ja no participeu en aquest xat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "T'han vetat en aquest xat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "La vostra clau pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "all": "Tot", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Afegeix a un espai", + "areYouSureYouWantToLogout": "Segur que voleu finalitzar la sessió?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Afegeix una adreça electrònica", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "L’ordre no és vàlida", + "@commandInvalid": { + "type": "String" + }, + "fontSize": "Mida de la lletra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "next": "Següent", + "@next": { + "type": "String", + "placeholders": {} + }, + "link": "Enllaç", + "redactMessage": "Estripa el missatge", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Envia en prémer Retorn", + "clearArchive": "Neteja l’arxiu", + "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "chatBackup": "Còpia de seguretat del xat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nom de l’espai", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "search": "Cerca", + "@search": { + "type": "String", + "placeholders": {} + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "newChat": "Xat nou", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Canvia l’avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignora", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "commandHint_react": "Envia una resposta com a reacció", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "defaultPermissionLevel": "Nivell de permisos per defecte per nous membres", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "El contingut s’ha denunciat als administradors del servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activa el xifratge", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Afegeix un compte", + "noEncryptionForPublicRooms": "Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versió de la sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Envia missatges", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Desa el fitxer", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Seguiu les instruccions al lloc web i toqueu «Següent».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denuncia el missatge", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Defineix com a àlies principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "status": "Estat", + "@status": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Qui pot efectuar quina acció", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Per què voleu denunciar això?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "S’està esperant que l’altre accepti la sol·licitud…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "unverified": "No verificat", + "commandHint_me": "Descriviu-vos", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandMissing": "{command} no és una ordre.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "configureChat": "Configura el xat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copia al porta-retalls", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Espai nou", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "S’ha produït un error en obtenir la ubicació: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "groups": "Grups", + "@groups": { + "type": "String", + "placeholders": {} + }, + "messages": "Missatges", + "@messages": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "L’espai és públic", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Escaneja un codi QR", + "obtainingLocation": "S’està obtenint la ubicació…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Comparteix la ubicació", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "S’està sincronitzant… Espereu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "reason": "Raó", + "@reason": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} ha canviat el seu àlies a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "commandHint_clearcache": "Neteja la memòria cau", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_join": "Uneix-te a la sala indicada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Expulsa uni usuàriï d'aquesta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomavatar": "Establiu la imatge per a aquesta sala (per mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_dm": "Inicia un xat directe\nUsa --no-encryption per desactivar l'encriptatge", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_invite": "Convida uni usuàriï a aquesta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_ban": "Veta uni usuàriï d'aquesta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_create": "Crea un xat de grup buit\nUsa --no-encryption per desactivar l'encriptatge", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descarta la sessió", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "repeatPassword": "Repetiu la contrasenya", + "commandHint_myroomnick": "Estableix el teu àlies per a aquesta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "editBlockedServers": "Edita els servidors bloquejats", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "El servidor admet els inicis de sessió:\n{serverVersions}\nPerò l'aplicació només admet:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "hugContent": "{senderName} t'abraça", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Salta a l'últim missatge llegit", + "commandHint_cuddle": "Envia una carícia", + "reportErrorDescription": "😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d'aquest bug a l'equip de desenvolupament.", + "removeYourAvatar": "Esborra el teu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Aquesta versió d'Android és incompatible", + "oneClientLoggedOut": "Una de les teves aplicacions ha tancat la sessió", + "setColorTheme": "Tria el color del tema:", + "supposedMxid": "Això hauria de ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Usuàrïi", + "youAcceptedTheInvitation": "👍 Has acceptat la invitació", + "noMatrixServer": "{server1} no és un servidor de matrix, vols fer servir {server2} ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} t'ha convidat", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.", + "removeDevicesDescription": "Tancaràs la sessió d'aquest dispositiu i no hi podràs rebre més missatges.", + "tryAgain": "Torna-ho a provar", + "youKickedAndBanned": "🙅 Has expulsat i vetat a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "L'usuàrïi ja pot tornar a entrar al xat.", + "youRejectedTheInvitation": "Has rebutjat la invitació", + "messagesStyle": "Missatges:", + "newSpaceDescription": "Els espais et permeten consolidar els teus xats i construir comunitats públiques o privades.", + "chatDescription": "Descripció del xat", + "editRoomAliases": "Canvia els àlies de la sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "encryptThisChat": "Xifra aquest xat", + "reopenChat": "Reobre el xat", + "addToBundle": "Afegeix al pquet", + "countFiles": "{count} arxius", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d'aquest dispositiu.\n\nTambé pot ser que l'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura't que els teus dispositius s'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura't que has activat la còpia de seguretat del xat als paràmetres.", + "commandHint_markasgroup": "Marca com un grup", + "pushNotificationsNotAvailable": "Les notificacions push no estan disponibles", + "storeInAppleKeyChain": "Desa en la Apple KeyChain", + "replaceRoomWithNewerVersion": "Substitueix la sala amb la versió més recent", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "hydrate": "Restaura un arxiu de recuperació", + "invalidServerName": "El nom del servidor és invàlid", + "chatPermissions": "Permisos del xat", + "sender": "Remitent", + "storeInAndroidKeystore": "Desa en la Android KeyStore", + "makeAdminDescription": "Un cop hagis fet admin aquesta persona ja no podràs desfer-ho, ja que llavors tindrà els mateixos permisos que tu.", + "editBundlesForAccount": "Edita paquets per aquest compte", + "whyIsThisMessageEncrypted": "Per què no es pot llegir aquest missatge?", + "setChatDescription": "Posa una descripció de xat", + "importFromZipFile": "Importa des d'un arxiu zip", + "dehydrateWarning": "Aquesta acció és irreversible. Assegura't que deses l'arxiu de recuperació en un lloc segur.", + "noOtherDevicesFound": "No s'han trobat més dispositius", + "redactedBy": "Estripat per {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Tingues en compte que les trucades de vídeo estan encara en beta. Pot ser que no funcioni bé o que falli en alguna plataforma.", + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "fileIsTooBigForServer": "No s'ha pogut enviar! El servidor només accepta adjunts de fins a {max}.", + "readUpToHere": "Llegit fins aquí", + "optionalRedactReason": "(Opcional) El motiu per estripar el missatge...", + "dehydrate": "Exporta la sessió i neteja el dispositiu", + "archiveRoomDescription": "Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.", + "exportEmotePack": "Exporta com un pack Emote en .zip", + "experimentalVideoCalls": "Trucades de vídeo experimentals", + "openInMaps": "Obre als mapes", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "Estripat per {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Has rebutjat la invitació de {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "reportUser": "Denuncia l'usuàrïi", + "confirmEventUnpin": "Vols desfixar l'esdeveniment permanentment?", + "youInvitedUser": "📩 Has convidat a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "S'ha desat l'arxiu a {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "S'estriparà el missatge per a totser d'aquesta conversa. Aquesta acció és irreversible.", + "invalidInput": "L'entrada no és vàlida!", + "doNotShowAgain": "No ho tornis a mostrar", + "report": "informa", + "screenSharingTitle": "compartició de pantalla", + "googlyEyesContent": "{senderName} t'ha enviat un parell d'ulls", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Has vetat a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "editRoomAvatar": "Canvia la imatge de la sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pica a la porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Obre l'enllaç en un navegador", + "messageInfo": "Informació del missatge", + "disableEncryptionWarning": "Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.", + "directChat": "Xat directe", + "wrongPinEntered": "Pin incorrecte! Torna-ho a provar en {seconds} segons...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Envia notificacions d'escriptura", + "inviteGroupChat": "📨 Invitació de grup", + "foregroundServiceRunning": "Aquesta notificació apareix quan el servei de primer pla està corrent.", + "voiceCall": "Videotrucada", + "commandHint_unban": "Aixeca el veto a aquesti usuàriï per aquesta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa emojis", + "wasDirectChatDisplayName": "Xat buit ( era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No s'ha afegit una descripció de xat.", + "removeFromBundle": "Esborra del paquet", + "confirmMatrixId": "Confirma la teva ID de Matrix per poder esborrar el compte.", + "learnMore": "Llegeix-ne més", + "notAnImage": "No és un arxiu d'image.", + "users": "Usuàrïis", + "openGallery": "Obre la galeria", + "chatDescriptionHasBeenChanged": "Ha canviat la descripció del xat", + "bundleName": "Nom del paquet", + "removeFromSpace": "Esborra de l'espai", + "roomUpgradeDescription": "El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Introdueix un número major que 0", + "youKicked": "👞 Has expulsat a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "jump": "Salta", + "reactedWith": "{sender} ha reaccionat amb {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Aquesta acció no és possible", + "shareInviteLink": "Comparteix un enllaç d'invitació", + "commandHint_markasdm": "Marca com a conversa directa la sala amb aquesta ID de Matrix", + "cuddleContent": "{senderName} et fa una carícia", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "emoteKeyboardNoRecents": "Els últims emotes usats apareixeran aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "T'has afegit al xat", + "markAsRead": "Marca com a llegit", + "commandHint_hug": "Envia una abraçada", + "replace": "Reemplaça", + "oopsPushError": "Ep! Sembla que s'ha produït un error en configurar les notificacions.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "youUnbannedUser": "Has aixecat el veto a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Espai nou", + "emojis": "Emojis", + "pleaseEnterYourPin": "Introdueix el teu pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Envia uns ulls curiosos", + "createGroup": "Crea un grup", + "time": "Temps", + "custom": "Personalitzat", + "noBackupWarning": "Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.", + "kickUserDescription": "Li usuàrïi ha estat expulsadi però no vetadi. Als xats públics, pot tornar-hi a entrar en qualsevol moment.", + "importNow": "Importa-ho ara", + "pinMessage": "Fixa a la sala", + "invite": "Convida", + "unsupportedAndroidVersionLong": "Aquesta funcionalitat només funciona amb versions d'Android més noves.", + "storeSecurlyOnThisDevice": "Desa de forma segura en aquest dispositiu", + "screenSharingDetail": "Estàs compartint la teva pantalla a FluffyChat", + "placeCall": "Truca", + "block": "Bloca", + "blockUsername": "Ignora aquesti usuàrïi", + "blockedUsers": "Usuàrïis blocadis", + "blockListDescription": "Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.", + "pleaseChooseAStrongPassword": "Tria una contrasenya forta", + "groupName": "Nom del grup", + "createGroupAndInviteUsers": "Crea un grup i convida-hi usuàrïis", + "wrongRecoveryKey": "Malauradament, aquesta clau de recuperació no és la correcta.", + "sendReadReceiptsDescription": "Lis altris participants d'un xat poden veure quan has llegit un missatge.", + "yourGlobalUserIdIs": "La teva ID global és: ", + "commandHint_sendraw": "Envia un json pelat", + "databaseMigrationTitle": "La base de dades ha estat optimitzada", + "pleaseEnterYourCurrentPassword": "Fica la teva contrasenya actual", + "newPassword": "Contrasenya nova", + "restoreSessionBody": "L'aplicació provarà de restaurar la teva sessió des de la còpia de seguretat. Si us plau, comunica aquest error a l'equi pde desenvolupament a {url}. El missatge d'error és {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "formattedMessages": "Missatges amb format", + "formattedMessagesDescription": "Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.", + "verifyOtherUser": "🔐 Verifica uni altri usuàrïi", + "verifyOtherDevice": "🔐 Verifica un altre dispositiu", + "initAppError": "S'ha produït un error mentre s'inicialitzava l'aplicació", + "noUsersFoundWithQuery": "No s'ha trobat cap usuàrïi amb \"{query}\". Revisa si ho has escrit malament.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "Per esborrar el teu estat, deixa-ho en blanc.", + "select": "Tria", + "searchForUsers": "Cerca @usuariïs...", + "addChatOrSubSpace": "Afegeix un xat o un subespai", + "sendReadReceipts": "Envia informes de tecleig", + "sendTypingNotificationsDescription": "Lis altris participants d'un xat poden veure quan estàs teclejant un missatge nou.", + "incomingMessages": "Missatge d'entrada", + "acceptedKeyVerification": "{sender} ha acceptat la verificació de claus", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} ha canceŀlat la verificació de claus", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} ha comletat la verificació de claus", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} està a punt per verificar les claus", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "nothingFound": "No s'ha trobat res...", + "searchChatsRooms": "Cerca #sales, @usuariïs...", + "groupCanBeFoundViaSearch": "El grup es pot trobar per la cerca general", + "databaseMigrationBody": "Espereu un moment, si us plau.", + "passwordsDoNotMatch": "Les contrasenyes no coincideixen", + "passwordIsWrong": "La contrasenya introduïda és incorrecta", + "joinSpace": "Fica't a l'espai", + "publicSpaces": "Espais públics", + "thisDevice": "Aquest dispositiu:", + "sessionLostBody": "S'ha perdut la teva sessió. Si us plau, comunica aquest error a l'equip de desenvolupament a {url}. El missatge d'error és: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l'altra persona i tu veureu un missatge emergent a l'app. Us sortiran un seguit d'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭", + "verifyOtherDeviceDescription": "Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d'iniciar la verificació. 🤳", + "requestedKeyVerification": "{sender} ha soŀlicitat verificar claus", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} ha iniciat la verificació de claus", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Enganxines", + "discover": "Descobreix", + "commandHint_ignore": "Ignora el compte de matrix especificat", + "commandHint_unignore": "Deixa d'ignorar el compt de matrix especificat", + "sendCanceled": "S'ha canceŀlat l'enviament", + "noChatsFoundHere": "Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️", + "knock": "Pica", + "knocking": "S'està picant", + "goToSpace": "Ves a l'espai {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Canvia les opcions generals de xat", + "sendRoomNotifications": "Envia notificacions @room", + "changeTheDescriptionOfTheGroup": "Canvia la descripció del xat", + "changelog": "Registre de canvis", + "userLevel": "{level} - Usuàriï", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderadori", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Convida més gent a la conversa", + "changeTheChatPermissions": "Canvia els permisos del xat", + "changeTheVisibilityOfChatHistory": "Canvia la visibilitat de l'historial de conversa", + "changeTheCanonicalRoomAlias": "Canvia l'adreça principal del xat", + "accessAndVisibilityDescription": "Qui pot entrar a aquesta conversa i com pot ser descoberta.", + "customEmojisAndStickers": "Emojis i stickers propis", + "accessAndVisibility": "Accés i visibilitat", + "calls": "Trucades", + "hideRedactedMessages": "Amaga els missatges estripats", + "hideInvalidOrUnknownMessageFormats": "Amaga els missatges que tinguin un format desconegut", + "passwordRecoverySettings": "Recuperació de contrasenya", + "gallery": "Galeria", + "noDatabaseEncryption": "No es pot xifrar la base de dades en aquesta plataforma", + "usersMustKnock": "Lis membres han de picar a la porta", + "noOneCanJoin": "Ningú s'hi pot ficar", + "customEmojisAndStickersBody": "Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.", + "hideRedactedMessagesBody": "Si algú estripa un missatge, ja no apareixerà a l'historial de la conversa.", + "searchIn": "Cerca al xat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "markAsUnread": "Marca com a no llegit", + "chatPermissionsDescription": "Defineix quin nivell de permisos cal per cada acció en aquest xat. Els nivells 0, 50 i 100 normalment representen usuàriïs, mods i admins, però es pot canviar.", + "updateInstalled": "🎉 S'ha actualitzat a la versió {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "appLockDescription": "Bloca l'app amb un pin quan no la facis servir", + "swipeRightToLeftToReply": "Llisca de dreta esquerra per respondre", + "globalChatId": "Identificador global de xat", + "createNewAddress": "Crea una adreça nova", + "searchMore": "Cerca més...", + "files": "Arxius", + "publicChatAddresses": "Adreces públiques del xat", + "unreadChatsInApp": "{appname}: {unread} converses pendents", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Ara mateix hi ha {count} usuàriïs bloquejadis.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "loginWithMatrixId": "Entra amb l'id de Matrix", + "doesNotSeemToBeAValidHomeserver": "No sembla un servidor compatible. Pot ser que la URL estigui malament?", + "noMoreChatsFound": "No hi ha més xats...", + "space": "Espai", + "unread": "Sense llegir", + "chatCanBeDiscoveredViaSearchOnServer": "El xat es pot descobrir amb la cerca de {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "calculatingFileSize": "S'està calculant la mida de l'arxiu...", + "noticeChatBackupDeviceVerification": "Nota: quan connectes tots els dispositius al backup del xat, es verifiquen automàticament.", + "continueText": "Continua", + "strikeThrough": "Text ratllat", + "addLink": "Afegeix un enllaç", + "noContactInformationProvided": "El servidor no ofereix cap informació de contacte vàlida", + "setWallpaper": "Tria imatge de fons", + "sendImages": "Envia {count} imatge", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendingAttachment": "S'està enviant l'adjunt...", + "oneOfYourDevicesIsNotVerified": "Un dels teus dispositius no està verificat", + "blur": "Difumina:", + "opacity": "Opacitat:", + "manageAccount": "Gestiona el compte", + "contactServerAdmin": "Contacta l'admin del servidor", + "contactServerSecurity": "Contacta l'equip de seguretat del servidor", + "version": "Versió", + "website": "Lloc web", + "compress": "Comprimeix", + "pleaseFillOut": "Emplena", + "invalidUrl": "URL invàlida", + "unableToJoinChat": "No s'ha pogut entrar al xat. Pot ser que l'altri participant hagi tancat la conversa.", + "aboutHomeserver": "Quant a {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "supportPage": "Pàgina de suport", + "serverInformation": "Informació del servidor:", + "name": "Nom", + "boldText": "Text en negreta", + "italicText": "Text en cursiva", + "contentNotificationSettings": "Opcions de notificació de continguts", + "roomNotificationSettings": "Opcions de notificacions de sales", + "notificationRuleContainsUserName": "Conté el nom d'usuàriï", + "notificationRuleContainsUserNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom.", + "notificationRuleMaster": "Silencia totes les notificacions", + "notificationRuleSuppressNotices": "Elimina els missatges automàtics", + "notificationRuleInviteForMe": "Invitació per a mi", + "notificationRuleInviteForMeDescription": "Notifica l'usuàriï quan és convidadi a una sala.", + "notificationRuleMemberEventDescription": "Ignora les notificacions quan entra o surt algú d'una sala.", + "notificationRuleIsUserMention": "Mencions", + "notificationRuleContainsDisplayName": "Conté el nom visible", + "notificationRuleIsRoomMention": "Menció de sala", + "notificationRuleIsRoomMentionDescription": "Notifica l'usuàriï quan es s'esmenti la sala.", + "notificationRuleRoomnotifDescription": "Notifica l'usuàriï quan un missatge contingui '@room'.", + "notificationRuleTombstone": "Làpida", + "notificationRuleTombstoneDescription": "Notifica l'usuàriï dels missatges de desactivació de sales.", + "notificationRuleReaction": "Reacció", + "notificationRuleReactionDescription": "Ignora les notificacions sobre reaccions.", + "notificationRuleRoomServerAcl": "Regles ACL del servidor d'una sala", + "notificationRuleRoomServerAclDescription": "Ignora les notificacions sobre les regles d'accés (ACL) del servidor d'una sala.", + "notificationRuleSuppressEdits": "Elimina les edicions", + "notificationRuleSuppressEditsDescription": "Ignora les notificacions per missatges editats.", + "notificationRuleCall": "Trucada", + "notificationRuleCallDescription": "Notifica l'usuàriï de trucades.", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica l'usuàriï de missatges en sales xifrades un a un, converses de dues persones.", + "notificationRuleEncryptedRoomOneToOne": "Converses xifrades", + "notificationRuleRoomOneToOne": "Converses", + "notificationRuleMessageDescription": "Notifica l'usuàriï sobre missatges generals.", + "notificationRuleEncrypted": "Xifrat", + "notificationRuleEncryptedDescription": "Notifica l'usuàriï de missatges en sales xifrades.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleServerAcl": "Ignora canvis en ACL de servidor", + "unknownPushRule": "No es coneix la regla push '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "more": "Més", + "notificationRuleSuppressNoticesDescription": "No envia notificacions relacionades amb usuàriïs automàtics com els bots.", + "otherNotificationSettings": "Altres opcions de notificacions", + "notificationRuleIsUserMentionDescription": "Notifica quan mencionin l'usuàriï en un missatge.", + "notificationRuleContainsDisplayNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom per mostrar.", + "notificationRuleJitsiDescription": "Notifica l'usuàriï sobre activitat del giny de Jitsi.", + "notificationRuleRoomnotif": "Notificació de sala", + "deletePushRuleCanNotBeUndone": "Si esborres aquesta opció de notificació no ho podràs tornar a canviar.", + "notificationRuleRoomOneToOneDescription": "Notifica l'usuàriï de missatges en converses de dues persones, sales un a un.", + "notificationRuleMemberEvent": "Canvis de membres", + "otherPartyNotLoggedIn": "L'altra persona no està en línia ara mateix i per tant no pot rebre missatges!", + "userSpecificNotificationSettings": "Opcions de notificacions d'usuàriï", + "generalNotificationSettings": "Opcions de notificacions generals", + "notificationRuleMessage": "Missatge", + "notificationRuleServerAclDescription": "Ignora les notificacions per canvis en les regles d'accés (ACL) de servidor.", + "shareKeysWithDescription": "Quins dispositius vols que puguin llegir els teus missatges xifrats?", + "previous": "Anterior", + "notificationRuleMasterDescription": "Ignora totes les altres regles i deshabilita totes les notificacions.", + "newChatRequest": "📩 Soŀlicitud de missatge", + "allDevices": "Tots els dispositius", + "crossVerifiedDevices": "Els dispositius verificats mútuament", + "verifiedDevicesOnly": "Només els dispositius verificats", + "synchronizingPleaseWaitCounter": " S'està sincronitzant... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Fes servir '{server}' per iniciar sessió", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Consenteixes que l'app i la web comparteixen informació sobre tu.", + "open": "Obre", + "waitingForServer": "S'està esperant el servidor...", + "shareKeysWith": "Comparteix les claus amb...", + "crossVerifiedDevicesIfEnabled": "Els dispositius verificats mútuament, si està activat", + "commandHint_roomupgrade": "Actualitza aquesta sala a la versió indicada", + "takeAPhoto": "Fes una foto", + "recordAVideo": "Grava un vídeo", + "optionalMessage": "(Opcional) missatge...", + "enterNewChat": "Entra al nou xat", + "notSupportedOnThisDevice": "No suportat en aquest dispositiu", + "changedTheChatDescription": "{username} ha canviat la descripció del xat", + "changedTheChatName": "{username} ha canviat el nom del xat", + "checkList": "Llista de tasques", + "countInvited": "{count} convidadis", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Missatge de veu de {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "approve": "Aprova", + "youHaveKnocked": "T'han picat a la porta", + "pleaseWaitUntilInvited": "Ara espera fins que algú de la sala t'hi deixi entrar.", + "commandHint_logout": "Tanca la sessió per aquest dispositiu", + "commandHint_logoutall": "Tanca totes les sessions actives", + "displayNavigationRail": "Mostra la barra de navegació al mòbil", + "customReaction": "Reacció personalitzada", + "moreEvents": "Altres esdeveniments", + "declineInvitation": "Rebutja la invitació", + "noMessagesYet": "No hi ha cap missatge", + "longPressToRecordVoiceMessage": "Deixa picat per gravar un missatge de veu.", + "pause": "Pausa", + "resume": "Continua", + "removeFromSpaceDescription": "S'esborrarà de l'espai el xat, però encara apareixerà a la llista de xats.", + "countChats": "{chats} xats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Membre dels espais {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Membre dels espais {spaces} poden picar a porta", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Comença una enquesta", + "endPoll": "Acaba l'enquesta", + "answersVisible": "Respostes visibles", + "pollQuestion": "Pregunta de l'enquesta", + "answerOption": "Opció de resposta", + "addAnswerOption": "Afegeix una opció", + "allowMultipleAnswers": "Permet múltiples respostes", + "pollHasBeenEnded": "Ha acabat l'enquesta", + "countVotes": "{count, plural, =1{Un vot} other{{count} vots}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Les respostes seran visibles quan s'acabi l'enquesta", + "replyInThread": "Respon en un fil", + "countReplies": "{count, plural, =1{Una resposta} other{{count} respostes}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Fil", + "backToMainChat": "Torna al xat principal", + "saveChanges": "Desa els canvis", + "createSticker": "Crea un sticker o un emoji", + "useAsSticker": "Agafa com a sticker", + "useAsEmoji": "Agafa com a emoji", + "stickerPackNameAlreadyExists": "Ja existeix aquest nom per un pack de stickers", + "newStickerPack": "Nou pack de stickers", + "stickerPackName": "Nom del pack de stickers", + "attribution": "Atribució", + "skipChatBackup": "Omet la còpia de seguretat del xat", + "skipChatBackupWarning": "N'estàs seguri? Si no actives la còpia de seguretat pots perdre accés als teus missatges si canvies de dispositiu.", + "noMoreResultsFound": "No s'han trobat més resultats", + "chatSearchedUntil": "S'ha cercat fins a {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL base de federació", + "clientWellKnownInformation": "Informació coneguda del client:", + "baseUrl": "URL base", + "identityServer": "Servidor d'identitats:", + "versionWithNumber": "Versió: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Registres", + "advancedConfigs": "Avançat", + "advancedConfigurations": "Configuracions avançades", + "signIn": "Obre sessió", + "createNewAccount": "Crea un compte nou", + "signUpGreeting": "El FluffyChat és descentralitzat! Tria un servidor on vulguis crear-t'hi un compte, i som-hi!", + "signInGreeting": "Si ja tens un compte a Matrix, benvingudi! Tria el teu servidor i inicia-hi sessió.", + "theProcessWasCanceled": "S'ha canceŀlat el procés.", + "join": "Entra", + "searchOrEnterHomeserverAddress": "Cerca o introdueix l'adreça del teu servidor", + "matrixId": "ID de Matrix", + "setPowerLevel": "Concedeix permisos", + "makeModerator": "Fes moderadori", + "makeAdmin": "Fes admin", + "removeModeratorRights": "Treu els drets de moderadori", + "removeAdminRights": "Treu els drets d'admin", + "powerLevel": "Nivell de permisos", + "setPowerLevelDescription": "Els nivells de permisos defineixen què pot fer uni membre d'aquesta sala, i es defineix per un número entre 0 i 100.", + "owner": "Propietàriï", + "mute": "Silencia", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Crea un nou xat", + "reset": "Reseteja", + "supportFluffyChat": "Dona suport a FluffyChat", + "support": "Aporta", + "setLowPriority": "Estableix una prioritat baixa", + "unsetLowPriority": "Restableix la prioritat", + "playSoundOnNotification": "Notificacions sonores" +} \ No newline at end of file diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb new file mode 100644 index 0000000000..95a513ac03 --- /dev/null +++ b/lib/l10n/intl_cs.arb @@ -0,0 +1,2448 @@ +{ + "@@locale": "cs", + "@@last_modified": "2021-08-14 12:41:10.131133", + "about": "O aplikaci", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Přijmout", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} přijal/a pozvání", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Účet", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktivoval/a koncové šifrování", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Přidat e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Správce", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Vše", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} odpověděl na hovor", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Kdokoliv se může připojit", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Zámek aplikace", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivovat", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Mohou se připojit hosté", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Jste si jistý?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Opravdu se chcete odhlásit?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Pro ověření této osoby zadejte prosím přístupovou frázi k „bezpečnému úložišti“ anebo „klíč pro obnovu“.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Přijmout žádost o ověření od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automaticky přehrajte animované nálepky a emoce", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Homeserver podporuje přihlášení typu:\n{serverVersions}\nAle tato aplikace podporuje pouze:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Zakázat chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Zakázán", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} zakázal {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokovat zařízení", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Zakázán", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Zrušit", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Nelze otevřít URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Změnit název zařízení", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} změnil avatar chatu", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} změnili nastavení oprávnění v chatu", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} změnil/a svoji přezdívku na: „{displayname}“", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} změnili přístupová práva pro hosty", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} změnili přístupová práva pro hosty na: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} změnili nastavení viditelnosti historie diskuze", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} změnili nastavení viditelnosti historie diskuze na: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} změnili nastavení pravidel připojení", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} změnili nastavení pravidel připojení na: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} změnili svůj avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} změnili nastavení aliasů místnosti", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} změnili odkaz k pozvání do místnosti", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Změnit heslo", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Změnit domovský server", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Změňte svůj styl", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Změnit název skupiny", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Změňte svůj avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrování bylo poškozeno", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Záloha chatu", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Bližší údaje o chatu", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chaty", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Vyberte silné heslo", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Vymazat archiv", + "close": "Zavřít", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Zakázat danému uživateli přístup do této místnosti", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Odeslat text ve formátu HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Pozvěte daného uživatele do této místnosti", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Připojte se k dané místnosti", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Odeberte daného uživatele z této místnosti", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Opusťte tuto místnost", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Představ se", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Nastavte si obrázek pro tuto místnost (autor mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Nastavte si váš zobrazovaný název pro tuto místnost", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Nastavit úroveň práv daného uživatele (výchozí: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Odeslat neformátovaný text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Odeslat odpověď jako reakci", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Poslat zprávu", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Zrušte zákaz přístupu daného uživatele do této místnosti", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Příkaz je neplatný", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} není příkaz.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Porovnejte a přesvědčete se, že následující emotikony se shodují na obou zařízeních", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Porovnejte a přesvědčete se, že následující čísla se shodují na obou zařízeních", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Nastavení chatu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt byl pozván do skupiny", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Obsah byl nahlášen správcům serveru", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Zkopírováno do schránky", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopírovat", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Zkopírovat do schránky", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nebylo možné dešifrovat zprávu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} účastníků", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Vytvořit", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} založil/a chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Nový prostor", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Aktuálně aktivní", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tmavé", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Tímto krokem se deaktivuje váš uživatelský účet. Akci nelze vrátit zpět! Jste si jistí?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Výchozí úroveň oprávnění nových uživatelů", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Smazat", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Smazat účet", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Smazat zprávu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Zařízení", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Přímé chatování", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Přezdívka byla změněna", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Stáhnout soubor", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Upravit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Upravit zakázané servery", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Změnit přezdívku", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Upravit aliasy místností", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Upravit avatara místnosti", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikona již existuje!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Neplatný kód emotikony!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Nastavení emotikonů", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Klávesová zkratka emotikonu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Prázdný chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Povolit balíček emotikon všude", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Povolit šifrování", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifrování již nebude možné vypnout. Jste si tím jisti?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Šifrováno", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifrování", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifrování není aktivní", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ukončil hovor", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Zadejte e-mailovou adresu", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Chyba při získávání polohy: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Velikost písma", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Přeposlat", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od vstupu", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od pozvání", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Skupina", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Skupina je veřejná", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Skupiny", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Skupina s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Hosté jsou zakázáni", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Hosté se mohou připojit", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} stáhl pozvánku pro {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoc", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Skrýt neznámé události", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorovat", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorovaní uživatelé", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Klikl jsem na odkaz", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nesprávné přístupové heslo anebo klíč pro obnovu", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pozvat kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pozvat kontakt do {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Pozvaný", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} pozval/a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Pouze pozvaní uživatelé", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} vás pozval/a na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se nebo se přihlaste.\n3. Otevřte pozvánku: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "píše…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} se připojil/a do konverzace", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Připojte se k místnosti", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} vyhodil/a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} vyhodil/a a zabanoval/a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Vyhodit z chatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Naposledy aktivní: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Opustit", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Opustil chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Světlé", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Načíst dalších {count} účastníků", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Načítání… Prosíme vyčkejte.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Načíst další…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Služby určování polohy jsou deaktivovány. Povolte jim, aby mohli sdílet vaši polohu.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Oprávnění k poloze odepřeno. Udělte jim prosím možnost sdílet vaši polohu.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Přihlásit se", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Přihlášení k {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Odhlásit", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Zmínit se", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Zprávy", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Ztlumit chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nový chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nová zpráva ve FluffyChatu", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nová žádost o ověření!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Další", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Žádné připojení k serveru", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nebyly nalezeny žádné emotikony. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Můžete aktivovat šifrování jakmile místnost přestane být veřejně dostupná.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Zdá se, že služba Firebase Cloud Messaging není ve vašem zařízení k dispozici. Chcete-li i nadále přijímat push oznámení, doporučujeme nainstalovat ntfy. Pomocí ntfy nebo jiného poskytovatele Unified Push můžete přijímat oznámení push zabezpečeným způsobem přenosu dat. Aplikaci ntfy si můžete stáhnout z obchodu PlayStore nebo z webu F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} není matrixový server, použít místo toho server {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Dosud jste nepřidali způsob, jak obnovit své heslo.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Chybí oprávnění", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nebyly nalezeny žádné místnosti…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Oznámení", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} uživatelé píší…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Získávání polohy…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online záloha kíčů je zapnuta", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Jejda! Při nastavování oznámení push došlo bohužel k chybě.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Jejda, něco se pokazilo…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Otevřete aplikaci pro přečtení zpráv", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otevřít fotoaparát", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Otevřít v mapách", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Nebo", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Účastník", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "heslo nebo klíč pro obnovení", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Heslo", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Zapomenuté heslo", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Heslo bylo změněno", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Obnova hesla", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Připnout zprávu", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Vyberte přístupový kód", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klikněte na odkaz v e-mailu a pokračujte.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Zadejte prosím své heslo", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Zadejte svůj PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Zadejte prosím své uživatelské jméno", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Postupujte podle pokynů na webu a klepněte na další.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Soukromí", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Veřejné místnosti", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Důvod", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} opravili událost", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redigovat zprávu", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Zamítnout", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} odmítli pozvání", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Odstranit", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Odstranit všechna další zařízení", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Zrušit zákaz chatu", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Odstraňte svého avatara", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Nahradit místnost novou verzí", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Odpovědět", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Nahlásit zprávu", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Místnost byla upgradována", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Verze místnosti", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Uložit soubor", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Hledat", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Bezpečnostní", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Odeslat", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Odeslat zprávu", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Odeslat jako text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Odeslat audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Odeslat soubor", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Odeslat obrázek", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Odeslat zprávy", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Odeslat video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} poslali soubor", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} poslali zvukovou nahrávku", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} poslali obrázek", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} poslali samolepku", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} poslali video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} odeslal informace o hovoru", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Nastavit jako hlavní alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Nastavit stav", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Nastavení", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Sdílet", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} sdílel jejich polohu", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Sdílet polohu", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Přeskočit", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Zdrojové kódy", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Prostor je veřejný", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Název prostoru", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} zahájil hovor", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stav", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Jak se dneska máš?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Odeslat", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizace ... Čekejte prosím.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Téma systému", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Neshodují se", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Shodují se", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Příliš mnoho požadavků. Prosím zkuste to znovu později!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Zkuste odeslat znovu", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} zrušili zákaz pro {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Odblokovat zařízení", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Neznámé zařízení", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Neznámý šifrovací algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Neznámá událost „{type}“", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Zrušit ztlumení chatu", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Odepnout zprávu", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} a {count} dalších píší…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} a {username2} píší…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} píše…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} opustili chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} poslali událost {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Ověřeno", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Zahájit ověření", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Ověření proběhlo úspěšně!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Ověřuji druhý účet", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video hovor", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Viditelnost historie chatu", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Viditelné pro všechny účastnící se", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Viditelné pro všechny", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Hlasová zpráva", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čeká se na potvrzení žádosti partnerem…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čeká se na potvrzení emoji partnerem…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čekání na partnera až přijme čísla…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Varování!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Zaslali jsme vám e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kdo může provést jakou akci", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kdo se může připojit do této skupiny", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Proč to chcete nahlásit?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "S těmito adresami můžete obnovit své heslo.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napište zprávu…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ano", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vy", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Tohoto chatu se nadále neúčastníte", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Byl vám zablokován přístup k tomuto chatu", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Váš veřejný klíč", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Přidat do prostoru", + "scanQrCode": "Naskenujte QR kód", + "sendOnEnter": "Odeslat při vstupu", + "addToBundle": "Přidat do balíčku", + "addAccount": "Přidat účet", + "bundleName": "Název balíčku", + "link": "Odkaz", + "editBundlesForAccount": "Upravit balíčky pro tento účet", + "oneClientLoggedOut": "Jeden z vašich klientů byl odhlášen", + "removeFromBundle": "Odstranit z tohoto balíčku", + "unverified": "Neověřeno", + "messageInfo": "Informace o zprávě", + "time": "Čas", + "sender": "Odesílatel", + "repeatPassword": "Zopakujte heslo", + "openGallery": "Otevřít galerii", + "removeFromSpace": "Odstranit z tohoto místa", + "commandHint_clearcache": "Vymazat mezipamět", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Zahodit relaci", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Zahajte přímý chat\nK deaktivaci šifrování použijte --no-encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Vytvořte prázdný skupinový chat\n K deaktivaci šifrování použijte --no-encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "markAsRead": "Označit jako přečtené", + "reportUser": "Nahlásit uživatele", + "reactedWith": "{sender} reagoval s {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emojis", + "voiceCall": "Hlasový hovor", + "unsupportedAndroidVersion": "Nepodporovaná verze Androidu", + "videoCallsBetaWarning": "Upozorňujeme, že videohovory jsou aktuálně ve verzi beta. Nemusí fungovat podle očekávání nebo fungovat vůbec na všech platformách.", + "placeCall": "Zavolejte", + "experimentalVideoCalls": "Experimentální videohovory", + "unsupportedAndroidVersionLong": "Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.", + "pinMessage": "Připnout zprávu do místnosti", + "confirmEventUnpin": "Opravdu chcete událost trvale odepnout?", + "youKicked": "Vykopli jste uživatele {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "Přijal jsi pozvání", + "youJoinedTheChat": "Připojili jste se k chatu", + "youInvitedBy": "Byli jste pozváni uživatelem {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "Zakázali jste uživatele {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "Pozvali jste uživatele {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "Vykopli jste a zakázali jste uživatele {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Zrušili jste zákaz uživateli {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Odmítli jste pozvání", + "youHaveWithdrawnTheInvitationFor": "Stáhli jste pozvánku pro uživatele {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.", + "confirmMatrixId": "Pro smazání svého účtu potvrďte, prosím, své Matrix ID.", + "commandHint_googly": "Poslat kroutící se očička", + "commandHint_cuddle": "Poslat mazlení", + "commandHint_hug": "Poslat obejmutí", + "hugContent": "{senderName} vás objímá", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} vám posílá kroutící se očička", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} se s vámi mazlí", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "notAnImage": "Není obrázek.", + "importNow": "Importovat nyní", + "redactedByBecause": "Smazáno uživatelem {username} s důvodem: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Uložit v Android KeyStore", + "dehydrate": "Exportovat relaci a promazat zařízení", + "doNotShowAgain": "Nezobrazovat znovu", + "commandHint_markasdm": "Označit jako místnost přímé konverzace s daným Matrix ID", + "hydrate": "Obnovit ze souboru zálohy", + "createGroup": "Vytvořit skupinu", + "shareInviteLink": "Sdílet pozvánku", + "setColorTheme": "Nastavit barvy:", + "importEmojis": "Importovat emodži", + "importFromZipFile": "Importovat ze .zip souboru", + "exportEmotePack": "Exportovat emodži jako .zip", + "replace": "Nahradit", + "users": "Uživatelé", + "storeInAppleKeyChain": "Uložit v Apple KeyChain", + "jumpToLastReadMessage": "Skočit na naposledy přečtenou zprávu", + "redactedBy": "Smazáno uživatelem {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "tryAgain": "Zkuste to znovu", + "redactMessageDescription": "Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.", + "optionalRedactReason": "(Nepovinné) Důvod smazání této zprávy…", + "messagesStyle": "Zprávy:", + "noOtherDevicesFound": "Žádná ostatní zařízení nebyla nalezena", + "chatDescription": "Popis konverzace", + "chatDescriptionHasBeenChanged": "Popis konverzace byl změněn", + "noChatDescriptionYet": "Zatím nebyl vytvořen žádný popis konverzace.", + "invalidServerName": "Neplatné jméno serveru", + "chatPermissions": "Oprávnění konverzace", + "directChat": "Přímá konverzace", + "setChatDescription": "Nastavit popis konverzace", + "whyIsThisMessageEncrypted": "Proč nelze přečíst tuto zprávu?", + "wasDirectChatDisplayName": "Prázdná konverzace (dříve {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Prostory umožňují organizovat Vaše konverzace a vytvářet soukromé nebo veřejné komunity.", + "sendTypingNotifications": "Posílat oznámení o psaní", + "commandHint_markasgroup": "Označit jako skupinu", + "foregroundServiceRunning": "Toto oznámení se zobrazuje když běží služba na pozadí.", + "screenSharingDetail": "Sdílíte svou obrazovku přes FluffyChat", + "encryptThisChat": "Zašifrovat tuto konverzaci", + "sorryThatsNotPossible": "Omlouváme se… to není možné", + "reopenChat": "Znovu otevřít konverzaci", + "fileIsTooBigForServer": "Neodesláno! Server povoluje maximálně {max} příloh.", + "jump": "Skočit", + "openLinkInBrowser": "Otevřít odkaz v prohlížeči", + "supposedMxid": "Tady by mělo být {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "newSpace": "Nový prostor", + "screenSharingTitle": "sdílení obrazovky", + "user": "Uživatel", + "fileHasBeenSavedAt": "Soubor uložen do {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "custom": "Vlastní", + "dehydrateWarning": "Tuto akci nelze vzít zpět. Ujistěte se, že máte bezpečně uložený soubor zálohy.", + "storeSecurlyOnThisDevice": "Uložit bezpečně na tomto zařízení", + "countFiles": "{count} souborů", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "emoteKeyboardNoRecents": "Naposledy použité emodži se zobrazí zde...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Zamknout aplikaci pomocí PIN kódu když není používána", + "globalChatId": "Globální ID chatu", + "accessAndVisibility": "Přístup a viditelnost", + "calls": "Volání", + "customEmojisAndStickers": "Vlastní emodži a nálepky", + "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", + "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emodži či nálepky, které lze použít v konverzaci.", + "swipeRightToLeftToReply": "Potáhnutím zprava doleva odpovědět na zprávu", + "noMoreChatsFound": "Žádné další konverzace nalezeny...", + "hideRedactedMessages": "Skrýt upravené zprávy", + "hideRedactedMessagesBody": "Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.", + "hideInvalidOrUnknownMessageFormats": "Skrýt nesprávné nebo neznámé formáty zpráv", + "blockUsername": "Ignorovat uživatelské jméno", + "passwordRecoverySettings": "Nastavení obnovení hesla", + "block": "Zablokovat", + "blockListDescription": "Můžete blokovat uživatele, kteří vás obtěžují. Od uživatelů na vašem osobním seznamu blokovaných uživatelů nebudete moci přijímat žádné zprávy ani pozvánky do místnosti.", + "blockedUsers": "Zablokování uživatelé", + "noChatsFoundHere": "Nejsou zde žádné konverzace. Začněte novou konverzaci s někým pomocí tlačítka níže. ⤵️", + "unread": "Nepřečtené", + "space": "Prostor", + "aboutHomeserver": "O {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "countInvited": "{count} pozváno", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hasKnocked": "🚪 {user} zaklepal", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Uživatelé musí zaklepat", + "changedTheChatDescription": "{username} změnil/a popis konverzace", + "changedTheChatName": "{username} změnil/a název konverzace", + "checkList": "Kontrolní seznam", + "knock": "Zaklepat", + "noBackupWarning": "Pozor! Bez povolení zálohování konverzací ztratíte přístup k zašifrovaným zprávám. Důrazně doporučujeme zálohování konverzací před odhlášením povolit.", + "readUpToHere": "Čtěte až sem", + "reportErrorDescription": "😭 Ale ne, něco se porouchalo. Pokud chcete, můžete tento bug nahlásit vývojářům.", + "report": "hlášení", + "invite": "Pozvánka", + "inviteGroupChat": "📨 Skupinová pozvánka", + "noKeyForThisMessage": "K tomuto může dojít, pokud byla zpráva odeslána před přihlášením k účtu v tomto zařízení.\n\nJe také možné, že odesílatel zablokoval vaše zařízení nebo se něco pokazilo s internetovým připojením.\n\nJste schopni si zprávu přečíst v jiné relaci? Pak můžete zprávu přenést z něj! Přejděte do Nastavení > Zařízení a zkontrolujte, zda se Vaše zařízení vzájemně ověřila. Při příštím otevření místnosti, kdy budou obě relace v popředí, se klíče přenesou automaticky.\n\nNechcete klíče ztratit při odhlašování nebo přepínání zařízení? Ujistěte se, že jste v nastaveních povolili zálohování konverzací.", + "invalidInput": "Nevhodný vstup!", + "wrongPinEntered": "Nespravný PIN! Zkuste to znovu za {seconds} vteřin...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Prosím, zadejte číslo větší než 0", + "archiveRoomDescription": "Konverzace bude přesunuta do archivu. Ostatní uživatelé uvidí, že jste konverzaci opustil/a.", + "roomUpgradeDescription": "Konverzace bude vytvořena znovu s novou verzí místnosti. Všem účastníkům bude oznámeno, že se musí přesunout do nové konverzace. Více o verzích místností se dočtete na https://spec.matrix.org/latest/", + "removeDevicesDescription": "Budete odhlášen/a z tohoto zařízení a nebudete nadále moci přijímat zprávy.", + "banUserDescription": "Uživatel bude vyhozen z konverzace a nebude se moci znovu připojit dokud nebude odblokován.", + "unbanUserDescription": "Uživatel se bude moci vrátit do konverzace pokud se o to pokusí.", + "makeAdminDescription": "Jestliže tohoto uživatele povýšíte na administrátora, nebude tak moci odčinit, protože bude mít stejná oprávnění jako Vy.", + "pushNotificationsNotAvailable": "Notifikace nejsou dostupné", + "learnMore": "Dozvědět se více", + "yourGlobalUserIdIs": "Vaše globální uživatelské ID (user-ID) je: ", + "knocking": "Klepání", + "chatCanBeDiscoveredViaSearchOnServer": "Konverzaci naleznete vyhledáváním na {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Vyhledat #konverzace, @uživatele...", + "nothingFound": "Nic nenalezeno...", + "groupName": "Název skupiny", + "createGroupAndInviteUsers": "Vytvořit skupinu a pozvat uživatele", + "groupCanBeFoundViaSearch": "Skupinu naleznete vyhledávním", + "commandHint_sendraw": "Odeslat soubor json", + "databaseMigrationTitle": "Databáze je optimalizována", + "databaseMigrationBody": "Vydržte prosím. Bude to chvilku trvat.", + "leaveEmptyToClearStatus": "Zanechte prázdné pro smazání statusu.", + "select": "Vybrat", + "searchForUsers": "Vyhledat @uživatele...", + "pleaseEnterYourCurrentPassword": "Prosím, zadejte Vaše současné heslo", + "newPassword": "Nové heslo", + "pleaseChooseAStrongPassword": "Prosím, zvolte si silné heslo", + "passwordsDoNotMatch": "Hesla se neshodují", + "passwordIsWrong": "Zadané heslo je nesprávné", + "publicChatAddresses": "Adresy veřejných konverzací", + "createNewAddress": "Vytvořit novou adresu", + "thisDevice": "Toto zařzení:", + "synchronizingPleaseWaitCounter": " Synchronizuji… ({percentage} %)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "noOneCanJoin": "Nikdo se nemůže připojit", + "kickUserDescription": "Uživatel bude vyhozen z chatu, ale nikoliv zabanován. V případě veřejných chatů to znamená, že se kdykoliv může znovu připojit.", + "noUsersFoundWithQuery": "Nepodařilo se najít uživatele \"{query}\". Zkontrolujte, prosím, že jste se nepřepsali.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "wrongRecoveryKey": "Jejda... toto nejspíš není správný obnovovací klíč.", + "joinSpace": "Připojit se do prostoru", + "publicSpaces": "Veřejné prostory", + "initAppError": "Při načítání nastala chyba", + "gallery": "Galerie", + "files": "Soubory", + "sessionLostBody": "Vaše relace byla ztracena. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikace se pokusí obnovit vaši relaci ze zálohy. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Posílat potvrzení o přečtení", + "sendTypingNotificationsDescription": "Ostatní účastníci konverzace uvidí, že píšete novou zprávu.", + "sendReadReceiptsDescription": "Ostatní účastníci konverzace uvidí, že jste si přečetl/a jejich zprávu.", + "formattedMessages": "Formátované zprávy", + "formattedMessagesDescription": "Zobrazovat formátovaný obsah zpráv, jako například tučný text pomocí markdownu.", + "verifyOtherUser": "🔐 Ověřit jiného uživatele", + "verifyOtherUserDescription": "Když ověříte jiného uživatele, můžete si být jistí, že víte, s kým si píšete. 💪\n\nJakmile začnete s ověřením, vy a druhý uživatel uvidíte v aplikaci vyskakovací okno. V něm uvidíte sérii emodži nebo čísel, které musíte společně porovnat.\n\nNejjednodušší je setkat se osobně nebo si udělat videohovor. 👭", + "verifyOtherDevice": "🔐 Ověřit jiné zařízení", + "verifyOtherDeviceDescription": "Když ověříte jiné zařízení, tato zařízení si mohou vyměnit klíče, čímž zvýšíte vaše zabezpečení. 💪 Jakmile začnete s ověřením, v aplikaci na obou zařízeních se objeví vyskakovací okno. V něm uvidíte sérii emodži nebo čísel, které musíte na zařízeních porovnat mezi sebou. Než začnete s ověřováním, je fajn mít obě zařízení po ruce. 🤳", + "acceptedKeyVerification": "{sender} přijal/a ověření klíče", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} zrušil ověření klíče", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} dokončil ověření klíče", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} je připraven/a na ověření klíče", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} požádal/a o ověření klíče", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} začal/a s ověřením klíče", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendingAttachment": "Posílám přílohu...", + "oneOfYourDevicesIsNotVerified": "Jedno z vašich zařízení není ověřeno", + "continueText": "Pokračovat", + "setWallpaper": "Nastavit tapetu", + "manageAccount": "Spravovat účet", + "noContactInformationProvided": "Server neposkytl žádné platné kontaktní informace", + "contactServerAdmin": "Kontaktovat administrátora serveru", + "supportPage": "Podpora", + "serverInformation": "Informace o serveru:", + "name": "Název", + "version": "Verze", + "website": "Webová stránka", + "compress": "Komprimovat", + "boldText": "Tučný text", + "italicText": "Kurzíva", + "strikeThrough": "Přeškrtnutý text", + "pleaseFillOut": "Prosím vyplňte", + "invalidUrl": "Neplatná URL adresa", + "addLink": "Přidat odkaz", + "unableToJoinChat": "Nepodařilo se připojit ke konverzaci. Je možné, že druhá strana ji už uzavřela.", + "previous": "Předchozí", + "otherPartyNotLoggedIn": "Druhá strana aktuálně není přihlášená, takže nemůže přijímat zprávy!", + "appWantsToUseForLogin": "Použít '{server}' k přihlášení", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Pokračováním povolíte aplikaci a webové stránce sdílet mezi sebou informace o vás.", + "open": "Otevřít", + "waitingForServer": "Čekám na server...", + "newChatRequest": "📩 Nová žádost o konverzaci", + "generalNotificationSettings": "Obecné nastavení oznámení", + "roomNotificationSettings": "Nastavení oznámení pro místnost", + "userSpecificNotificationSettings": "Nastavení oznámení pro uživatele", + "otherNotificationSettings": "Ostatní nastavení oznámení", + "notificationRuleContainsUserName": "Obsahuje uživatelské jméno", + "notificationRuleContainsUserNameDescription": "Pošle uživateli oznámení, když zpráva obsahuje jeho uživatelské jméno.", + "notificationRuleMaster": "Ztlumit veškerá oznámení", + "notificationRuleMasterDescription": "Přepíše veškerá ostatní pravidla a zakáže všechna oznámení.", + "notificationRuleSuppressNotices": "Ztlumit automatizované zprávy", + "notificationRuleSuppressNoticesDescription": "Ztlumí oznámení od automatizovaných klientů, jako jsou např. roboti.", + "notificationRuleInviteForMe": "Pozvánka adresovaná mně", + "notificationRuleInviteForMeDescription": "Pošle uživateli oznámení, když je pozván do místnosti.", + "notificationRuleMemberEvent": "Události týkající se členství", + "notificationRuleMemberEventDescription": "Ztlumí oznámení týkající se veškerých událostí souvisejících s členstvím.", + "notificationRuleIsUserMention": "Zmínka uživatele", + "notificationRuleIsUserMentionDescription": "Pošle uživateli oznámení, když je někdo přímo zmíní ve zprávě.", + "notificationRuleContainsDisplayName": "Obsahuje přezdívku", + "notificationRuleContainsDisplayNameDescription": "Pošle uživateli oznámení, když zpráva obsahuje jejich přezdívku.", + "notificationRuleIsRoomMention": "Označení místnosti", + "notificationRuleIsRoomMentionDescription": "Pošle uživateli oznámení, když je označena celá místnost.", + "notificationRuleRoomnotif": "Označení místnosti", + "notificationRuleRoomnotifDescription": "Pošle uživateli oznámení, když zpráva obsahuje '@room'.", + "notificationRuleTombstone": "Náhrobek", + "notificationRuleTombstoneDescription": "Pošle uživateli oznámení ohledně zpráv o deaktivaci místnosti.", + "notificationRuleReaction": "Reakce", + "notificationRuleReactionDescription": "Ztlumí oznámení o reakcích.", + "notificationRuleSuppressEdits": "Ztlumit úpravy", + "notificationRuleSuppressEditsDescription": "Ztlumí notifikace týkající se upravených zpráv.", + "notificationRuleCall": "Hovor", + "notificationRuleCallDescription": "Pošle uživateli oznámení ohledně hovorů.", + "sentVoiceMessage": "🎙️ {duration} - Hlasová zpráva od {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Odstranění tohoto nastavení oznámení nelze vzít zpět.", + "more": "Více", + "shareKeysWith": "Sdílet klíče s...", + "shareKeysWithDescription": "Která zařízení mají být označena jako důvěryhodná, aby mohla současně číst vaše zprávy v šifrovaných konverzacích?", + "allDevices": "Všechna zařízení", + "crossVerifiedDevicesIfEnabled": "Křížově ověřená zařízení, pokud je povoleno", + "crossVerifiedDevices": "Křížově ověřená zařízení", + "verifiedDevicesOnly": "Pouze ověřená zařízení", + "recordAVideo": "Nahrát video", + "optionalMessage": "(Volitelné) zpráva...", + "notSupportedOnThisDevice": "Není na tomto zařízení podporováno", + "approve": "Schválit", + "youHaveKnocked": "Zaklepali jste", + "pleaseWaitUntilInvited": "Nyní musíte počkat, až vás nějaký člen této místnosti pozve dovnitř.", + "commandHint_logout": "Odhlásit se z aktuálního zařízení", + "commandHint_logoutall": "Odhlásit se ze všech aktivních zařízení", + "displayNavigationRail": "Zobrazit navigační lištu na mobilu", + "customReaction": "Vlastní reakce", + "moreEvents": "Více událostí", + "declineInvitation": "Odmítnout pozvánku", + "noMessagesYet": "Zatím tu nejsou žádné zprávy", + "longPressToRecordVoiceMessage": "Podržte pro nahrání hlasové zprávy.", + "pause": "Pozastavit", + "resume": "Pokračovat", + "removeFromSpaceDescription": "Tato konverzace bude odstraněna z tohoto prostoru, stále však bude dostupná ve vašem seznamu konverzací.", + "countChats": "{chats} konverzací", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Členové prostoru {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Členové prostoru {spaces} mohou zaklepat", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Spustit hlasování", + "endPoll": "Ukončit hlasování", + "answersVisible": "Odpovědi budou viditelné", + "pollQuestion": "Předmět hlasování", + "answerOption": "Možnost", + "addAnswerOption": "Přidat možnost", + "allowMultipleAnswers": "Povolit více odpovědí", + "pollHasBeenEnded": "Hlasování skončilo", + "answersWillBeVisibleWhenPollHasEnded": "Odpovědi budou viditelné jakmile hlasování skončí", + "replyInThread": "Odpovědět ve vlákně", + "thread": "Vlákno", + "backToMainChat": "Zpátky do hlavního chatu", + "saveChanges": "Uložit změny", + "createSticker": "Vytvořit nálepku nebo emodži", + "useAsSticker": "Použít jako nálepku", + "useAsEmoji": "Použít jako emodži", + "stickerPackNameAlreadyExists": "Balíček nálepek s tímto názvem již existuje", + "newStickerPack": "Nový balíček nálepek", + "stickerPackName": "Název balíčku nálepek", + "attribution": "Zdroj", + "skipChatBackup": "Přeskočit zálohu konverzací", + "skipChatBackupWarning": "Jste si jistí? Pokud nepovolíte zálohu konverzací, můžete ztratit přístup ke svým zprávám v případě změny zařízení.", + "noMoreResultsFound": "Žádné další výsledky nenalezeny", + "chatSearchedUntil": "Konverzace prohledána do {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Základní URL pro federování", + "baseUrl": "Základní URL", + "versionWithNumber": "Verze: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Záznamy", + "advancedConfigs": "Pokročilá nastavení", + "signIn": "Přihlásit se", + "createNewAccount": "Vytvořit nový účet", + "signUpGreeting": "FluffyChat je decentralizovaný! Vyberte server, kde si chcete vytvořit účet, a jdeme na věc!", + "signInGreeting": "Již máte účet na Matrixu? Vítejte zpět! Vyberte svůj domácí server a přihlaste se.", + "theProcessWasCanceled": "Proces byl zrušen.", + "sendImages": "Poslat {count} obrazků", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "commandHint_roomupgrade": "Aktualizovat místnost na danou verzi", + "@goToSpace": { + "type": "String", + "space": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_da.arb b/lib/l10n/intl_da.arb new file mode 100644 index 0000000000..09d115e38f --- /dev/null +++ b/lib/l10n/intl_da.arb @@ -0,0 +1,1861 @@ +{ + "repeatPassword": "Gentag password", + "notAnImage": "Ikke en billedfil.", + "remove": "Fjern", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Importer nu", + "importEmojis": "Importer emojis", + "importFromZipFile": "Importer fra .zip fil", + "exportEmotePack": "Eksportér Emote-pakke som .zip-fil", + "replace": "Erstat", + "about": "Om", + "aboutHomeserver": "Om {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Acceptér", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepterede invitationen", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiverede end-to-end kryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Tilføj e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Bekræft din Matrix-ID for at slette din konto.", + "supposedMxid": "Den burde være {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Tilføj til gruppe", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Opgrader dette rum til den givne rumversion", + "commandHint_googly": "Send googly-eyes", + "commandHint_cuddle": "Send et varmt smil", + "commandHint_hug": "Send et kram", + "googlyEyesContent": "{senderName} sender dig googly-eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} sender dig et varmt smil", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} krammer dig", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} svarer på dit opkald", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Enhver kan deltage", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb new file mode 100644 index 0000000000..82558a5dd6 --- /dev/null +++ b/lib/l10n/intl_de.arb @@ -0,0 +1,2718 @@ +{ + "@@locale": "de", + "@@last_modified": "2021-08-14 12:41:10.119255", + "about": "Über", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Annehmen", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} hat die Einladung angenommen", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} hat Ende-zu-Ende Verschlüsselung aktiviert", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "E-Mail hinzufügen", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "Alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alle", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} hat den Anruf angenommen", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Jeder darf beitreten", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Anwendungssperre", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Dürfen Gäste teilnehmen?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Bist du sicher?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Willst du dich wirklich abmelden?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Bitte gib, um die andere Person signieren zu können, dein Sicherheitsschlüssel oder Wiederherstellungsschlüssel ein.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Diese Bestätigungsanfrage von {username} annehmen?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Der Homeserver unterstützt diese Anmelde-Typen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Aus dem Chat verbannen", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Verbannt", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} hat {targetName} verbannt", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blockiere Gerät", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blockiert", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Abbrechen", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Die URI {uri} kann nicht geöffnet werden", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Gerätenamen ändern", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} hat den Chat-Avatar geändert", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} hat die Chat-Berechtigungen geändert", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} hat den Spitznamen geändert in: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} hat die Zugangsregeln für Gäste geändert", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} hat die Zugangsregeln für Gäste geändert zu: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} hat die Sichtbarkeit des Chat-Verlaufs geändert", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} hat die Sichtbarkeit des Chat-Verlaufs geändert zu: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} hat die Zugangsregeln geändert", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} hat die Zugangsregeln geändert zu: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} hat das Profilbild geändert", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} hat die Raum-Aliasse geändert", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} hat den Einladungslink geändert", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Passwort ändern", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Anderen Homeserver verwenden", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ändere Deinen Style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Gruppenname ändern", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Deinen Avatar ändern", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Die Verschlüsselung wurde korrumpiert", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Chat-Backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatdetails", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Wähle ein sicheres Passwort", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Archiv leeren", + "close": "Schließen", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Banne ausgewählten Benutzer aus diesen Raum", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Sende HTML-formatierten Text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Lade den Benutzer in diesen Raum ein", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Betritt den ausgewählten Raum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Entferne den übergebenen Benutzer aus diesem Raum", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Diesen Raum verlassen", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Beschreibe dich selbst", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Setze dein Profilbild nur für diesen Raum (MXC-Uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Setze deinen Anzeigenamen nur für diesen Raum", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Setze den übergeben Powerlevel des Benutzers (Standard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Sende unformatierten Text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Sende die Antwort als Reaktion", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Text senden", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Hebe die Verbannung dieses Benutzers in diesem Raum auf", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Befehl ungültig", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} ist kein Befehl.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Bitte vergleiche die Emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Bitte vergleiche die Zahlen", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Chat konfigurieren", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt wurde in die Gruppe eingeladen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Der Inhalt wurde den Serveradministratoren gemeldet", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Wurde in die Zwischenablage kopiert", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopieren", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "In Zwischenablage kopieren", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nachricht konnte nicht entschlüsselt werden: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} Mitglieder", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Erstellen", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} hat den Chat erstellt", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Neuer Space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Jetzt gerade online", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dunkel", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Dies deaktiviert dein Konto. Es kann nicht rückgängig gemacht werden! Bist du sicher?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standardberechtigungsstufe für neue Benutzer", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Löschen", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Konto löschen", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Nachricht löschen", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Geräte", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direkte Chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Anzeigename wurde geändert", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Datei herunterladen", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Bearbeiten", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Blockierte Server einstellen", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Anzeigename ändern", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Raum-Aliase bearbeiten", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Raumavatar bearbeiten", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoticon existiert bereits!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ungültiges Emoticon-Kürzel!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emoticon-Einstellungen", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoticon-Kürzel", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Leerer Chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktiviere Emoticon-Bündel global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Verschlüsselung anschalten", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du wirst die Verschlüsselung nicht mehr ausstellen können. Bist Du sicher?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Verschlüsselt", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Verschlüsselung", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Verschlüsselung ist nicht aktiviert", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} hat den Anruf beendet", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Gib eine E-Mail-Adresse ein", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Fehler beim Suchen des Standortes: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Schriftgröße", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Weiterleiten", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Ab dem Beitritt", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Ab der Einladung", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Gruppe", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Öffentliche Gruppe", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruppen", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppe mit {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gäste sind verboten", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gäste dürfen beitreten", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} hat die Einladung für {targetName} zurückgezogen", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hilfe", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Unbekannte Ereignisse ausblenden", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorieren", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorierte Personen", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ich habe den Link angeklickt", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Falsches Passwort oder Wiederherstellungsschlüssel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kontakt einladen", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kontakt in die Gruppe {groupName} einladen", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Eingeladen", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} hat {targetName} eingeladen", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Nur eingeladene Mitglieder", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} hat Dich zu FluffyChat eingeladen. \n1. Gehe auf fluffychat.im und installiere die App \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "schreibt …", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} ist dem Chat beigetreten", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Raum beitreten", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} hat {targetName} hinausgeworfen", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} hat {targetName} hinausgeworfen und verbannt", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Aus dem Chat hinauswerfen", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Zuletzt aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Verlassen", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Hat den Chat verlassen", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Hell", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "{count} weitere Mitglieder laden", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Lade … Bitte warten.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Mehr laden …", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Standort ist deaktiviert. Bitte aktivieren, um den Standort teilen zu können.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Standort-Berechtigung wurde abgelehnt. Bitte akzeptieren, um den Standort teilen zu können.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Anmelden", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Bei {homeserver} anmelden", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Abmelden", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Erwähnen", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Nachrichten", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Stummschalten", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Neuer Chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Neue Nachricht in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Neue Verifikationsanfrage!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Weiter", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nein", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Keine Verbindung zum Server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Keine Emoticons gefunden. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Du kannst die Verschlüsselung erst aktivieren, sobald dieser Raum nicht mehr öffentlich zugänglich ist.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging scheint auf deinem Gerät nicht verfügbar zu sein. Um trotzdem Push-Benachrichtigungen zu erhalten, empfehlen wir die Installation von ntfy. Mit ntfy oder einem anderen Unified-Push-Anbieter kannst du Push-Benachrichtigungen datensicher empfangen. Du kannst ntfy im PlayStore oder bei F-Droid herunterladen.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du hast bisher keine Möglichkeit hinzugefügt, um dein Passwort zurückzusetzen.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Keine Berechtigung", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Keine Räume gefunden …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Benachrichtigungen", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} Mitglieder schreiben …", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Standort wird ermittelt …", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online-Schlüsselsicherung ist aktiviert", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hoppla! Leider ist beim Einrichten der Push-Benachrichtigungen ein Fehler aufgetreten.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppla, da ist etwas schiefgelaufen…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "App öffnen, um Nachrichten zu lesen", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamera öffnen", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "In Maps öffnen", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Oder", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Mitglied", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Passwort oder Wiederherstellungsschlüssel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Passwort", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Passwort vergessen", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Passwort wurde geändert", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Passwort wiederherstellen", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Anpinnen", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Bitte einen Code festlegen", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Bitte auf den Link in der E-Mail klicken und dann fortfahren.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Bitte dein Passwort eingeben", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Bitte gib deine Pin ein", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Bitte deinen Benutzernamen eingeben", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Bitte folge den Anweisungen auf der Website und tippe auf Weiter.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatsphäre", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Öffentliche Räume", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Grund", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} hat ein Ereignis gelöscht", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Nachricht löschen", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Ablehnen", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} hat die Einladung abgelehnt", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Entfernen", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Alle anderen Geräte entfernen", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Verbannung aufheben", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Deinen Avatar löschen", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Raum mit neuer Version ersetzen", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Antworten", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Nachricht melden", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Der Raum wurde ge-upgraded", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Raumversion", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Datei speichern", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Suchen", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sicherheit", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Senden", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Nachricht schreiben", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Sende als Text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Sende Audiodatei", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Datei senden", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Bild senden", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Nachrichten senden", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Sende Video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} hat eine Datei gesendet", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} hat eine Audio-Datei gesendet", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} hat ein Bild gesendet", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} hat einen Sticker gesendet", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} hat ein Video gesendet", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} hat Anrufinformationen geschickt", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Als Haupt-Alias festlegen", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Status ändern", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Einstellungen", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Teilen", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} hat den Standort geteilt", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Standort teilen", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Überspringen", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Quellcode", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space ist öffentlich", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Space-Name", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} hat einen Anruf getätigt", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Wie geht es dir heute?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Absenden", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronisiere... Bitte warten.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Stimmen nicht überein", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Stimmen überein", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Zu viele Anfragen. Bitte versuche es später noch einmal!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Noch mal versuchen zu senden", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} hat die Verbannung von {targetName} aufgehoben", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Geräteblockierung aufheben", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Unbekanntes Gerät", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Unbekannter Verschlüsselungsalgorithmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Unbekanntes Ereignis '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Stumm aus", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Nicht mehr anpinnen", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} und {count} andere schreiben …", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} und {username2} schreiben …", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} schreibt …", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} hat den Chat verlassen", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} hat ein {type}-Ereignis gesendet", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verifiziert", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Starte Verifikation", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Erfolgreich verifiziert!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Anderes Konto wird verifiziert", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videoanruf", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Sichtbarkeit des Chat-Verlaufs", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Sichtbar für alle Mitglieder", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Für jeden sichtbar", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Sprachnachricht", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Warte darauf, dass der Partner die Anfrage annimmt …", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Warte darauf, dass der Partner die Emoji annimmt …", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Warten, dass der Partner die Zahlen annimmt …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Achtung!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Wir haben dir eine E-Mail gesendet", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Wer kann welche Aktion ausführen", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Wer darf der Gruppe beitreten", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Warum willst du dies melden?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Mit diesen Adressen kannst du dein Passwort wiederherstellen, wenn du es vergessen hast.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Schreibe eine Nachricht …", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Du", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du bist kein Mitglied mehr in diesem Chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du wurdest aus dem Chat verbannt", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Dein öffentlicher Schlüssel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ist kein Matrix-Server, stattdessen {server2} benutzen?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "scanQrCode": "QR-Code scannen", + "autoplayImages": "Animierte Sticker und Emotes automatisch abspielen", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Zum Space hinzufügen", + "bundleName": "Name des Bundles", + "removeFromBundle": "Von diesem Bundle entfernen", + "addToBundle": "Zu einem Bundle hinzufügen", + "editBundlesForAccount": "Bundles für dieses Konto bearbeiten", + "addAccount": "Konto hinzufügen", + "oneClientLoggedOut": "Einer deiner Clients wurde abgemeldet", + "sendOnEnter": "Senden mit Enter", + "link": "Link", + "unverified": "Unverifiziert", + "messageInfo": "Nachrichten-Info", + "time": "Zeit", + "sender": "Absender:in", + "openGallery": "Galerie öffnen", + "removeFromSpace": "Aus dem Space entfernen", + "repeatPassword": "Passwort wiederholen", + "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_discardsession": "Sitzung verwerfen", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Zwischenspeicher löschen", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Erstelle ein leeren Gruppenchat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "pinMessage": "An Raum anheften", + "emojis": "Emojis", + "placeCall": "Anruf tätigen", + "voiceCall": "Sprachanruf", + "unsupportedAndroidVersion": "Nicht unterstützte Android-Version", + "videoCallsBetaWarning": "Bitte beachte, dass sich Videoanrufe derzeit in der Beta-Phase befinden. Sie funktionieren möglicherweise nicht wie erwartet oder überhaupt nicht auf allen Plattformen.", + "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder prüfe die Lineage-OS-Unterstützung.", + "experimentalVideoCalls": "Experimentelle Videoanrufe", + "reactedWith": "{sender} reagierte mit {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "markAsRead": "Als gelesen markiert", + "reportUser": "Benutzer melden", + "confirmEventUnpin": "Möchtest du das Ereignis wirklich dauerhaft lösen?", + "youKicked": "👞 Du hast {user} rausgeworfen", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Du hast {user} rausgeworfen und verbannt", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Du hast die Verbannung von {user} rückgängig gemacht", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Du hast die Einladung abgelehnt", + "youJoinedTheChat": "Du bist dem Chat beigetreten", + "youAcceptedTheInvitation": "👍 Du hast die Einladung angenommen", + "youBannedUser": "Du hast den {user} verbannt", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Du hast die Einladung für {user} zurückgezogen", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Du wurdest von {user} eingeladen", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Du hast {user} eingeladen", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "user": "Benutzer", + "custom": "Benutzerdefiniert", + "storeInAndroidKeystore": "Im Android KeyStore speichern", + "storeSecurlyOnThisDevice": "Auf diesem Gerät sicher speichern", + "dehydrate": "Sitzung exportieren und Gerät löschen", + "dehydrateWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Stelle sicher, dass du die Sicherungsdatei sicher aufbewahrst.", + "hydrate": "Aus Sicherungsdatei wiederherstellen", + "countFiles": "{count} Dateien", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "users": "Benutzer", + "storeInAppleKeyChain": "Im Apple KeyChain speichern", + "confirmMatrixId": "Bitte bestätigen deine Matrix-ID, um dein Konto zu löschen.", + "supposedMxid": "das sollte sein {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Als Direktnachrichtenraum für die angegebene Matrix-ID markieren", + "commandHint_markasgroup": "Als Gruppe markieren", + "doNotShowAgain": "Nicht mehr anzeigen", + "noKeyForThisMessage": "Dies kann passieren, wenn die Nachricht gesendet wurde, bevor du dich auf diesem Gerät bei deinem Konto angemeldet hast.\n\nEs ist auch möglich, dass der Absender dein Gerät blockiert hat oder etwas mit der Internetverbindung schief gelaufen ist.\n\nKannst du die Nachricht in einer anderen Sitzung lesen? Dann kannst du die Nachricht davon übertragen! Gehe zu den Einstellungen > Geräte und vergewissere dich, dass sich deine Geräte gegenseitig verifiziert haben. Wenn du den Raum das nächste Mal öffnest und beide Sitzungen im Vordergrund sind, werden die Schlüssel automatisch übertragen.\n\nDu möchtest die Schlüssel beim Abmelden oder Gerätewechsel nicht verlieren? Stelle sicher, dass du das Chat-Backup in den Einstellungen aktiviert hast.", + "foregroundServiceRunning": "Diese Benachrichtigung wird angezeigt, wenn der Vordergrunddienst ausgeführt wird.", + "screenSharingTitle": "Bildschirm teilen", + "whyIsThisMessageEncrypted": "Warum ist diese Nachricht nicht lesbar?", + "newSpace": "Neuer Space", + "screenSharingDetail": "Du teilst deinen Bildschirm in FuffyChat", + "newSpaceDescription": "Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.", + "wasDirectChatDisplayName": "Leerer Chat (war {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "encryptThisChat": "Diesen Chat verschlüsseln", + "googlyEyesContent": "{senderName} hat dir Googly Eyes gesendet", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Umarmung senden", + "commandHint_hug": "Umarmung senden", + "cuddleContent": "{senderName} knuddelt dich", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Sorry ... das ist nicht möglich", + "hugContent": "{senderName} umarmt dich", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Glupschaugen senden", + "disableEncryptionWarning": "Aus Sicherheitsgründen kannst du die Verschlüsselung in einem Chat nicht deaktivieren, wo sie zuvor aktiviert wurde.", + "reopenChat": "Chat wieder eröffnen", + "noBackupWarning": "Achtung! Ohne Aktivierung des Chat-Backups verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Vor dem Ausloggen wird dringend empfohlen, das Chat-Backup zu aktivieren.", + "noOtherDevicesFound": "Keine anderen Geräte anwesend", + "fileHasBeenSavedAt": "Datei wurde gespeichert unter {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Zur letzten ungelesenen Nachricht", + "readUpToHere": "Bis hier gelesen", + "jump": "Springen", + "openLinkInBrowser": "Link im Browser öffnen", + "reportErrorDescription": "😭 Oh nein. Etwas ist schief gelaufen. Wenn du möchtest, kannst du den Bug bei den Entwicklern melden.", + "report": "Melden", + "importNow": "Jetzt importieren", + "importEmojis": "Emojis importieren", + "importFromZipFile": "Aus ZIP-Datei importieren", + "exportEmotePack": "Emote-Paket als ZIP-Datei exportieren", + "notAnImage": "Keine Bilddatei.", + "replace": "Ersetzen", + "sendTypingNotifications": "Tippbenachrichtigungen senden", + "createGroup": "Gruppe erstellen", + "shareInviteLink": "Einladungslink teilen", + "tryAgain": "Neuer Versuch", + "redactMessageDescription": "Die Nachricht wird für alle Teilnehmer dieses Gesprächs gelöscht. Dies kann nicht rückgängig gemacht werden.", + "redactedBy": "Gelöscht von {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "Gelöscht von {username} weil: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setColorTheme": "Farbdesign einstellen:", + "invite": "Einladen", + "optionalRedactReason": "(Optional) Grund für die Löschung dieser Nachricht...", + "messagesStyle": "Nachrichten:", + "chatPermissions": "Chatberechtigungen", + "chatDescription": "Chatbeschreibung", + "chatDescriptionHasBeenChanged": "Chatbeschreibung geändert", + "noChatDescriptionYet": "Noch keine Chatbeschreibung vorhanden.", + "invalidServerName": "Ungültiger Servername", + "directChat": "Privater Chat", + "setChatDescription": "Chatbeschreibung festlegen", + "inviteGroupChat": "📨 Einladungen zum Gruppenchat", + "invalidInput": "Ungültige Eingabe!", + "hasKnocked": "🚪 {user} hat angeklopft", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "wrongPinEntered": "Falsche PIN eingegeben! Bitte in {seconds} Sekunden erneut versuchen ...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Bitte eine Zahl größer 0 eingeben", + "emoteKeyboardNoRecents": "Kürzlich verwendete Emotes werden hier angezeigt ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "banUserDescription": "Der Benutzer wird aus dem Chat gebannt und kann den Chat erst wieder betreten, wenn die Verbannung aufgehoben wird.", + "removeDevicesDescription": "Du wirst von diesem Gerät abgemeldet und kannst dann dort keine Nachrichten mehr empfangen.", + "unbanUserDescription": "Der Benutzer kann den Chat dann wieder betreten, wenn er es versucht.", + "pushNotificationsNotAvailable": "Push-Benachrichtigungen nicht verfügbar", + "makeAdminDescription": "Sobald du diesen Benutzer zum Administrator gemacht hast, kannst du das möglicherweise nicht mehr rückgängig machen, da er dann über dieselben Berechtigungen wie du verfügt.", + "archiveRoomDescription": "Der Chat wird in das Archiv verschoben. Andere Benutzer können sehen, dass du den Chat verlassen hast.", + "learnMore": "Erfahre mehr", + "roomUpgradeDescription": "Der Chat wird dann mit der neuen Raumversion neu erstellt. Alle Teilnehmer werden benachrichtigt, dass sie zum neuen Chat wechseln müssen. Mehr über Raumversionen erfährst du unter https://spec.matrix.org/latest/rooms/", + "kickUserDescription": "Der Benutzer wird aus dem Chat geworfen, aber nicht gebannt. In öffentlichen Chats kann der Benutzer jederzeit wieder beitreten.", + "blockListDescription": "Du kannst Benutzer blockieren, die dich stören. Von Benutzern auf deiner persönlichen Blocklierliste kannst du keine Nachrichten oder Raumeinladungen mehr erhalten.", + "createGroupAndInviteUsers": "Gruppe erstellen und Nutzer einladen", + "blockedUsers": "Blockierte Benutzer", + "groupCanBeFoundViaSearch": "Gruppe kann über die Suche gefunden werden", + "noUsersFoundWithQuery": "Leider konnte mit \"{query}\" kein Benutzer gefunden werden. Bitte schau nach, ob dir ein Tippfehler unterlaufen ist.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Blockieren", + "yourGlobalUserIdIs": "Deine globale Benutzer-ID ist: ", + "commandHint_sendraw": "Rohes JSON senden", + "wrongRecoveryKey": "Entschuldigung ... das scheint nicht der richtige Wiederherstellungsschlüssel zu sein.", + "blockUsername": "Blockiere Benutzername", + "groupName": "Gruppenname", + "searchChatsRooms": "Suche nach #Chats, @Nutzer ...", + "databaseMigrationTitle": "Datenbank wird optimiert", + "databaseMigrationBody": "Bitte warten. Dies kann einen Moment dauern.", + "thisDevice": "Dieses Gerät:", + "publicSpaces": "Öffentliche Spaces", + "passwordIsWrong": "Dein eingegebenes Passwort ist falsch", + "pleaseEnterYourCurrentPassword": "Bitte dein aktuelles Passwort eingeben", + "nothingFound": "Nichts gefunden ...", + "newPassword": "Neues Passwort", + "passwordsDoNotMatch": "Passwörter stimmen nicht überein", + "select": "Auswählen", + "pleaseChooseAStrongPassword": "Bitte wähle ein starkes Passwort", + "addChatOrSubSpace": "Chat oder Sub-Space hinzufügen", + "leaveEmptyToClearStatus": "Leer lassen, um den Status zu löschen.", + "joinSpace": "Space beitreten", + "searchForUsers": "Suche nach @benutzer ...", + "initAppError": "Beim Starten der App ist ein Fehler aufgetreten", + "sessionLostBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Lesebestätigungen senden", + "formattedMessages": "Formatierte Nachrichten", + "sendTypingNotificationsDescription": "Andere Teilnehmer in einem Chat können sehen, wenn du eine neue Nachricht tippst.", + "formattedMessagesDescription": "Formatierte Nachrichteninhalte wie fettgedruckten Text mit Markdown anzeigen.", + "verifyOtherUser": "🔐 Anderen Benutzer verifizieren", + "sendReadReceiptsDescription": "Andere Teilnehmer in einem Chat können sehen, ob du eine Nachricht gelesen hast.", + "verifyOtherDevice": "🔐 Anderes Gerät verifizieren", + "verifyOtherUserDescription": "Wenn du einen anderen Benutzer verifizierst, kannst du sicher sein, dass du weißt, an wen du wirklich schreibst. 💪\n\nWenn du eine Verifizierung startest, wird dir und dem anderen Nutzer ein Popup in der App angezeigt. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die ihr miteinander vergleichen müsst.\n\nDas geht am besten, wenn man sich trifft oder einen Videoanruf startet. 👭", + "acceptedKeyVerification": "{sender} hat die Schlüsselverifikation akzeptiert", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} hat die Schlüsselverifikation abgebrochen", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} hat die Schlüsselverifikation abgeschlossen", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} ist bereit für die Schlüsselverifikation", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} hat eine Schlüsselverifikation angefragt", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} hat die Schlüsselverifikation gestartet", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDeviceDescription": "Wenn du ein anderes Gerät verifizierst, können diese Geräte Schlüssel austauschen, was die Sicherheit insgesamt erhöht. 💪Sobald du eine Verifizierung startest, erscheint ein Pop-up in der App auf beiden Geräten. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die du miteinander vergleichen musst. Am besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳", + "incomingMessages": "Eingehende Nachrichten", + "commandHint_unignore": "Angegebene Matrix-ID nicht mehr ignorieren", + "commandHint_ignore": "Angegebene Matrix-ID ignorieren", + "noDatabaseEncryption": "Datenbankverschlüsselung wird auf dieser Plattform nicht unterstützt", + "stickers": "Sticker", + "discover": "Entdecken", + "unreadChatsInApp": "{appname}: {unread} ungelesene Chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "customEmojisAndStickersBody": "Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.", + "globalChatId": "Globale Chat-ID", + "accessAndVisibility": "Zugang und Sichtbarkeit", + "accessAndVisibilityDescription": "Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.", + "chatCanBeDiscoveredViaSearchOnServer": "Chat kann über die Suche auf {server} gefunden werden", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appLockDescription": "App mit einer PIN sperren, wenn sie nicht verwendet wird", + "calls": "Anrufe", + "customEmojisAndStickers": "Eigene Emojis und Sticker", + "hideRedactedMessages": "Geschwärzte Nachrichten verstecken", + "hideRedactedMessagesBody": "Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.", + "hideInvalidOrUnknownMessageFormats": "Ungültige und unbekannte Nachrichten-Formate ausblenden", + "passwordRecoverySettings": "Passwort-Wiederherstellungs-Einstellungen", + "knock": "Anklopfen", + "knocking": "Klopft", + "thereAreCountUsersBlocked": "Im Augenblick werden {count} Benutzer blockiert.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "usersMustKnock": "Benutzer müssen anklopfen", + "noOneCanJoin": "Niemand kann beitreten", + "createNewAddress": "Neue Adresse erstellen", + "publicChatAddresses": "Öffentliche Chat-Adressen", + "gallery": "Galerie", + "files": "Dateien", + "searchIn": "In Chat \"{chat}\" suchen ...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Weiter suchen ...", + "unread": "Ungelesen", + "noMoreChatsFound": "Keine weiteren Chats gefunden ...", + "space": "Space", + "goToSpace": "Geh zum Space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Als ungelesen markieren", + "swipeRightToLeftToReply": "Wische von rechts nach links zum Antworten", + "changeGeneralChatSettings": "Allgemeine Chat-Einstellungen ändern", + "userLevel": "{level} - Benutzer", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheChatPermissions": "Ändere die Chat-Berechtigungen", + "changeTheVisibilityOfChatHistory": "Wechsele die Sichtbarkeit der Chat-Historie", + "chatPermissionsDescription": "Einstellen, welches Level für bestimmte Aktionen in diesem Chat erforderlich ist. Die Level 0, 50 und 100 stehen üblicherweise für Benutzer, Moderatoren und Admins, aber jede Abstufung ist möglich.", + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Lade andere Benutzer in diesen Chat ein", + "changeTheCanonicalRoomAlias": "Ändern der Hauptadresse für den öffentlichen Chat", + "sendRoomNotifications": "Sende eine @room-Benachrichtigung", + "changeTheDescriptionOfTheGroup": "Chat-Beschreibung ändern", + "updateInstalled": "🎉 Update {version} installiert!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Änderungsprotokoll", + "sendCanceled": "Senden abgebrochen", + "noChatsFoundHere": "Hier wurden noch keine Chats gefunden. Starte einen neuen Chat mit jemandem, indem du die Schaltfläche unten verwenden. ⤵️", + "doesNotSeemToBeAValidHomeserver": "Scheint kein kompatibler Homeserver zu sein. Falsche URL?", + "loginWithMatrixId": "Mit Matrix-ID anmelden", + "sendingAttachment": "Anhang wird gesendet ...", + "calculatingFileSize": "Dateigröße wird berechnet ...", + "fileIsTooBigForServer": "Kann nicht gesendet werden! Der Server unterstützt nur Anhänge bis höchstens {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Eines deiner Geräte ist nicht verifiziert", + "noticeChatBackupDeviceVerification": "Hinweis: Wenn du alle deine Geräte mit dem Chat-Backup verbindest, sind sie automatisch verifiziert.", + "setWallpaper": "Hintergrund ändern", + "opacity": "Deckkraft:", + "blur": "Verwischen:", + "manageAccount": "Konto verwalten", + "continueText": "Fortfahren", + "noContactInformationProvided": "Der Server stellt keine gültigen Kontaktinformationen bereit", + "contactServerAdmin": "Serveradministrator kontaktieren", + "name": "Name", + "version": "Version", + "website": "Website", + "aboutHomeserver": "Über {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "boldText": "Fetter Text", + "invalidUrl": "Ungültige URL", + "addLink": "Link hinzufügen", + "unableToJoinChat": "Chat kann nicht beigetreten werden. Möglicherweise hat die Gegenseite das Gespräch bereits beendet.", + "italicText": "Kursiver Text", + "strikeThrough": "Durchgestrichen", + "pleaseFillOut": "Bitte ausfüllen", + "sendImages": "Sende {count} Bilder", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "contactServerSecurity": "Server-Sicherheit kontaktieren", + "compress": "Komprimieren", + "supportPage": "Support-Seite", + "serverInformation": "Server-Informationen:", + "newChatRequest": "📩 Neue Chat-Anfrage", + "synchronizingPleaseWaitCounter": " Synchronisierung… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "waitingForServer": "Auf Server warten...", + "previous": "Vorige", + "otherPartyNotLoggedIn": "Der User ist aktuell nicht eingeloggt und kann daher keine Nachrichten empfangen!", + "appWantsToUseForLogin": "Nutze '{server}' um dich einzuloggen", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Hiermit erlaubst du der App und der Website, Informationen über dich weiterzugeben.", + "open": "Öffnen", + "notificationRuleContainsUserName": "Enthält Benutzernamen", + "notificationRuleContainsUserNameDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht seinen Benutzernamen enthält.", + "notificationRuleMaster": "Alle Benachrichtigungen stummschalten", + "notificationRuleSuppressNotices": "Automatisierte Nachrichten unterdrücken", + "notificationRuleMasterDescription": "Setzt alle anderen Regeln außer Kraft und deaktiviert alle Benachrichtigungen.", + "generalNotificationSettings": "Allgemeine Benachrichtigungseinstellungen", + "otherNotificationSettings": "Andere Benachrichtigungseinstellungen", + "contentNotificationSettings": "Einstellungen für Inhaltsbenachrichtigungen", + "userSpecificNotificationSettings": "Benutzerspezifische Benachrichtigungseinstellungen", + "roomNotificationSettings": "Einstellungen für Raumbenachrichtigungen", + "notificationRuleSuppressNoticesDescription": "Unterdrückt Benachrichtigungen von automatisierten Clients wie Bots.", + "notificationRuleInviteForMe": "Einladung für mich", + "notificationRuleReaction": "Reaktion", + "notificationRuleReactionDescription": "Unterdrückt Benachrichtigungen für Reaktionen.", + "notificationRuleSuppressEditsDescription": "Unterdrückt Benachrichtigungen für bearbeitete Nachrichten.", + "notificationRuleCall": "Anruf", + "notificationRuleCallDescription": "Benachrichtigt den Benutzer über Anrufe.", + "notificationRuleEncrypted": "Verschlüsselt", + "more": "Mehr", + "notificationRuleSuppressEdits": "Unterdrückt Bearbeitungen", + "notificationRuleRoomServerAclDescription": "Unterdrückt Benachrichtigungen für Raumserver-Zugriffskontrolllisten (ACL).", + "notificationRuleMessage": "Nachricht", + "notificationRuleMessageDescription": "Informiert den Benutzer über allgemeine Nachrichten.", + "notificationRuleJitsi": "Jitsi", + "allDevices": "Alle Geräte", + "enterNewChat": "Neuen Chat betreten", + "shareKeysWith": "Schlüssel teilen mit...", + "shareKeysWithDescription": "Welchen Geräten sollte vertraut werden, damit sie deine Nachrichten in verschlüsselten Chats mitlesen können?", + "verifiedDevicesOnly": "Nur verifizierte Geräte", + "takeAPhoto": "Foto aufnehmen", + "recordAVideo": "Video aufnehmen", + "optionalMessage": "(Optionale) Nachricht...", + "notSupportedOnThisDevice": "Nicht unterstützt auf diesem Gerät", + "notificationRuleEncryptedRoomOneToOneDescription": "Benachrichtigt den Benutzer über Nachrichten in verschlüsselten Eins-zu-Eins-Chats.", + "commandHint_roomupgrade": "Aktualisieren Sie diesen Raum auf die angegebene Raumversion", + "notificationRuleMemberEvent": "Mitgliederveranstaltung", + "notificationRuleInviteForMeDescription": "Benachrichtigt den Benutzer, wenn er in einen Raum eingeladen wird.", + "notificationRuleIsUserMentionDescription": "Benachrichtigt den Benutzer, wenn er in einer Nachricht direkt erwähnt wird.", + "notificationRuleRoomnotifDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht „@room“ enthält.", + "notificationRuleRoomOneToOneDescription": "Benachrichtigt den Benutzer über Nachrichten in Einzelchats.", + "notificationRuleEncryptedDescription": "Benachrichtigt den Benutzer über Nachrichten in verschlüsselten Räumen.", + "notificationRuleJitsiDescription": "Benachrichtigt den Benutzer über Jitsi-Widget-Ereignisse.", + "checkList": "Checkliste", + "countInvited": "{count} invited", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notificationRuleIsUserMention": "Benutzererwähnung", + "notificationRuleContainsDisplayName": "Enthält den Anzeigenamen", + "notificationRuleContainsDisplayNameDescription": "Benachrichtigt den Benutzer, wenn eine Nachricht seinen Anzeigenamen enthält.", + "notificationRuleIsRoomMention": "Chat-Erwähnung", + "notificationRuleRoomnotif": "Chat-Benachritigung", + "notificationRuleTombstoneDescription": "Benachrichtigt den Benutzer über Nachrichten zur Raumdeaktivierung.", + "notificationRuleEncryptedRoomOneToOne": "Verschlüsselter Einzelchat", + "notificationRuleRoomOneToOne": "Einzelchat", + "notificationRuleServerAclDescription": "Unterdrückt Benachrichtigungen für Server-ACL-Ereignisse.", + "unknownPushRule": "Unbekannte Push-Regel '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Wenn Sie diese Benachrichtigungseinstellung löschen, kann dies nicht rückgängig gemacht werden.", + "crossVerifiedDevices": "Cross-verifizierte Geräte", + "notificationRuleIsRoomMentionDescription": "Benachrichtigt den Benutzer, wenn ein Raum erwähnt wird.", + "notificationRuleRoomServerAcl": "Raumserver-ACL", + "crossVerifiedDevicesIfEnabled": "Cross-verifizierte Geräte, falls aktiviert", + "notificationRuleServerAcl": "Unterdrücken von Server-ACL-Ereignissen", + "notificationRuleMemberEventDescription": "Unterdrückt Benachrichtigungen zu Mitgliedschaftsereignissen.", + "sentVoiceMessage": "🎙️ {duration} - Sprachnachricht von {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "approve": "Genehmigen", + "youHaveKnocked": "Du hast geklopft", + "pleaseWaitUntilInvited": "Bitte warte nun, bis dich jemand aus dem Raum auffordert.", + "notificationRuleTombstone": "Tombstone", + "commandHint_logout": "Aktuelles Gerät abmelden", + "commandHint_logoutall": "Alle aktiven Geräte abmelden", + "displayNavigationRail": "Navigationsleiste auf dem Smartphone anzeigen", + "customReaction": "Benutzerdefinierte Reaktion", + "moreEvents": "Weitere Ereignisse", + "declineInvitation": "Einladung ablehnen", + "noMessagesYet": "Noch keine Nachrichten", + "longPressToRecordVoiceMessage": "Lange drücken, um eine Sprachnachricht aufzunehmen.", + "pause": "Pause", + "removeFromSpaceDescription": "Der Chat wird aus dem Space entfernt, erscheint aber weiterhin in Ihrer Chatliste.", + "countChats": "{chats} Chats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Space-Mitglieder von {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Space-Mitglieder von {spaces} kann klopfen", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "resume": "Fortsetzen", + "startPoll": "Umfrage starten", + "endPoll": "Umfrage beenden", + "answersVisible": "Antworten sichtbar", + "pollQuestion": "Frage", + "answerOption": "Antwortmöglichkeit", + "addAnswerOption": "Antwortoption hinzufügen", + "allowMultipleAnswers": "Mehrere Antworten zulassen", + "pollHasBeenEnded": "Umfrage ist beendet", + "countVotes": "{count, plural, =1{Eine Stimme} other{{count} Stimmen}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Die Antworten werden nach Ende der Umfrage sichtbar sein", + "replyInThread": "Im Thread antworten", + "countReplies": "{count, plural, =1{Eine Antwort} other{{count} Antworten}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Thread", + "backToMainChat": "Zurück zum Hauptchat", + "changedTheChatDescription": "{username} hat die Chatbeschreibung geändert", + "changedTheChatName": "{username} den Chatnamen geändert", + "saveChanges": "Änderungen speichern", + "skipChatBackup": "Chatsicherung überspringen", + "skipChatBackupWarning": "Bist du sicher? Ohne die Chatsicherung zu aktivieren, kannst du den Zugriff auf deine Nachrichten verlieren, wenn du dein Gerät wechselst.", + "createSticker": "Sticker oder Emoji erstellen", + "useAsSticker": "Als Sticker verwenden", + "useAsEmoji": "Als Emoji verwenden", + "stickerPackNameAlreadyExists": "Name des Sticker-Pakets existiert bereits", + "newStickerPack": "Neues Sticker-Paket", + "stickerPackName": "Name des Sticker-Pakets", + "noMoreResultsFound": "Keine weiteren Ergebnisse gefunden", + "chatSearchedUntil": "Chat durchsucht bis {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "attribution": "Attribuierung", + "identityServer": "Identitätsserver:", + "versionWithNumber": "Version: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Protokolle", + "baseUrl": "Basis-URL", + "advancedConfigs": "Erweiterte Konfigurationen", + "advancedConfigurations": "Erweiterte Konfigurationen", + "signIn": "Anmelden", + "createNewAccount": "Neues Konto erstellen", + "signUpGreeting": "FluffyChat ist dezentral! Wähle einen Server, auf dem du dein Konto erstellen möchtest, und los geht's!", + "signInGreeting": "Du hast bereits ein Konto bei Matrix? Willkommen zurück! Wähle deinen Homeserver aus und melde dich an.", + "theProcessWasCanceled": "Der Vorgang wurde abgebrochen.", + "federationBaseUrl": "Basis-URL der Föderation", + "clientWellKnownInformation": "Bekannte Informationen zum Client:", + "join": "Beitreten", + "searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben", + "matrixId": "Matrix ID", + "reset": "Zurücksetzen", + "setPowerLevel": "Power-Level einstellen", + "makeModerator": "Zum Moderator machen", + "makeAdmin": "Zum Admin machen", + "removeModeratorRights": "Moderatorenrechte entziehen", + "removeAdminRights": "Adminrechte entziehen", + "powerLevel": "Power-Level", + "setPowerLevelDescription": "Die Power-Level legen fest, was ein Mitglied in diesem Raum tun darf und liegen üblicherweise zwischen 0 und 100.", + "owner": "Besitzer", + "mute": "Stumm", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Neuen Chat erstellen", + "supportFluffyChat": "FluffyChat unterstützen", + "support": "Unterstützen", + "createNewTag": "Neuen tag erstellen", + "tagName": "Tag-Name", + "addTag": "Tag hinzufügen", + "playSoundOnNotification": "Ton bei Benachrichtigung abspielen", + "unsetLowPriority": "Niedrige Priorität aufheben", + "setLowPriority": "Niedrige Priorität festlegen", + "removeTag": "Tag entfernen", + "appDescription": "Kommuniziere verschlüsselt über das dezentrale [matrix]-Netzwerk, so dass es einfach und zugänglich für jeden ist.", + "discardEdits": "Du hast ungespeicherte Änderungen. Möchtest du deine Änderungen verwerfen?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Mehr anzeigen", + "showLess": "Weniger anzeigen", + "hideRoomsInSpaces": "Räume ausblenden, die sich in einem space befinden", + "possibleByYou": "Diese Veröffentlichung war nur dank eurer Unterstützung möglich. FluffyChat bleibt kostenlos, Open-Source und vollständig von der Community getragen.", + "showThumbnailsInTimeline": "Thumbnails von Bildern und Videos anzeigen", + "appSubtitle": "Sichere [matrix]-Kommunikation", + "interactiveVerification": "Interaktive Verifikation", + "interactiveVerificationDescription": "Wenn ihr euch nebeneinander befindet oder über einen sicheren Kanal kommuniziert, könnt ihr alle Geräte gleichzeitig verifizieren, indem ihr eine Sicherheitsnummer oder Emojis vergleicht.", + "countUnverifiedDevices": "{count} unbestätigte Geräte im Chat.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Verschlüsselte Nachricht", + "unencryptedMessage": "Unverschlüsselte Nachricht", + "publicKey": "Öffentlicher Schlüssel: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Geräteidentitätsschlüssel", + "messageCanOnlyBeReadByUser": "Deine Nachricht ist Ende-zu-Ende-verschlüsselt und kann nur von diesem Nutzer gelesen werden:", + "messageCanOnlyBeReadByUsers": "Deine Nachricht ist Ende-zu-Ende-verschlüsselt und kann nur von diesen Nutzern gelesen werden:", + "restoreBootstrapEmptyDevicesDescription": "Bitte gib deine Passphrase oder deinen Wiederherstellungsschlüssel ein, um dieses Gerät zu verifizieren und Zugriff auf dein verschlüsseltes Nachrichten-Backup zu erhalten.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Bitte wähle eines deiner anderen Geräte aus, um diese Sitzung zu bestätigen:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Konto zurücksetzen", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Krypto-Identität wiederherstellen", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Krypto-Identität zurücksetzen", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Krypto-Identität einrichten", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Warten auf Schlüssel... Bitte lass das andere Gerät aktiv.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Keine Schlüssel übertragen. Bitte versuche es erneut.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Entsperren", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Datei öffnen", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Wenn du dein Konto zurücksetzt, verlierst du dauerhaft den Zugriff auf deine alten Nachrichten. Alle deine aktuellen Geräte müssen erneut verifiziert werden. Führe diesen Schritt bitte nur aus, wenn du über keine anderen Geräte mehr zur Verifizierung deiner Sitzung verfügst und zudem deinen Wiederherstellungsschlüssel sowie deine Passphrase verloren hast!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat verwendet Ende-zu-Ende-Verschlüsselung. Um deine Nachrichten nicht zu verlieren, wähle bitte eine starke Passphrase, um deine Krypto-Identität und dein verschlüsseltes Nachrichten-Backup zu sichern.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Neue Passphrase", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Passphrase wiederholen", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Passphrasen stimmen überein", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Mindestens 12 Zeichen lang.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Enthält Groß- und Kleinbuchstaben.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Enthält Sonderzeichen.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Enthält eine Zahl.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Bitte notiere deinen Wiederherstellungsschlüssel, um deine verschlüsselten Nachrichten und deine Krypto-Identität wiederherstellen zu können.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Als Datei speichern", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Du bist bereit loszulegen!", + "noUserKeyFound": "Kein Benutzerschlüssel gefunden", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Bekannt seit: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Nicht signiertes Gerät", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Signiertes Gerät", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Kein curve25519-Schlüssel gefunden", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Nachricht nicht entschlüsselbar", + "today": "Heute", + "sending": "Wird gesendet", + "generatingThumbnail": "Thumbnail wird erstellt", + "encrypting": "Verschlüsselung", + "uploading": "Hochladen", + "edited": "(bearbeitet)", + "couldNotBeSent": "Konnte nicht gesendet werden", + "yesterday": "Gestern", + "resetRecoveryKey": "Wiederherstellungsschlüssel zurücksetzen" +} \ No newline at end of file diff --git a/lib/l10n/intl_el.arb b/lib/l10n/intl_el.arb new file mode 100644 index 0000000000..fc3a3364d9 --- /dev/null +++ b/lib/l10n/intl_el.arb @@ -0,0 +1,1880 @@ +{ + "hugContent": "{senderName} σε αγκαλιάζει", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Στείλε μια αγκαλιά", + "admin": "Διαχειριστής", + "@admin": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Αποκλεισμός Συσκευής", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "Αυτό θα πρέπει να είναι {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "banFromChat": "Αποκλεισμός από τη συνομιλία", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Για να μπορέσεις να υπογράψεις το άλλο άτομο, πληκτρολόγησε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "remove": "Αφαίρεση", + "@remove": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Επιτρέπεται στους επισκέπτες χρήστες να συμμετάσχουν", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "blocked": "Αποκλείστηκε", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Αποστολή με enter", + "answeredTheCall": "{senderName} απάντησε στην κλήση", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "ψευδώνυμο", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Όλα", + "@all": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Ο οικιακός διακομιστής υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "importFromZipFile": "Εισαγωγή από αρχείο .zip", + "autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "repeatPassword": "Επανάληψη κωδικού πρόσβασης", + "acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banned": "Αποκλείστηκε", + "@banned": { + "type": "String", + "placeholders": {} + }, + "exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip", + "account": "Λογαριασμός", + "@account": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Σίγουρα;", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Προσθήκη στο χώρο", + "about": "Σχετικά", + "@about": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε την κρυπτογράφηση από άκρο σε άκρο", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} σού στέλνει αστεία μάτια", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cancel": "Ακύρωση", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "appLock": "Κλείδωμα εφαρμογής", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "Αποστολή ειδοποιήσεων πληκτρολόγησης", + "importEmojis": "Εισαγωγή Emojis", + "confirmMatrixId": "Παρακαλούμε επιβεβαίωσε το Matrix ID σου για να διαγράψεις τον λογαριασμό σου.", + "notAnImage": "Δεν είναι αρχείο εικόνας.", + "areYouSureYouWantToLogout": "Σίγουρα θες να αποσυνδεθείς;", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} απέκλεισε {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} σέ αγκαλιάζει", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Προσθήκη email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_hug": "Στείλτε μια αγκαλιά", + "replace": "Αντικατάσταση", + "archive": "Αρχείο", + "@archive": { + "type": "String", + "placeholders": {} + }, + "accept": "Αποδοχή", + "@accept": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Στείλε αστεία μάτια", + "importNow": "Εισαγωγή τώρα", + "anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "Σχετικά με {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Αναβάθμιση αυτού του δωματίου στην δεδομένη έκδοση δωματίου", + "appLockDescription": "Κλείδωμα εφαρμογής όταν δεν χρησιμοποιείται με κωδικό PIN", + "swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση", + "noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...", + "noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️", + "unread": "Μη αναγνωσμένα", + "space": "Χώρος", + "changeDeviceName": "Αλλαγή ονόματος συσκευής", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} άλλαξε το άβαταρ συνομιλίας", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} άλλαξε το εμφανιζόμενο όνομά του σε: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών σε: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Αλλαγή κωδικού πρόσβασης", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Άλλαξε το στυλ σου", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Αλλαγή εικόνας προφιλ", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Αντίγραφο ασφαλείας συνομιλίας", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Λεπτομέρειες συνομιλίας", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Συνομιλίες", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Κλείσιμο", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb new file mode 100644 index 0000000000..6bfe3a2a0a --- /dev/null +++ b/lib/l10n/intl_en.arb @@ -0,0 +1,2716 @@ +{ + "@@locale": "en", + "@@last_modified": "2021-08-14 12:38:37.885451", + "repeatPassword": "Repeat password", + "notAnImage": "Not an image file.", + "remove": "Remove", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Import now", + "importEmojis": "Import Emojis", + "importFromZipFile": "Import from .zip file", + "exportEmotePack": "Export Emote pack as .zip", + "replace": "Replace", + "about": "About", + "aboutHomeserver": "About {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Accept", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepted the invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activated end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Add email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Please confirm your Matrix ID in order to delete your account.", + "supposedMxid": "This should be {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Add to space", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "All", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Upgrade this room to the given room version", + "commandHint_googly": "Send some googly eyes", + "commandHint_cuddle": "Send a cuddle", + "commandHint_hug": "Send a hug", + "googlyEyesContent": "{senderName} sends you googly eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} cuddles you", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} hugs you", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} answered the call", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Anyone can join", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App lock", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Lock the app when not using with a pin code", + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Are guest users allowed to join?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Are you sure?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "discardEdits": "You have unsaved changes. Discard your edits?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Are you sure you want to log out?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "To be able to sign the other person, please enter your secure store passphrase or recovery key.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accept this verification request from {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automatically play animated stickers and emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Send typing notifications", + "swipeRightToLeftToReply": "Swipe right to left to reply", + "sendOnEnter": "Send on enter", + "noMoreChatsFound": "No more chats found...", + "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", + "unread": "Unread", + "space": "Space", + "banFromChat": "Ban from chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banned", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} banned {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Block Device", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocked", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancel", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Can't open the URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Change device name", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} changed the chat avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescription": "{username} changed the chat description", + "changedTheChatName": "{username} changed the chat name", + "changedTheChatPermissions": "{username} changed the chat permissions", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} changed their displayname to: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} changed the guest access rules", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} changed the guest access rules to: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} changed the history visibility", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} changed the history visibility to: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} changed the join rules", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} changed the join rules to: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} changed their avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} changed the room aliases", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} changed the invitation link", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Change password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Change the homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Change your style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Change the name of the group", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Change your avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "The encryption has been corrupted", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Chat backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chat details", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Choose a strong password", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Clear archive", + "close": "Close", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Mark as direct message room for the giving Matrix ID", + "commandHint_markasgroup": "Mark as group", + "commandHint_ban": "Ban the given user from this room", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Clear cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Create an empty group chat\nUse --no-encryption to disable encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Discard session", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Start a direct chat\nUse --no-encryption to disable encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Send HTML-formatted text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Invite the given user to this room", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Join the given room", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remove the given user from this room", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Leave this room", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Describe yourself", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Set your picture for this room (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Set your display name for this room", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Set the given user's power level (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Send unformatted text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Send reply as a reaction", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Send text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Unban the given user from this room", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Command invalid", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is not a command.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Please compare the emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Please compare the numbers", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configure chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "The content has been reported to the server admins", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copied to clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copy", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copy to clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Could not decrypt message: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "checkList": "Check list", + "countParticipants": "{count, plural, =1{1 participant} other{{count} participants}}", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countInvited": "{count} invited", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Create", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} created the chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Create group", + "createNewSpace": "New space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Currently active", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dark", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "This will deactivate your user account. This can not be undone! Are you sure?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Default permission level for new users", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Delete", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Delete account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Delete message", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Devices", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direct Chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displayname has been changed", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Download file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Edit blocked servers", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Chat permissions", + "editDisplayname": "Edit displayname", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Edit room aliases", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edit room avatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote already exists!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Invalid emote shortcode!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Recently-used emotes will appear here...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote Settings", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Global chat ID", + "accessAndVisibility": "Access and visibility", + "accessAndVisibilityDescription": "Who is allowed to join this chat and how the chat can be discovered.", + "calls": "Calls", + "customEmojisAndStickers": "Custom emojis and stickers", + "customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.", + "emoteShortcode": "Emote shortcode", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Empty chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Enable emote pack globally", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Enable encryption", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "You won't be able to disable the encryption anymore. Are you sure?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encrypted", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Encryption", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Encryption is not enabled", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ended the call", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Enter an email address", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Error obtaining location: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Font size", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Forward", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "From joining", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "From the invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Group", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Chat description", + "chatDescriptionHasBeenChanged": "Chat description changed", + "groupIsPublic": "Group is public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groups", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Group with {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Guests are forbidden", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Guests can join", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} has withdrawn the invitation for {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Help", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedMessages": "Hide redacted messages", + "hideRedactedMessagesBody": "If someone redacts a message, this message won't be visible in the chat anymore.", + "hideInvalidOrUnknownMessageFormats": "Hide invalid or unknown message formats", + "block": "Block", + "blockedUsers": "Blocked users", + "blockListDescription": "You can block users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal block list.", + "blockUsername": "Ignore username", + "iHaveClickedOnLink": "I have clicked on the link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Incorrect passphrase or recovery key", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invite contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invite contact to {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No chat description created yet.", + "tryAgain": "Try again", + "invalidServerName": "Invalid server name", + "invited": "Invited", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "The message will be redacted for all participants in this conversation. This cannot be undone.", + "optionalRedactReason": "(Optional) Reason for redacting this message...", + "invitedUser": "📩 {username} invited {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Invited users only", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} invited you to FluffyChat.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "is typing…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} joined the chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Join room", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} kicked {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} kicked and banned {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kick from chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Last active: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Leave", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Left the chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Light", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Load {count} more participants", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Export session and wipe device", + "dehydrateWarning": "This action cannot be undone. Ensure you safely store the backup file.", + "hydrate": "Restore from backup file", + "loadingPleaseWait": "Loading… Please wait.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Load more…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Location services are disabled. Please enable them to be able to share your location.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Location permission denied. Please grant them to be able to share your location.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Login", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Log in to {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logout", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mention", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Messages:", + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mute chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "New chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 New message in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "New verification request!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Next", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "No connection to the server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "No emotes found. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "You can only activate encryption as soon as the room is no longer publicly accessible.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging doesn't appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} is no matrix server, use {server2} instead?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Share invite link", + "scanQrCode": "Scan QR code", + "noPasswordRecoveryDescription": "You have not added a way to recover your password yet.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "No permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "No rooms found…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifications", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} users are typing…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtaining location…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online Key Backup is enabled", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oops! Unfortunately, an error occurred when setting up the push notifications.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oops, something went wrong…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Open app to read messages", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Open camera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "One of your clients has been logged out", + "addAccount": "Add account", + "editBundlesForAccount": "Edit bundles for this account", + "addToBundle": "Add to bundle", + "removeFromBundle": "Remove from this bundle", + "bundleName": "Bundle name", + "openInMaps": "Open in maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Link", + "or": "Or", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "passphrase or recovery key", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Password", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Password forgotten", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Password has been changed", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecoverySettings": "Password recovery settings", + "passwordRecovery": "Password recovery", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Please choose a pass code", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Please click on the link in the email and then proceed.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Please enter your password", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Please enter your pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Please enter your username", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Please follow the instructions on the website and tap on next.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Public Rooms", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Reason", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "Redacted by {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Direct chat", + "redactedByBecause": "Redacted by {username} because: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} redacted an event", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redact message", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Reject", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rejected the invitation", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Remove all other devices", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Unban from chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remove your avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Replace room with newer version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Reply", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Report message", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Room has been upgraded", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Room version", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Save file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Search", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Security", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Send", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Send a message", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Send as text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Send audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Send file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Send image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Send {count} image", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Send messages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Send video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} sent a file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} sent an audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} sent a picture", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} sent a sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} sent a video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sent call information", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Set as main alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Set chat description", + "setStatus": "Set status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Settings", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Share", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} shared their location", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Share location", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Skip", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Source code", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space is public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Space name", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} started a call", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "How are you today?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Submit", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizing… Please wait.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Synchronizing… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "They Don't Match", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "They Match", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Too many requests. Please try again later!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Try to send again", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} unbanned {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Unblock Device", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Unknown device", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Unknown encryption algorithm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Unknown event '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Unmute chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Unpin", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} and {count} others are typing…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} and {username2} are typing…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} is typing…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} left the chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} sent a {type} event", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Unverified", + "verified": "Verified", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Start Verification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "You successfully verified!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifying other account", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video call", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibility of the chat history", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible for all participants", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible for everyone", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voice message", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Waiting for partner to accept the request…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Waiting for partner to accept the emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Waiting for partner to accept the numbers…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Warning!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "We sent you an email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Who can perform which action", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Who is allowed to join this group", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Why do you want to report this?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "With these addresses you can recover your password.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Write a message…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Yes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "You", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "You are no longer participating in this chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "You have been banned from this chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Your public key", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Message info", + "time": "Time", + "sender": "Sender", + "openGallery": "Open gallery", + "removeFromSpace": "Remove from space", + "markAsRead": "Mark as read", + "reportUser": "Report user", + "reactedWith": "{sender} reacted with {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Pin to room", + "confirmEventUnpin": "Are you sure to permanently unpin the event?", + "emojis": "Emojis", + "placeCall": "Place call", + "voiceCall": "Voice call", + "unsupportedAndroidVersion": "Unsupported Android version", + "unsupportedAndroidVersionLong": "This feature requires a newer Android version. Please check for updates or Lineage OS support.", + "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", + "experimentalVideoCalls": "Experimental video calls", + "youRejectedTheInvitation": "You rejected the invitation", + "youJoinedTheChat": "You joined the chat", + "youAcceptedTheInvitation": "👍 You accepted the invitation", + "youBannedUser": "You banned {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "You have withdrawn the invitation for {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 You have been invited by {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 You invited {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 You kicked {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 You kicked and banned {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "You unbanned {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} has knocked", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Users must knock", + "noOneCanJoin": "No one can join", + "knock": "Knock", + "users": "Users", + "storeInAndroidKeystore": "Store in Android KeyStore", + "storeInAppleKeyChain": "Store in Apple KeyChain", + "storeSecurlyOnThisDevice": "Store securely on this device", + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "User", + "custom": "Custom", + "foregroundServiceRunning": "This notification appears when the foreground service is running.", + "screenSharingTitle": "screen sharing", + "screenSharingDetail": "You are sharing your screen in FuffyChat", + "whyIsThisMessageEncrypted": "Why is this message unreadable?", + "noKeyForThisMessage": "This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.", + "newSpace": "New space", + "doNotShowAgain": "Do not show again", + "wasDirectChatDisplayName": "Empty chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities.", + "encryptThisChat": "Encrypt this chat", + "disableEncryptionWarning": "For security reasons you can not disable encryption in a chat, where it has been enabled before.", + "sorryThatsNotPossible": "Sorry... that is not possible", + "reopenChat": "Reopen chat", + "noBackupWarning": "Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.", + "noOtherDevicesFound": "No other devices found", + "fileIsTooBigForServer": "Unable to send! The server only supports attachments up to {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "File has been saved at {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Jump to last read message", + "readUpToHere": "Read up to here", + "jump": "Jump", + "openLinkInBrowser": "Open link in browser", + "reportErrorDescription": "😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.", + "report": "report", + "setColorTheme": "Set color theme:", + "invite": "Invite", + "inviteGroupChat": "📨 Group chat invite", + "invalidInput": "Invalid input!", + "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Please enter a number greater than 0", + "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", + "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", + "removeDevicesDescription": "You will be logged out of this device and will no longer be able to receive messages.", + "banUserDescription": "The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.", + "unbanUserDescription": "The user will be able to enter the chat again if they try.", + "kickUserDescription": "The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.", + "makeAdminDescription": "Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.", + "pushNotificationsNotAvailable": "Push notifications not available", + "learnMore": "Learn more", + "yourGlobalUserIdIs": "Your global user-ID is: ", + "noUsersFoundWithQuery": "Unfortunately no user could be found with \"{query}\". Please check whether you made a typo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Knocking", + "chatCanBeDiscoveredViaSearchOnServer": "Chat can be discovered via the search on {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Search for #chats, @users...", + "nothingFound": "Nothing found...", + "groupName": "Group name", + "createGroupAndInviteUsers": "Create a group and invite users", + "groupCanBeFoundViaSearch": "Group can be found via search", + "wrongRecoveryKey": "Sorry... this does not seem to be the correct recovery key.", + "commandHint_sendraw": "Send raw json", + "databaseMigrationTitle": "Database is optimized", + "databaseMigrationBody": "Please wait. This may take a moment.", + "leaveEmptyToClearStatus": "Leave empty to clear your status.", + "select": "Select", + "searchForUsers": "Search for @users...", + "pleaseEnterYourCurrentPassword": "Please enter your current password", + "newPassword": "New password", + "pleaseChooseAStrongPassword": "Please choose a strong password", + "passwordsDoNotMatch": "Passwords do not match", + "passwordIsWrong": "Your entered password is wrong", + "publicChatAddresses": "Public chat addresses", + "createNewAddress": "Create new address", + "joinSpace": "Join space", + "publicSpaces": "Public spaces", + "addChatOrSubSpace": "Add chat or sub space", + "thisDevice": "This device:", + "initAppError": "An error occured while init the app", + "searchIn": "Search in chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Search more...", + "gallery": "Gallery", + "files": "Files", + "sessionLostBody": "Your session is lost. Please report this error to the developers at {url}. The error message is: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "The app now tries to restore your session from the backup. Please report this error to the developers at {url}. The error message is: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Send read receipts", + "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", + "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", + "formattedMessages": "Formatted messages", + "formattedMessagesDescription": "Display rich message content like bold text using markdown.", + "verifyOtherUser": "🔐 Verify other user", + "verifyOtherUserDescription": "If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭", + "verifyOtherDevice": "🔐 Verify other device", + "verifyOtherDeviceDescription": "When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It's best to have both devices handy before you start the verification. 🤳", + "acceptedKeyVerification": "{sender} accepted key verification", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} canceled key verification", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} completed key verification", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} is ready for key verification", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} requested key verification", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} started key verification", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Incoming messages", + "stickers": "Stickers", + "discover": "Discover", + "commandHint_ignore": "Ignore the given matrix ID", + "commandHint_unignore": "Unignore the given matrix ID", + "unreadChatsInApp": "{appname}: {unread} unread chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Database encryption is not supported on this platform", + "thereAreCountUsersBlocked": "Right now there are {count} users blocked.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Go to space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Mark as unread", + "userLevel": "{level} - User", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Change general chat settings", + "inviteOtherUsers": "Invite other users to this chat", + "changeTheChatPermissions": "Change the chat permissions", + "changeTheVisibilityOfChatHistory": "Change the visibility of the chat history", + "changeTheCanonicalRoomAlias": "Change the main public chat address", + "sendRoomNotifications": "Send a @room notifications", + "changeTheDescriptionOfTheGroup": "Change the description of the chat", + "chatPermissionsDescription": "Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.", + "updateInstalled": "🎉 Update {version} installed!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Changelog", + "sendCanceled": "Sending canceled", + "loginWithMatrixId": "Login with Matrix-ID", + "doesNotSeemToBeAValidHomeserver": "Doesn't seem to be a compatible homeserver. Wrong URL?", + "calculatingFileSize": "Calculating file size...", + "sendingAttachment": "Sending attachment...", + "oneOfYourDevicesIsNotVerified": "One of your devices is not verified", + "noticeChatBackupDeviceVerification": "Note: When you connect all your devices to the chat backup, they are automatically verified.", + "continueText": "Continue", + "blur": "Blur:", + "opacity": "Opacity:", + "setWallpaper": "Set wallpaper", + "manageAccount": "Manage account", + "noContactInformationProvided": "Server does not provide any valid contact information", + "contactServerAdmin": "Contact server admin", + "contactServerSecurity": "Contact server security", + "supportPage": "Support page", + "serverInformation": "Server information:", + "name": "Name", + "version": "Version", + "website": "Website", + "compress": "Compress", + "boldText": "Bold text", + "italicText": "Italic text", + "strikeThrough": "Strikethrough", + "pleaseFillOut": "Please fill out", + "invalidUrl": "Invalid url", + "addLink": "Add link", + "unableToJoinChat": "Unable to join chat. Maybe the other party has already closed the conversation.", + "previous": "Previous", + "otherPartyNotLoggedIn": "The other party is currently not logged in and therefore cannot receive messages!", + "appWantsToUseForLogin": "Use '{server}' to log in", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "You hereby allow the app and website to share information about you.", + "open": "Open", + "waitingForServer": "Waiting for server...", + "newChatRequest": "📩 New chat request", + "contentNotificationSettings": "Content notification settings", + "generalNotificationSettings": "General notification settings", + "roomNotificationSettings": "Room notification settings", + "userSpecificNotificationSettings": "User specific notification settings", + "otherNotificationSettings": "Other notification settings", + "notificationRuleContainsUserName": "Contains User Name", + "notificationRuleContainsUserNameDescription": "Notifies the user when a message contains their username.", + "notificationRuleMaster": "Mute all notifications", + "notificationRuleMasterDescription": "Overrides all other rules and disables all notifications.", + "notificationRuleSuppressNotices": "Suppress Automated Messages", + "notificationRuleSuppressNoticesDescription": "Suppresses notifications from automated clients like bots.", + "notificationRuleInviteForMe": "Invite for Me", + "notificationRuleInviteForMeDescription": "Notifies the user when they are invited to a room.", + "notificationRuleMemberEvent": "Member Event", + "notificationRuleMemberEventDescription": "Suppresses notifications for membership events.", + "notificationRuleIsUserMention": "User Mention", + "notificationRuleIsUserMentionDescription": "Notifies the user when they are directly mentioned in a message.", + "notificationRuleContainsDisplayName": "Contains Display Name", + "notificationRuleContainsDisplayNameDescription": "Notifies the user when a message contains their display name.", + "notificationRuleIsRoomMention": "Room Mention", + "notificationRuleIsRoomMentionDescription": "Notifies the user when there is a room mention.", + "notificationRuleRoomnotif": "Room Notification", + "notificationRuleRoomnotifDescription": "Notifies the user when a message contains '@room'.", + "notificationRuleTombstone": "Tombstone", + "notificationRuleTombstoneDescription": "Notifies the user about room deactivation messages.", + "notificationRuleReaction": "Reaction", + "notificationRuleReactionDescription": "Suppresses notifications for reactions.", + "notificationRuleRoomServerAcl": "Room Server ACL", + "notificationRuleRoomServerAclDescription": "Suppresses notifications for room server access control lists (ACL).", + "notificationRuleSuppressEdits": "Suppress Edits", + "notificationRuleSuppressEditsDescription": "Suppresses notifications for edited messages.", + "notificationRuleCall": "Call", + "notificationRuleCallDescription": "Notifies the user about calls.", + "notificationRuleEncryptedRoomOneToOne": "Encrypted Room One-to-One", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifies the user about messages in encrypted one-to-one rooms.", + "notificationRuleRoomOneToOne": "Room One-to-One", + "notificationRuleRoomOneToOneDescription": "Notifies the user about messages in one-to-one rooms.", + "notificationRuleMessage": "Message", + "notificationRuleMessageDescription": "Notifies the user about general messages.", + "notificationRuleEncrypted": "Encrypted", + "notificationRuleEncryptedDescription": "Notifies the user about messages in encrypted rooms.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Notifies the user about Jitsi widget events.", + "notificationRuleServerAcl": "Suppress Server ACL Events", + "notificationRuleServerAclDescription": "Suppresses notifications for Server ACL events.", + "unknownPushRule": "Unknown push rule '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Voice message from {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "If you delete this notification setting, this can not be undone.", + "more": "More", + "shareKeysWith": "Share keys with...", + "shareKeysWithDescription": "Which devices should be trusted so that they can read along your messages in encrypted chats?", + "allDevices": "All devices", + "crossVerifiedDevicesIfEnabled": "Cross verified devices if enabled", + "crossVerifiedDevices": "Cross verified devices", + "verifiedDevicesOnly": "Verified devices only", + "takeAPhoto": "Take a photo", + "recordAVideo": "Record a video", + "optionalMessage": "(Optional) message...", + "notSupportedOnThisDevice": "Not supported on this device", + "enterNewChat": "Enter new chat", + "approve": "Approve", + "youHaveKnocked": "You have knocked", + "pleaseWaitUntilInvited": "Please wait now, until someone from the room invites you.", + "commandHint_logout": "Logout your current device", + "commandHint_logoutall": "Logout all active devices", + "displayNavigationRail": "Show navigation rail on mobile", + "customReaction": "Custom reaction", + "moreEvents": "More events", + "showMore": "Show more", + "showLess": "Show less", + "declineInvitation": "Decline invitation", + "noMessagesYet": "No messages yet", + "longPressToRecordVoiceMessage": "Long press to record voice message.", + "pause": "Pause", + "resume": "Resume", + "removeFromSpaceDescription": "The chat will be removed from the space but still appear in your chat list.", + "countChats": "{chats} chats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Space member of {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Space member of {spaces} can knock", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Start poll", + "endPoll": "End poll", + "answersVisible": "Answers visible", + "pollQuestion": "Poll question", + "answerOption": "Answer option", + "addAnswerOption": "Add answer option", + "allowMultipleAnswers": "Allow multiple answers", + "pollHasBeenEnded": "Poll has been ended", + "countVotes": "{count, plural, =1{One vote} other{{count} votes}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Answers will be visible when poll has ended", + "replyInThread": "Reply in thread", + "countReplies": "{count, plural, =1{One reply} other{{count} replies}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Thread", + "backToMainChat": "Back to main chat", + "saveChanges": "Save changes", + "createSticker": "Create sticker or emoji", + "useAsSticker": "Use as sticker", + "useAsEmoji": "Use as emoji", + "stickerPackNameAlreadyExists": "Sticker pack name already exists", + "newStickerPack": "New sticker pack", + "stickerPackName": "Sticker pack name", + "attribution": "Attribution", + "skipChatBackup": "Skip chat backup", + "skipChatBackupWarning": "Are you sure? Without enabling the chat backup you may lose access to your messages if you switch your device.", + "noMoreResultsFound": "No more results found", + "chatSearchedUntil": "Chat searched until {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Federation Base URL", + "clientWellKnownInformation": "Client-Well-Known Information:", + "baseUrl": "Base URL", + "identityServer": "Identity Server:", + "versionWithNumber": "Version: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logs", + "advancedConfigs": "Advanced Configs", + "advancedConfigurations": "Advanced configurations", + "signIn": "Sign in", + "createNewAccount": "Create new account", + "signUpGreeting": "FluffyChat is decentralized! Select a server where you want to create your account and let's go!", + "signInGreeting": "You already have an account in Matrix? Welcome back! Select your homeserver and sign in.", + "theProcessWasCanceled": "The process was canceled.", + "join": "Join", + "searchOrEnterHomeserverAddress": "Search or enter homeserver address", + "matrixId": "Matrix ID", + "setPowerLevel": "Set power level", + "makeModerator": "Make moderator", + "makeAdmin": "Make admin", + "removeModeratorRights": "Remove moderator rights", + "removeAdminRights": "Remove admin rights", + "powerLevel": "Power level", + "setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100.", + "owner": "Owner", + "mute": "Mute", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Create new chat", + "reset": "Reset", + "supportFluffyChat": "Support FluffyChat", + "support": "Support", + "setLowPriority": "Set low priority", + "unsetLowPriority": "Unset low priority", + "playSoundOnNotification": "Play sound on notification", + "addTag": "Add tag", + "removeTag": "Remove tag", + "tagName": "Tag name", + "createNewTag": "Create new tag", + "hideRoomsInSpaces": "Hide rooms that are in a space", + "possibleByYou": "This release was only possible thanks to your support. FluffyChat remains free, open-source, and entirely community-driven.", + "showThumbnailsInTimeline": "Show thumbnails of images and videos", + "appSubtitle": "Secure [matrix] Communication", + "appDescription": "Communicate encrypted over the decentralized [matrix] network in an easy and accessible way for everyone.", + "interactiveVerification": "Interactive verification", + "interactiveVerificationDescription": "If you are next to each other or communicate via a secure channel then you can verify all devices at once by comparing a security number or emojis.", + "countUnverifiedDevices": "{count} unverified devices in the chat.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Encrypted message", + "unencryptedMessage": "Unencrypted message", + "messageCanOnlyBeReadByUser": "Your message is end to end encrypted and can only be read by this user:", + "messageCanOnlyBeReadByUsers": "Your message is end to end encrypted and can only be read by these users:", + "publicKey": "Public key: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Device identity key", + "restoreBootstrapEmptyDevicesDescription": "Please enter your passphrase or recovery key to verify this device and get access to your encrypted message backup.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Please pick one of your other devices, to verify this session:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Reset account", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Restore Crypto Identity", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Reset Crypto Identity", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Set Up Crypto Identity", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Waiting for keys... Please keep the other device active.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "No keys transmitted. Please try again.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Unlock", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Open file", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "When you reset your account you will lose the access to your old messages forever. All your current devices need to be verified again. Please only perform this action when you have no other devices left to verify your session and you have lost your recovery key and passphrase!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat uses end to end encryption. To not lose your messages, please choose a strong passphrase to secure your crypto identity and your encrypted message backup.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "New passphrase", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Repeat passphrase", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Passphrases match", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "At least 12 characters long.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Contains uppercase and lowercase characters.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Contains special characters.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Contains one numbers.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Please note down your recovery key to be able to restore your encrypted messages and your crypto identity on.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Save as file", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "You are ready to start!", + "noUserKeyFound": "No user key found", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Known since: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Unsigned device", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Signed device", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "No curve25519 key found", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Message not decryptable", + "today": "Today", + "sending": "Sending", + "generatingThumbnail": "Generating thumbnail", + "encrypting": "Encrypting", + "uploading": "Uploading", + "edited": "(edited)", + "couldNotBeSent": "Could not be sent", + "yesterday": "Yesterday", + "resetRecoveryKey": "Reset recovery key", + "pleaseEnter6Digits": "Please enter 6 digits to enable the app lock.", + "disableAppLock": "Disable app lock", + "disableAppLockAreYouSure": "Are you sure you want to disable the app lock?", + "enableBiometrics": "Enable biometric authentication", + "disableBiometrics": "Disable biometric authentication", + "biometricsDescription": "With biometric authentication you can unlock the app with your face or your fingerprint. The capabilities depend on your device.", + "useAppLock": "Use app lock", + "unlockWithBiometrics": "Unlock with biometric authentication", + "resetPin": "Reset pin", + "forwardCountMessages": "Forward {count, plural, =1{one message} other{{count} messages}}?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_eo.arb b/lib/l10n/intl_eo.arb new file mode 100644 index 0000000000..21ab284ba9 --- /dev/null +++ b/lib/l10n/intl_eo.arb @@ -0,0 +1,2132 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.107750", + "about": "Prio", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Akcepti", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} akceptis la inviton", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} aktivigis tutvojan ĉifradon", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Aldoni retpoŝtadreson", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administranto", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "kromnomo", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Ĉio", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} respondis la vokon", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Ĉiu ajn povas aliĝi", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Ŝlosado", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arĥivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Ĉu gastoj rajtas aliĝi", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ĉu vi certas?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ĉu vi certe volas adiaŭi?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Por ke vi povu kontroli (subskribi) la alian personon, bonvolu enigi pasfrazon de via sekreta deponejo aŭ vian rehavan ŝlosilon.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Ĉu akcepti ĉi tiun kontrolpeton de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "La hejmservilo subtenas la jenajn specojn de salutoj:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Forbari de babilo", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Forbarita", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} forbaris uzanton {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloki aparaton", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokita", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Nuligi", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ne povis malfermi URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Ŝanĝi nomon de aparato", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ŝanĝis bildon de la babilo", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ŝanĝis permesojn pri la babilo", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ŝanĝis sian prezentan nomon al: {username}", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ŝanĝis regulojn pri aliro de gastoj", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ŝanĝis regulojn pri aliro de gastoj al: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ŝanĝis videblecon de la historio", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ŝanĝis videblecon de la historio al: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ŝanĝis regulojn pri aliĝado", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ŝanĝis regulojn pri aliĝado al: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ŝanĝis sian profilbildon", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ŝanĝis la kromnomojn de la ĉambro", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ŝanĝis la invitan ligilon", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Ŝanĝi pasvorton", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ŝanĝi hejmservilon", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ŝanĝu la haŭton", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ŝanĝi nomon de la grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ŝanĝi vian profilbildon", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "La ĉifrado estas difektita", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Babilo", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Savkopiado de babilo", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detaloj pri babilo", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Babiloj", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Elektu fortan pasvorton", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Vakigi arĥivon", + "close": "Fermi", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Forbari la donitan uzanton de ĉi tiu ĉambro", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Sendi tekston formatan je HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Inviti la donitan uzanton al ĉi tiu ĉambro", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Aliĝi al la donita ĉambro", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Forigi la donitan uzanton de ĉi tiu ĉambro", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Foriri de ĉi tiu ĉambro", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Priskribu vian agon", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Agordi vian profilbildon por ĉi tiu ĉambro (laŭ mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Agordi vian prezentan nomon en ĉi tiu ĉambro", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Agordi povnivelon de la donita uzanto (implicite: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Sendi senformatan tekston", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Sendi respondon kiel reagon", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_unban": "Malforbari la donitan uzanton de ĉi tiu ĉambro", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Nevalida ordono", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} ne estas ordono.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Komparu kaj certigu, ke la jenaj bildosignoj samas en ambaŭ aparatoj:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Komparu kaj certigu, ke la jenaj numeroj samas en ambaŭ aparatoj:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Agordi babilon", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakto invitiĝis al la grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "La enhavo raportiĝis al la administrantoj de la servilo", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopiite al tondujo", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopii", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopii al tondujo", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Ne povis malĉifri mesaĝon: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} partoprenantoj", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Krei", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} kreis la babilon", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Nova aro", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Nun aktiva", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Malhela", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ĉi tio malaktivigos vian konton de uzanto. Ne eblas tion malfari! Ĉu certe vi certas?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Norma nivelo de permesoj", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Forigi", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Forigi konton", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Forigi mesaĝon", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Aparatoj", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Rektaj babiloj", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prezenta nomo ŝanĝiĝis", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Elŝuti dosieron", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Redakti", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Redakti blokitajn servilojn", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Redakti prezentan nomon", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Ŝanĝi kromnomojn de ĉambro", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Redakti bildon de ĉambro", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Mieneto jam ekzistas!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Nevalida mallongigo de mieneto!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Agordoj pri mienetoj", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Mallongigo de mieneto", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Malplena babilo", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Ŝalti mienetaron ĉie", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ŝalti ĉifradon", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Vi ne povos malŝalti la ĉifradon. Ĉu vi certas?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Ĉifrite", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Ĉifrado", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Ĉifrado ne estas ŝaltita", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} finis la vokon", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Enigu retpoŝtadreson", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Eraris akirado de loko: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Grandeco de tiparo", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Plusendi", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Ekde aliĝo", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Ekde la invito", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupo estas publika", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupoj", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo kun {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gastoj estas malpermesitaj", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gastoj povas aliĝi", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} nuligis la inviton por {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Helpo", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Kaŝi nekonatajn eventojn", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Malatenti", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Malatentitaj uzantoj", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Mi klakis la ligilon", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Neĝusta pasfrazo aŭ rehava ŝlosilo", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Inviti kontakton", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Inviti kontakton al {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitita", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} invitis uzanton {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Nur invititoj", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} invitis vin al FluffyChat. \n1. Instalu la aplikaĵon FluffyChat: https://fluffychat.im \n2. Registriĝu aŭ salutu \n3. Malfermu la invitan ligilon: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "tajpas…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} aliĝis al la babilo", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Aliĝi al ĉambro", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} forpelis uzanton {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} forpelis kaj forbaris uzanton {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Forpeli de babilo", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Lastafoje aktiva: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Foriri", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Foriris de la ĉambro", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Hela", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Enlegi {count} pliajn partoprenantojn", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Enlegante… bonvolu atendi.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Enlegi pli…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Saluti", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Saluti servilon {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Adiaŭi", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencii", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mesaĝoj", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Reguligisto", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silentigi babilon", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova babilo", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nova mesaĝo en FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova kontrolpeto!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Sekva", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Neniu konekto al la servilo", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Neniuj mienetoj troviĝis. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Vi nur povas aktivigi ĉifradon kiam la ĉambro ne plu estas publike alirebla.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Ŝajnas, ke via telefono ne havas servojn de Google. Tio estas bona decido por via privateco! Por ricevadi pasivajn sciigojn en FluffyChat, ni rekomendas, ke vi uzu la https://microg.org/ aŭ https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Vi ankoraŭ ne aldonis manieron rehavi vian pasvorton.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Neniu permeso", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Neniuj ĉambroj troviĝis…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Sciigoj", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} uzantoj tajpas…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Akirante lokon…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "bone", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Enreta savkopiado de ŝlosiloj estas ŝaltita", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oj! Bedaŭrinde eraris la agordado de pasivaj sciigoj.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oj! Io misokazis…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Malfermu la aplikaĵon por legi mesaĝojn", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Malfermi fotilon", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "Aŭ", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Partoprenanto", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "pasfrazo aŭ rehava ŝlosilo", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Pasvorto", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Forgesita pasvorto", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Pasvorto ŝanĝiĝis", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Rehavo de pasvorto", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fiksi", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Bonvolu elekti paskodon", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Bonvolu klaki la ligilon en la retletero kaj pluiĝi.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Bonvolu enigi vian pasvorton", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Bonvolu enigi vian personan identigan numeron", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Bonvolu enigi vian uzantonomon", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Bonvolu sekvi la instrukciojn de la retejo kaj tuŝetu al «Sekva».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privateco", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publikaj ĉambroj", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Kialo", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} obskurigis eventon", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Obskurigi mesaĝon", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Rifuzi", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rifuzis la inviton", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Forigi", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Forigi ĉiujn aliajn aparatojn", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Malforbari", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Forigi vian profilbildon", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Anstataŭigi ĉambron per nova versio", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Respondi", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Raporti mesaĝon", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Ĉambro gradaltiĝis", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versio de ĉambro", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Konservi dosieron", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Serĉi", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sekureco", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Sendi", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Sendi mesaĝon", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Sendi sondosieron", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Sendi dosieron", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Sendi bildon", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Sendi mesaĝojn", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Sendi filmon", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} sendis dosieron", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} sendis sondosieron", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} sendis bildon", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} sendis glumarkon", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} sendis filmon", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sendis informojn pri voko", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Agordi kiel ĉefan kromnomon", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Agordi staton", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Agordoj", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Konigi", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} konigis sian lokon", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Konigi lokon", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Preterpasi", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Fontkodo", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Aro estas publika", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nomo de aro", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} komencis vokon", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stato", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kiel vi fartas?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Sendi", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Spegulante… Bonvolu atendi.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ili ne akordas", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Ili akordas", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Tro multaj petoj. Bonvolu reprovi poste!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Reprovi sendi", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} malforbaris uzanton {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Malbloki aparaton", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Nekonata aparato", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nekonata ĉifra algoritmo", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nekonata evento «{type}»", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Malsilentigi babilon", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Malfiksi", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} kaj {count} aliaj tajpas…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} kaj {username2} tajpas…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} tajpas…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} foriris de la babilo", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} sendis eventon de speco {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Kontrolita", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Komenci kontrolon", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Vi sukcese kontrolis!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Kontrolante alian konton", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Vidvoko", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Videbleco de historio de la babilo", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Videbla al ĉiuj partoprenantoj", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Videbla al ĉiuj", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voĉmesaĝo", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Atendante konfirmon de peto de la kunulo…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Atendante akcepton de la bildosignoj de la kunulo…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Atendante akcepton de la numeroj, de la kunulo…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Averto!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Ni sendis retleteron al vi", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kiu povas kion", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kiu rajtas aliĝi al ĉi tiu grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kial vi volas tion ĉi raporti?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Per tiuj ĉi adresoj vi povas rehavi vian pasvorton.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skribi mesaĝon…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Jes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vi", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Vi ne plu partoprenas ĉi tiun babilon", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Vi estas forbarita de ĉi tiu babilo", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Via publika ŝlosilo", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Sendi kiel tekston", + "@sendAsText": { + "type": "String" + }, + "noMatrixServer": "{server1} ne estas matriksa servilo, eble provu anstataŭe servilon {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "commandHint_send": "Sendi tekston", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "autoplayImages": "Memage ludi movbildajn glumarkojn kaj mienetojn", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Aldoni al aro", + "sendOnEnter": "Sendi per eniga klavo", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb new file mode 100644 index 0000000000..208d64fefd --- /dev/null +++ b/lib/l10n/intl_es.arb @@ -0,0 +1,2572 @@ +{ + "@@locale": "es", + "@@last_modified": "2021-08-14 12:41:10.097243", + "about": "Acerca de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} aceptó la invitación", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Cuenta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activó el cifrado de extremo a extremo", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Añadir dirección de correo", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrador", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} respondió a la llamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Cualquiera puede unirse", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "¿Pueden los usuarios invitados unirse?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "¿Estás seguro?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "¿Confirma que quiere cerrar sesión?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poder confirmar a la otra persona, ingrese su contraseña de almacenamiento segura o la clave de recuperación.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "¿Aceptar esta solicitud de verificación de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "El servidor soporta los siguientes mecanismos para autenticación:\n{serverVersions}\npero esta aplicación sólo soporta:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Vetar del chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetado", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} vetó a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Cambiar el nombre del dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} cambió el icono del chat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} cambió los permisos del chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} cambió su nombre visible a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} cambió las reglas de acceso de visitantes", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} cambió las reglas de acceso de visitantes a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} cambió la visibilidad del historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} cambió la visibilidad del historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} cambió las reglas de ingreso", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} cambió las reglas de ingreso a {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} cambió su imagen de perfil", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} cambió el alias de la sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} cambió el enlace de invitación", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Cambiar la contraseña", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Cambiar el servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambia tu estilo", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Cambiar el nombre del grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "El cifrado se ha corrompido", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Copia de respaldo del chat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalles del chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversaciones", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Elija una contraseña segura", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Borrar archivo", + "close": "Cerrar", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Por favor compare los emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Por favor compare los números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "El contacto ha sido invitado al grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado al portapapeles", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar al portapapeles", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "No se pudo descifrar el mensaje: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crear", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬{username} creó el chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Actualmente activo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Oscuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Se desactivará su cuenta de usuario. ¡La operación no se puede cancelar! ¿Está seguro?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Cancelar cuenta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Eliminar mensaje", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "El nombre visible ha cambiado", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descargar archivo", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nombre visible", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar alias de la sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "¡El emote ya existe!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "¡El atajo del emote es inválido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configuración de emotes", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Atajo de emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Chat vacío", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Habilitar paquete de emoticonos a nivel general", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ya no podrá deshabilitar el cifrado. ¿Estás seguro?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Cifrado", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "El cifrado no está habilitado", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} terminó la llamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Introducir una dirección de correo electrónico", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenviar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Desde que se unió", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Desde la invitación", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "El grupo es público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Los visitantes están prohibidos", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Los visitantes pueden unirse", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha retirado la invitación para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ayuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ocultar sucesos desconocidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuarios ignorados", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de contraseña o clave de recuperación incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invitar contacto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invitar contacto a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitado", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩{username} invitó a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Sólo usuarios invitados", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} te invitó a FluffyChat.\n1.Visita fluffychat.im e instala la app\n2. Regístrate o inicia sesión\n3. Abre el enlace de invitación:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está escribiendo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋{username} se unió al chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Unirse a la sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞{username} echó a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅{username} echó y vetó a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Echar del chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Última vez activo: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abandonar", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Abandonó el chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Mostrar {count} participantes más", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Cargando… Por favor espere.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Mostrar más…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Acceso", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Iniciar sesión en {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Cerrar sesión", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenciar chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nuevo mensaje en FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "¡Nueva solicitud de verificación!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Siguiente", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ningún emote encontrado. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Sólo se puede activar el cifrado en cuanto la sala deja de ser de acceso público.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Parece que no tienes servicios de Firebase Cloud Messaging en tu dispositivo. Para recibir de todas formas notificaciones, recomendamos instalar ntfy. Con ntfy o cualquier proveedor Unified Push, puedes recibir notificaciones manteniendo seguridad de datos. Puedes descargar ntfy de la PlayStore o de F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sin autorización", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Ninguna sala encontrada…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La copia de seguridad de la clave en línea está habilitada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, algo salió mal…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abrir la aplicación para leer los mensajes", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir cámara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "contraseña o clave de recuperación", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contraseña", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La contraseña ha sido cambiada", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Haga clic en el enlace del correo electrónico y luego continúe.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Por favor ingrese su contraseña", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Por favor ingrese su nombre de usuario", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Por favor, siga las instrucciones del sitio web y presione \"siguiente\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidad", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} censuró un suceso", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Rechazar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rechazó la invitación", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Eliminar", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Eliminar todos los otros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Eliminar la expulsión", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La sala ha subido de categoría", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versión de sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Enviar un mensaje", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Enviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar un archivo", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar una imagen", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} envió un archivo", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} envió un audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} envió una imagen", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} envió un sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} envió un video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} envió información de la llamada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Fijar alias principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Establecer estado", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ajustes", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Compartir", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} compartió la ubicación", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Omitir", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Código fuente", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} comenzó una llamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "¿Cómo estás hoy?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Enviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "No coinciden", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Coinciden", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Intentar enviar nuevamente", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} admitió a {targetName} nuevamente", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloquear dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo desconocido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo de cifrado desconocido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento desconocido '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Dejar de silenciar el chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Despinchar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} y {count} más están escribiendo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} y {username2} están escribiendo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está escribiendo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} abandonó el chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} envió un evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Comenzar verificación", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "¡Has verificado exitosamente!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificando la otra cuenta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video llamada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilidad del historial del chat", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible para todos los participantes", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible para todo el mundo", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mensaje de voz", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Esperando a que el socio acepte la solicitud…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Esperando a que el socio acepte los emojis…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Esperando a que el socio acepte los números…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "¡Advertencia!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Te enviamos un correo electrónico", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Quién tiene permitido unirse al grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escribe un mensaje…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sí", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Tú", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ya no estás participando en este chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Has sido vetado de este chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Reproducir emoticonos y stickers animados automáticamente", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Agregar al espacio", + "cantOpenUri": "No puedo abrir el URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "all": "Todo", + "@all": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueo de aplicación", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Se ha cerrado en la sesión de uno de sus clientes", + "addAccount": "Añadir cuenta", + "editBundlesForAccount": "Editar paquetes para esta cuenta", + "addToBundle": "Agregar al paquete", + "bundleName": "Nombre del paquete", + "saveFile": "Guardar el archivo", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Compartir ubicación", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "status": "Estado", + "@status": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizando... por favor espere.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "He hecho clic en el enlace", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chat directo", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Error al obtener la ubicación: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Aún no ha agregado una forma de recuperar su contraseña.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuarios están escribiendo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "El espacio es público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Comando inválido", + "@commandInvalid": { + "type": "String" + }, + "passwordRecovery": "Recuperación de contraseña", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "security": "Seguridad", + "@security": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueado", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sin conexión al servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Tu clave pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contraseña olvidada", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "reason": "Razón", + "@reason": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nuevo espacio", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificaciones", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Reemplazar habitación con una versión más nueva", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "El contenido ha sido reportado a los administradores del servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Mensaje de informe", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "search": "Buscar", + "@search": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permiso de ubicación denegado. Concédeles que puedan compartir tu ubicación.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permiso predeterminado para nuevo usuarios", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Obteniendo ubicación…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "tooManyRequestsWarning": "Demasiadas solicitudes. ¡Por favor inténtelo más tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Con esta dirección puede recuperar su contraseña.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_send": "Enviar texto", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "oopsPushError": "¡Ups! Desafortunadamente, se produjo un error al configurar las notificaciones push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Quitar tu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Habilitar la encriptación", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensajes", + "@messages": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Tamaño de fuente", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Prohibir al usuario dado en esta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_unban": "Des banear al usuario dado en esta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandMissing": "{command} no es un comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "scanQrCode": "Escanear código QR", + "newChat": "Nuevo chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Únete a la sala indicada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "sendOnEnter": "Enviar con enter", + "changeYourAvatar": "Cambiar tu avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Descríbete", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_html": "Enviar texto con formato HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Invitar al usuario indicado a esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_kick": "Eliminar el usuario indicado de esta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Deja esta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Selecciona tu foto para esta sala (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Establece tu nombre para mostrar para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Establece el nivel de potencia del usuario dado (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar texto sin formato", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar respuesta como reacción", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "editRoomAvatar": "Editar avatar de sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Los servicios de ubicación están deshabilitado. Habilite para poder compartir su ubicación.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encriptado", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} no es un servidor matrix, usar {server2} en su lugar?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "openInMaps": "Abrir en maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Quitar de este paquete", + "link": "Link", + "pleaseChooseAPasscode": "Elija un código de acceso", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Por favor ingrese su pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Censurar mensaje", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensajes", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nombre del espacio", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Quién puede realizar qué acción", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "¿Por qué quieres denunciar esto?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "unverified": "No verificado", + "commandHint_clearcache": "Limpiar cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "messageInfo": "Información del mensaje", + "time": "Tiempo", + "repeatPassword": "Repite la contraseña", + "removeFromSpace": "Eliminar del espacio", + "openGallery": "Abrir galería", + "commandHint_discardsession": "Descartar sesión", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "newSpace": "Nuevo espacio", + "commandHint_markasgroup": "Marcar como grupo", + "youRejectedTheInvitation": "Rechazaste la invitación", + "users": "Usuarios", + "youInvitedBy": "📩 Has sido invitado por {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Aceptaste la invitación", + "commandHint_cuddle": "Enviar un abrazo", + "supposedMxid": "Esto debería ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "importFromZipFile": "Importar de un archivo .zip", + "exportEmotePack": "Exportar paquete de emotes a .zip", + "sendTypingNotifications": "Enviar notificaciones \"está escribiendo\"", + "importEmojis": "Importar emojis", + "confirmMatrixId": "Por favor confirma tu Matrix ID para borrar tu cuenta.", + "notAnImage": "El archivo no es una imagen.", + "commandHint_hug": "Mandar un abrazo", + "importNow": "Importar ahora", + "hugContent": "{senderName} te abraza", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "countFiles": "{count} archivos", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "reportUser": "Reportar usuario", + "voiceCall": "Llamada de voz", + "reactedWith": "{sender} reaccionó con {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "markAsRead": "Marcar como leído", + "replace": "Reemplazar", + "unsupportedAndroidVersionLong": "Esta característica requiere una versión más reciente de Android. Por favor, compruebe las actualizaciones o la compatibilidad de LineageOS.", + "storeSecurlyOnThisDevice": "Almacenar de forma segura en este dispositivo", + "screenSharingDetail": "Usted está compartiendo su pantalla en FluffyChat", + "unsupportedAndroidVersion": "Versión de Android no compatible", + "commandHint_create": "Crear un chat grupal vacío\nUse --no-encryption para deshabilitar el cifrado", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "user": "Usuario", + "tryAgain": "Inténtelo de nuevo", + "youKickedAndBanned": "🙅 Usted expulsó y prohibió el acceso a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "messagesStyle": "Mensajes:", + "chatDescription": "Descripción del chat", + "storeInAppleKeyChain": "Almacenar en la KeyChain de Apple", + "hydrate": "Restaurar desde fichero de copia de seguridad", + "invalidServerName": "Nombre del servidor no válido", + "chatPermissions": "Permisos del chat", + "sender": "Remitente", + "storeInAndroidKeystore": "Almacenar en la KeyStore de Android", + "whyIsThisMessageEncrypted": "¿Por qué no se puede leer este mensaje?", + "setChatDescription": "Establecer descripción del chat", + "dehydrateWarning": "Esta acción no se puede deshacer. Asegúrese de que ha almacenado de forma segura el fichero de copia de seguridad.", + "redactedBy": "Censurado por {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Tenga en cuenta que las videollamadas están actualmente en fase beta. Es posible que no funcionen como se espera o que no funcionen de ninguna manera en algunas plataformas.", + "optionalRedactReason": "(Opcional) Motivo para censurar este mensaje...", + "dehydrate": "Exportar sesión y limpiar dispositivo", + "experimentalVideoCalls": "Videollamadas experimentales", + "redactedByBecause": "Censurado por {username} porque: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Usted retiró la invitación a {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "confirmEventUnpin": "¿Seguro que quiere desfijar permanentemente el evento?", + "youInvitedUser": "📩 Usted invitó a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "redactMessageDescription": "El mensaje será censurado para todas las personas participantes en la conversación. Esto no se puede deshacer.", + "doNotShowAgain": "No mostrar de nuevo", + "screenSharingTitle": "Compartir la pantalla", + "youBannedUser": "Usted prohibió el acceso a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "directChat": "Chat directo", + "foregroundServiceRunning": "Esta notificación aparece cuando el servicio en segundo plano se está ejecutando.", + "wasDirectChatDisplayName": "Chat vacío (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No se ha creado una descripción del chat aún.", + "chatDescriptionHasBeenChanged": "Se ha cambiado la descripción del chat", + "youKicked": "👞 Usted expulsó a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "shareInviteLink": "Compartir enlace de invitación", + "commandHint_markasdm": "Marcar como sala de mensajes directos para el ID de Matrix", + "emoteKeyboardNoRecents": "Los emotes usados recientemente aparecerán aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Usted se ha unido al chat", + "commandHint_dm": "Iniciar un chat directo\nUse --no-encryption para deshabilitar el cifrado", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "youUnbannedUser": "Usted volvió a permitir el acceso a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "emojis": "Emojis", + "createGroup": "Crear grupo", + "custom": "Personalizado", + "pinMessage": "Anclar a la sala", + "googlyEyesContent": "{senderName} te manda ojos saltones", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} se acurruca contigo", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Enviar unos ojos saltones", + "noChatsFoundHere": "No se han encontrado chats. Inicia un nuevo chat usando el botón de abajo. ⤵️", + "space": "Espacio", + "block": "Bloquear", + "blockListDescription": "Puedes bloquear usuarios que te estén molestando. No podrás recibir mensajes ni invitaciones de chat de los usuarios de tu lista de bloqueo.", + "aboutHomeserver": "Acerca de {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "unread": "No leídos", + "swipeRightToLeftToReply": "Desliza a la izquierda para responder", + "hideRedactedMessagesBody": "Si alguien elimina un mensaje, este mensaje ya no será visible en el chat.", + "hideInvalidOrUnknownMessageFormats": "Esconde formatos de mensajes inválidos o desconocidos", + "hideRedactedMessages": "Esconde mensajes eliminados", + "appLockDescription": "Bloquear la aplicación cuando no se use con código pin", + "accessAndVisibility": "Acceso y visibilidad", + "globalChatId": "ID de chat Global", + "accessAndVisibilityDescription": "A quién se le permite unirse a este chat y cómo se puede descubrir el chat.", + "calls": "Llamadas", + "customEmojisAndStickers": "Emojis y stickers personalizados", + "customEmojisAndStickersBody": "Agrega o comparte emojis y stickers personalizados que se pueden utilizar en cualquier chat.", + "blockedUsers": "Usuarios bloqueados", + "blockUsername": "Ignorar nombre de usuario", + "noMoreChatsFound": "No se encontraron más chats...", + "placeCall": "Llamar", + "disableEncryptionWarning": "Por motivos de seguridad no es posible deshabilitar el cifrado en un chat si ha sido habilitado previamente.", + "setColorTheme": "Poner tema de color:", + "inviteGroupChat": "📨 Invitar a grupo", + "invalidInput": "¡Entrada no válida!", + "wrongPinEntered": "¡Pin erróneo! Vuelve a intenrarlo en {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "thisDevice": "Este dispositivo:", + "verifyOtherDevice": "🔐 Verificar otro dispositivo", + "chatPermissionsDescription": "Definir el nivel necesario para ciertas acciones en este chat. Los niveles 0, 50 y 100 habitualmente representan usuarios, moderadores y administradores, pero se puede establecer cualquier escala.", + "updateInstalled": "¡🎉 Actualización {version} instalada!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Cambios", + "sendCanceled": "Envío cancelado", + "invite": "Invitar", + "searchIn": "Buscar en chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Usar '{server}' para entrar", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Por la presente permites a la app y web compartir información sobre ti.", + "encryptThisChat": "Cifrar este chat", + "select": "Elegir", + "newPassword": "Nueva clave", + "nothingFound": "No se encontró nada...", + "openLinkInBrowser": "Abrir enlace en navegador", + "learnMore": "Aprender más", + "incomingMessages": "Mensajes entrantes", + "noOtherDevicesFound": "No se han encontrado otros dispositivos", + "generalNotificationSettings": "Ajustes de notificación generales", + "roomNotificationSettings": "Ajustes de notificación de salas", + "userSpecificNotificationSettings": "Ajustes de notificación por usuario", + "contentNotificationSettings": "Ajustes de notificación de contenido", + "otherNotificationSettings": "Otros ajustes de notificación", + "notificationRuleContainsUserName": "Contiene nombre de usuario", + "notificationRuleContainsUserNameDescription": "Notifica al usuario cuando un mensaje contiene su nombre de usuario.", + "notificationRuleMaster": "Silenciar todas las notificaciones", + "notificationRuleMasterDescription": "Anula todas las demás reglas y desactiva todas las notificaciones.", + "notificationRuleSuppressNotices": "Suprimir los mensajes automáticos", + "notificationRuleSuppressNoticesDescription": "Suprimir notificaciones de clientes automáticos, como bots.", + "notificationRuleInviteForMe": "Invitación para mí", + "notificationRuleInviteForMeDescription": "Notifica al usuario cuando se les invita a una sala.", + "notificationRuleMemberEvent": "Evento para miembros", + "notificationRuleMemberEventDescription": "Suprimir notificaciones de eventos para miembros.", + "notificationRuleIsUserMention": "Mención al usuario", + "notificationRuleIsUserMentionDescription": "Notifica al usuario cuando son mencionados directamente en un mensaje.", + "notificationRuleContainsDisplayName": "Contiene el nombre visible", + "notificationRuleContainsDisplayNameDescription": "Notifica al usuario cuando un mensaje contiene su nombre visible.", + "notificationRuleIsRoomMention": "Mención de sala", + "notificationRuleIsRoomMentionDescription": "Notifica al usuario cuando hay una mención de sala.", + "notificationRuleRoomnotif": "Notificación de sala", + "notificationRuleRoomnotifDescription": "Notifica al usuario cuando un mensaje contiene '@sala'.", + "notificationRuleTombstone": "Lápida", + "notificationRuleTombstoneDescription": "Notifica al usuario sobre mensajes de desactivación de sala.", + "notificationRuleReaction": "Reacción", + "notificationRuleReactionDescription": "Suprime notificaciones por reacciones.", + "notificationRuleRoomServerAcl": "ACL de servidor de sala", + "notificationRuleRoomServerAclDescription": "Suprime notificaciones de listas de control de acceso de servidores de sala.", + "notificationRuleSuppressEdits": "Suprimir ediciones", + "notificationRuleSuppressEditsDescription": "Suprime las notificaciones de mensajes editados.", + "notificationRuleCall": "Llamar", + "notificationRuleCallDescription": "Notifica al usuario de llamadas.", + "notificationRuleEncryptedRoomOneToOne": "Sala cifrada uno a uno", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica al usuario sobre mensajes en salas cifradas uno a uno.", + "notificationRuleRoomOneToOne": "Sala uno a uno", + "notificationRuleRoomOneToOneDescription": "Notifica al usuario sobre mensajes en salas uno a uno.", + "notificationRuleMessage": "Mensaje", + "notificationRuleMessageDescription": "Notifica al usuario sobre mensajes generales.", + "notificationRuleEncrypted": "Cifrado", + "notificationRuleEncryptedDescription": "Notifica al usuario sobre mensajes en salas cifradas.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Notifica al usuario sobre eventos del componente de Jitsi.", + "notificationRuleServerAcl": "Suprimir eventos de ACL del servidor", + "notificationRuleServerAclDescription": "Suprime notificaciones de eventos de ACL del servidor.", + "unknownPushRule": "Regla de notificación desconocida '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Si eliminas este ajuste de notificación, esto no se puede deshacer.", + "more": "Más", + "groupCanBeFoundViaSearch": "Los grupos se pueden encontrar buscando", + "addChatOrSubSpace": "Añadir chat o sub espacio", + "sendRoomNotifications": "Mandar notificación @sala", + "changeTheChatPermissions": "Cambiar los permisos de chat", + "setWallpaper": "Poner fondo", + "sendImages": "Envío de la imagen {count}", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "usersMustKnock": "Los usuarios han de avisar", + "noOneCanJoin": "Nadie puede unirse", + "reopenChat": "Reabrir chat", + "fileIsTooBigForServer": "¡No se pudo mandar! El servidor solamente permite adjuntos de hasta {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Saltar al último mensaje leído", + "report": "informe", + "readUpToHere": "Leer hasta aquí", + "formattedMessages": "Mensajes con formato", + "publicSpaces": "Espacios públicos", + "formattedMessagesDescription": "Mostrar contenido de mensaje enriquecido, como texto en negrita, usando markdown.", + "userLevel": "{level} - Usuario", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "completedKeyVerification": "{sender} completó la verificación de clave", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendingAttachment": "Enviando adjunto...", + "compress": "Comprimir", + "pleaseFillOut": "Por favor, rellenar", + "newChatRequest": "📩 Nueva petición de chat", + "unbanUserDescription": "El usuario podrá entrar al chat de nuevo si lo intenta.", + "roomUpgradeDescription": "El chat se volverá a crear con la nueva versión de sala. Todos los participantes serán notificados de que tienen que cambiarse al nuevo chat. Puedes encontrar más información sobre versiones de salas en https://spec.matrix.org/latest/rooms/", + "makeAdminDescription": "Una vez hagas que este usuario sea admin, puede que no puedas deshacerlo porque tendrá los mismos permisos que tú.", + "knocking": "Avisando", + "chatCanBeDiscoveredViaSearchOnServer": "El chat se puede descubrir buscando en {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Buscar #chats, @usuarios...", + "groupName": "Nombre de grupo", + "createGroupAndInviteUsers": "Crear un grupo e invitar usuarios", + "databaseMigrationTitle": "La base de datos está optimizada", + "searchForUsers": "Buscar @usuarios...", + "gallery": "Galería", + "files": "Archivos", + "initAppError": "Hubo un error al arrancar la app", + "sessionLostBody": "Se perdió tu sesión. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "unreadChatsInApp": "{appname}: {unread} chats no leídos", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} ha pedido verificación de clave", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "adminLevel": "{level} - Administrador", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Cambiar los ajustes generales de chat", + "inviteOtherUsers": "Invitar a otros usuarios a este chat", + "calculatingFileSize": "Calculando tamaño de archivo...", + "blur": "Difuminar:", + "continueText": "Continuar", + "opacity": "Opacidad:", + "version": "Versión", + "serverInformation": "Información del servidor:", + "website": "Web", + "name": "Nombre", + "passwordRecoverySettings": "Ajustes de recuperación de clave", + "acceptedKeyVerification": "{sender} aceptó la verificación de clave", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Pegatinas", + "shareKeysWith": "Compartir claves con...", + "shareKeysWithDescription": "¿Qué dispositivos deben ser de confianza para que puedan leer tus mensajes en chats cifrados?", + "crossVerifiedDevicesIfEnabled": "Dispositivos verificados si están habilitados", + "allDevices": "Todos los dispositivos", + "crossVerifiedDevices": "Dispositivos verificados", + "verifiedDevicesOnly": "Solo dispositivos verificados", + "removeDevicesDescription": "Vas a salir en este dispositivo y ya no podrás recibir mensajes.", + "databaseMigrationBody": "Por favor espera. Esto llevará un momento.", + "pleaseEnterYourCurrentPassword": "Por favor, pon tu clave actual", + "pleaseChooseAStrongPassword": "Por favor, pon una clave fuerte", + "joinSpace": "Unirse al espacio", + "wrongRecoveryKey": "Lo siento... esta no parece ser la clave de recuperación correcta.", + "leaveEmptyToClearStatus": "Deja vacío para limpiar tu estado.", + "restoreSessionBody": "La app ahora trata de recuperar tu sesión de la copia de seguridad. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Mandar recibos de lectura", + "sendTypingNotificationsDescription": "Otros participantes en un chat pueden ver cuándo estás escribiendo un mensaje.", + "sendReadReceiptsDescription": "Otros participantes en un chat pueden ver cuándo has leído un mensaje.", + "verifyOtherUserDescription": "Si verificas a otro usuario, puedes estar seguro de a quién estás escribiendo realmente. 💪\n\nCuando empiezas una verificación, tú y el otro usuario veréis una ventana emergente en la app. En ella veréis una serie de emojiso números que tenéis que comparar.\n\nLa mejor forma de hacer esto es quedar o una videollamada. 👭", + "verifyOtherDeviceDescription": "Cuando verificas otro dispositivo, esos dispositivos pueden intercambiar claves, incrementando tu seguridad global. 💪 Cuando inicias una verificación, aparece una ventana en la app en ambos dispositivos. En ella, verás una serie de emojis o números que tienes que comparar. Es mejor tener ambos dispositivos a mano antes de empezar la verificación. 🤳", + "canceledKeyVerification": "{sender} canceló la verificación de clave", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "No ignorar la ID de matrix dada", + "noDatabaseEncryption": "En esta plataforma no hay cifrado de base de datos", + "startedKeyVerification": "{sender} ha comenzado verificación de clave", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "discover": "Descubrir", + "thereAreCountUsersBlocked": "Ahora mismo, hay {count} usuarios bloqueados.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "commandHint_ignore": "Ignorar la ID de matrix dada", + "jump": "Saltar", + "commandHint_sendraw": "Mandar json pelado", + "kickUserDescription": "Se expulsa al usuario del chat, pero no se le prohíbe volver a entrar. En chats públicos, el usuario podrá volver a entrar en cualquier momento.", + "fileHasBeenSavedAt": "Archivo guardado en {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "markAsUnread": "Marcar no leído", + "changeTheDescriptionOfTheGroup": "Cambiar la descripción del chat", + "sorryThatsNotPossible": "Lo siento... eso no es posible", + "publicChatAddresses": "Dirección de chat pública", + "createNewAddress": "Crear nueva dirección", + "boldText": "Texto en negrita", + "italicText": "Texto en cursiva", + "strikeThrough": "Tachado", + "searchMore": "Buscar más...", + "knock": "Aviso", + "newSpaceDescription": "Los espacios permiten consolidar los chats y montar comunidades privadas o públicas.", + "pleaseEnterANumber": "Por favor pon un número mayor que 0", + "archiveRoomDescription": "El chat se moverá al archivo. Otros usuarios podrán ver que has abandonado el chat.", + "pushNotificationsNotAvailable": "No están disponibles las notificaciones emergentes", + "passwordsDoNotMatch": "Las claves no coinciden", + "passwordIsWrong": "La clave que has puesto es incorrecta", + "verifyOtherUser": "🔐 Verificar a otro usuario", + "isReadyForKeyVerification": "{sender} está preparado para verificación de clave", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "goToSpace": "Ir al espacio: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "oneOfYourDevicesIsNotVerified": "Uno de tus dispositivos no está verificado", + "noticeChatBackupDeviceVerification": "Nota: Cuando conectas todos tus dispositivos a la copia de seguridad del chat, son verificados automáticamente.", + "manageAccount": "Gestionar cuenta", + "contactServerAdmin": "Contactar con el administrador del servidor", + "contactServerSecurity": "Contactar con seguridad del servidor", + "supportPage": "Página de atención", + "invalidUrl": "Url incorrecto", + "addLink": "Añadir enlace", + "unableToJoinChat": "No se puede entrar al chat. Puede que la otra parte ya haya cerrado la conversación.", + "waitingForServer": "Esperando al servidor...", + "synchronizingPleaseWaitCounter": " Sincronizando… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 Oh, no. Algo ha salido mal. Si quieres, puedes informar de este fallo a los desarrolladores.", + "hasKnocked": "🚪 {user} ha avisado", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noBackupWarning": "¡Cuidado! Si no se habilita la copia de seguridad del chat, perderás acceso a tus mensajes cifrados. Se recomienda encarecidamente habilitar la copia de seguridad del chat antes de salir.", + "yourGlobalUserIdIs": "Tu id de usuario global es: ", + "noKeyForThisMessage": "Esto puede ocurrir si el mensaje se envió antes de que entraras en tu cuenta en este dispositivo.\n\nTambién puede que el remitente haya bloqueado tu dispositivo o haya fallado algo en la conexión a Internet.\n\n¿Puedes leer el mensaje en otra sesión? Entonces, ¡puedes transferir el mensaje desde allí! Ve a Ajustes > Dispositivos y asegúrate de que tus dispositivos se han verificado mutuamente. Cuando abras la sala la próxima vez y ambas sesiones estén en primer plano, las claves se transmitirán automáticamente.\n\n¿No quieres perder las claves al salir o al cambiar de dispositivo? Asegúrate de que has habilitado la copia de seguridad del chat en los ajustes.", + "banUserDescription": "Se expulsará al usuario del chat y no podrá volver a entrar hasta que se le permita.", + "loginWithMatrixId": "Entrar con un ID de Matrix", + "changeTheCanonicalRoomAlias": "Cambiar la dirección pública principal de chat", + "noContactInformationProvided": "El servidor no suministra ninguna información de contacto válida", + "noUsersFoundWithQuery": "Desgraciadamente, no se encontró ningún usuario con \"{query}\". Por favor, revisa si cometiste un error.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "changeTheVisibilityOfChatHistory": "Cambiar la visibilidad de la historia de chat", + "doesNotSeemToBeAValidHomeserver": "No parece ser un homeserver compatible. ¿URL equivocada?", + "moderatorLevel": "{level} - Moderador", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "open": "Abrir", + "previous": "Anterior", + "otherPartyNotLoggedIn": "La otra parte ahora mismo no está conectada y por tanto ¡no puede recibir mensajes!", + "takeAPhoto": "Tomar foto", + "recordAVideo": "Grabar video", + "optionalMessage": "(Opcional) mensaje...", + "notSupportedOnThisDevice": "No es compatible con este dispositivo", + "enterNewChat": "Ingresar a nuevo chat", + "pleaseWaitUntilInvited": "Por favor espera, hasta que alguien del chat te invite.", + "commandHint_roomupgrade": "Actualizar este chat a la versión de chat asignada", + "checkList": "Lista de tareas", + "countInvited": "{count} invitado", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Mensaje de voz de {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "commandHint_logout": "Salir del dispositivo actual", + "commandHint_logoutall": "Salir de todos los dispositivos activos", + "displayNavigationRail": "Mostrar carril de navegación en móvil", + "approve": "Aprobar", + "youHaveKnocked": "Has sido expulsado", + "customReaction": "Reacción personalizada", + "moreEvents": "Más eventos", + "declineInvitation": "Rechazar invitación", + "changedTheChatDescription": "{username} ha cambiado la descripción del chat", + "changedTheChatName": "{username} ha cambiado el nombre del chat", + "noMessagesYet": "Sin mensajes", + "longPressToRecordVoiceMessage": "Deja presionado para grabar un mensaje.", + "pause": "Pausa", + "resume": "Continuar", + "removeFromSpaceDescription": "El chat sera removido del espacio pero continuara apareciendo en tu lista de chats.", + "countChats": "{chats} chats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "startPoll": "Iniciar encuesta", + "endPoll": "Finalizar encuesta", + "answersVisible": "Respuestas visibles", + "spaceMemberOf": "Espacio miembro de {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Miembros del espacio de {spaces} pueden llamar", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "pollQuestion": "Pregunta de encuesta", + "answerOption": "Respuesta", + "addAnswerOption": "Añadir respuesta", + "allowMultipleAnswers": "Permitir varias respuestas", + "pollHasBeenEnded": "La encuesta ha terminado", + "countVotes": "{count, plural, =1{Un voto} other{{count} votos}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Las respuestas serán visibles cuando termine la encuesta", + "replyInThread": "Contestar en el hilo", + "countReplies": "{count, plural, =1{One reply} other{{count} replies}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Hilo", + "backToMainChat": "Volver al chat pricipal", + "saveChanges": "Guardar cambios", + "createSticker": "Crear sticker o emoticono", + "useAsSticker": "Usar como sticker", + "useAsEmoji": "Usar como emoticono", + "stickerPackNameAlreadyExists": "El nombre del paquete de stickers ya existe", + "newStickerPack": "Nuevo paquete de stickers", + "stickerPackName": "Nombre del paquete de stickers", + "attribution": "Atribución", + "skipChatBackup": "Omitir copia de seguridad del chat", + "skipChatBackupWarning": "¿Estás seguro? Sin habilitar la copia de seguridad del chat puedes perder el acceso a tus mensajes si cambias de dispositivo.", + "noMoreResultsFound": "No se han encontrado más resultados", + "chatSearchedUntil": "Chat buscado hasta {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL de la Federación Base", + "clientWellKnownInformation": "Información conocida del cliente:", + "baseUrl": "URL Base", + "identityServer": "Identidad del Servidor:", + "versionWithNumber": "Versión: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Registros", + "advancedConfigs": "Configuración avanzada", + "advancedConfigurations": "Configuraciones Avanzadas", + "signIn": "Iniciar sesión", + "createNewAccount": "Crear nueva cuenta", + "signUpGreeting": "¡FluffyChat está descentralizado! ¡Selecciona un servidor donde quieres crear tu cuenta y sigamos!", + "signInGreeting": "¿Ya tienes una cuenta en Matrix? ¡Bienvenido de nuevo! Selecciona tu servidor e inicia sesión.", + "theProcessWasCanceled": "El proceso se ha cancelado.", + "join": "Unirse", + "searchOrEnterHomeserverAddress": "Buscar o pon la dirección de tu servidor local", + "matrixId": "Matrix ID", + "setPowerLevel": "Establecer nivel de poder", + "makeModerator": "Convertir en Moderador", + "makeAdmin": "Convertir en administrador", + "removeModeratorRights": "Remover derechos de moderador", + "removeAdminRights": "Remover derechos de administrador", + "powerLevel": "Nivel de Poder", + "setPowerLevelDescription": "El nivel de poder define el nivel de acciones de un miembro, usualmente esta en el rango entre 0 a 100.", + "owner": "Dueño", + "mute": "Silenciar", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Crear nuevo chat", + "reset": "Resetear", + "supportFluffyChat": "Apoyar FluffyChat", + "support": "Apoyar", + "setLowPriority": "Colocar baja prioridad", + "unsetLowPriority": "Desactivar baja prioridad", + "playSoundOnNotification": "Sonido en notificación", + "addTag": "Agregar etiqueta", + "removeTag": "Remover etiqueta", + "tagName": "Nombre de etiqueta", + "createNewTag": "Crear nueva etiqueta", + "discardEdits": "Tienes cambios sin guardar ¿Quieres descartarlos?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Mostrar más", + "showLess": "Mostrar menos", + "hideRoomsInSpaces": "Esconder salas que estén en un espacio", + "possibleByYou": "Esta versión sólo fue posible gracias a tu apoyo. FluffyChat sigue siendo gratis, de código abierto y totalmente impulsado por la comunidad.", + "showThumbnailsInTimeline": "Mostrar miniaturas de imágenes y videos", + "appSubtitle": "Comunicación [matrix] Segura", + "appDescription": "Comunicación cifrada a través de la red descentralizada [matrix] de una manera fácil y accesible para todos.", + "interactiveVerification": "Verificación interactiva", + "interactiveVerificationDescription": "Si se encuentran cerca o se comunican por una vía segura pueden verificar todos los dispositivos a la vez comparando números de seguridad o emojis.", + "countUnverifiedDevices": "{count} dispositivos sin verificar en el chat.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Mensaje encriptado", + "unencryptedMessage": "Mensaje des-encriptado", + "messageCanOnlyBeReadByUser": "Tu mensaje esta encriptado punto a punto y solo puede ser leído por este usuario:", + "messageCanOnlyBeReadByUsers": "Tu mensaje esta encriptado punto a punto y solo puede ser leído por estos usuarios:", + "publicKey": "Llave Pública: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + } +} diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb new file mode 100644 index 0000000000..4618a9a49d --- /dev/null +++ b/lib/l10n/intl_et.arb @@ -0,0 +1,2727 @@ +{ + "@@locale": "et", + "@@last_modified": "2021-08-14 12:41:10.079944", + "about": "Rakenduse teave", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Nõustu", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} võttis kutse vastu", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Kasutajakonto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐{username} võttis kasutusele läbiva krüptimise", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Lisa e-posti aadress", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Peakasutaja", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Kõik", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} vastas kõnele", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Kõik võivad liituda", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Rakenduse lukustus", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhiiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Kas külalised võivad liituda?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Kas sa oled kindel?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Kas sa oled kindel, et soovid välja logida?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla salafraas või taastevõti.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Kas võtad vastu selle verifitseerimispalve kasutajalt {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Esita liikuvad kleepse ja emotikone automaatselt", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "See koduserver toetab Matrixi võrku sisselogimiseks:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi võimalusi:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Keela ligipääs vestlusele", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Ligipääs vestlusele on keelatud", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} keelas ligipääsu kasutajale {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokeeri seade", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokeeritud", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Katkesta", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "{uri} aadressi avamine ei õnnestu", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Muuda seadme nime", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} muutis vestluse tunnuspilti", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} muutis vestlusega seotud õigusi", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} muutis oma uueks kuvatavaks nimeks: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} muutis külaliste ligipääsureegleid", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} muutis külaliste ligipääsureegleid järgnevalt: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} muutis sõnumite ajaloo nähtavust", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} muutis sõnumite ajaloo nähtavust järgnevalt: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} muutis liitumise reegleid", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} muutis liitumise reegleid järgnevalt: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} muutis oma tunnuspilti", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} muutis jututoa aliast", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} muutis kutse linki", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Muuda salasõna", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Muuda koduserverit", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Muuda oma stiili", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Muuda jututoa nime", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Muuda oma tunnuspilti", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Kasutatud krüptimine on vigane", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Vestlus", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Varunda vestlus", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Vestluse teave", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Vestlused", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Vali korralik salasõna", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Kustuta arhiiv", + "close": "Sulge", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Sea sellele kasutajale antud jututoas suhtluskeeld", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Saada HTML-vormingus tekst", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Kutsu see kasutaja antud jututuppa", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Liitu selle jututoaga", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Eemalda antud kasutaja sellest jututoast", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Lahku sellest jututoast", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Kirjelda ennast", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Seadista selles jututoas oma tunnuspilt (mxc-uri vahendusel)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Seadista selles jututoas oma kuvatav nimi", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Seadista selle kasutaja õigusi (vaikimisi: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Saada vormindamata tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Saada vastus reaktsioonina", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Saada tekst", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Eemalda sellelt kasutajalt antud jututoas suhtluskeeld", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Vigane käsk", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "„{command}“ ei ole käsk.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Palun võrdle emojisid", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Palun võrdle numbreid", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Seadista vestlust", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma jututoaga", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Saatsime selle sisu kohta teate koduserveri haldajate", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopeerisin lõikelauale", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopeeri", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopeeri lõikelauale", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Sõnumi dekrüptimine ei õnnestunud: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} osalejat", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Loo", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} algatas vestluse", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Uus kogukond", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Hetkel aktiivne", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tume kujundus", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Järgnevaga eemaldatakse sinu konto kasutusest. Seda tegevust ei saa tagasi pöörata! Kas sa ikka oled kindel?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Vaikimisi õigused uutele kasutajatele", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Kustuta", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Kustuta kasutajakonto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Kustuta sõnum", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Seadmed", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Otsevestlused", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Kuvatav nimi on muudetud", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Laadi fail alla", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Muuda", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Muuda blokeeritud serverite loendit", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Muuda kuvatavat nime", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Muuda jututoa aliasi", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Muuda jututoa tunnuspilti", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Selline emotsioonitegevus on juba olemas!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Vigane emotsioonitegevuse lühikood!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emotsioonitegevuste seadistused", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emotsioonitegevuse lühikood", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Vestlust pole olnud", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Võta emotsioonitegevuste pakid läbivalt kasutusele", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Kasuta krüptimist", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Sa ei saa hiljem enam krüptimist välja lülitada. Kas oled kindel?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Krüptitud", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Krüptimine", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Krüptimine ei ole kasutusel", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} lõpetas kõne", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Sisesta e-posti aadress", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Viga asukoha tuvastamisel: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Kirjatüübi suurus", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Edasta", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Alates liitumise hetkest", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Kutse saamisest", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Jututuba", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Jututuba on avalik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Jututoad", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Jututuba {displayname} kasutajanimega", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Külalised ei ole lubatud", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Külalised võivad liituda", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} on võtnud tagasi kutse kasutajale {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Abiteave", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Peida tundmatud sündmused", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Eira", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Eiratud kasutajad", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ma olen klõpsinud saadetud linki", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Vigane salafraas või taastevõti", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kutsu sõpru ja tuttavaid", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} jututoa liikmeks", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Kutsutud", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} saatis kutse kasutajale {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Ainult kutsutud kasutajatele", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} kutsus sind kasutama Matrix'i-põhist suhtlusrakendust FluffyChat. \n1. Ava fluffychat.im ja paigalda FluffyChat'i rakendus \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix'i kasutajakontoga\n3. Ava kutse link: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "kirjutab…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} liitus vestlusega", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Liitu jututoaga", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} müksas kasutaja {targetName} välja", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅{username} müksas kasutaja {targetName} välja ning seadis talle suhtluskeelu", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Müksa vestlusest välja", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Viimati nähtud: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Lahku", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Lahkus vestlusest", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Hele kujundus", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Lisa veel {count} osalejat", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laadin andmeid… Palun oota.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Laadi veel…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Asukohateenused on seadmes väljalülitatud. Asukoha jagamiseks palun lülita nad sisse.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Puudub luba asukohateenuste kasutamiseks. Asukoha jagamiseks palun anna rakendusele vastavad õigused.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Logi sisse", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logi sisse {homeserver} serverisse", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logi välja", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Maini", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Sõnumid", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderaator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Summuta vestlus", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Uus vestlus", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Uus sõnum FluffyChati vahendusel", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Uus verifitseerimispäring!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Edasi", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ei", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Puudub ühendus koduserveriga", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ühtegi emotsioonitegevust ei leidunud. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Sa võid krüptimise kasutusele võtta niipea, kui jututuba pole enam avalik.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Tundub, et sinu nutiseadmes pole Firebase Cloud Messaging teenuseid. Sinu privaatsuse mõttes on see kindlasti hea otsus! Kui sa soovid FluffyChatis näha tõuketeavitusi, siis soovitame, et selle jaoks kasutad ntfy liidestust. Kasutades ntfyd või mõnda muud Unified Push standardil põhinevat liidestust saad tõuketeavitusi turvalisel moel. Ntfy rakendus on saadaval nii PlayStore kui F-Droidi rakendusepoodides.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} pole Matrix'i server, kas kasutame selle asemel {server2} serverit?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Sa pole veel lisanud võimalust salasõna taastamiseks.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Õigused puuduvad", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Jututube ei leidu…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Teavitused", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} kasutajat kirjutavad…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Tuvastan asukohta…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Sobib", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Krüptovõtmete veebipõhine varundus on kasutusel", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Vaat kus lops! Kahjuks tekkis tõuketeavituste seadistamisel viga.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Vaat kus lops! Midagi läks nüüd viltu…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Sõnumite lugemiseks ava rakendus", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ava kaamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Ava kaardirakendusega", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "või", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Osaleja", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "salafraas või taastevõti", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Salasõna", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Salasõna on ununenud", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Salasõna on muudetud", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Salasõna taastamine", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Tõsta esile", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Palun sisesta rakenduse PIN-kood", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Jätkamiseks palun klõpsi sulle saadetud e-kirjas leiduvat linki.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Palun sisesta oma salasõna", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Palun sisesta oma PIN-kood", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Palun sisesta oma kasutajanimi", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Palun järgi veebilehel olevaid juhiseid ja klõpsi nuppu Edasi.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privaatsus", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Avalikud jututoad", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Põhjus", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} muutis sündmust", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Eemalda sõnum", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Lükka tagasi", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} lükkas kutse tagasi", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Eemalda", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Eemalda kõik muud seadmed", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Eemalda suhtluskeeld", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Kustuta oma tunnuspilt", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Asenda jututoa senine versioon uuega", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Vasta", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Teata sõnumist", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Jututoa versioon on uuendatud", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Jututoa versioon", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salvesta fail", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Otsi", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Turvalisus", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Saada", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Saada sõnum", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Saada tekstisõnumina", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Saada helifail", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Saada fail", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Saada pilt", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Saada sõnumeid", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Saada videofail", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} saatis faili", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} saatis helifaili", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} saatis pildi", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} saatis kleepsu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} saatis video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} edastas teavet kõne kohta", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Määra põhinimeks", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Määra olek", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Seadistused", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Jaga", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} jagas oma asukohta", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Jaga asukohta", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Jäta vahele", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Lähtekood", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Kogukond on avalik", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Kogukonna nimi", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} helistas", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Olek", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kuidas sul täna läheb?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Saada", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sünkroonin andmeid… Palun oota.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Süsteemi kujundus", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Nad ei klapi omavahel", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Nad klapivad omavahel", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Liiga palju päringuid. Palun proovi hiljem uuesti!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Proovi uuesti saata", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} eemaldas ligipääsukeelu kasutajalt {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Eemalda seadmelt blokeering", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Tundmatu seade", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Tundmatu krüptoalgoritm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Tundmatu sündmuse tüüp '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Lõpeta vestluse summutamine", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Eemalda esiletõstmine", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} ja {count} muud kirjutavad…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ja {username2} kirjutavad…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} kirjutab…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} lahkus vestlusest", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} saatis „{type}“ tüüpi sündmuse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verifitseeritud", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Alusta verifitseerimist", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Sinu verifitseerimine õnnestus!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifitseerin teist kasutajakontot", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videokõne", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vestluse ajaloo nähtavus", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Nähtav kõikidele osalejatele", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Nähtav kõikidele", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Häälsõnum", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ootan, et teine osapool nõustuks päringuga…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ootan teise osapoole kinnitust, et tegemist on samade emojidega…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Ootan teise osapoole kinnitust, et tegemist on samade numbritega…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Hoiatus!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Me saatsime sulle e-kirja", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Erinevatele kasutajatele lubatud toimingud", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kes võivad selle jututoaga liituda", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miks sa soovid sellest teatada?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Nende e-posti aadresside abil saad taastada oma salasõna.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Koosta sõnum…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Jah", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Sina", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Sa enam ei osale selles vestluses", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Sinule on selles vestluses seatud suhtluskeeld", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Sinu avalik võti", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Lisa kogukonda", + "scanQrCode": "Skaneeri QR-koodi", + "sendOnEnter": "Saada sõnum sisestusklahvi vajutusel", + "bundleName": "Köite nimi", + "removeFromBundle": "Eemalda sellest köitest", + "addToBundle": "Lisa köitesse", + "editBundlesForAccount": "Muuda selle kasutajakonto köiteid", + "addAccount": "Lisa kasutajakonto", + "oneClientLoggedOut": "Üks sinu klientrakendustest on Matrixi võrgust välja loginud", + "link": "Link", + "unverified": "Verifitseerimata", + "repeatPassword": "Korda salasõna", + "messageInfo": "Sõnumi teave", + "time": "Kellaaeg", + "sender": "Saatja", + "openGallery": "Ava galerii", + "removeFromSpace": "Eemalda kogukonnast", + "commandHint_discardsession": "Loobu sessioonist", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Tühjenda vahemälu", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Alusta otsevestlust\nKrüptimise keelamiseks kasuta --no-encryption võtit", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Loo tühi jututuba\nKrüptimise keelamiseks kasuta --no-encryption võtit", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "markAsRead": "Märgi loetuks", + "reportUser": "Teata kasutajast", + "reactedWith": "{sender} reageeris sedaviisi: {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emojid", + "placeCall": "Helista", + "unsupportedAndroidVersion": "See Androidi versioon ei ole toetatud", + "voiceCall": "Häälkõne", + "confirmEventUnpin": "Kas sa oled kindel, et tahad esiletõstetud sündmuse jäädavalt eemaldada?", + "pinMessage": "Tõsta sõnum jututoas esile", + "videoCallsBetaWarning": "Palun arvesta, et videokõned on veel beetajärgus. Nad ei pruugi veel toimida kõikidel platvormidel korrektselt.", + "experimentalVideoCalls": "Katselised videokõned", + "unsupportedAndroidVersionLong": "See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OSi kasutada.", + "youAcceptedTheInvitation": "👍 Sa võtsid kutse vastu", + "youUnbannedUser": "Sa eemaldasid suhtluskeelu kasutajalt {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Sa oled tühistanud kutse kasutajale {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "Sa seadsid suhtluskeelu kasutajale {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Sa liitusid vestlusega", + "youKickedAndBanned": "🙅Sa müksasid kasutaja {user} välja ning seadsid talle suhtluskeelu", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Sa lükkasid kutse tagasi", + "youKicked": "👞 Sa müksasid kasutaja {user} välja", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Sa saatsid kutse kasutajale {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} saatis sulle kutse", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Kasutajad", + "storeInAndroidKeystore": "Vali salvestuskohaks Android KeyStore", + "storeInAppleKeyChain": "Vali salvestuskohaks Apple KeyChain", + "storeSecurlyOnThisDevice": "Salvesta turvaliselt selles seadmes", + "countFiles": "{count} faili", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Ekspordi sessiooni teave ja kustuta nutiseadmest rakenduse andmed", + "dehydrateWarning": "Seda tegevust ei saa tagasi pöörata. Palun kontrolli, et sa oled varukoopia turvaliselt salvestanud.", + "hydrate": "Taasta varundusfailist", + "user": "Kasutaja", + "custom": "Kohandatud", + "confirmMatrixId": "Konto kustutamiseks palun kinnita oma Matrix'i kasutajatunnus (Matrix ID).", + "supposedMxid": "See peaks olema {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Märgi jututoaks", + "commandHint_markasdm": "Märgi otsevestluseks antud Matrixi ID jaoks", + "whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?", + "noKeyForThisMessage": "See võib juhtuda, kui sõnum oli saadetud enne, kui siin seadmes oma kontoga sisse logisid.\n\nSamuti võib juhtuda siis, kui saatja on lugemises selles seadmes blokeerinud või on tekkinud tõrkeid veebiühenduses.\n\nAga mõnes teises seadmes saad seda sõnumit lugeda? Siis sa võid sõnumi sealt üle tõsta. Ava Seadistused -> Seadmed ning kontrolli, et kõik sinu seadmed on omavahel verifitseeritud. Kui avad selle vestluse või jututoa ning mõlemad sessioonid on avatud, siis vajalikud krüptovõtmed saadetakse automaatset.\n\nKas sa soovid vältida krüptovõtmete kadumist väljalogimisel ja seadmete vahetusel? Siis palun kontrolli, et seadistuses on krüptovõtmete varundus sisse lülitatud.", + "newSpace": "Uus kogukond", + "screenSharingTitle": "ekraani jagamine", + "foregroundServiceRunning": "See teavitus toimib siis, kui esiplaaniteenus töötab.", + "screenSharingDetail": "Sa jagad oma ekraani FuffyChati vahendusel", + "doNotShowAgain": "Ära näita uuesti", + "commandHint_cuddle": "Saada üks kaisutus", + "commandHint_hug": "Saada üks kallistus", + "googlyEyesContent": "{senderName} saatis sulle otsivad silmad", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} kaisutab sind", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} kallistab sind", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Saada ühed otsivad silmad", + "wasDirectChatDisplayName": "Sõnumiteta vestlus (vana nimega {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "encryptThisChat": "Krüpti see vestlus", + "disableEncryptionWarning": "Kui vestluses on krüptimine kasutusele võetud, siis turvalisuse huvides ei saa seda hiljem välja lülitada.", + "sorryThatsNotPossible": "Vabandust... see ei ole võimalik", + "newSpaceDescription": "Kogukonnad võimaldavad sul koondada erinevaid vestlusi ning korraldada avalikku või privaatset ühistegevust.", + "reopenChat": "Alusta vestlust uuesti", + "noOtherDevicesFound": "Muid seadmeid ei leidu", + "noBackupWarning": "Hoiatus! Kui sa ei lülita sisse vestluse varundust, siis sul puudub hiljem ligipääs krüptitud sõnumitele. Me tungivalt soovitame, et palun lülita vestluse varundamine sisse enne väljalogimist.", + "fileIsTooBigForServer": "Saatmine ei õnnestu! Serveri vaid kuni {max} suurusega manuseid.", + "fileHasBeenSavedAt": "Fail on salvestatud kausta: {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Liigu viimase loetud sõnumini", + "readUpToHere": "Siiamaani on loetud", + "jump": "Hüppa", + "openLinkInBrowser": "Ava link veebibrauseris", + "report": "teata", + "reportErrorDescription": "😭 Oh appike! Midagi läks valesti. Kui soovid, võid sellest veast arendajatele teatada.", + "importFromZipFile": "Impordi zip-failist", + "exportEmotePack": "Ekspordi emotikonide pakk zip-failina", + "replace": "Asenda", + "notAnImage": "See pole pildifail.", + "importNow": "Impordi kohe", + "importEmojis": "Impordi emojid", + "sendTypingNotifications": "Saada kirjutamise teavitusi", + "createGroup": "Loo jututuba", + "tryAgain": "Proovi uuesti", + "chatPermissions": "Vestluse õigused", + "chatDescription": "Vestluse kirjeldus", + "noChatDescriptionYet": "Vestluse kirjeldus on puudu.", + "optionalRedactReason": "(Kui soovid lisada) Sõnumi muutmise põhjus...", + "messagesStyle": "Sõnumid:", + "shareInviteLink": "Jaga kutse linki", + "directChat": "Otsevestlus", + "setChatDescription": "Lisa vestluse kirjeldus", + "setColorTheme": "Vali värviteema:", + "invite": "Kutsu", + "invalidServerName": "Vigane serveri nimi", + "chatDescriptionHasBeenChanged": "Vestluse kirjeldus on muutunud", + "redactMessageDescription": "Sõnumi muudatus kehtib kõikidele vestluses osalejatele. Seda muudatust ei saa tagasi pöörata.", + "redactedBy": "Muutja: {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "Muutja {username} märkis põhjuseks: „{reason}“", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 Kutse jututuppa", + "emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Vigane sisend!", + "wrongPinEntered": "Sisestasid vale PIN-koodi! Proovi uuesti {seconds} sekundi pärast...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Sellele kasutajale on nüüd selles jututoas seatud suhtluskeeld ning ta ei saa vestluses osaleda seni, kuni suhtluskeeld pole eemaldatud.", + "removeDevicesDescription": "Sind logitakse sellest seadmest välja ja sa enam ei saa sõnumeid.", + "unbanUserDescription": "Uuesti proovimisel saab see kasutaja nüüd vestlusega liituda.", + "pushNotificationsNotAvailable": "Tõuketeavitused pole saadaval", + "makeAdminDescription": "Kui annad sellele kasutajale peakasutaja õigused, siis kuna tal on sinuga samad õigused, sa ei saa seda toimingut enam tagasi pöörata.", + "archiveRoomDescription": "Selle vestluse tõstame nüüd arhiivi. Muud osalejad näevad, et sa oled vestlusest lahkunud.", + "hasKnocked": "🚪{user} on jututoa uksele koputanud", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Loe lisaks", + "roomUpgradeDescription": "See vestlus luuakse nüüd uuesti jututoa uue versioonina. Kõik senised osalejad saavad teate, et nad peavad liituma uue vestlusega. Jututubade versioonide kohta leiad teavet https://spec.matrix.org/latest/rooms/ lehelt", + "pleaseEnterANumber": "Palun sisesta 0'st suurem number", + "kickUserDescription": "See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.", + "blockListDescription": "Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.", + "createGroupAndInviteUsers": "Lisa jututuba ja kutsu sinna kasutajaid", + "blockedUsers": "Blokeeritud kasutajad", + "groupCanBeFoundViaSearch": "Jututuba on leitav otsinguga", + "noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Blokeeri", + "yourGlobalUserIdIs": "Sinu üldine kasutajatunnus on: ", + "commandHint_sendraw": "Saada json oma algupärasel kujul", + "wrongRecoveryKey": "Vabandust..., see ei tundu olema korrektne taastevõti.", + "blockUsername": "Eira kasutajanime", + "groupName": "Jututoa nimi", + "databaseMigrationTitle": "Andmebaas on optimeeritud", + "searchChatsRooms": "Otsi #vestlusi, @kasutajaid...", + "databaseMigrationBody": "Palun oota üks hetk. Natuke võib kuluda aega.", + "thisDevice": "See seade:", + "publicSpaces": "Avalikud kogukonnad", + "passwordIsWrong": "Sinu sisestatud salasõna on vale", + "pleaseEnterYourCurrentPassword": "Palun sisesta oma praegune salasõna", + "nothingFound": "Ei leidnud mitte midagi...", + "newPassword": "Uus salasõna", + "passwordsDoNotMatch": "Salasõnad ei klapi omavahel", + "select": "Vali", + "pleaseChooseAStrongPassword": "Palun sisesta korralik salasõna", + "addChatOrSubSpace": "Lisa vestlus või jututuba", + "leaveEmptyToClearStatus": "Senise oleku eemaldamiseks jäta väärtus tühjaks.", + "joinSpace": "Liitu kogukonnaga", + "searchForUsers": "Otsi kasutajat @kasutajanimi ...", + "initAppError": "Rakenduse käivitamisel tekkis viga", + "sessionLostBody": "Sinu sessioon on kadunud. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Nüüd üritab rakendus taastada sinu sessiooni varukoopiast. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Saada lugemisteatisi", + "verifyOtherUserDescription": "Kui sa oled vestluse teise osapoole verifitseerinud, siis saad kindel olla, et tead, kellega suhtled. 💪\n\nKui alustad verifitseerimist, siis sinul ja teisel osapoolel tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida peate omavahel võrdlema.\n\nKõige lihtsam on seda teha kas omavahelise kohtumise ajal või videokõne kestel. 👭", + "sendTypingNotificationsDescription": "Muud vestluses osalejad saavad näha, kui sa oled uut sõnumit kirjutamas.", + "sendReadReceiptsDescription": "Muud vestluses osalejad näevad, kas oled sõnumit lugenud.", + "formattedMessages": "Vormindatud sõnumid", + "verifyOtherUser": "🔐 Verifitseeri teine kasutaja", + "verifyOtherDevice": "🔐 Verifitseeri oma muu seade", + "canceledKeyVerification": "{sender} katkestas krüptovõtmete verifitseerimise", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} sai valmis krüptovõtmete verifitseerimise", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Kasutades markdown-süntaksit kuva vormindust, nagu rasvases kirjas tekst.", + "verifyOtherDeviceDescription": "Kui sa oled oma muu seadme verifitseerinud, siis need seadmed võivad vahetada krüptovõtmeid ning see parandab üldist turvalisust. 💪 Kui alustad verifitseerimist, siis sinu mõlemas seadmes tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida pead omavahel võrdlema. On oluline, et mõlemad seadmed on verifitseerimise alustamisel sinu kõrval. 🤳", + "acceptedKeyVerification": "{sender} nõustus krüptovõtmete verifitseerimisega", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} on valmis krüptovõtmete verifitseerimiseks", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} palus krüptovõtmete verifitseerimist", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} alustas krüptovõtmete verifitseerimist", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Saabuvad sõnumid", + "stickers": "Kleepsud", + "discover": "Otsi ja leia", + "commandHint_ignore": "Eira seda Matrixi kasutajatunnust", + "commandHint_unignore": "Lõpeta selle Matrixi kasutajatunnuse eiramine", + "unreadChatsInApp": "{appname}: {unread} lugemata vestlust", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "globalChatId": "Üldine vestluse tunnus", + "accessAndVisibilityDescription": "Kes võib selle vestlusega liituda ja kuidas on võimalik seda vestlust leida.", + "hideRedactedMessagesBody": "Kui keegi muudab sõnumit, siis teda enam ei kuvataks vestluses.", + "usersMustKnock": "Kasutajad peavad uksele koputama", + "noOneCanJoin": "Mitte keegi ei saa liituda", + "knocking": "Koputus uksele", + "chatCanBeDiscoveredViaSearchOnServer": "Vestluse või jututoa saad leida otsingust serveris {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Vestluse avalik aadress", + "noDatabaseEncryption": "Andmebaasi krüptimine pole sellel platvormil toetatud", + "knock": "Koputa uksele", + "appLockDescription": "Kui sa rakendust parasjagu ei kasuta, siis lukusta ta PIN-koodiga", + "accessAndVisibility": "Hõlbustus, ligipääsetavus ja nähtavus", + "calls": "Kõned", + "customEmojisAndStickers": "Kohandatud emotikonid ja kleepsud", + "customEmojisAndStickersBody": "Lisa või jaga kohandatud emotikone või kleepsupakke, mida võiks kasutada igas vestluses.", + "hideRedactedMessages": "Peida muudetud sõnumid", + "hideInvalidOrUnknownMessageFormats": "Peida vigase või tundmatu vorminguga sõnumid", + "passwordRecoverySettings": "Salasõna taastamise seadistused", + "createNewAddress": "Loo uus aadress", + "thereAreCountUsersBlocked": "Hetkel on {count} blokeeritud kasutajat.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "searchIn": "Otsi vestlusest „{chat}“...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Otsi veel...", + "gallery": "Galerii", + "files": "Failid", + "swipeRightToLeftToReply": "Vastamiseks viipa paremalt vasakule", + "noMoreChatsFound": "Rohkem vestlusi ei leidu...", + "unread": "Lugemata", + "space": "Kogukond", + "goToSpace": "Ava kogukond: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Märgi mitteloetuks", + "userLevel": "{level} - kasutaja", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - moderaator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - peakasutaja", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheVisibilityOfChatHistory": "Muuda vestluse ajaloo nähtavust", + "sendRoomNotifications": "Saada @jututuba teavitusi", + "changeTheCanonicalRoomAlias": "Muuda vestluse põhilist avalikult nähtavat aadressi", + "changeGeneralChatSettings": "Muuda vestluse üldiseid seadistusi", + "inviteOtherUsers": "Kutsu teisi osalejaid sellesse vestlusesse", + "changeTheChatPermissions": "Muuda vestluse õigusi", + "changeTheDescriptionOfTheGroup": "Muuda vestluse/jututoa kirjeldust", + "chatPermissionsDescription": "Määra erinevatele kasutajatele selles vestluses vajalikud õigused. Tüüpiliselt on need 0, 50 ja 100 (vastavalt kasutajad, moderaatorid ja peakasutajad), kuid igasugused vahepealsed variatsioonid on ka võimalikud.", + "updateInstalled": "🎉 Versiooniuuendus {version} on paigaldatud!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Muudatuste logi", + "sendCanceled": "Saatmine on katkestatud", + "noChatsFoundHere": "Siin ei leidu veel ühtegi vestlust. Alusta uut vestlust klõpsides allpool asuvat nuppu. ⤵️", + "loginWithMatrixId": "Logi sisse Matrix-ID alusel", + "doesNotSeemToBeAValidHomeserver": "Ei tundu olema ühilduv koduserver. Kas võrguaadress on ikka õige?", + "sendingAttachment": "Saadame manust...", + "calculatingFileSize": "Arvutame faili suurust...", + "oneOfYourDevicesIsNotVerified": "Üks sinu seadmetest pole verifitseeritud", + "noticeChatBackupDeviceVerification": "Märkus: kui liidad kõik oma seadmed vestluste varundamisega, siis on nad sellega ka automaatselt verifitseeritud.", + "continueText": "Jätka", + "setWallpaper": "Määra taustapildiks", + "manageAccount": "Halda kasutajakontot", + "blur": "Hägusus:", + "opacity": "Läbipaistmatus:", + "contactServerSecurity": "Võta ühendust serveri andmeturbe eest vastutajaga", + "supportPage": "Kasutajatugi", + "serverInformation": "Serveri teave:", + "name": "Nimi", + "version": "Versioon", + "noContactInformationProvided": "Server ei jaga asjakohast kontaktteavet", + "contactServerAdmin": "Võta ühendust serveri haldajaga", + "website": "Veebisait", + "aboutHomeserver": "Koduserveri teave: {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "pleaseFillOut": "Palun täida", + "invalidUrl": "Vigane võrguaadress", + "addLink": "Lisa link", + "strikeThrough": "Läbikriipsutatud kiri", + "boldText": "Paks kiri", + "italicText": "Kaldkiri", + "unableToJoinChat": "Vestlusega liitumine ei õnnestu. Võib-olla on teine osapool juba vestluse sulgenud.", + "sendImages": "Saada {count} pilti", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Paki kokku", + "previous": "Eelmine", + "otherPartyNotLoggedIn": "Vestluse teine osapool pole hetkel võrku loginud ega seega saa neid sõnumeid kohe kätte!", + "open": "Ava", + "appWantsToUseForLoginDescription": "Järgnevaga lubad sa, et rakendus ja veebisait jagavad teavet sinu kohta.", + "appWantsToUseForLogin": "Sisselogimiseks kasuta serverit '{server}'", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "waitingForServer": "Ootame serveri vastust...", + "synchronizingPleaseWaitCounter": " Sünkroonin… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "newChatRequest": "📩 Uus vestluskutse", + "notificationRuleCallDescription": "Teavita kasutajat saabuvast video- või häälkõnest.", + "notificationRuleEncryptedRoomOneToOneDescription": "Teavita kasutajat kahepoolse krüptitud vestluse sõnumitest.", + "notificationRuleMasterDescription": "Ära järgi muid reegleid ja lülita kõik teavitused välja.", + "notificationRuleSuppressNoticesDescription": "Ära teavita sõnumite puhul, mis on genereeritud masinate, nt jututubade robotite poolt.", + "notificationRuleSuppressEdits": "Peida muutmised", + "notificationRuleInviteForMeDescription": "Teavita kasutajat jututoa kutse saamisel.", + "notificationRuleIsUserMentionDescription": "Teavita kasutajat, kui ta on sõnumis otseselt mainitud.", + "notificationRuleContainsDisplayNameDescription": "Teavita kasutajat, kui sõnumis leidub ta kuvatav nimi.", + "notificationRuleJitsi": "Jitsi videokõned", + "notificationRuleRoomnotif": "Jututoa üldteavitus", + "notificationRuleRoomnotifDescription": "Teavita kasutajat, kui jututuba on sõnumis otseselt mainitud viisil „@toanimi“.", + "generalNotificationSettings": "Üldised teavituste seadistused", + "roomNotificationSettings": "Jututoa teavituste seadistused", + "userSpecificNotificationSettings": "Kasutajakohaste teavituste seadistused", + "notificationRuleContainsUserName": "Kasutajanime olemasolul", + "notificationRuleSuppressNotices": "Ära teavita automaatsete sõnumite korral", + "notificationRuleMemberEventDescription": "Ära teavita sõnumite puhul, mis seotud jututubade liikmelisusega.", + "notificationRuleIsUserMention": "Kasutaja mainimised", + "notificationRuleContainsDisplayName": "Kuvatava nime sisaldumisel", + "notificationRuleIsRoomMention": "Jututoa mainimine", + "notificationRuleIsRoomMentionDescription": "Teavita kasutajat, kui jututuba on sõnumis otseselt mainitud.", + "notificationRuleTombstone": "Jututoa tegevuse lõpetamine", + "notificationRuleTombstoneDescription": "Teavita kasutajat jututoa väljalülitamisega seotud sõnumite korral.", + "notificationRuleReaction": "Reageerimised", + "notificationRuleRoomServerAcl": "Jututoa ligipääsuõigused serveris", + "notificationRuleSuppressEditsDescription": "Peida teavitused sõnumite muutmise kohta.", + "notificationRuleCall": "Kõne", + "notificationRuleEncryptedRoomOneToOne": "Kahepoolne vestlus krüptitud jututoas", + "notificationRuleRoomOneToOne": "Kahepoolne vestlus krüptimata jututoas", + "notificationRuleMessageDescription": "Teavita kasutajat üldistest sõnumitest.", + "notificationRuleEncrypted": "Krüptitud sõnumid", + "notificationRuleEncryptedDescription": "Teavita kasutajat sõnumitest krüptitud jututubades.", + "notificationRuleJitsiDescription": "Teavita kasutajat sündmustest Jitsi vidinas.", + "notificationRuleMessage": "Üldised sõnumid", + "notificationRuleServerAclDescription": "Peida teavitused ligipääsuõiguste muutuste korral serveris.", + "unknownPushRule": "Tõuketeavituse tundmatu reegel '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "more": "Lisateave", + "notificationRuleInviteForMe": "Kutsed mulle", + "notificationRuleContainsUserNameDescription": "Teavita kasutajat, kui sõnumis on tema kasutajanimi.", + "contentNotificationSettings": "Sisuteavituste seadistused", + "notificationRuleRoomServerAclDescription": "Peida teavitused jututoa ligipääsuõiguste muutuste korral serveris.", + "notificationRuleRoomOneToOneDescription": "Teavita kasutajat kahepoolse krüptimata vestluse sõnumitest.", + "notificationRuleServerAcl": "Ligipääsuõigused serveris", + "notificationRuleMemberEvent": "Jututoa liikmelisusega seotud sündmus", + "notificationRuleMaster": "Summuta kõik teavitused", + "notificationRuleReactionDescription": "Teavita kasutajat sõnumitele reageerimise korral.", + "otherNotificationSettings": "Muud teavituste seadistused", + "deletePushRuleCanNotBeUndone": "Kui sa kustutad selle teavituse seadistuse, siis seda tegevust tagasi võtta ei saa.", + "shareKeysWith": "Jaga võtmeid seadmega...", + "shareKeysWithDescription": "Missuguseid seadmeid sa usaldad, et neist võiks lugeda krüptitud vestluste sõnumeid?", + "allDevices": "Kõiki seadmeid", + "crossVerifiedDevicesIfEnabled": "Risttunnustatud seadmeid, kui see võimalus on kasutusel", + "crossVerifiedDevices": "Risttunnustatud seadmeid", + "verifiedDevicesOnly": "Vaid verifitseeritud seadmeid", + "recordAVideo": "Salvesta video", + "takeAPhoto": "Pildista", + "optionalMessage": "Sõnum (kui soovid lisada)...", + "notSupportedOnThisDevice": "See pole antud seadmes toetatud", + "enterNewChat": "Liitu uue vestlusega", + "commandHint_roomupgrade": "Uuenda see jututuba antud jututoa versioonini", + "approve": "Kiida heaks", + "pleaseWaitUntilInvited": "Palun oota seni, kuni keegi jututoast saadab sulle kutse.", + "youHaveKnocked": "Sa oled koputanud", + "countInvited": "{count} kutsutut", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Häälsõnum kasutajalt {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "checkList": "Kontrollnimekiri", + "commandHint_logoutall": "Logi kõikidest aktiivsetest seadmetest välja", + "commandHint_logout": "Logi oma praegusest seadmest välja", + "displayNavigationRail": "Näita mobiilis külgmist tööriistariba", + "customReaction": "Kohandatud reaktsioon", + "moreEvents": "Veel sündmusi", + "declineInvitation": "Keeldu kutsest", + "noMessagesYet": "Pole veel ühtegi sõnumit", + "longPressToRecordVoiceMessage": "Pika vajutusega saad salvestada häälsõnumi.", + "pause": "Peata", + "resume": "Jätka", + "removeFromSpaceDescription": "See vestlus eemaldatakse nüüd kogukonnast, kuid on jätkuvalt nähtav sinu vestluste loendis.", + "countChats": "{chats} vestlust", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Kogukonna liige: {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} kogukonna liige võib uksele koputada", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Koosta küsitlus", + "endPoll": "Lõpeta küsitlus", + "answersVisible": "Vastused on näha", + "pollQuestion": "Küsitluse küsimus", + "answerOption": "Valikvastus", + "addAnswerOption": "Lisa valikvastus", + "allowMultipleAnswers": "Luba mitu vastusevalikut", + "pollHasBeenEnded": "Küsitlus on lõppenud", + "countVotes": "{count, plural, =1{Üks hääl} other{{count} häält}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Vastused on näha küsitluse lõppedes", + "replyInThread": "Vasta jutulõngas", + "countReplies": "{count, plural, =1{Üks vastus} other{{count} vastust}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Jutulõng", + "backToMainChat": "Tagasi põhivestlusesse", + "saveChanges": "Salvesta muudatused", + "createSticker": "Loo kleeps või emoji", + "useAsSticker": "Kasuta kleepsuna", + "useAsEmoji": "Kasuta emojina", + "stickerPackNameAlreadyExists": "Selline kleepsupaki nimi on juba olemas", + "newStickerPack": "Uus kleepsupakk", + "stickerPackName": "Kleepsupaki nimi", + "attribution": "Autoriõigused", + "skipChatBackup": "Jäta vestluse varundamine vahele", + "skipChatBackupWarning": "Kas oled kindel? Kui sa pole lülitanud sisse vestluste krüptovõtmete varundust, siis võid oma seadme vahetamisel kaotada ligipääsu oma senistele sõnumitele.", + "changedTheChatDescription": "{username} muutis vestluse kirjeldust", + "changedTheChatName": "{username} muutis vestluse nime", + "noMoreResultsFound": "Rohkem tulemusi ei leidu", + "chatSearchedUntil": "Otsing vestlusest kuni {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Födereerimise alusaadress", + "clientWellKnownInformation": "Kliendi „.well-known“ teave:", + "baseUrl": "Alusaadress", + "identityServer": "Isikutuvastusserver:", + "versionWithNumber": "Versioon: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logid", + "advancedConfigs": "Täiendav seadistus", + "advancedConfigurations": "Täiendavad seadistused", + "signIn": "Logi sisse", + "createNewAccount": "Loo uus kasutajakonto", + "signUpGreeting": "FluffyChat kasutab hajutatud võrku! Vali server, kuhu tahad oma kasutajakonto lisada ning alustame!", + "signInGreeting": "Sul juba on Matrixi kasutajakonto olemas? Tere tulemast tagasi! Vali oma koduserver ja logi sisse.", + "theProcessWasCanceled": "Protsess on katkestatud.", + "join": "Liitu", + "searchOrEnterHomeserverAddress": "Otsi koduserveri aadressi või sisesta see", + "matrixId": "Matrixi kasutajatunnus", + "setPowerLevel": "Seadista õigusi", + "makeModerator": "Määra moderaatoriks", + "makeAdmin": "Määra peakasutajaks", + "removeModeratorRights": "Eemalda moderaatori õigused", + "removeAdminRights": "Eemalda peakasutaja õigused", + "powerLevel": "Õiguste tase", + "setPowerLevelDescription": "Õiguste tase on üks võimalusi kirjeldamaks seda, mida kasutaja saab jututoas teha ning see tavaliselt väljendub numbriga vahemikust 0 kuni 100.", + "owner": "Omanik", + "mute": "Summuta", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Loo uus vestlus", + "reset": "Lähtesta", + "supportFluffyChat": "Toeta FluffyChati", + "support": "Toeta meid", + "setLowPriority": "Märgi vähetähtsaks", + "unsetLowPriority": "Eemalda märkimine vähetähtsaks", + "playSoundOnNotification": "Lisa teavitusele helimärguanne", + "addTag": "Lisa silt", + "removeTag": "Eemalda silt", + "tagName": "Sildi nimi", + "createNewTag": "Lisa uus silt", + "discardEdits": "Sul on salvestamata muudatusi. Kas loobud neist?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "hideRoomsInSpaces": "Peida jututoad, mis on osa kogukonnast", + "possibleByYou": "Selle versiooni väljaandmine oli võimalik vaid sinu toetusele. FluffyChat jääb vabaks, avatud lähtekoodi põhiseks ja kogukonnakeskseks.", + "showThumbnailsInTimeline": "Näita piltide ja videote pisipilte", + "appSubtitle": "Turvaline suhtlus [matrix]'i võrgus", + "appDescription": "Suhtle krüptitult hajutatud [matrix] võrgustikus viisil, mis on lihtne ja kõigile kättesaadav.", + "interactiveVerification": "Interaktiivne verifitseerimine", + "interactiveVerificationDescription": "Kui asute üksteise kõrval või kasutate turvalist suhtluskanalit, siis võite kohe verifitseerida üksteise seadmed võrreldes numbreid või emojisid.", + "countUnverifiedDevices": "Selles vestluses on {count} verifitseerimata seadet.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Krüptitud sõnum", + "unencryptedMessage": "Krüptimata sõnum", + "publicKey": "Avalik võti: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Seadme identiteedi võti", + "showMore": "Näita veel", + "showLess": "Näita vähem", + "messageCanOnlyBeReadByUser": "Sinu sõnum on läbivalt krüptitud ja seda saab lugeda vaid see kasutaja:", + "messageCanOnlyBeReadByUsers": "Sinu sõnum on läbivalt krüptitud ja seda saavad lugeda vaid need kasutajad:", + "messageNotDecryptable": "Sõnum pole dekrüptitav", + "noCurve25519KeyFound": "Ühtegi curve25519 võtit ei leidu", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Allkirjastatud seade", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "unsignedDevice": "Allkirjastamata seade", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapEmptyDevicesDescription": "Selle seadme verifitseerimiseks ja krüptitud sõnumite varunduse kasutamiseks palun sisesta oma kasutajakonto salafraas või taastevõti.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Selle sessiooni verifitseerimiseks palun vali üks oma muudets seadmetest:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Lähtesta kasutajakonto", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Taasta krüptoidentiteet", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Lähtesta krüptoidentiteet", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Seadista krüptoidentiteet", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Ootan võtmete laadimist… Palun hoia teine seade aktiivsena.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Mitte mingeid krüptovõtmeid ei edastatud. Palun proovi uuesti.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Ava lukustus", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Ava fail", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Kui sa lähtestad oma kasutajakonto, siis kaotad igaveseks ligipääsu oma vanadele sõnumitele. Lisaks vajavad kõik sinu praegused seadmed uuesti verifitseerimist. Palun võta selline toiming ette vaid siis, kui sul pole jäänud alles enam mitte ühtegi teist seadet oma sessiooni verifitseerimiseks ning sa oled kaotanud oma taastevõtme ja salafraasi!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat kasutab läbivat krüptimist. Et sa ei kaotaks oma sõnumeid, turvaks oma krüptidentitedi ja krüptiks sõnumite varunduse, siis palun sisesta korralik ja tugev salafraas.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Uus salafraas", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Korda salafraasi", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Salafraasid klapivad", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Vähemalt 12 tähemärki pikk.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Sisaldab suur- ja väiketähti.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Sisaldab erimärke.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Sisaldab vähemat ühte numbrit.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Selleks, et saaksid hiljem oma krüptitud sõnumeid ja krüptoidentiteeti taastada, palun tähenda taastevõti turvaliselt üles ja talleta kas moodsas digitaalses salasõnalaekas või vana kooli seifis.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Salvesta failina", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Sa oled valmis alustama!", + "noUserKeyFound": "Kasutaja võtit ei leidu", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Teada alates: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "today": "Täna", + "sending": "Saadan", + "generatingThumbnail": "Koostan pisipilti", + "encrypting": "Krüptin", + "uploading": "Laadin üles", + "edited": "(muudetud)", + "couldNotBeSent": "Saatmine ei õnnestunud", + "yesterday": "Eile", + "resetRecoveryKey": "Lähtesta taastevõti", + "pleaseEnter6Digits": "Rakenduse luku sisselülitamiseks sisesta palun 6 numbrit.", + "disableAppLock": "Lülita rakenduse lukk välja", + "disableAppLockAreYouSure": "Kas oled kindel, et soovid selle rakenduse luku lülitada välja?", + "enableBiometrics": "Kasuta biomeetrilist autentimist", + "disableBiometrics": "Lülita biomeetriline autentimine välja", + "useAppLock": "Kasuta rakenduse lukustust", + "unlockWithBiometrics": "Ava lukustus biomeetrilise autentimisega", + "resetPin": "Lähtesta PIN-kood", + "forwardCountMessages": "Kas edastad {count, plural, =1{ühe sõnumi} other{{count} sõnumit}}?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "biometricsDescription": "Biomeetrilise autentimise puhul saad rakenduse lukust avada oma näo või sõrmejäljega. Konkreetsed võimalused sõltuvad sinu seadmest." +} diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb new file mode 100644 index 0000000000..d9e39b2a74 --- /dev/null +++ b/lib/l10n/intl_eu.arb @@ -0,0 +1,2563 @@ +{ + "@@locale": "eu", + "@@last_modified": "2021-08-14 12:41:10.062383", + "about": "Honi buruz", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Onartu", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username}(e)k gonbidapena onartu du", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Kontua", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username}(e)k ertzetik ertzerako zifratzea gaitu du", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administratzailea", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "ezizena", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName}(e)k deia erantzun du", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Edonor batu daiteke", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Fitxategia", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Batu al daitezke bisitan dauden erabiltzaileak?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ziur zaude?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Beste pertsona egiaztatzeko, sartu zure biltegiratze segururako pasaesaldia edo berreskuratze-gakoa.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}(r)en egiaztaketa-eskaera onartu?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Txatera batzeko debekua ezarri", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Kanporatuta", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}(e)k {targetName}(r)i debekua ezarri dio", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokeatu gailua", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Utzi", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username}(e)k txataren abatarra aldatu du", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username}(e)k txataren baimenak aldatu ditu", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}(e)k bere ezizena aldatu du. Aurrerantzean '{displayname}' izango da", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username}(e)k bisitarien sarbide-arauak aldatu ditu", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username}(e)k bisitarien arauak aldatu ditu: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username}(e)k historiaren ikusgaitasuna aldatu du", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username}(e)k historiaren ikusgaitasuna {rules}-(e)ra aldatu du", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username}(e)k batzeko arauak aldatu ditu", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username}(e)k batzeko arauak aldatu ditu: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}(e)k profileko abatarra aldatu du", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username}(e)k gelaren ezizena aldatu du", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username}(e)k gonbidapen-esteka aldatu du", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Aldatu zerbitzaria", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Aldatu itxura", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Taldearen izena aldatu", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Zifratzea hondatu egin da", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Txata", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Txataren xehetasunak", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Aukeratu pasahitz sendo bat", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Itxi", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Konparatu emojiak", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Konparatu zenbakiak", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontaktua taldera gonbidatu da", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Arbelera kopiatu da", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiatu", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Ezin izan da mezua deszifratu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} partaide", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Sortu", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username}(e)k txata sortu du", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Une honetan aktibo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Iluna", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "delete": "Ezabatu", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Mezuak ezabatu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Gailuak", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Ezizena aldatu da", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Deskargatu fitxategia", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editatu ezizena", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotea badago lehendik ere!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Emotearen laburdura ez da baliozkoa!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote-ezarpenak", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Laburdura", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Txata hutsik dago", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ezingo duzu zifratzea ezgaitu. Ziur zaude?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Zifratzea", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Zifratzea ez dago gaituta", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName}(e)k deia amaitu du", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "forward": "Birbidali", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Batzeaz geroztik", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Gonbidapenaz geroztik", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Taldea", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Taldea publikoa da", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} duen taldea", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Ez, bisitariak ez daude baimenduta", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Bai, bisitariak batu daitezke", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username}(e)k {targetName}(r)en gonbidapena atzera bota du", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Laguntza", + "@help": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Pasaesaldi edo berreskuratze-gakoa ez da zuzena", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kontaktuak gonbidatu", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Gonbidatu kontaktua {groupName}(e)ra", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Gonbidatuta", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username}(e)k {targetName} gonbidatu du", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Gonbidatutako erabiltzaileak solik", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username}(e)k FluffyChatera gonbidatu zaitu.\n1. Bisitatu https://fluffychat.im eta instalatu aplikazioa\n2. Eman izena edo hasi saioa\n3. Ireki gonbidapen-esteka:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "idazten ari da…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} txatera batu da", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Batu gelara", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username}(e)k {targetName} kanporatu du", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username}(e)k {targetName} kanporatu eta debekua ezarri dio", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Txatetik kanporatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Azkenekoz aktibo: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Irten", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Txatetik irten da", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Argia", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Kargatu {count} partaide gehiago", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Kargatzen… itxaron.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Kargatu gehiago…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Hasi saioa", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Hasi saioa {homeserver}(e)n", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Amaitu saioa", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatzailea", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mututu txata", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Mezu berria FluffyChaten", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Egiaztaketa-eskaera berria!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "Ez", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ez da emoterik aurkitu. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Ez dirudi Firebase Cloud Messaging zure mugikorrean erabilgarri dagoenik. Jakinarazpenak jasotzeko ntfy instalatzea gomendatzen dugu. ntfy edo beste Unified Push hornitzaileren batekin, push jakinarazpenak jaso ditzazkezu datuentzako segurua den modu batean. ntfy PlayStore edo F-Droid dendetatik deskarga dezakezu.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Baimenik gabe", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Ez da gelarik aurkitu…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "Ados", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Gakoen online babeskopia gaituta dago", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hara, zerbaitek huts egin du…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Ireki aplikazioa mezuak irakurtzeko", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ireki kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "pasaesaldia edo berreskuratze-gakoa", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Pasahitza", + "@password": { + "type": "String", + "placeholders": {} + }, + "pin": "Finkatu", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Sartu zure pasahitza", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Sartu zure erabiltzaile-izena", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Gela publikoak", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username}(e)k gertaera bat atzera bota du", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Baztertu", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username}(e)k gonbidapena baztertu du", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Kendu", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Kendu gainerako gailu guztiak", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Kendu txatean duen debekua", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Erantzun", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Gela bertsio-berritu da", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "send": "Bidali", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Bidali mezua", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Bidali audioa", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Bidali fitxategia", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Bidali irudia", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Bidali bideoa", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username}(e)k fitxategia bidali du", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username}(e)k audioa bidali du", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username}(e)k irudia bidali du", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username}(e)k pegatina bidali du", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username}(e)k bideoa bidali du", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName}(e)k deiaren informazioa bidali du", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "Ezarri egoera", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ezarpenak", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Partekatu", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username}(e)k kokapena partekatu du", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Saltatu", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Iturburu kodea", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName}(e)k deia hasi du", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Zer moduz zaude gaur?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Bidali", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistemak darabilena", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ez datoz bat", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Bat datoz", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Saiatu berriro bidaltzen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}(e)k {targetName}(r)i debekua kendu dio", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desblokeatu gailua", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Gailu ezezaguna", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Zifratze-algoritmo ezezaguna", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "'{type}' gertaera ezezaguna", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Utzi txata mututzeari", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Utzi finkatzeari", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} eta beste {count} idazten ari dira…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} eta {username2} idazten ari dira…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} idazten ari da…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username}(e)k txata utzi du", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username}(e)k {type} gertaera bat bidali du", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Abiarazi egiaztaketa", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Ondo egiaztatu duzu!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Beste kontua egiaztatzen", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Bideo-deia", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Txat-historiaren ikusgaitasuna", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Partaide guztientzat ikusgai", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Edonorentzat ikusgai", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Ahozko mezua", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Kideak eskaera onartuko zain…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Kideak emojia onartuko zain…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Kideak zenbakiak onartuko zain…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Nor batu daiteke talde honetara", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Idatzi mezua…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Bai", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Zeu", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ez duzu txat honetan parte hartzen honezkero", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Txat honetan debekua ezarri dizute", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editatu gelaren aliasak", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "chats": "Txatak", + "@chats": { + "type": "String", + "placeholders": {} + }, + "emojis": "Emojiak", + "placeCall": "Egin deia", + "voiceCall": "Ahozko deia", + "unsupportedAndroidVersion": "Android bertsioa ez da bateragarria", + "unsupportedAndroidVersionLong": "Funtzio honek Android bertsio berriago bat behar du. Egiaztatu eguneraketak ote dauden edo begiratu Lineage OS-ek zure gailuarentzat aukerarik eskaintzen duen.", + "commandHint_ban": "Debekatu erabiltzailea gela honetan", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Ezabatu katxea", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Sortu taldeko-txat huts bat\nErabili --no-encyption zifratzea desgaitzeko", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_op": "Zehaztu erabiltzaile honen botere-maila (defektuz: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Bidali formaturik gabeko testua", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Bidali erantzuna erreakzio gisa", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Bidali testua", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "createNewSpace": "Gune berria", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editatu blokeatutako zerbitzariak", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Gelaren abatarra editatu", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Zifratuta", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Sartu helbide elektroniko bat", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Errorea kokapena lortzerakoan: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "groups": "Taldeak", + "@groups": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ezkutatu gertaera ezezagunak", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} erabiltzaile idazten ari dira…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifications": "Jakinarazpenak", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Zure gailuetako batek saioa amaitu du", + "addAccount": "Gehitu kontua", + "editBundlesForAccount": "Editatu kontu honetarako sortak", + "oopsPushError": "Hara! Zoritxarrez, errore bat gertatu da push jakinarazpenak ezartzerakoan.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Gorde fitxategia", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "Kontuan izan bideo-deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.", + "all": "Guztia", + "@all": { + "type": "String", + "placeholders": {} + }, + "next": "Hurrengoa", + "@next": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Bideo-dei esperimentalak", + "removeFromBundle": "Kendu sorta honetatik", + "or": "Edo", + "@or": { + "type": "String", + "placeholders": {} + }, + "link": "Esteka", + "privacy": "Pribatutasuna", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Bota mezua atzera", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Jarraitu webguneko argibideak eta sakatu 'Hurrengoa'.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reason": "Arrazoia", + "@reason": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Salatu mezua", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "status": "Egoera", + "@status": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Zure gako publikoa", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "time": "Ordua", + "edit": "Editatu", + "@edit": { + "type": "String", + "placeholders": {} + }, + "mention": "Aipatu", + "@mention": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Idatzi berriro pasahitza", + "addEmail": "Gehitu ePosta", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ziur zaude saioa amaitu nahi duzula?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiatu arbelera", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ez ikusia egindako erabiltzaileak", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "security": "Segurtasuna", + "@security": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Automatikoki abiarazi pegatina eta emote animatuak", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Bidali enter sakatuz", + "cantOpenUri": "Ezin da {uri} URIa ireki", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Aldatu gailuaren izena", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Aldatu pasahitza", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Aldatu abatarra", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Txataren babeskopia", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Txata konfiguratu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Edukia zerbitzariko administratzaileei jakinarazi zaie", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Ezarri alias nagusi bezala", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "appLock": "Aplikazioa blokeatzea", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Gehitu gunera", + "badServerLoginTypesException": "Zerbitzariak ondorengo aukerak onartzen ditu saioa hasteko:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu bakarrik:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "commandHint_dm": "Hasi banakako txat bat\nErabili --no-encyption zifratzea desgaitzeko", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "Utzi gela hau", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "blocked": "Blokeatuta", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Komandoa ez da baliozkoa", + "@commandInvalid": { + "type": "String" + }, + "commandHint_myroomnick": "Ezarri zure ezizena gela honetarako", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "ignore": "Ezikusi", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Kokapen zerbitzuak ezgaituta daude. Gaitu zure kokapena partekatu ahal izateko.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "directChats": "Banakako txatak", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Gaitu zifratzea", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Estekan sakatu dut", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Oraindik ez duzu pasahitza berreskuratzeko modurik gehitu.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Ordezkatu gela bertsio berriago batekin", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Bilatu", + "@search": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Helbide hauekin pasahitza berreskuratu dezakezu.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Zergatik salatu nahi duzu?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "openGallery": "Ireki bilduma", + "pinMessage": "Finkatu gelan", + "reactedWith": "{sender}(e)k {reaction}(r)ekin erreakzionatu du", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Ziur zaude gertaera finaktzeari utzi nahi diozula?", + "markAsRead": "Markatu irakurritzat", + "clearArchive": "Ezabatu artxiboa", + "commandHint_html": "Bidali testua HTML formatuan", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Gonbidatu erabiltzailea gela honetara", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Batu adierazitako gelara", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Kendu erabiltzaile hori gela honetatik", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_me": "Deskribatu zure burua", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ezarri zure irudia gela honetarako (mxc-uri bidez)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_unban": "Kendu erabiltzaileak gela honetan duen debekua", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandMissing": "{command} ez da komandoa.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandHint_discardsession": "Baztertu saioa", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "deactivateAccountWarning": "Honek zure kontua desaktibatuko du. Ezin da desegin! Ziur zaude?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Erabiltzaile berrien defektuzko botere-maila", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ezabatu kontua", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Gaitu emote-sorta txat guztietarako", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Letraren tamaina", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Kokapen baimena ukatu da. Eman zure kokapena partekatzeko baimena.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "messages": "Mezuak", + "@messages": { + "type": "String", + "placeholders": {} + }, + "newChat": "Txat berria", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ez dago konexiorik zerbitzariarekin", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Zifratzea aktiba dezakezu soilik gelak publikoa izateari utzi badio.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ez da matrix zerbitzari bat, {server2} erabili nahi duzu haren ordez?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "scanQrCode": "Eskaneatu QR kodea", + "obtainingLocation": "Kokapena atzitzen…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Gehitu sortara", + "bundleName": "Sortaren izena", + "openInMaps": "Ireki mapen aplikazioan", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "participant": "Partaide", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Pasahitza ahaztu dut", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Pasahitza aldatu da", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Pasahitzaren berreskurapena", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Aukeratu sartzeko kode bat", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Sakatu ePostako estekan eta ondoren jarraitu.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Sartu zure PINa", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Kendu zure abatarra", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Gelaren bertsioa", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Bidali testu bezala", + "@sendAsText": { + "type": "String" + }, + "sendMessages": "Mezuak bidali", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Partekatu kokapena", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Gunea publikoa da", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Gunearen izena", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinkronizatzen… itxaron.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Eskaera gehiegi. Saiatu berriro geroago!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unverified": "Egiaztatu gabe(a)", + "verified": "Egiaztatuta", + "@verified": { + "type": "String", + "placeholders": {} + }, + "warning": "Kontuz!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "ePosta bat bidali dizugu", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Nork zer egin dezakeen", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Mezuaren xehetasunak", + "sender": "Igorlea", + "removeFromSpace": "Kendu gunetik", + "reportUser": "Salatu erabiltzailea", + "youJoinedTheChat": "Txatera batu zara", + "youAcceptedTheInvitation": "👍 Gonbidapena onartu duzu", + "youBannedUser": "{user}(r)i debekua ezarri diozu", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}(r)i luzatutako gonbidapena baliogabetu duzu", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user}(e)k gonbidatu zaitu", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} gonbidatu duzu", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user} kanporatu duzu", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 {user} kanporatu eta debekua ezarri diozu", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "{user}(r)i debekua kendu diozu", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Gonbidapena baztertu duzu", + "users": "Erabiltzaileak", + "storeInAndroidKeystore": "Gorde Android KeyStore-n", + "dehydrate": "Esportatu saioa eta ezabatu gailua", + "dehydrateWarning": "Ekintza hau ezin da desegin. Egiaztatu babeskopia toki seguruan gorde duzula.", + "hydrate": "Lehengoratu babeskopia bat erabiliz", + "storeSecurlyOnThisDevice": "Gorde gailu honetan modu seguruan", + "countFiles": "{count} fitxategi", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Erabiltzailea", + "custom": "Neurrira egindakoa", + "storeInAppleKeyChain": "Gorde Apple KeyChain-en", + "confirmMatrixId": "Baieztatu zure Matrix IDa kontua ezabatu ahal izateko.", + "newSpace": "Gune berria", + "whyIsThisMessageEncrypted": "Zergatik ezin da mezu hau irakurri?", + "screenSharingTitle": "pantaila-partekatzea", + "screenSharingDetail": "Pantaila FluffyChaten partekatzen ari zara", + "noKeyForThisMessage": "Mezua gailu honetan saioa hasi baino lehen bidali bazen gertatu daiteke.\n\nBeste aukera bat igorleak zure gailua blokeatu izana da, edo zerbaitek huts egin izana interneteko konexioan.\n\nMezua beste saio batean irakur dezakezu? Hala bada, mezua transferitu dezakezu! Zoaz Ezrpenetara > Gailuak eta baieztatu zure gailuek bata bestea egiaztatu dutela. Gela irekiko duzun hurrengo aldian eta bi saioak aurreko planoan irekita daudenean, gakoak automatikoki partekatuko dira.\n\nEz duzu gakorik galdu nahi saioa amaitu edo gailuak aldatzen dituzunean? Baieztatu ezarpenetan txaten babeskopiak gaituta dituzula.", + "supposedMxid": "Hau {mxid} izan behar da", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Markatu talde bezala", + "foregroundServiceRunning": "Jakinarazpen hau zerbitzua martxan dagoenean agertzen da.", + "commandHint_markasdm": "Markatu mezu-zuzen gela bezala Matrix ID jakin honentzat", + "wasDirectChatDisplayName": "Txata hutsik dago ({oldDisplayName} zen lehen)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noBackupWarning": "Adi! Txataren babeskopia gaitzen ez baduzu, ezingo dituzu zifratutako txatak atzitu. Oso gomendagarria da txaten babeskopia gaitzea saioa amaitu baino lehen.", + "doNotShowAgain": "Ez erakutsi berriro", + "fileIsTooBigForServer": "Ezin da bidali! Zerbitzariak gehienez {max}-ko eranskinak onartzen ditu.", + "noOtherDevicesFound": "Ez da beste gailurik aurkitu", + "newSpaceDescription": "Guneek txatak taldekatzea ahalbidetzen dute eta komunitate pribatu edo publikoak osatzea.", + "disableEncryptionWarning": "Segurtasun arrazoiak direla-eta, ezin duzu lehendik zifratuta zegoen txat bateko zifratzea ezgaitu.", + "encryptThisChat": "Zifratu txata", + "commandHint_hug": "Bidali besarkada", + "hugContent": "{senderName}(e)k besarkatu zaitu", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Barka… hori ez da posible", + "reopenChat": "Ireki txata berriro", + "commandHint_googly": "Bidali begi dibertigarri batzuk", + "commandHint_cuddle": "Bidali besarkada samurra", + "googlyEyesContent": "{senderName}(e)k begi dibertigarri batzuk bidali dizkizu", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Joan irakurritako azken mezura", + "reportErrorDescription": "😭 O ez! Zerbaitek huts egin du. Nahi izanez gero, eman garatzaileei errorearen berri.", + "cuddleContent": "{senderName}(e)k samurki besarkatu zaitu", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "readUpToHere": "Honaino irakurrita", + "fileHasBeenSavedAt": "Fitxategia {path}(e)n gorde da", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jump": "Joan", + "openLinkInBrowser": "Ireki esteka nabigatzailean", + "report": "salatu", + "notAnImage": "Ez da irudi-fitxategia.", + "importNow": "Inportatu orain", + "importEmojis": "Inportatu emojiak", + "importFromZipFile": "Inportatu .zip fitxategi batetik", + "exportEmotePack": "Esportatu emote-sorta .zip gisa", + "replace": "Ordezkatu", + "sendTypingNotifications": "Jakinarazi idazten nagoela", + "setColorTheme": "Ezarri kolore-gaia:", + "tryAgain": "Saiatu berriro", + "messagesStyle": "Mezuak:", + "chatDescription": "Txataren deskribapena", + "invalidServerName": "Zerbitzari-izenak ez du balio", + "chatPermissions": "Txataren baimenak", + "setChatDescription": "Ezarri txataren deskribapena", + "redactedBy": "{username}(e)k atzera bota du", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Aukerakoa) Mezua atzera botatzearen arrazoia…", + "redactedByBecause": "{username}(e)k atzera bota du \"{reason}\" dela-eta", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Mezua elkarrizketa honetako partaide guztientzat botako da atzera. Ezin da desegin.", + "directChat": "Banakako txata", + "wrongPinEntered": "PIN okerra! Saiatu berriro {seconds} segundu barru…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "noChatDescriptionYet": "Ez da txaterako deskribapenik sortu oraindik.", + "chatDescriptionHasBeenChanged": "Txataren deskribapena aldatu da", + "shareInviteLink": "Partekatu gonbidapen-esteka", + "emoteKeyboardNoRecents": "Oraintsu erabilitako emoteak hemen ageriko dira…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "createGroup": "Sortu taldea", + "invite": "Gonbidatu", + "invalidInput": "Sartu duzunak ez du balio!", + "inviteGroupChat": "📨 Taldeko txatera gonbidapena", + "banUserDescription": "Erabiltzailea txatetik kanporatu eta berriro sartzeko debekua ezarriko zaio; ezingo da berriro sartu debekua kendu arte.", + "removeDevicesDescription": "Gailu honetako saioa amaituko da eta ezingo duzu mezurik jaso aurrerantzean.", + "unbanUserDescription": "Erabiltzailea txatera berriro sartu ahal izango da berak nahi izanez gero.", + "pushNotificationsNotAvailable": "Push jakinarazpenak ez daude erabilgarri", + "makeAdminDescription": "Behin erabiltzaile hau administratzaile eginda, litekeena da desegin ezin izatea zuk dituzun baimenak izango dituelako.", + "archiveRoomDescription": "Txata artxibategira mugituko da. Beste erabiltzaileek txatetik alde egin duzula ikusi ahal izango dute.", + "hasKnocked": "🚪 {user}(e)k baimena eskatu du", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Gehiago irakurri", + "roomUpgradeDescription": "Gela bertsio berri gisa birsortuko da txata. Partaide guztiei jakinaraziko zaie txat berrira aldatu behar direla. Gehiago irakur dezakezu gela bertsioei buruz ondorengo estekan: https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Sartu 0 baino zenbaki handiago bat", + "kickUserDescription": "Erabiltzailea txatetik kanporatu da baina ez zaio debekua ezarri. Txat publikoen kasuan, edozein momentutan batu daiteke berriro.", + "createGroupAndInviteUsers": "Sortu talde bat eta gonbidatu partaideak", + "groupCanBeFoundViaSearch": "Bilaketa erabiliz aurkitu daiteke taldea", + "noUsersFoundWithQuery": "Zoritxarrez ez da \"{query}\" duen erabiltzailerik aurkitu. Egiaztatu zuzen idatzi duzula.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "Zure erabiltzaile-ID orokorra: ", + "commandHint_sendraw": "Bidali json gordina", + "wrongRecoveryKey": "Barka baina ez dirudi berreskuratze-gako zuzena denik.", + "groupName": "Taldearen izena", + "searchChatsRooms": "Bilatu #txatak, @erabiltzaileak…", + "blockListDescription": "Gogaitzen zaituzten erabiltzaileak blokeatu ditzakezu. Ez duzu blokeatutakoen zerrendan dituzun erabiltzaileen mezurik edo gelara batzeko gonbidapenik jasoko.", + "blockedUsers": "Blokeatutako erabiltzaileak", + "block": "Blokeatu", + "blockUsername": "Ezikusi erabiltzaile-izena", + "databaseMigrationTitle": "Datu-basea optimizatu da", + "databaseMigrationBody": "Itxaron, litekeena da tarte bat behar izatea.", + "publicSpaces": "Gune publikoak", + "passwordIsWrong": "Sartu duzun pasahitza okerra da", + "pleaseEnterYourCurrentPassword": "Sartu oraingo pasahitza", + "nothingFound": "Ez da ezer aurkitu…", + "newPassword": "Pasahitz berria", + "passwordsDoNotMatch": "Pasahitzak ez datoz bat", + "select": "Hautatu", + "pleaseChooseAStrongPassword": "Aukeratu pasahitz sendo bat", + "addChatOrSubSpace": "Gehitu txata edo azpi-gunea", + "leaveEmptyToClearStatus": "Utzi hutsik zure egoera garbitzeko.", + "joinSpace": "Batu gunera", + "searchForUsers": "Bilatu @erabiltzaileak…", + "thisDevice": "Gailu hau:", + "initAppError": "Errorea aplikazioa abiaraztean", + "sessionLostBody": "Zure saioa galdu da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikazioa babeskopia erabiliz saioa leheneratzen saiatuko da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Bidali irakurri izanaren agiria", + "formattedMessages": "Formatua duten mezuak", + "verifyOtherDevice": "🔐 Egiaztatu beste gailu bat", + "acceptedKeyVerification": "{sender}(e)k gakoaren egiaztapena onartu du", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender}(e)k gakoen egiaztapena ezeztatu du", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender}(e)k gakoen egiaztapena galdegin du", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Txateko beste partaideek mezu bat irakurri duzula ikus dezakete.", + "completedKeyVerification": "{sender}(e)k gakoen egiaztapena osatu du", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} gakoak egiaztatzeko prest dago", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDeviceDescription": "Beste gailu bat egiaztatzean, gailu horiek gakoak truka ditzakete, eta segurtasun orokorra handitu. 💪 Egiaztapena hasten duzunean, laster-leiho bat agertuko da bi gailuetan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk ikusiko dituzu. Hobe da bi gailuak eskura izatea egiaztapena hasi aurretik. 🤳", + "verifyOtherUserDescription": "Beste erabiltzaile bat egiaztatzen baduzu, ziur egon zaitezke nori idazten ari zaren. 💪\n\nEgiaztapena hasten duzunean, zuk eta beste erabiltzaileak laster-leiho bat ikusiko duzue aplikazioan. Bertan, elkarrekin alderatu behar diren emoji edo zenbaki batzuk erakutsiko dira.\n\nBideo-dei bat hastea edo aurrez-aurre batzea da horretarako modurik onena. 👭", + "formattedMessagesDescription": "Erakutsi mezu aberatsen edukia markdown erabiliz, testu lodia esaterako.", + "sendTypingNotificationsDescription": "Txateko beste partaideek mezu berri bat idazten ari zarela ikus dezakete.", + "verifyOtherUser": "🔐 Egiaztatu beste erabiltzaile bat", + "startedKeyVerification": "{sender}(e)k gakoen egiaztapena hasi du", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Jasotako mezuak", + "discover": "Arakatu", + "stickers": "Pegatinak", + "commandHint_unignore": "Utzi Matrix ID honi muzin egiteari", + "commandHint_ignore": "Muzin egin Matrix ID honi", + "unreadChatsInApp": "{appname}: {unread} mezu irakurri gabe", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Plataforma honetan ezin da datu-basea zifratu", + "usersMustKnock": "Erabiltzaileek baimena eskatu behar dute", + "knock": "Eskatu baimena", + "knocking": "Baimena eskatzen", + "chatCanBeDiscoveredViaSearchOnServer": "Txata {server}(e)n bilaketa eginez aurkitu daiteke", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Une honetan {count} erabiltzaile daude blokeatuta.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "appLockDescription": "Blokeatu aplikazioa pin kode batekin erabiltzen ari ez zarenean", + "accessAndVisibility": "Sarbidea eta ikusgaitasuna", + "accessAndVisibilityDescription": "Nork du txat honetara batzeko baimena eta nola aurkitu daiteke txata.", + "customEmojisAndStickers": "Emoji eta pegatina propioak", + "customEmojisAndStickersBody": "Gehitu edo partekatu edozein txatetan erabil daitezkeen emoji edo pegatina propioak.", + "hideRedactedMessages": "Ezkutatu atzera botatako mezuak", + "hideRedactedMessagesBody": "Norbaitek mezuren bat atzera botaz gero, mezua txatetik kenduko da, abisurik gabe.", + "hideInvalidOrUnknownMessageFormats": "Ezkutatu mezuen formatu ezezagun edo baliogabea", + "passwordRecoverySettings": "Pasahitza berreskuratzeko ezarpenak", + "globalChatId": "Txat ID orokorra", + "calls": "Deiak", + "noOneCanJoin": "Ezin da inor batu", + "publicChatAddresses": "Txataren helbide publikoak", + "createNewAddress": "Sortu helbide berria", + "files": "Fitxategiak", + "gallery": "Galeria", + "searchIn": "Bilatu {chat} txatean...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Bilatu gehiago...", + "swipeRightToLeftToReply": "Herrestatu eskuin-ezker erantzuteko", + "noMoreChatsFound": "Ez da beste txatik aurkitu...", + "unread": "Irakurtzeke", + "space": "Gunea", + "goToSpace": "Joan {space} gunera", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Markatu irakurri gabetzat", + "adminLevel": "{level} - Administratzailea", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheChatPermissions": "Aldatu txataren baimenak", + "inviteOtherUsers": "Gonbidatu beste erabiltzaileak txat honetara", + "userLevel": "{level} - Erabiltzailea", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderatzailea", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendRoomNotifications": "Bidali @gela jakinarazpena", + "changeTheDescriptionOfTheGroup": "Aldatu txataren deskribapena", + "changeGeneralChatSettings": "Aldatu txataren ezarpen orokorrak", + "changeTheVisibilityOfChatHistory": "Aldatu txataren historiaren ikusgaitasuna", + "changeTheCanonicalRoomAlias": "Aldatu txataren helbide publiko nagusia", + "updateInstalled": "🎉 {version} bertsioa instalatu da!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Aldaketak", + "chatPermissionsDescription": "Definitu zer botere-maila behar den txat honetako ekintza jakinetarako. 0, 50 eta 100 botere-mailek erabiltzaileak, moderatzaileak eta administratzaileak ordezkatzen dituzte, baina edozein graduazio posible da.", + "sendCanceled": "Bidalketa bertan behera utzi da", + "noChatsFoundHere": "Ez da txatik aurkitu. Hasi norbaitekin txateatzen beheko botoia erabiliz. ⤵️", + "loginWithMatrixId": "Hasi saioa Matrix IDarekin", + "doesNotSeemToBeAValidHomeserver": "Ez dirudi zerbitzaria bateragarria denik. Zuzena da URLa?", + "calculatingFileSize": "Fitxategiaren tamaina kalkulatzen…", + "sendingAttachment": "Eranskina bidaltzen…", + "oneOfYourDevicesIsNotVerified": "Zure gailuetako bat ez dago egiaztatuta", + "noticeChatBackupDeviceVerification": "Oharra: gailu guztiak txat-babeskopiarekin konektatzen dituzunean, automatikoki egiaztatzen dira.", + "opacity": "Opakutasuna:", + "manageAccount": "Kudeatu kontua", + "setWallpaper": "Ezarri horma-irudia", + "blur": "Lausotu:", + "continueText": "Jarraitu", + "contactServerAdmin": "Jarri harremanetan zerbitzariaren administratzailearekin", + "aboutHomeserver": "{homeserver}(e)ri buruz", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "supportPage": "Laguntza orria", + "serverInformation": "Zerbitzariaren informazioa:", + "name": "Izena", + "version": "Bertsioa", + "website": "Webgunea", + "contactServerSecurity": "Jakinarazi segurtasun arazo bat", + "noContactInformationProvided": "Zerbitzariak ez du harremanetarako informaziorik zehaztu", + "boldText": "Testu lodia", + "italicText": "Testu etzana", + "invalidUrl": "URL baliogabea", + "addLink": "Gehitu esteka", + "strikeThrough": "Zirrimarra", + "pleaseFillOut": "Bete ezazu", + "unableToJoinChat": "Ezin da txatera batu. Agian besteak elkarrizketa itxiko zuen honezkero.", + "sendImages": "Bidali {count} irudi", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Konprimatu", + "previous": "Aurrekoa", + "otherPartyNotLoggedIn": "Besteak ez du saiorik hasita eta, beraz, ezin du mezurik jaso!", + "appWantsToUseForLogin": "Erabili '{server}' saioa hasteko", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Honenbestez, aplikazioak eta webguneak zuri buruzko informazioa partekatzea baimentzen duzu.", + "open": "Ireki", + "generalNotificationSettings": "Jakinarazpen orokorren ezarpenak", + "notificationRuleContainsUserName": "Erabiltzaile-izena dauka", + "notificationRuleMaster": "Isilarazi jakinarazpen guztiak", + "userSpecificNotificationSettings": "Erabiltzaile zehatzen jakinarazpenen ezarpenak", + "more": "Gehiago", + "newChatRequest": "📩 Txat-eskaera berria", + "contentNotificationSettings": "Edukiaren jakinarazpenen ezarpenak", + "notificationRuleContainsUserNameDescription": "Mezuan erabiltzaile-izena aipatzen denean jakinarazten du.", + "notificationRuleMasterDescription": "Gainerako arauak gainidatzi eta jakinarazpenak ezgaitzen ditu.", + "roomNotificationSettings": "Gelen jakinarazpenen ezarpenak", + "otherNotificationSettings": "Beste jakinarazpenen ezarpenak", + "waitingForServer": "Zerbitzariaren zain…", + "synchronizingPleaseWaitCounter": " Sinkronizatzen… (%{percentage})", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "notificationRuleInviteForMe": "Gonbidapena niretzat", + "notificationRuleInviteForMeDescription": "Erabiltzailea gela batera gonbidatzen dutenean jakinarazten du.", + "notificationRuleSuppressNotices": "Ezkutatu mezu automatikoak", + "notificationRuleSuppressNoticesDescription": "BOTen eta bestelako bezero automatikoen jakinarazpenak ezkutatzen ditu.", + "notificationRuleMemberEvent": "Kideen gertaera", + "notificationRuleMemberEventDescription": "Kideen gertaeren jakinarazpenak ezkutatzen ditu.", + "notificationRuleIsUserMention": "Erabiltzailea aipatzea", + "notificationRuleContainsDisplayName": "Pantaila-izena dauka", + "notificationRuleIsUserMentionDescription": "Erabiltzailea mezu zuzen batean aipatzen dutenean jakinarazten du.", + "notificationRuleContainsDisplayNameDescription": "Mezu batek erabiltzailearen pantaila-izena duenean jakinarazten du.", + "notificationRuleIsRoomMention": "Gelaren aipamena", + "notificationRuleIsRoomMentionDescription": "Gela aipatzen denean erabiltzailea jakinarazten du.", + "notificationRuleRoomnotif": "Gelaren jakinarazpena", + "notificationRuleRoomnotifDescription": "Mezu batek '@room' duenean erabiltzaileari jakinarazten dio.", + "notificationRuleTombstone": "Hilarria", + "notificationRuleReaction": "Erreakzioa", + "notificationRuleReactionDescription": "Erreakzioen jakinarazpenak ezkutatzen ditu.", + "notificationRuleTombstoneDescription": "Gela desaktibatzeko mezuei buruz jakinarazten dio erabiltzaileari.", + "notificationRuleRoomServerAcl": "Gelaren zerbitzariaren ACLa", + "notificationRuleSuppressEdits": "Ezkutatu edizioak", + "notificationRuleCall": "Deia", + "notificationRuleEncryptedRoomOneToOne": "Zifratutako bien arteko gela", + "notificationRuleSuppressEditsDescription": "Editatutako mezuen jakinarazpenak ezkutatzen ditu.", + "notificationRuleCallDescription": "Erabiltzaileari deiei buruz jakinarazten dio.", + "notificationRuleEncryptedRoomOneToOneDescription": "Erabiltzailea jakinarazten du zifratutako bien arteko geletako mezuei buruz.", + "notificationRuleRoomOneToOne": "Bien arteko gela", + "notificationRuleRoomOneToOneDescription": "Erabiltzailea jakinarazten du bien arteko geletako mezuei buruz.", + "notificationRuleMessage": "Mezua", + "notificationRuleMessageDescription": "Erabiltzailea jakinarazten du mezu orokorrei buruz.", + "notificationRuleEncrypted": "Zifratuak", + "notificationRuleEncryptedDescription": "Erabiltzailea jakinarazten du zifratutako geletako mezuei buruz.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Erabiltzailea jakinarazten du Jitsi widgetaren gertaerei buruz.", + "notificationRuleServerAcl": "Ezkutatu zerbitzariaren ACL gertaerak", + "notificationRuleServerAclDescription": "Zerbitzariaren ACL gertaerak ezkutatzen ditu.", + "unknownPushRule": "Push arau ezezaguna '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Jakinarazpen ezarpen hau ezabatzen baduzu, ezin da desegin.", + "shareKeysWith": "Partekatu gakoak…", + "allDevices": "Gailu guztiekin", + "shareKeysWithDescription": "Zein gailu hartu beharko litzateke fidagarritzat zifratutako txaten mezuak irakur ditzaten?", + "crossVerifiedDevicesIfEnabled": "Egiaztapen gurutzatuko gailuekin, gaituta badaude", + "verifiedDevicesOnly": "Egiaztatutako gailuekin soilik", + "crossVerifiedDevices": "Egiaztapen gurutzatuko gailuekin", + "takeAPhoto": "Egin argazkia", + "recordAVideo": "Grabatu bideoa", + "optionalMessage": "Mezua (aukerakoa)…", + "notSupportedOnThisDevice": "Ez da gailu honekin bateragarria", + "commandHint_roomupgrade": "Bertsio-berritu gela adierazitako gela-bertsiora", + "enterNewChat": "Sartu txat berrira", + "notificationRuleRoomServerAclDescription": "Gela-zerbitzarirako sarbide-kontroleko zerrenden (ACL) jakinarazpenak ezkutatzen ditu.", + "approve": "Onetsi", + "youHaveKnocked": "Sartzeko baimena eskatu duzu", + "pleaseWaitUntilInvited": "Orain itxaron gelako norbaitek gonbidatzen zaituen arte.", + "checkList": "Kontrol-zerrenda", + "countInvited": "{count} gonbidatu", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - {sender}(r)en ahots-mezua", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "commandHint_logout": "Amaitu saioa gailu honetan", + "commandHint_logoutall": "Amaitu saioa aktibo dauden gailu guztietan", + "moreEvents": "Gertaera gehiago", + "displayNavigationRail": "Erakutsi nabigazio-barra mugikorrean", + "customReaction": "Erreakzio pertsonalizatua", + "declineInvitation": "Uko egin gonbidapenari", + "noMessagesYet": "Mezurik ez oraingoz", + "longPressToRecordVoiceMessage": "Sakatuta mantendu ahots-mezua grabatzeko.", + "pause": "Gelditu", + "resume": "Jarraitu", + "removeFromSpaceDescription": "Txata gunetik kenduko da, baina txaten zerrendan mantenduko da.", + "countChats": "{chats} txat", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces} guneko kidea", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} guneko kideak sartzeko baimena eska dezake", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Hasi bozketa", + "endPoll": "Amaitu bozketa", + "answersVisible": "Erakutsi emaitzak", + "pollQuestion": "Bozketako galdera", + "answerOption": "Erantzun-aukera", + "addAnswerOption": "Gehitu erantzun-aukera", + "allowMultipleAnswers": "Baimendu erantzun bat baino gehiago", + "pollHasBeenEnded": "Bozketa amaitu da", + "countVotes": "{count, plural, =1{Bozka bat} other{{count} bozka}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Emaitzak bozketak amaitu duenean egongo dira ikusgai", + "replyInThread": "Erantzun harian", + "countReplies": "{count, plural, =1{Erantzun bat} other{{count} erantzun}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Haria", + "backToMainChat": "Joan txat nagusira", + "changedTheChatDescription": "{username}(e)k txataren deskribapena aldatu du", + "changedTheChatName": "{username}(e)k txataren izena aldatu du", + "saveChanges": "Gorde aldaketak", + "createSticker": "Sortu pegatina edo emojia", + "attribution": "Sortzailea", + "skipChatBackup": "Ez egin txataren babeskopia", + "skipChatBackupWarning": "Ziur? Txataren babeskopia gaitzen ez baduzu, gailuz aldatuz gero mezuen sarbidea gal zenezake.", + "useAsSticker": "Erabili pegatina gisa", + "stickerPackNameAlreadyExists": "Pegatina-sortaren izena badago lehendik ere", + "newStickerPack": "Pegatina-sorta berria", + "stickerPackName": "Pegatina-sortaren izena", + "useAsEmoji": "Erabili emoji gisa", + "noMoreResultsFound": "Ez da beste emaitzarik aurkitu", + "chatSearchedUntil": "Txatean bilatu da {time} arte", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "clientWellKnownInformation": "Bezeroaren Well-Known informazioa:", + "versionWithNumber": "Bertsioa: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Erregistroak", + "advancedConfigs": "Konfigurazio aurreratua", + "advancedConfigurations": "Konfigurazio aurreratua", + "federationBaseUrl": "Federatzeko URL oinarria", + "baseUrl": "URL oinarria", + "identityServer": "Identitate-zerbitzaria:", + "signIn": "Hasi saioa", + "createNewAccount": "Sortu kontu berria", + "signUpGreeting": "FluffyChat deszentralizatua da! Hautatu zure kontua zein zerbitzaritan sortu nahi duzun, eta hasi erabiltzen!", + "signInGreeting": "Baduzu dagoeneko Matrix kontu bat? Ongi etorri berriro ere! Hautatu zure zerbitzaria eta hasi saioa.", + "theProcessWasCanceled": "Eragiketa bertan behera utzi da.", + "join": "Batu", + "searchOrEnterHomeserverAddress": "Bilatu edo sartu zerbitzariaren helbidea", + "matrixId": "Matrix IDa", + "setPowerLevel": "Ezarri botere-maila", + "makeModerator": "Izendatu moderatzaile", + "makeAdmin": "Izendatu administrari", + "removeModeratorRights": "Kendu moderatzaile eskubideak", + "removeAdminRights": "Kendu administratzaile eskubideak", + "powerLevel": "Botere-maila", + "setPowerLevelDescription": "Botere-mailek zehazten dute kide batek zer egin dezakeen gela honetan, eta tartea 0tik 100era artekoa izan ohi da.", + "owner": "Jabea", + "mute": "Mututu", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Sortu txat berria", + "reset": "Berrezarri", + "supportFluffyChat": "Eman babesa FluffyChat-i", + "support": "Lagundu", + "setLowPriority": "Ezarri lehentasun baxua", + "unsetLowPriority": "Kendu lehentasun baxua", + "playSoundOnNotification": "Jo soinua jakinarazpenekin", + "createNewTag": "Sortu etiketa berria", + "tagName": "Etiketaren izena", + "addTag": "Gehitu etiketa", + "removeTag": "Kendu etiketa", + "discardEdits": "Gorde gabeko aldaketak daude. Baztertu nahi dituzu?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Erakutsi gehiago", + "showLess": "Erakutsi gutxiago", + "hideRoomsInSpaces": "Ezkutatu gune batean dauden gelak", + "possibleByYou": "Bertsio hau zure laguntzari esker izan da posible. FluffyChat-ek doakoa, kode irekikoa eta guztiz komunitarioa izaten jarraitzen du.", + "showThumbnailsInTimeline": "Erakutsi irudi eta bideoen iruditxoa", + "appSubtitle": "[matrix] komunikazio segurua", + "appDescription": "Komunikatu [matrix] sare deszentralizatuaren bidez, era zifratuan, mundu guztiarentzat modu erraz eta eskuragarrian.", + "interactiveVerification": "Egiaztapen interaktiboa", + "interactiveVerificationDescription": "Elkarren ondoan bazaudete edo kanal seguru baten bidez komunikatzen bazarete, gailu guztiak batera egiazta ditzakezu, segurtasun-zenbaki bat edo emoji bat konparatuz.", + "countUnverifiedDevices": "Egiaztatu gabeko {count} gailu txatean.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Zifratutako mezua", + "unencryptedMessage": "Zifratu gabeko mezua", + "publicKey": "Gako publikoa: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Gailuaren identitate-gakoa" +} \ No newline at end of file diff --git a/lib/l10n/intl_fa.arb b/lib/l10n/intl_fa.arb new file mode 100644 index 0000000000..9e3b184de8 --- /dev/null +++ b/lib/l10n/intl_fa.arb @@ -0,0 +1,2522 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.061080", + "repeatPassword": "تکرار گذرواژه", + "about": "درباره", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "پذیرش", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} دعوت را پذیرفت", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "حساب", + "@account": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "به فضا افزودن", + "appLock": "قفل برنامه", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "all": "همه", + "@all": { + "type": "String", + "placeholders": {} + }, + "addEmail": "افزودن رایانامه", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} به تماس پاسخ داد", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "بایگانی", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "مطمئن هستید؟", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خارج شوید؟", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} رمزنگاری سراسری را فعال کرد", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "مدیر", + "@admin": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "گمان میرود {mxid} باشد", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} نام نمایشی را به '{displayname}' تغییر داد", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "confirmMatrixId": "برای پاک کردن حساب، لطفاً هویت ماتریکس خود را بپذیرید.", + "changeDeviceName": "تغییر نام دستگاه", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "alias": "نام مستعار", + "@alias": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "بن کردن از چت", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "آیا درخواست بازبینی {username} را می‌پذیرید؟", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areGuestsAllowedToJoin": "آیا مهمانان اجازه پیوستن دارند؟", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "پخش خودکار شکلک‌ها و برچسب‌های متحرک", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "فرستادن با کلید Enter", + "cancel": "رد کردن", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatPermissions": "{username} دسترسی‌های چت را تغییر داد", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "cantOpenUri": "نمی‌توان پیوند {uri} را باز کرد", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "banned": "محروم‌شده", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} کاربر {targetName} را محروم کرد", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "مسدود کردن دستگاه", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "مسدود‌شده", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "سرور از این نوع ورود پشتیبانی می‌کند:\n{serverVersions}\nاما برنامه تنها از این‌ها پشتیبانی می‌کند:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} نماد چت را تغییر داد", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} قوانین دسترسی مهمان را تغییر داد", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} نماد نمایه را تغییر داد", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chats": "چت ها", + "@chats": { + "type": "String", + "placeholders": {} + }, + "messages": "پیام‌ها", + "@messages": { + "type": "String", + "placeholders": {} + }, + "send": "فرستادن", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "فرستادن صدا", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} نام‌های مستعار اتاق را تغییر داد", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} پیوند دعوت را تغییر داد", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "close": "بستن", + "@close": { + "type": "String", + "placeholders": {} + }, + "sendImage": "فرستادن تصویر", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "فرستادن پیام‌ها", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibility": "{username} ویژگی دیدن تاریخچه را تغییر داد", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} قوانین دسترسی مهمان را به {rules} تغییر داد", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} قوانین پیوستن را به {joinRules} تغییر داد", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ویژگی دیدن تاریخچه را به {rules} تغییر داد", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "chooseAStrongPassword": "یک گذرواژه قوی انتخاب کنید", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "تغییر پوسته", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "تغییر نام گروه", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "تغییر نماد نمایه", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "رمزنگاری مخدوش شده است", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "پاک کردن بایگانی", + "commandHint_create": "ساختن یک چت گروهی خالی\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "شروع یک چت مستقیم\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "sendVideo": "فرستادن ویدئو", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sender": "فرستنده", + "changedTheJoinRules": "{username} قوانین پیوستن را تغییر داد", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chatDetails": "جزئیات چت", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "علامت‌گذاری به‌عنوان اتاق پیام مستقیم با شناسه ماتریکس", + "commandHint_markasgroup": "علامت‌گذاری به‌عنوان گروه", + "commandHint_clearcache": "پاک کردن حافظه نهان", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "رد کردن نشست", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "groups": "گروه‌ها", + "@groups": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "برای خواندن پیام‌ها، برنامه را باز کنید", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "فرستادن پیام", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} اطلاعات تماس را فرستاد", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendAsText": "فرستادن به‌عنوان متن", + "@sendAsText": { + "type": "String" + }, + "sendFile": "فرستادن پرونده", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} تماس را آغاز کرد", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "tryToSendAgain": "تلاش دوباره برای فرستادن", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} با {reaction} واکنش نشان داد", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "askSSSSSign": "لطفاً عبارت عبور یا کلید بازیابی حافظه امن را وارد کنید تا شخص دیگری را امضا کنید.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "chat": "چت", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "پشتیبان چت", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changePassword": "تغییر گذرواژه", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "تغییر سرور خانگی", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} یک تصویر فرستاد", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} یک ویدئو فرستاد", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandInvalid": "دستور نامعتبر", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} یک دستور نیست.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "مخاطب به گروه دعوت شد", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} یک پرونده فرستاد", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} یک صدا فرستاد", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} یک رویداد {type} فرستاد", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "weSentYouAnEmail": "یک رایانامه برای شما فرستادیم", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "بارگیری {count} شرکت‌کننده دیگر", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentASticker": "😊 {username} یک برچسب فرستاد", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_ban": "محروم کردن کاربر مشخص‌شده از این اتاق", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_kick": "بیرون کردن کاربر مشخص‌شده از این اتاق", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_plain": "فرستادن متن بدون قالب", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_unban": "رد محرومیت کاربر مشخص‌شده از این اتاق", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "copy": "رونوشت", + "@copy": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "سطح دسترسی پیش‌فرض", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "پاک کردن", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "پاک کردن حساب", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "پاک کردن پیام", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "فرستادن متن با قالب HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_join": "پیوستن به اتاق مشخص‌شده", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_leave": "ترک این اتاق", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomnick": "تنظیم نام نمایشی برای این اتاق", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "تنظیم نماد نمایه برای این اتاق (با mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "تنظیم سطح دسترسی کاربر مشخص‌شده (پیش‌فرض: ۵۰)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "فرستادن پاسخ به‌عنوان واکنش", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "compareEmojiMatch": "لطفاً شکلک‌ها را مقایسه کنید", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "رونوشت به بریده‌دان", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} شرکت‌کننده", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "ساختن", + "@create": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "فضای جدید", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "devices": "دستگاه‌ها", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "نام نمایشی تغییر کرد", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "بارگیری پرونده", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "ویرایش", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ویرایش سرورهای مسدود", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "ویرایش نام‌های مستعار اتاق", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "ویرایش نماد اتاق", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "شکلک از پیش وجود دارد!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "کد کوتاه شکلک نامعتبر است!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "چت خالی", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "به بریده‌دان رونوشت شد", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} چت را ساخت", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "darkTheme": "تیره", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "directChats": "چت های مستقیم", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "تنظیمات شکلک", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "کد کوتاه شکلک", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "توصیف خود", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_send": "فرستادن متن", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "couldNotDecryptMessage": "نمی‌توان پیام را رمزگشایی کرد: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "این کار حساب شما را غیرفعال می‌کند. این کنش برگشت‌ناپذیر است! آیا مطمئن هستید؟", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "commandHint_invite": "دعوت از کاربر مشخص‌شده به این اتاق", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "compareNumbersMatch": "لطفاً اعداد را مقایسه کنید", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "تنظیمات چت", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "اکنون فعال", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}، {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "editDisplayname": "ویرایش نام نمایشی", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} دعوت {targetName} را پس گرفت", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsAreForbidden": "مهمان‌ها ممنوع هستند", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "پنهان کردن رویدادهای ناشناخته", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "محتوا به مدیران سرور گزارش شد", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "از پیوستن", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "از دعوت", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "گروه", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "گروه عمومی است", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "گروه با {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "enableEmotesGlobally": "فعال کردن بسته شکلک به‌صورت سراسری", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "فعال کردن رمزنگاری", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "نمی‌توانید رمزنگاری را غیرفعال کنید. آیا مطمئن هستید؟", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "رمزنگاری‌شده", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "رمزنگاری", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "رمزنگاری فعال نیست", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "یک نشانی رایانامه وارد کنید", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} به تماس پایان داد", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "errorObtainingLocation": "خطا در به‌دست آوردن مکان: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "اندازه قلم", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "هدایت", + "@forward": { + "type": "String", + "placeholders": {} + }, + "help": "کمک", + "@help": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "مهمان‌ها می‌توانند بپیوندند", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "کاربران نادیده‌گرفته شده", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "فرستادن چند چشم گوگولی", + "googlyEyesContent": "{senderName} برای شما چشم‌های گوگولی می‌فرستد", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "ignore": "نادیده‌گرفتن", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} شما را در آغوش می‌گیرد", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} شما را بغل می‌کند", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "فرستادن آغوش", + "commandHint_hug": "فرستادن بغل", + "editBundlesForAccount": "ویرایش بسته‌های این حساب", + "logout": "خروج", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "نام‌بردن", + "@mention": { + "type": "String", + "placeholders": {} + }, + "muteChat": "بی‌صدا کردن چت", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "چت جدید", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 پیام جدید در فلافی‌چت", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "بدون اتصال به سرور", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "no": "خیر", + "@no": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "هنوز روشی برای بازیابی گذرواژه خود اضافه نکرده‌اید.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "or": "یا", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "شرکت‌کننده", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "عبارت عبور یا کلید بازیابی", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "گذرواژه", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "گذرواژه تغییر کرد", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "بازیابی گذرواژه", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "سنجاق کردن", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "لطفاً رمز کوتاه خود را وارد کنید", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "لطفاً گذرواژه خود را وارد کنید", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "لطفاً دستورالعمل‌های وبگاه را دنبال کنید و روی بعدی بزنید.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "اتاق‌های عمومی", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "در حال به‌دست آوردن مکان…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "اوه، مشکلی پیش آمد…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "افزودن به بسته", + "passwordForgotten": "فراموشی گذرواژه", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "link": "پیوند", + "iHaveClickedOnLink": "روی پیوند کلیک کردم", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "عبارت عبور یا کلید بازیابی نادرست است", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "دعوت مخاطب به {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "فقط کاربران دعوت‌شده", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "isTyping": "در حال نوشتن…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "پیوستن به اتاق", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} کاربر {targetName} را بیرون کرد", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "بیرون کردن از چت", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "چت را ترک کرد", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "صدور نشست و پاک کردن دستگاه", + "loadingPleaseWait": "در حال بارگذاری… لطفاً صبر کنید.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "بارگذاری بیشتر…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "دسترسی به مکان رد شد. برای هم‌رسانی مکان، لطفاً دسترسی بدهید.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "logInTo": "ورود به {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "moderator": "ناظر", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "درخواست بازبینی جدید!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noPermission": "بدون دسترسی", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "اتاقی پیدا نشد…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "اوه! خطایی در تنظیم آگاه‌سازها رخ داد.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "openCamera": "باز کردن دوربین", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "addAccount": "افزودن حساب", + "pleaseChooseAPasscode": "لطفاً یک رمز کوتاه انتخاب کنید", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "لطفاً نام کاربری خود را وارد کنید", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "حریم خصوصی", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} کاربر در حال نوشتن…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "invited": "دعوت‌شده", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} از {targetName} دعوت کرد", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinedTheChat": "👋 {username} به چت پیوست", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} کاربر {targetName} را بیرون و محروم کرد", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "dehydrateWarning": "این کنش برگشت‌ناپذیر است. مطمئن شوید پرونده پشتیبان را به‌صورت امن ذخیره می‌کنید.", + "locationDisabledNotice": "مکان‌یاب غیرفعال است. لطفاً آن را فعال کنید تا بتوانید مکان خود را هم‌رسانی کنید.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "next": "بعدی", + "@next": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "شکلکی پیدا نشد. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "به نظر می‌رسد دستگاه شما سرویس‌های گوگل ندارد. این انتخاب خوبی برای حریم خصوصی است! برای دریافت آگاه‌سازها در فلافی‌چت، پیشنهاد می‌کنیم از https://ntfy.sh استفاده کنید. با ntfy یا یک فراهم‌کننده UnifiedPush می‌توانید آگاه‌سازهای امن دریافت کنید. می‌توانید ntfy را از Play Store یا F-Droid بارگیری کنید.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "رمزنگاری را تنها زمانی می‌توانید فعال کنید که اتاق عمومی نباشد.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "پشتیبان‌گیری آنلاین کلید فعال است", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "لطفاً روی پیوند در رایانامه کلیک کنید و ادامه دهید.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "hydrate": "بازیابی از پرونده پشتیبان", + "inviteContact": "دعوت از مخاطب", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} سرور ماتریکس نیست، از {server2} استفاده شود؟", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "oneClientLoggedOut": "یکی از برنامه‌های شما از سیستم خارج شد", + "removeFromBundle": "برداشتن از بسته", + "bundleName": "نام بسته", + "openInMaps": "باز کردن در نقشه", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} شما را به فلافی‌چت دعوت کرد.\n۱. به fluffychat.im بروید و برنامه را نصب کنید\n۲. ثبت‌نام کنید یا وارد شوید\n۳. پیوند دعوت را باز کنید:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "leave": "ترک کردن", + "@leave": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "پویش کد QR", + "lastActiveAgo": "آخرین فعالیت: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "lightTheme": "روشن", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "login": "ورود", + "@login": { + "type": "String", + "placeholders": {} + }, + "notifications": "آگاه‌سازها", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "ok": "خوب", + "@ok": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "اتاق ارتقا یافت", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "reject": "رد کردن", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} دعوت را رد کرد", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unbanFromChat": "لغو محرومیت از چت", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "پاسخ", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "نگارش اتاق", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "جستجو", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "امنیت", + "@security": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "تنظیم به‌عنوان نام مستعار اصلی", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "برداشتن نماد نمایه", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} یک رویداد را ویرایش کرد", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "برداشتن", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "پاک کردن همه دستگاه‌های دیگر", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "گزارش پیام", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "ذخیره پرونده", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "reason": "دلیل", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "ویرایش پیام", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "جایگزینی اتاق با نگارش جدیدتر", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "پرونده در {path} ذخیره شد", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "چت خالی (قبلا {oldDisplayName} بود)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "فضاها امکان یکپارچه‌سازی چت ها و ساخت جوامع خصوصی یا عمومی را فراهم می‌کنند.", + "encryptThisChat": "رمزنگاری این چت", + "sorryThatsNotPossible": "متأسفیم... این ممکن نیست", + "fileIsTooBigForServer": "نمیتوان فرستاد! سرور تنها از پیوست های تا {max} پشتیبانی میکند.", + "jumpToLastReadMessage": "پرش به آخرین پیام خوانده‌شده", + "doNotShowAgain": "دوباره نمایش نده", + "readUpToHere": "خوانده‌شده تا اینجا", + "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان چت، دسترسی به پیام‌های رمزنگاری‌شده خود را از دست خواهید داد. پیشنهاد می‌شود پیش از خروج، پشتیبان چت را فعال کنید.", + "noOtherDevicesFound": "دستگاه دیگری پیدا نشد", + "countFiles": "{count} پرونده", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "اگر پیام پیش از ورود به حساب در این دستگاه فرستاده شده باشد، این مشکل ممکن است رخ دهد.\n\nهمچنین ممکن است فرستنده دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت وجود داشته باشد.\n\nآیا می‌توانید پیام را در نشست دیگری بخوانید؟ در این صورت، می‌توانید آن را منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید دستگاه‌هایتان یکدیگر را بازبینی کرده‌اند. هنگام باز کردن دوباره اتاق و فعال بودن هر دو نشست، کلیدها به‌صورت خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج یا تغییر دستگاه کلیدها را گم کنید؟ مطمئن شوید پشتیبان چت را در تنظیمات فعال کرده‌اید.", + "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزنگاری را در چتی که فعال شده غیرفعال کنید.", + "foregroundServiceRunning": "این آگاه‌ساز زمانی ظاهر می‌شود که خدمت پیش‌زمینه فعال است.", + "storeSecurlyOnThisDevice": "ذخیره امن در این دستگاه", + "screenSharingDetail": "شما در حال هم‌رسانی صفحه‌نمایش خود در فلافی‌چت هستید", + "newSpace": "فضای جدید", + "storeInAndroidKeystore": "ذخیره در Android KeyStore", + "storeInAppleKeyChain": "ذخیره در Apple KeyChain", + "user": "کاربر", + "custom": "سفارشی", + "screenSharingTitle": "هم‌رسانی صفحه‌نمایش", + "whyIsThisMessageEncrypted": "چرا این پیام خوانا نیست؟", + "reopenChat": "باز کردن دوباره چت", + "unmuteChat": "فعال کردن صدای چت", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "share": "هم‌رسانی", + "@share": { + "type": "String", + "placeholders": {} + }, + "skip": "رد کردن", + "@skip": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "سامانه", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "هم‌خوانی ندارند", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "باز کردن دستگاه", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "آغاز بازبینی", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "بازبینی با موفقیت انجام شد!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "در انتظار پذیرش شکلک توسط دیگری…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "چه کسی می‌تواند چه کاری انجام دهد", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "نوشتن پیام…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "شما از این چت محروم شده‌اید", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "setStatus": "تنظیم وضعیت", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "تنظیمات", + "@settings": { + "type": "String", + "placeholders": {} + }, + "spaceName": "نام فضا", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "هم‌خوانی دارند", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "درخواست‌های بیش از حد. لطفاً بعداً دوباره تلاش کنید!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} محرومیت {targetName} را برداشت", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEncryptionAlgorithm": "الگوریتم رمزنگاری ناشناخته", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unpin": "برداشتن سنجاق", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} و {username2} در حال نوشتن…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "videoCall": "تماس تصویری", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "قابل‌دید برای همه شرکت‌کنندگان", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "قابل‌دید برای همه", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "پیام صوتی", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "در انتظار پذیرش درخواست توسط دیگری…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "warning": "هشدار!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "شما دیگر در این چت شرکت نمی‌کنید", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "اطلاعات پیام", + "time": "زمان", + "userIsTyping": "{username} در حال نوشتن…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "yes": "بله", + "@yes": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "کلید عمومی شما", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "هم‌رسانی مکان", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "youInvitedUser": "📩 شما {user} را دعوت کردید", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unverified": "تأییدنشده", + "unsupportedAndroidVersion": "نسخه اندروید پشتیبانی‌نشده", + "youUnbannedUser": "شما محرومیت {user} را برداشتید", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "verified": "تاییدشده", + "@verified": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "چرا می‌خواهید گزارش دهید؟", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "you": "شما", + "@you": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "کد منبع", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "فضا عمومی است", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "در حال همگام‌سازی... لطفا صبر کنید.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "رویداد ناشناخته '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} و {count} نفر دیگر در حال تایپ کردن…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userLeftTheChat": "👋 {username} چت را ترک کرد", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "verifyTitle": "در حال تایید حساب دیگر", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه چت", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "چه کسی اجازه پیوستن به این گروه را دارد", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "در انتظار پذیرش اعداد توسط دیگری…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "با این آدرس‌ها می‌توانید رمز خود را بازیابی کنید.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openGallery": "بازکردن گالری", + "removeFromSpace": "حذف از فضا", + "confirmEventUnpin": "آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟", + "youKickedAndBanned": "🙅 شما {user} را بیرون و محروم کردید", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "statusExampleMessage": "امروز حالتان چطور است؟", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "ارسال", + "@submit": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "شما دعوت را رد کردید", + "youAcceptedTheInvitation": "👍 شما دعوت را پذیرفتید", + "videoCallsBetaWarning": "لطفا توجه داشته باشید که تماس‌های تصویری در حال حاضر آزمایشی هستند. ممکن است طبق انتظار کار نکنند یا روی همه پلتفرم‌ها اصلا کار نکنند.", + "experimentalVideoCalls": "تماس‌های تصویری آزمایشی", + "placeCall": "برقراری تماس", + "unsupportedAndroidVersionLong": "این ویژگی به نسخه تازه‌تری از اندروید نیاز دارد. لطفا به‌روزرسانی یا پشتیبانی لینیج‌اواس(LineageOS) را بررسی کنید.", + "sharedTheLocation": "{username} وضعیت مکانی خود را به اشتراک گذاشت", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "status": "وضعیت", + "@status": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "دستگاه ناشناس", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "علامت‌گذاشتن به عنوان خوانده شده", + "reportUser": "گزارش دادن کاربر", + "pinMessage": "سنجاق کردن به اتاق", + "emojis": "شکلک‌ها", + "voiceCall": "تماس صوتی", + "youJoinedTheChat": "شما به چت پیوستید", + "youBannedUser": "شما {user} را محروم کردید", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "شما دعوت {user} را پس‌گرفتید", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 شما توسط {user} دعوت شده‌اید", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 شما {user} را بیرون کردید", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "کاربرها", + "jump": "پرش", + "report": "گزارش", + "openLinkInBrowser": "بازکردن پیوند در مرورگر", + "reportErrorDescription": "اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.", + "notAnImage": "یک فایل تصویری نیست.", + "importNow": "اکنون وارد کنید", + "importEmojis": "وارد کردن شکلک‌ها", + "importFromZipFile": "وارد کردن از پرونده زیپ", + "exportEmotePack": "صادر کردن بسته شکلک به‌صورت زیپ", + "replace": "جایگزین کردن", + "aboutHomeserver": "درباره {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "ارتقای این اتاق به نگارش مشخص‌شده", + "appLockDescription": "قفل کردن برنامه با رمز کوتاه هنگام عدم استفاده", + "sendTypingNotifications": "فرستادن آگاه‌سازهای نوشتن", + "swipeRightToLeftToReply": "کشیدن از راست به چپ برای پاسخ", + "noMoreChatsFound": "چت دیگری پیدا نشد...", + "noChatsFoundHere": "اینجا هنوز چتی پیدا نشد. با استفاده از دکمه زیر چت جدیدی با کسی شروع کنید. ⤵️", + "unread": "خوانده‌نشده", + "space": "فضا", + "checkList": "فهرست بررسی", + "countInvited": "{count} دعوت‌شده", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "ساختن گروه", + "chatPermissions": "دسترسی‌های چت", + "emoteKeyboardNoRecents": "شکلک‌هایی که به تازگی استفاده‌شده اینجا نمایش داده میشوند...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "شناسه سراسری چت", + "accessAndVisibility": "دسترسی و قابلیت دید", + "accessAndVisibilityDescription": "چه کسی اجازه پیوستن به این چت را دارد و چت چگونه قابل پیدا شدن است.", + "calls": "تماس‌ها", + "customEmojisAndStickers": "شکلک‌ها و برچسب‌های سفارشی", + "customEmojisAndStickersBody": "افزودن یا اشتراک گذاری ایموجی ها یا استیکر های سفارشی که در هر چت قابل استفاده‌اند.", + "chatDescription": "توضیحات چت", + "chatDescriptionHasBeenChanged": "توضیحات چت تغییر کرد", + "hideRedactedMessages": "پنهان کردن پیام‌های ویرایش‌شده", + "hideRedactedMessagesBody": "اگر کسی پیامی را ویرایش کند، دیگر نمیتوان آن پیام را در چت دید.", + "hideInvalidOrUnknownMessageFormats": "پنهان کردن قالب‌های پیام نامعتبر یا ناشناخته", + "block": "مسدود کردن", + "blockedUsers": "کاربران مسدود‌شده", + "blockListDescription": "میتوانید کاربرانی که مزاحم شما هستند را مسدود کنید. از کاربران موجود در فهرست مسدود شخصی، پیام یا دعوت به اتاق دریافت نخواهید کرد.", + "blockUsername": "چشم‌پوشی از نام کاربری", + "noChatDescriptionYet": "هنوز توضیحات چتی نوشته نشده است.", + "tryAgain": "تلاش دوباره", + "invalidServerName": "نام سرور نامعتبر", + "redactMessageDescription": "پیام برای همه شرکت‌کنندگان در این گفتگو ویرایش خواهد شد. این کار برگشت‌ناپذیر است.", + "optionalRedactReason": "(اختیاری) دلیل ویرایش این پیام...", + "messagesStyle": "پیام‌ها:", + "shareInviteLink": "هم‌رسانی پیوند دعوت", + "passwordRecoverySettings": "تنظیمات بازیابی گذرواژه", + "redactedBy": "ویرایش‌شده به‌دست {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "چت مستقیم", + "redactedByBecause": "ویرایش‌شده به‌دست {username} زیرا: «{reason}»", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "sendImages": "فرستادن {count} تصویر", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "setChatDescription": "تنظیم توضیحات چت", + "synchronizingPleaseWaitCounter": " در حال همگام‌سازی... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} در زده است", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "کاربران باید در بزنند", + "noOneCanJoin": "هیچ‌کس نمیتواند بپیوندد", + "knock": "در زدن", + "setColorTheme": "تنظیم پوسته رنگی:", + "invite": "دعوت", + "inviteGroupChat": "📨 دعوت به چت گروهی", + "invalidInput": "ورودی نامعتبر!", + "wrongPinEntered": "رمز کوتاه نادرست وارد شد! {seconds} ثانیه دیگر دوباره تلاش کنید...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "لطفاً عددی بزرگ‌تر از ۰ وارد کنید", + "archiveRoomDescription": "چت به بایگانی خواهد رفت. کاربران دیگر میتوانند ببینند که شما چت را ترک کرده‌اید.", + "roomUpgradeDescription": "چت با نگارش جدید اتاق بازسازی خواهد شد. به همه شرکت‌کنندگان آگاهی‌رسانی میشود که باید به چت جدید بروند. داده‌های بیشتر درباره نگارش‌های اتاق در https://spec.matrix.org/latest/rooms/", + "removeDevicesDescription": "از این دستگاه خارج خواهید شد و دیگر نمیتوانید پیام دریافت کنید.", + "banUserDescription": "کاربر از چت محروم خواهد شد و تا زمانی که محرومیت برداشته نشود، نمیتواند دوباره وارد چت شود.", + "unbanUserDescription": "کاربر در صورت تلاش دوباره میتواند وارد چت شود.", + "kickUserDescription": "کاربر از چت بیرون میشود اما محروم نمیشود. در چت های عمومی، کاربر میتواند هر زمان دوباره بپیوندد.", + "makeAdminDescription": "پس از مدیر کردن این کاربر، ممکن است نتوانید این کار را لغو کنید، زیرا آن‌ها همان دسترسی‌های شما را خواهند داشت.", + "pushNotificationsNotAvailable": "آگاه‌سازهای فشاری در دسترس نیستند", + "learnMore": "بیشتر بدانید", + "yourGlobalUserIdIs": "شناسه کاربری سراسری شما: ", + "noUsersFoundWithQuery": "متأسفانه کاربری با «{query}» پیدا نشد. لطفاً بررسی کنید که آیا اشتباه نوشتاری دارید.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "در زدن", + "chatCanBeDiscoveredViaSearchOnServer": "چت با جستجو در {server} قابل کشف است", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "جستجو برای #چت ها، @کاربران...", + "nothingFound": "چیزی پیدا نشد...", + "groupName": "نام گروه", + "createGroupAndInviteUsers": "ساختن گروه و دعوت کاربران", + "groupCanBeFoundViaSearch": "گروه با جستجو قابل یافتن است", + "wrongRecoveryKey": "متأسفیم... به نظر میرسد این کلید بازیابی درست نباشد.", + "commandHint_sendraw": "فرستادن json خام", + "databaseMigrationTitle": "پایگاه داده بهینه‌سازی شد", + "databaseMigrationBody": "لطفاً صبر کنید. این ممکن است لحظه‌ای طول بکشد.", + "leaveEmptyToClearStatus": "برای پاک کردن وضعیت، خالی بگذارید.", + "select": "انتخاب", + "searchForUsers": "جستجو برای @کاربران...", + "pleaseEnterYourCurrentPassword": "لطفاً گذرواژه کنونی خود را وارد کنید", + "newPassword": "گذرواژه جدید", + "pleaseChooseAStrongPassword": "لطفاً یک گذرواژه قوی انتخاب کنید", + "passwordsDoNotMatch": "گذرواژه‌ها هم‌خوانی ندارند", + "passwordIsWrong": "گذرواژه واردشده نادرست است", + "publicChatAddresses": "آدرس های چت عمومی", + "createNewAddress": "ساختن نشانی جدید", + "joinSpace": "پیوستن به فضا", + "publicSpaces": "فضاهای عمومی", + "addChatOrSubSpace": "افزودن چت یا زیرفضا", + "thisDevice": "این دستگاه:", + "searchIn": "جستجو در چت «{chat}»...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "جستجوی بیشتر...", + "gallery": "نگارخانه", + "files": "پرونده‌ها", + "sessionLostBody": "نشست شما گم شده است. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "برنامه اکنون سعی میکند نشست شما را از پشتیبان بازیابی کند. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "فرستادن رسیدهای خواندن", + "sendTypingNotificationsDescription": "دیگر شرکت‌کنندگان در چت میتوانند ببینند که شما در حال تایپ پیام جدید هستید.", + "sendReadReceiptsDescription": "دیگر شرکت‌کنندگان در چت میتوانند ببینند که شما پیام را خوانده‌اید.", + "formattedMessages": "پیام‌های قالب‌بندی‌شده", + "formattedMessagesDescription": "نمایش محتوای پیام غنی مانند متن پررنگ با استفاده از مارک‌داون.", + "verifyOtherUser": "🔐 بازبینی کاربر دیگر", + "verifyOtherUserDescription": "اگر کاربر دیگری را بازبینی کنید، میتوانید مطمئن شوید که واقعاً با چه کسی در حال نوشتن هستید. 💪\n\nهنگام شروع بازبینی، شما و کاربر دیگر پنجره‌ای در برنامه خواهید دید. در آنجا مجموعه‌ای از شکلک‌ها یا اعداد را مشاهده میکنید که باید با یکدیگر مقایسه کنید.\n\nبهترین راه برای این کار دیدار حضوری یا شروع تماس تصویری است. 👭", + "verifyOtherDevice": "🔐 بازبینی دستگاه دیگر", + "verifyOtherDeviceDescription": "هنگام بازبینی دستگاه دیگر، آن دستگاه‌ها میتوانند کلیدها را تبادل کنند و امنیت کلی شما را افزایش دهند. 💪 هنگام شروع بازبینی، پنجره‌ای در برنامه روی هر دو دستگاه ظاهر میشود. در آنجا مجموعه‌ای از شکلک‌ها یا اعداد را مشاهده میکنید که باید با یکدیگر مقایسه کنید. بهتر است پیش از شروع بازبینی، هر دو دستگاه در دسترس باشند. 🤳", + "acceptedKeyVerification": "{sender} بازبینی کلید را پذیرفت", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} بازبینی کلید را رد کرد", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} بازبینی کلید را کامل کرد", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} برای بازبینی کلید آماده است", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} درخواست بازبینی کلید کرد", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} بازبینی کلید را آغاز کرد", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "پیام‌های دریافتی", + "stickers": "برچسب‌ها", + "discover": "کشف", + "commandHint_ignore": "چشم‌پوشی از شناسه ماتریکس داده‌شده", + "commandHint_unignore": "لغو چشم‌پوشی از شناسه ماتریکس داده‌شده", + "unreadChatsInApp": "{appname}: {unread} چت خوانده‌نشده", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "رمزنگاری پایگاه داده در این سکو پشتیبانی نمیشود", + "thereAreCountUsersBlocked": "اکنون {count} کاربر مسدود شده‌اند.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "رفتن به فضا: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "علامت‌گذاری به‌عنوان خوانده‌نشده", + "userLevel": "{level} - کاربر", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - ناظر", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - مدیر", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "تغییر تنظیمات عمومی چت", + "inviteOtherUsers": "دعوت کاربران دیگر به این چت", + "changeTheChatPermissions": "تغییر دسترسی‌های چت", + "changeTheVisibilityOfChatHistory": "تغییر قابلیت دید تاریخچه چت", + "changeTheCanonicalRoomAlias": "تغییر نشانی اصلی چت عمومی", + "sendRoomNotifications": "فرستادن آگاه‌سازهای @room", + "changeTheDescriptionOfTheGroup": "تغییر توضیح چت", + "chatPermissionsDescription": "مشخص کنید کدام سطح دسترسی برای اقدامات خاصی در این چت لازم است. سطح‌های دسترسی ۰، ۵۰ و ۱۰۰ معمولاً نشان‌دهنده کاربران، ناظران و مدیران هستند، اما هر درجه‌بندی ممکن است.", + "updateInstalled": "🎉 به‌روزرسانی {version} نصب شد!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "فهرست تغییرات", + "sendCanceled": "فرستادن رد شد", + "loginWithMatrixId": "ورود با شناسه ماتریکس", + "doesNotSeemToBeAValidHomeserver": "به نظر نمیرسد سرور خانگی سازگاری داشته باشد. نشانی اشتباه است؟", + "calculatingFileSize": "در حال محاسبه اندازه پرونده...", + "sendingAttachment": "در حال فرستادن پیوست...", + "oneOfYourDevicesIsNotVerified": "یکی از دستگاه‌های شما بازبینی نشده است", + "noticeChatBackupDeviceVerification": "توجه: وقتی همه دستگاه‌های خود را به پشتیبان چت متصل کنید، به‌صورت خودکار بازبینی میشوند.", + "continueText": "ادامه", + "blur": "محو کردن:", + "opacity": "شفافیت:", + "setWallpaper": "تنظیم کاغذدیواری", + "manageAccount": "مدیریت حساب", + "noContactInformationProvided": "سرور هیچ اطلاعات تماس معتبری نمیدهد", + "contactServerAdmin": "تماس با مدیر سرور", + "contactServerSecurity": "تماس با امنیت سرور", + "supportPage": "صفحه پشتیبانی", + "serverInformation": "درباره سرور:", + "name": "نام", + "version": "نگارش", + "website": "وبگاه", + "compress": "فشرده‌سازی", + "boldText": "متن درشت", + "italicText": "متن کج", + "strikeThrough": "خط‌خورده", + "pleaseFillOut": "لطفاً پر کنید", + "invalidUrl": "نشانی نامعتبر", + "addLink": "افزودن پیوند", + "unableToJoinChat": "ناتوانی در پیوستن به چت. شاید طرف مقابل گفتگو را بسته است.", + "previous": "پیشین", + "otherPartyNotLoggedIn": "طرف مقابل اکنون وارد نشده است و بنابراین نمیتواند پیام دریافت کند!", + "appWantsToUseForLogin": "برای ورود از '{server}' استفاده کنید", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "شما بدین‌وسیله به برنامه و وبگاه اجازه میدهید اطلاعات شما را هم‌رسانی کنند.", + "open": "باز کردن", + "waitingForServer": "در انتظار سرور...", + "newChatRequest": "📩 درخواست چت جدید", + "contentNotificationSettings": "تنظیمات آگاه‌ساز محتوا", + "generalNotificationSettings": "تنظیمات آگاه‌ساز عمومی", + "roomNotificationSettings": "تنظیمات آگاه‌ساز اتاق", + "userSpecificNotificationSettings": "تنظیمات آگاه‌ساز خاص کاربر", + "otherNotificationSettings": "سایر تنظیمات آگاه‌ساز", + "notificationRuleContainsUserName": "دارای نام کاربری", + "notificationRuleContainsUserNameDescription": "وقتی پیامی حاوی نام کاربری باشد، کاربر را آگاه میکند.", + "notificationRuleMaster": "بی‌صدا کردن همه آگاه‌سازها", + "notificationRuleMasterDescription": "از قوانین دیگر چشم‌پوشی میکند و همه آگاه‌سازها را غیرفعال میکند.", + "notificationRuleSuppressNotices": "سرکوب پیام‌های خودکار", + "notificationRuleSuppressNoticesDescription": "آگاه‌سازهای کارخواه‌های خودکار مانند ربات‌ها را سرکوب میکند.", + "notificationRuleInviteForMe": "دعوت برای من", + "notificationRuleInviteForMeDescription": "وقتی کاربر به اتاقی دعوت میشود، او را آگاه میکند.", + "notificationRuleMemberEvent": "رویداد عضویت", + "notificationRuleMemberEventDescription": "آگاه‌سازهای رویدادهای عضویت را سرکوب میکند.", + "notificationRuleIsUserMention": "نام‌بردن از کاربر", + "notificationRuleIsUserMentionDescription": "وقتی در پیامی مستقیماً از کاربر نام برده میشود، او را آگاه میکند.", + "notificationRuleContainsDisplayName": "دارای نام نمایشی", + "notificationRuleContainsDisplayNameDescription": "وقتی پیامی حاوی نام نمایشی کاربر باشد، کاربر را آگاه میکند.", + "notificationRuleIsRoomMention": "نام‌بردن از اتاق", + "notificationRuleIsRoomMentionDescription": "وقتی نام اتاق ذکر میشود، کاربر را آگاه میکند.", + "notificationRuleRoomnotif": "آگاه‌ساز اتاق", + "notificationRuleRoomnotifDescription": "وقتی پیامی حاوی '@room' باشد، کاربر را آگاه میکند.", + "notificationRuleTombstone": "سنگ قبر", + "notificationRuleTombstoneDescription": "کاربر را از پیام‌های غیرفعال‌سازی اتاق آگاه میکند.", + "notificationRuleReaction": "واکنش", + "notificationRuleReactionDescription": "آگاه‌سازهای واکنش‌ها را سرکوب میکند.", + "notificationRuleRoomServerAcl": "ACL سرور اتاق", + "notificationRuleRoomServerAclDescription": "آگاه‌سازهای فهرست‌های کنترل دسترسی سرور اتاق (ACL) را سرکوب میکند.", + "notificationRuleSuppressEdits": "سرکوب ویرایش‌ها", + "notificationRuleSuppressEditsDescription": "آگاه‌سازهای پیام‌های ویرایش‌شده را سرکوب میکند.", + "notificationRuleCall": "تماس", + "notificationRuleCallDescription": "درباره تماس‌ها کاربر را آگاه میکند.", + "notificationRuleEncryptedRoomOneToOne": "اتاق رمزنگاری‌شده یک‌به‌یک", + "notificationRuleEncryptedRoomOneToOneDescription": "کاربر را از پیام‌ها در اتاق‌های رمزنگاری‌شده یک‌به‌یک آگاه میکند.", + "notificationRuleRoomOneToOne": "اتاق یک‌به‌یک", + "notificationRuleRoomOneToOneDescription": "کاربر را از پیام‌ها در اتاق‌های یک‌به‌یک آگاه میکند.", + "notificationRuleMessage": "پیام", + "notificationRuleMessageDescription": "کاربر را از پیام‌های عمومی آگاه میکند.", + "notificationRuleEncrypted": "رمزنگاری‌شده", + "notificationRuleEncryptedDescription": "کاربر را از پیام‌ها در اتاق‌های رمزنگاری‌شده آگاه میکند.", + "notificationRuleJitsi": "جیتسی", + "notificationRuleJitsiDescription": "کاربر را از رویدادهای ابزارک جیتسی آگاه میکند.", + "notificationRuleServerAcl": "سرکوب رویدادهای ACL سرور", + "notificationRuleServerAclDescription": "آگاه‌سازهای رویدادهای ACL سرور را سرکوب میکند.", + "unknownPushRule": "قانون ناشناخته آگاه‌ساز '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - پیام صوتی از {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "اگر این تنظیم آگاه‌ساز را پاک کنید، این کار برگشت‌ناپذیر است.", + "more": "بیشتر", + "shareKeysWith": "هم‌رسانی کلیدها با...", + "shareKeysWithDescription": "کدام دستگاه‌ها باید مورد اعتماد باشند تا بتوانند پیام‌های شما را در چت های رمزنگاری‌شده بخوانند؟", + "allDevices": "همه دستگاه‌ها", + "crossVerifiedDevicesIfEnabled": "دستگاه‌های بازبینی‌شده متقابل اگر فعال باشد", + "crossVerifiedDevices": "دستگاه‌های بازبینی‌شده متقابل", + "verifiedDevicesOnly": "فقط دستگاه‌های بازبینی‌شده", + "takeAPhoto": "گرفتن عکس", + "recordAVideo": "ضبط ویدئو", + "optionalMessage": "(اختیاری) پیام...", + "notSupportedOnThisDevice": "در این دستگاه پشتیبانی نمیشود", + "enterNewChat": "ورود به چت جدید", + "approve": "پذیرفتن", + "youHaveKnocked": "شما در زده‌اید", + "pleaseWaitUntilInvited": "لطفاً اکنون صبر کنید تا کسی از اتاق شما را دعوت کند.", + "commandHint_logout": "خروج از دستگاه کنونی", + "commandHint_logoutall": "خروج از همه دستگاه‌های فعال", + "displayNavigationRail": "نمایش نوار ناوبری در تلفن همراه", + "customReaction": "واکنش سفارشی", + "moreEvents": "رویدادهای بیشتر", + "initAppError": "خطایی هنگام آغاز برنامه رخ داد", + "changedTheChatDescription": "‮‭‭‮‭‬‫{username} توضیحات چت را تغییر داد", + "changedTheChatName": "{username} نام چت را تغییر داد", + "declineInvitation": "رد کردن دعوت", + "noMessagesYet": "پیامی وجود ندارد", + "longPressToRecordVoiceMessage": "برای ضبط پیام صوتی، انگشت خود را نگه دارید.", + "pause": "توقف", + "resume": "ادامه", + "removeFromSpaceDescription": "این چت از این فضا حذف خواهد شد اما همچنان در لیست چت های شما نمایش داده میشود.", + "countChats": "{chats} چت", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "عضو فضای {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "عضو فضای {spaces} میتواند در بزند", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "آغاز نظرسنجی", + "endPoll": "پایان نظرسنجی", + "answersVisible": "پاسخ ها قابل رویت", + "pollQuestion": "سوال نظرسنجی", + "answerOption": "گزینه جواب", + "addAnswerOption": "اضافه کردن گزینه جواب", + "allowMultipleAnswers": "اجازه دادن چند جواب", + "pollHasBeenEnded": "این نظرسنجی پایان یافته است", + "answersWillBeVisibleWhenPollHasEnded": "پاسخ ها وقتی نظرسنجی به پایان برسد نمایش داده خواهند شد", + "replyInThread": "پاسخ در رشته", + "countReplies": "{count} پاسخ دیگر", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "رشته", + "backToMainChat": "بازگشت به چت اصلی", + "saveChanges": "ذخیره تغییرات", + "createSticker": "ساخت استیکر یا ایموجی", + "useAsSticker": "استفاده به عنوان استیکر", + "useAsEmoji": "استفاده به عنوان ایموجی", + "stickerPackNameAlreadyExists": "نام استیکرپک تکراری است", + "newStickerPack": "استیکر پک جدید", + "stickerPackName": "نام استیکر پک", + "attribution": "نسبت دادن", + "skipChatBackup": "صرف نظر از پشتیبان گیری چت", + "skipChatBackupWarning": "آیا مطمئنید؟ بدون فعال کردن پشتیبان گیری چت ممکن است در صورت تغییر دستگاه دسترسی خود به پیام هایتان را از دست بدهید.", + "noMoreResultsFound": "نتایج دیگری یافت نشد", + "chatSearchedUntil": "چت تا {time} جستجو شد", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "پایه آدرس فدریشن", + "clientWellKnownInformation": "اطلاعات Client-Well-Known:", + "baseUrl": "پایه آدرس", + "identityServer": "سرور احراز هویت:", + "versionWithNumber": "ورژن: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "لاگ ها", + "advancedConfigs": "تنظیمات پیشرفته", + "advancedConfigurations": "تنظیمات پیشرفته", + "signIn": "ورود", + "createNewAccount": "ساخت حساب جدید", + "signUpGreeting": "فلافی چت غیرمتمرکز است! یک سرور که میخواهید در آن حسابتان را بسازید را انتخاب کنید و شروع کنید!", + "signInGreeting": "از قبل در ماتریکس حساب کاربری دارید؟ خوش برگشتید! سرور خانه خود را انتخاب و لاگین کنید.", + "theProcessWasCanceled": "فرآیند لغو شد.", + "join": "عضویت", + "searchOrEnterHomeserverAddress": "جستجو یا وارد کردن آدرس سرور خانه", + "matrixId": "شناسه ماتریکس", + "setPowerLevel": "انتخاب سطح قدرت", + "makeModerator": "انتخاب به عنوان ناظر", + "makeAdmin": "انتخاب به عنوان مدیر", + "removeModeratorRights": "حذف دسترسی های نظارتی", + "removeAdminRights": "حذف دسترسی های مدیریتی", + "powerLevel": "سطح قدرت", + "setPowerLevelDescription": "سطح قدرت مشخص میکند که یک کاربر قادر به انجام چه کارهایی در این اتاق است. معمولا یک عدد بین ۰ تا ۱۰۰ می باشد.", + "owner": "صاحب", + "mute": "ساکت", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "ساخت چت جدید", + "reset": "ریست کردن", + "supportFluffyChat": "حمایت از فلافی چت", + "support": "پشتیبانی", + "setLowPriority": "تنظیم اولویت پایین", + "unsetLowPriority": "لغو تنظیم اولویت پایین", + "countVotes": "{count} رای دیگر", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_fi.arb b/lib/l10n/intl_fi.arb new file mode 100644 index 0000000000..f256510e3c --- /dev/null +++ b/lib/l10n/intl_fi.arb @@ -0,0 +1,2475 @@ +{ + "repeatPassword": "Salasana uudelleen", + "about": "Tietoa FluffyChatista", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Hyväksy", + "@accept": { + "type": "String", + "placeholders": {} + }, + "account": "Tili", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} hyväksyi kutsun", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "activatedEndToEndEncryption": "🔐 {username} otti käyttöön päästä-päähän salauksen", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "archive": "Arkisto", + "@archive": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Voidaksesi allekirjoittaa toisen henkilön, syötä turvavaraston salalause tai palautusavain.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Lisää sähköpostiosoite", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Lisää tilaan", + "admin": "Ylläpitäjä", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Kaikki", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} vastasi puheluun", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Kuka tahansa voi liittyä", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Sovelluksen lukitus", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Sallitaanko vieraiden liittyminen", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Haluatko varmasti kirjautua ulos?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Oletko varma?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Toista animoidut tarrat ja emojit automaattisesti", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "askVerificationRequest": "Hyväksytäänkö tämä varmennuspyyntö käyttäjältä {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendOnEnter": "Lähetä painamalla rivinvaihtonäppäintä", + "badServerLoginTypesException": "Tämä kotipalvelin tukee sisäänkirjautumistapoja: \n{serverVersions},\nmutta tämä sovellus tukee vain -tapoja: \n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Anna porttikielto keskusteluun", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Porttikiellossa", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} antoi porttikiellon käyttäjälle {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Estä laite", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Estetty", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Peruuta", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Vaihda laitteen nimeä", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} muutti keskustelun kuvaa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} asetti näyttönimekseen: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} muutti vieraspääsyn sääntöjä", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} asetti vieraspääsyn säännö(i)ksi: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} muutti historian näkyvyyttä", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} asetti historian näkymissäännöksi: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} muutti liittymissääntöjä", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} asetti liittymissäännöiksi: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} vaihtoi profiilikuvaansa", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} muutti kutsulinkkiä", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Vaihda salasana", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} muutti huoneen aliaksia", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "cantOpenUri": "URI-osoitetta {uri} ei voida avata", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} muutti keskustelun oikeuksia", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheme": "Vaihda tyyliäsi", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Keskustelun varmuuskopiointi", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Keskustelun tiedot", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Keskustelut", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Valitse vahva salasana", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Sulje", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Lähetä HTML-muotoiltua tekstiä", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Anna syötetylle käyttäjälle porttikielto tähän huoneeseen", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_invite": "Kutsu syötetty käyttäjä tähän huoneeseen", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_leave": "Poistu tästä huoneesta", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Aseta profiilikuvasi tähän huoneeseen (syöttämällä mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Aseta näyttönimesi vain tässä huoneessa", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Aseta käyttäjän voimataso (oletus: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Lähetä muotoilematonta tekstiä", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Lähetä vastaus reaktiona", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "create": "Luo", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} loi keskustelun", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Uusi tila", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Aktiivinen nyt", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Tämä poistaa tunnuksesi käytöstä. Tätä ei voi kumota! Oletko varma?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Uusien käyttäjien oikeuksien oletustaso", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Poista", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Poista tunnus", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Poista viesti", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Laitteet", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Suorat keskustelut", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Näyttönimi on vaihdettu", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Lataa tiedosto", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Muokkaa", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Muokkaa estettyjä palvelimia", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Muokkaa näyttönimeä", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Muokkaa huoneen aliaksia", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Muokkaa huoneen profiilikuvaa", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote on jo olemassa!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Epäkelpo emote-lyhytkoodi!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote-asetukset", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emote-lyhytkoodi", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tyhjä keskustelu", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Et voi poistaa salausta myöhemmin. Oletko varma?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Salaus ei ole käytössä", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} päätti puhelun", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Syötä sähköposti-osoite", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Virhe paikannuksessa: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fromJoining": "Alkaen liittymisestä", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Alkaen kutsumisesta", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Ryhmä", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Ryhmä on julkinen", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Ryhmät", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Ryhmä seuralaisina {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Vieraat on kielletty", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Vieraat voivat liittyä", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} on perunnut käyttäjän {targetName} kutsun", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Apua", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Piilota tuntemattomat tapahtumat", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Jätä huomioitta", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Huomiotta jätetyt käyttäjät", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kutsu yhteystieto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "invited": "Kutsuttu", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} kutsui käyttäjän {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Vain kutsutut käyttäjät", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} kutsui sinut FluffyChattiin.\n1. Viereaile sivulla: https://fluffychat.im ja asenna sovellus\n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "kicked": "👞 {username} potki käyttäjän {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} potki ja antoi porttikiellon käyttäjälle {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Potki keskustelusta", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Aktiivinen viimeksi: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Poistu", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Poistui keskustelusta", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Vaalea", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Ladataan... Hetkinen.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Lataa vielä {count} osallistujaa", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadMore": "Lataa lisää…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Sijaintipalvelut ovat poissa käytöstä. Otathan ne käyttöön jakaaksesi sijaintisi.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "SIjaintioikeus on estetty. Myönnäthän sen jakaaksesi sijaintisi.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Kirjaudu sisään", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Kirjaudu sisään palvelimelle {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Kirjaudu ulos", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mainitse", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Viestit", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Valvoja", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Vaienna keskustelu", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Uusi keskustelu", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Uusi viesti FluffyChätissä", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Uusi varmennuspyyntö!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Seuraava", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ei", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ei yhteyttä palvelimeen", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Voit ottaa salauksen käyttöön vasta kun huone ei ole julkisesti liityttävissä.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ei ole Matrix-palvelin, käytetäänkö {server2} sen sijaan?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "scanQrCode": "Skannaa QR-koodi", + "noPasswordRecoveryDescription": "Et ole vielä lisännyt tapaa salasanasi palauttamiseksi.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Huoneita ei löytynyt…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Ilmoitukset", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} käyttäjää kirjoittavat…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Paikannetaan sijantia…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopioitu leikepöydälle", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopioi", + "@copy": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Vaihda profiilikuvasi", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chat": "Keskustelu", + "@chat": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Tyhjennä arkisto", + "forward": "Edelleenlähetä", + "@forward": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Liity syötettyyn huoneeseen", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_me": "Kuvaile itseäsi", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "compareEmojiMatch": "Vertaa hymiöitä", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} osallistujaa", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "changeTheHomeserver": "Vaihda kotipalvelinta", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Vaihda ryhmän nimeä", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Salaus on korruptoitunut", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "commandHint_kick": "Poista syötetty käyttäjä huoneesta", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_unban": "Poista syötetyn käyttäjän porttikielto tästä huoneesta", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandMissing": "{command} ei ole komento.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandHint_send": "Lähetä tekstiä", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandInvalid": "Epäkelvollinen komento", + "@commandInvalid": { + "type": "String" + }, + "compareNumbersMatch": "Vertaa numeroita", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Määritä keskustelu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Yhteystieto on kutsuttu ryhmään", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Sisältö on ilmoitettu palvelimen ylläpitäjille", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopioi leikepöydälle", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Viestin salausta ei voitu purkaa: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "encrypted": "Salattu", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Salaus", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kutsu yhteystieto ryhmään {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "isTyping": "kirjoittaa…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Ota emote-paketti käyttöön kaikkialla", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tumma", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ota salaus käyttöön", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Fonttikoko", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Olen klikannut linkkiä", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Virheellinen salasana tai palautusavain", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} liittyi keskusteluun", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Liity huoneeseen", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Emoteja ei löytynyt. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging -palvelu ei vaikuta olevan saatavilla laitteellasi. Saadaksesi push-ilmoituksia silti, suosittelemme Ntfy-sovelluksen asentamista. Käyttämällä Ntfy-sovellusta tai muuta Unified Push -tarjoajaa, saat push-ilmoitukset tietoturvallisella tavalla. Voit ladata Ntfy-sovelluksen Play Kaupasta tai F-Droidista.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ei lupaa", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Verkkkoavainvarmuuskopio on käytössä", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hups! Valitettavasti push-ilmoituksia käyttöönotettaessa tapahtui virhe.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hups, jotakin meni pieleen…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Avaa sovellus lukeaksesi viestit", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Avaa kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Yksi tunnuksistasi on kirjattu ulos", + "addAccount": "Lisää tili", + "editBundlesForAccount": "Muokkaa tämän tilin kääröjä", + "addToBundle": "Lisää kääreeseen", + "removeFromBundle": "Poista tästä kääreestä", + "bundleName": "Kääreen nimi", + "openInMaps": "Avaa kartoissa", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Tai", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Osallistuja", + "@participant": { + "type": "String", + "placeholders": {} + }, + "password": "Salasana", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Salasana on vaihdettu", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Salasanan palautus", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Kiinnitä", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Valitse pääsykoodi", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klikkaa linkkiä sähköpostissa ja sitten jatka.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Syötä PIN-koodisi", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Syötä käyttäjätunnuksesi", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Seuraa ohjeita verkkosivulla ja paina seuraava.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Yksityisyys", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} poisti tapahtuman", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Poista viesti", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Hylkää", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} hylkäsi kutsun", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Poista", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Poista kaikki muut laitteet", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Poista porttikielto keskusteluun", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Lähetä viesti", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "send": "Lähetä", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Lähetä tekstinä", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Lähetä ääniviesti", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Lähetä tiedosto", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Lähetä kuva", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Lähetä viestejä", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Aseta pääalias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Aseta tila", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Asetukset", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Jaa", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} jakoi sijaintinsa", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Ohita", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Lähdekoodi", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Tila on julkinen", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Tilan nimi", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "Tila", + "@status": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synkronoidaan... Hetkinen.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Järjestelmä", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ne eivät täsmää", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Ne täsmäävät", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Liikaa pyyntöjä. Yritä myöhemmin uudelleen!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Yritä uudelleenlähettämistä", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} poisti käyttäjän {targetName} porttikiellon", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Poista laitteen esto", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Tuntematon laite", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Tuntematon salausalgoritmi", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Tuntematon tapahtuma '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} ja {count} muuta kirjoittavat…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ja {username2} kirjoittavat…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} kirjoittaa…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} poistui keskustelusta", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} lähetti {type}-tapahtuman", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Varmistamaton", + "verified": "Varmistettu", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Aloita varmennus", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Varmensit onnistuneesti!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Varmistetaan toista tunnusta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Keskusteluhistorian näkyvyys", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Näkyy kaikille osallistujille", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Näkyy kaikille", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Ääniviesti", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Odotetaan kumppanin varmistavan pyynnön…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Odotetaan kumppanin hyväksyvän emojit…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Odotetaan kumppanin hyväksyvän numerot…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Varoitus!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Lähetimme sinulle sähköpostia", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kuka voi suorittaa minkä toimenpiteen", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kenen on sallittua liittyä ryhmään", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miksi haluat ilmoittaa tämän?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Näillä osoitteilla voit palauttaa salasanasi.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Et enää osallistu tähän keskusteluun", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Sinulle on annettu porttikielto tähän keskusteluun", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "Poista tilasta", + "roomVersion": "Huoneen versio", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} lähetti puhelutiedot", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "passphraseOrKey": "salalause tai palautusavain", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Syötä salasanasi", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Huone on päivitetty", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Hae", + "@search": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} lähetti tiedoston", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} lähetti ääniviestin", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "link": "Linkki", + "passwordForgotten": "Salasana unohtunut", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Poista profiilikuvasi", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "reply": "Vastaa", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Ilmoita viesti", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Tallenna tiedosto", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "security": "Turvallisuus", + "@security": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Julkiset huoneet", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Syy", + "@reason": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Korvaa huone uudemmalla versiolla", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Lähetä video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} lähetti kuvan", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} lähetti tarran", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} lähetti videon", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Jaa sijainti", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Millainen on vointisi?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videopuhelu", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "sender": "Lähettäjä", + "startedACall": "{senderName} aloitti puhelun", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "submit": "Lähetä", + "@submit": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Poista keskustelun mykistys", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Poista kiinnitys", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "time": "Aika", + "writeAMessage": "Kirjoita viesti…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Kyllä", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Sinä", + "@you": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Julkinen avaimesi", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Viestin tiedot", + "openGallery": "Avaa galleria", + "commandHint_clearcache": "Tyhjennä välimuisti", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Luo tyhjä ryhmäkeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Aloita yksityiskeskustelu\nKäytä parametria --no-encryption poistaaksesi salauksen käytöstä", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_discardsession": "Hylkää istunto", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "markAsRead": "Merkitse luetuksi", + "emojis": "Hymiöt", + "unsupportedAndroidVersionLong": "Tämä ominaisuus vaatii uudemman Android-version. Tarkistathan päivitykset tai Lineage OS :n tuki.", + "unsupportedAndroidVersion": "Ei tuettu Android-versio", + "reportUser": "Ilmianna käyttäjä", + "voiceCall": "Äänipuhelu", + "videoCallsBetaWarning": "Huomaathan videopuheluiden ovan beta-asteella. Ne eivät ehkä toimi odotetusti tai toimi ollenkaan kaikilla alustoilla.", + "placeCall": "Soita", + "reactedWith": "{sender} reagoi {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Kiinnitä huoneeseen", + "confirmEventUnpin": "Haluatko varmasti irrottaa tapahtuman pysyvästi?", + "experimentalVideoCalls": "Kokeelliset videopuhelut", + "youRejectedTheInvitation": "Kieltäydyit kutsusta", + "youJoinedTheChat": "Liityit keskusteluun", + "youAcceptedTheInvitation": "👍 Hyväksyit kutsun", + "youBannedUser": "Annoit porttikiellon käyttäjälle {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Olet perunut kutsun käyttäjälle {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} kutsui sinut", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Potkit käyttäjän {user} keskustelusta", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Kutsuit käyttäjän {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Potkit ja annoit porttikiellon käyttäjälle {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Poistit käyttäjän {user} porttikiellon", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hydrate": "Palauta varmuuskopiotiedostosta", + "dehydrate": "Vie istunto ja tyhjennä laite", + "dehydrateWarning": "Tätä toimenpidettä ei voi kumota. Varmista varmuuskopiotiedoston turvallinen tallennus.", + "users": "Käyttäjät", + "storeSecurlyOnThisDevice": "Tallenna turvallisesti tälle laitteelle", + "storeInAndroidKeystore": "Tallenna Android KeyStoreen", + "storeInAppleKeyChain": "Tallenna Applen avainnippuun", + "countFiles": "{count} tiedostoa", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Käyttäjä", + "custom": "Mukautettu", + "confirmMatrixId": "Kirjoita Matrix IDsi uudelleen poistaaksesi tunnuksesi.", + "supposedMxid": "Tämän pitäisi olla {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Merkitse ryhmäksi", + "whyIsThisMessageEncrypted": "Miksei tätä viestiä voida lukea?", + "noKeyForThisMessage": "Tämä voi tapahtua mikäli viesti lähetettiin ennen sisäänkirjautumistasi tälle laitteelle.\n\nOn myös mahdollista, että lähettäjä on estänyt tämän laitteen tai jokin meni pieleen verkkoyhteyden kanssa.\n\nPystytkö lukemaan viestin toisella istunnolla? Siinä tapauksessa voit siirtää viestin siltä! Mene Asetukset > Laitteet ja varmista, että laitteesi ovat varmistaneet toisensa. Seuraavankerran avatessasi huoneen ja molempien istuntojen ollessa etualalla, avaimet siirretään automaattisesti.\n\nHaluatko varmistaa ettet menetä avaimia uloskirjautuessa tai laitteita vaihtaessa? Varmista avainvarmuuskopion käytössäolo asetuksista.", + "commandHint_markasdm": "Merkitse yksityiskeskusteluksi syötetyn Matrix IDn kanssa", + "foregroundServiceRunning": "Tämä ilmoitus näkyy etualapalvelun ollessa käynnissä.", + "newSpace": "Uusi tila", + "screenSharingTitle": "ruudunjako", + "screenSharingDetail": "Jaat ruutuasi FluffyChatissä", + "hugContent": "{senderName} halaa sinua", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} kokovartalohalaa sinua", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "Lähetä halaus", + "googlyEyesContent": "{senderName} lähettää askartelusilmiä", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Lähetä askartelusilmiä", + "commandHint_cuddle": "Lähetä kokovartaluhalaus", + "doNotShowAgain": "Älä näytä uudelleen", + "fileHasBeenSavedAt": "Tiedosto on tallennettu sijaintiin {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "Turvallisuuden vuoksi et voi poistaa salausta käytöstä huoneista, joissa se on aiemmin otettu käyttöön.", + "newSpaceDescription": "Tilat mahdollistavat keskusteluidesi keräämisen ja yksityisten tai julkisten yhteisöjen rakentamisen.", + "reopenChat": "Avaa keskustelu uudelleen", + "noOtherDevicesFound": "Muita laitteita ei löytynyt", + "jumpToLastReadMessage": "Hyppää viimeiseen luettuun viestiin", + "readUpToHere": "Luettu tähän asti", + "jump": "Hyppää", + "openLinkInBrowser": "Avaa linkki selaimessa", + "report": "ilmoita", + "encryptThisChat": "Salaa tämä keskustelu", + "noBackupWarning": "Varoitus! Ilman avainvarmuuskopion käyttöönottoa menetät pääsyn salattuihin viesteihisi. Suosittelemme ehdottomasti avainvarmuuskopion käyttöönottoa ennen uloskirjautumista.", + "fileIsTooBigForServer": "Ei voi lähettää! Palvelin tukee liitetiedostoja vain enintään {max}.", + "reportErrorDescription": "😭 Voi ei. Jokin meni pieleen. Halutessasi voit ilmoittaa ongelman kehittäjille.", + "wasDirectChatDisplayName": "Tyhjä keskustelu (oli {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Anteeksi... se ei ole mahdollista", + "setColorTheme": "Aseta väriteema:", + "tryAgain": "Yritä uudelleen", + "messagesStyle": "Viestit:", + "chatDescription": "Keskustelun kuvaus", + "invalidServerName": "Virheellinen palvelimen nimi", + "chatPermissions": "Keskustelun oikeudet", + "setChatDescription": "Asetti keskustelun kuvauksen", + "importFromZipFile": "Tuo .zip -tiedostosta", + "redactedBy": "Poistanut {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Vapaaehtoinen) Syy tämän viestin poistamiselle...", + "archiveRoomDescription": "Keskustelu siirretään arkistoon. Muut käyttäjät näkevät sinun poistuneen keskustelusta.", + "exportEmotePack": "Vie emotepaketti .zip-tiedostona", + "redactedByBecause": "Poistanut {username} syystä: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Viesti poistetaan kaikilta keskustelun osallistujilta. Tätä ei voida kumota.", + "invalidInput": "Virheellinen syöte!", + "hasKnocked": "🚪 {user} on koputtanut", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "directChat": "Yksityiskeskustelu", + "wrongPinEntered": "Väärä pin-koodi! Yritä uudelleen {seconds} sekuntin kuluttua...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Lähetä kirjoitusilmoituksia", + "inviteGroupChat": "📨 Kutsu ryhmäkeskusteluun", + "importEmojis": "Tuo emojit", + "noChatDescriptionYet": "Keskustelun kuvausta ei ole vielä luotu.", + "notAnImage": "Tämä ei ole kuvatiedosto.", + "chatDescriptionHasBeenChanged": "Keskustelun kuvaus muutettu", + "roomUpgradeDescription": "Keskustelu luodaan uudelleen uudella huoneversiolla. Kaikille osallistujille ilmoitetaan, että heidän tulee siirtyä uuteen keskusteluun. Voit lukea lisää huoneversioista osoitteesta https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Syötä suurempi luku kuin 0", + "shareInviteLink": "Jaa kutsulinkki", + "emoteKeyboardNoRecents": "Viimeaikoina käytetyt emotet tulevat näkymään täällä...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "replace": "Korvaa", + "createGroup": "Luo ryhmä", + "importNow": "Tuo nyt", + "invite": "Kutsu", + "swipeRightToLeftToReply": "Vastaa pyyhkäisemällä oikealta vasemmalle", + "accessAndVisibility": "Pääsy ja näkyvyys", + "unread": "Lukemattomat", + "noMoreChatsFound": "Lisää keskusteluja ei löytynyt...", + "select": "Valitse", + "searchForUsers": "Etsi @users...", + "pleaseEnterYourCurrentPassword": "Anna nykyinen salasanasi", + "newPassword": "Uusi salasana", + "pleaseChooseAStrongPassword": "Valitse vahva salasana", + "passwordsDoNotMatch": "Salasanat eivät täsmää", + "passwordIsWrong": "Salasanasi on väärä", + "thisDevice": "Tämä laite:", + "gallery": "Galleria", + "files": "Tiedostot", + "changelog": "Muutosloki", + "continueText": "Jatka", + "serverInformation": "Palvelimen tiedot:", + "name": "Nimi", + "version": "Versio", + "website": "Verkkosivu", + "previous": "Edellinen", + "open": "Avaa", + "more": "Lisää", + "allDevices": "Kaikki laitteet", + "recordAVideo": "Nauhoita video", + "approve": "Hyväksy", + "pause": "Keskeytä", + "resume": "Jatka", + "aboutHomeserver": "Tietoja {homeserver}:sta", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Päivitä tämä huone annettuun huoneversioon", + "appLockDescription": "Lukitse sovellus kun sitä ei käytetä PIN-koodin kanssa", + "noChatsFoundHere": "Täältä ei löytynyt vielä pikakeskusteluja. Aloita uusi pikakeskustelu jonkun kanssa alla olevalla painikkeella. ⤵️", + "space": "Tila", + "checkList": "Tarkistuslista", + "countInvited": "{count} kutsuttu", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "globalChatId": "Yleisesti pätevä keskustelutunnus", + "accessAndVisibilityDescription": "Kuka voi liittyä tähän pikakeskusteluun ja miten pikakeskustelun voi löytää.", + "calls": "Puhelut", + "customEmojisAndStickers": "Mukautetut emojit ja tarrat", + "customEmojisAndStickersBody": "Lisää tai jaa mukautettuja emojeja tai tarroja, joita voidaan käyttää missä tahansa pikakeskustelussa.", + "hideInvalidOrUnknownMessageFormats": "Piilota virheelliset tai tuntemattomat viestimuodot", + "block": "Estä", + "blockedUsers": "Estetyt käyttäjät", + "blockListDescription": "Voit estää sinua häiritsevät käyttäjät. Et voi vastaanottaa viestejä tai huonekutsuja henkilökohtaisella estolistallasi olevilta käyttäjiltä.", + "blockUsername": "Jätä käyttäjänimi huomiotta", + "passwordRecoverySettings": "Salasanan palautusasetukset", + "sendImages": "Lähetä {count} kuva", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " Synkronoidaan… ({percentage} %)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "usersMustKnock": "Käyttäjien on koputettava", + "noOneCanJoin": "Kukaan ei voi liittyä", + "knock": "Koputa", + "removeDevicesDescription": "Sinut kirjataan ulos tästä laitteesta, etkä voi enää vastaanottaa viestejä.", + "banUserDescription": "Käyttäjä kielletään pikakeskustelusta, eikä hän voi liittyä pikakeskusteluun uudelleen ennen kuin kielto kumotetaan.", + "unbanUserDescription": "Käyttäjä voi liittyä pikakeskusteluun uudelleen, jos hän yrittää.", + "kickUserDescription": "Käyttäjä potkitaan ulos pikakeskustelusta, mutta häntä ei porttikieltoa saada. Julkisissa pikakeskusteluissa käyttäjä voi liittyä takaisin milloin tahansa.", + "makeAdminDescription": "Kun olet tehnyt tästä käyttäjästä järjestelmänvalvojan, et ehkä voi perua tätä, koska hänellä on siitä hetkestä lähtien samat oikeudet kuin sinulla.", + "pushNotificationsNotAvailable": "Työntöilmoitukset ei saatavilla", + "learnMore": "Opi lisää", + "yourGlobalUserIdIs": "Yleisesti pätevä käyttäjätunnuksesi on: ", + "noUsersFoundWithQuery": "Valitettavasti käyttäjää ei löytynyt haulla \"{query}\". Tarkistathan, onko kirjoitusvirhe.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Koputetaan", + "chatCanBeDiscoveredViaSearchOnServer": "Pikakeskustelu löytyy haulla {server}:lta", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Hae #pikakeskustelut, @käyttäjät...", + "nothingFound": "Mitään ei löytynyt...", + "groupName": "Ryhmän nimi", + "createGroupAndInviteUsers": "Luo ryhmä ja kutsu käyttäjiä", + "groupCanBeFoundViaSearch": "Ryhmä löytyy haun kautta", + "wrongRecoveryKey": "Pahoittelut... tämä ei vaikuta olevan oikea palautusavain.", + "commandHint_sendraw": "Lähetä raaka JSON", + "databaseMigrationTitle": "Tietokanta on optimoitu", + "databaseMigrationBody": "Odotathan hetki. Tämä voi kestää hetken.", + "leaveEmptyToClearStatus": "Jätä tyhjäksi tyhjentääksesi tilasi.", + "publicChatAddresses": "Julkiset keskusteluosoitteet", + "createNewAddress": "Luo uusi osoite", + "joinSpace": "Liity tilaan", + "publicSpaces": "Julkiset tilat", + "addChatOrSubSpace": "Lisää pikakeskustelu tai alitila", + "initAppError": "Sovelluksen alustamisessa tapahtui virhe", + "searchIn": "Hae keskustelusta \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Hae lisää...", + "sessionLostBody": "Istuntosi on menetetty. Ilmoita tästä virheestä kehittäjille osoitteessa {url}. Virheviesti on: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Sovellus yrittää nyt palauttaa istuntosi varmuuskopiosta. Ilmoita tästä virheestä kehittäjille osoitteessa {url}. Virheviesti on: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Lähetä lukukuittaukset", + "sendTypingNotificationsDescription": "Muut keskustelun osallistujat näkevät, milloin olet kirjoittamassa uutta viestiä.", + "sendReadReceiptsDescription": "Muut keskustelun osallistujat näkevät, milloin olet lukenut viestin.", + "formattedMessages": "Muotoillut viestit", + "formattedMessagesDescription": "Näytä rikasta viestisisältöä, kuten lihavoitua tekstiä, käyttämällä Markdownia.", + "verifyOtherUser": "🔐 Vahvista toinen käyttäjä", + "verifyOtherUserDescription": "Jos vahvistat toisen käyttäjän, voit olla varma, että tiedät kenelle todella kirjoitat. 💪\n\nKun aloitat vahvistuksen, sinä ja toinen käyttäjä näette sovelluksessa ponnahdusikkunan. Siellä näette sitten sarjan emojeja tai numeroita, joita teidän on verrattava toisiinsa.\n\nParas tapa tehdä tämä on tavata heidät tai aloittaa videopuhelu. 👭", + "verifyOtherDevice": "🔐 Vahvista toinen laite", + "verifyOtherDeviceDescription": "Kun vahvistat toisen laitteen, kyseiset laitteet voivat vaihtaa avaimia, mikä lisää yleistä turvallisuuttasi. 💪 Kun aloitat vahvistuksen, molempien laitteiden sovellukseen ilmestyy ponnahdusikkuna. Siellä näet sitten sarjan emojeja tai numeroita, joita sinun on verrattava toisiinsa. On parasta pitää molemmat laitteet käsillä ennen vahvistuksen aloittamista. 🤳", + "acceptedKeyVerification": "{sender} hyväksyi avaimen vahvistuksen", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} peruutti avaimen vahvistuksen", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} suoritti avaimen vahvistuksen", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} on valmis avaimen vahvistukseen", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} pyysi avaimen vahvistusta", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} aloitti avaimen vahvistuksen", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Saapuvat viestit", + "stickers": "Tarrat", + "discover": "Tutustu", + "commandHint_ignore": "Jätä huomiotta annettu matrix-tunnus", + "commandHint_unignore": "Kumoa annetun matrix-tunnuksen huomiottajätäminen", + "unreadChatsInApp": "{appname}: {unread} lukematonta keskustelua", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Tietokannan salausta ei tueta tällä alustalla", + "thereAreCountUsersBlocked": "Tällä hetkellä {count} käyttäjää on estetty.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Siirry tilaan: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Merkitse lukemattomaksi", + "userLevel": "{level} - Käyttäjä", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Valvoja", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Järjestelmänvalvoja", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Muuta yleisiä keskusteluasetuksia", + "inviteOtherUsers": "Kutsu muita käyttäjiä tähän pikakeskusteluun", + "changeTheChatPermissions": "Muuta keskustelulupia", + "changeTheVisibilityOfChatHistory": "Muuta pikakeskusteluhistorian näkyvyyttä", + "changeTheCanonicalRoomAlias": "Vaihda julkisen pikakeskustelun pääosoite", + "sendRoomNotifications": "Lähetä @room-ilmoituksia", + "changeTheDescriptionOfTheGroup": "Muuta keskustelun kuvausta", + "chatPermissionsDescription": "Määritä tarvittava tehotaso tietyille toiminnoille tässä pikakeskustelussa. Tehotasot 0, 50 ja 100 edustavat yleensä käyttäjiä, valvoja ja ylläpitäjiä, mutta mikä tahansa porrastus on mahdollinen.", + "updateInstalled": "🎉 Päivitys {version} asennettu!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "Lähetys peruttu", + "loginWithMatrixId": "Kirjaudu sisään Matrix-tunnuksella", + "doesNotSeemToBeAValidHomeserver": "Ei näytä olevan yhteensopiva kotipalvelin. Väärä URL-osoite?", + "calculatingFileSize": "Lasketaan tiedoston kokoa...", + "sendingAttachment": "Lähetetään liitettä...", + "oneOfYourDevicesIsNotVerified": "Yhtä laitteistasi ei ole vahvistettu", + "noticeChatBackupDeviceVerification": "Huomautus: Kun yhdistät kaikki laitteesi keskustelun varmuuskopiointiin, ne vahvistetaan automaattisesti.", + "blur": "Sumeus:", + "opacity": "Läpinäkymättömyys:", + "setWallpaper": "Aseta taustakuva", + "manageAccount": "Hallinnoi tiliä", + "noContactInformationProvided": "Palvelin ei ilmoittaa mitään kelvollisia yhteystietoja", + "contactServerAdmin": "Ota yhteyttä palvelimen ylläpitäjään", + "contactServerSecurity": "Ota yhteyttä palvelimen tietoturvaosastoon", + "supportPage": "Tukisivu", + "compress": "Pakkaa", + "boldText": "Lihavoitu teksti", + "italicText": "Kursivoitu teksti", + "strikeThrough": "Yliviivaus", + "pleaseFillOut": "Ole hyvä ja täytä", + "invalidUrl": "Virheellinen URL-osoite", + "addLink": "Lisää linkki", + "unableToJoinChat": "Pikakeskusteluun liittyminen ei onnistu. Toinen osapuoli on ehkä jo sulkenut keskustelun.", + "otherPartyNotLoggedIn": "Toinen osapuoli ei ole tällä hetkellä kirjautuneena sisään, joten ei voi vastaanottaa viestejä!", + "appWantsToUseForLogin": "Kirjaudu sisään käyttämällä '{server}':ta", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Annat täten sovellukselle ja verkkosivustolle luvan jakaa tietoja sinusta.", + "waitingForServer": "Odotetaan palvelinta...", + "newChatRequest": "📩 Uusi pikakeskustelupyyntö", + "contentNotificationSettings": "Sisältöilmoitusten asetukset", + "generalNotificationSettings": "Yleiset ilmoitusasetukset", + "roomNotificationSettings": "Huoneen ilmoitusten asetukset", + "userSpecificNotificationSettings": "Käyttäjäkohtaiset ilmoitusten asetukset", + "otherNotificationSettings": "Muut ilmoitusten asetukset", + "notificationRuleContainsUserName": "Sisältää käyttäjän nimen", + "notificationRuleContainsUserNameDescription": "Ilmoittaa käyttäjälle, kun viesti sisältää hänen käyttäjän nimensä.", + "notificationRuleMaster": "Mykistä kaikki ilmoitukset", + "notificationRuleMasterDescription": "Ohittaa kaikki muut säännöt ja poistaa kaikki ilmoitukset käytöstä.", + "notificationRuleSuppressNotices": "Poista kaikki automatisoidut viestit", + "notificationRuleSuppressNoticesDescription": "Poistaa ilmoitukset automatisoiduilta asiakkailta, kuten boteilta.", + "notificationRuleInviteForMe": "Kutsu minulle", + "notificationRuleInviteForMeDescription": "Ilmoittaa käyttäjälle, kun hänet on kutsuttu huoneeseen.", + "notificationRuleMemberEvent": "Jäsentapahtuma", + "notificationRuleMemberEventDescription": "Poistaa jäsenyystapahtumien ilmoitukset.", + "notificationRuleIsUserMention": "Käyttäjän maininta", + "notificationRuleIsUserMentionDescription": "Ilmoittaa käyttäjälle, kun hänet mainitaan suoraan viestissä.", + "notificationRuleContainsDisplayName": "Sisältää näyttönimen", + "notificationRuleContainsDisplayNameDescription": "Ilmoittaa käyttäjälle, kun viesti sisältää hänen näyttönimensä.", + "notificationRuleIsRoomMention": "Huoneen maininta", + "notificationRuleIsRoomMentionDescription": "Ilmoittaa käyttäjälle, kun huoneesta on maininta.", + "notificationRuleRoomnotif": "Huoneilmoitus", + "notificationRuleRoomnotifDescription": "Ilmoittaa käyttäjälle, kun viesti sisältää '@room'.", + "notificationRuleTombstone": "Hautakivi", + "notificationRuleTombstoneDescription": "Ilmoittaa käyttäjälle huoneen deaktivointiviesteistä.", + "notificationRuleReaction": "Reagointi", + "notificationRuleReactionDescription": "Poistaa ilmoitukset reaktioista.", + "notificationRuleRoomServerAcl": "Huonepalvelimen pääsyluettelo", + "notificationRuleRoomServerAclDescription": "Poistaa huonepalvelimen pääsyluetteloiden (ACL) ilmoitukset.", + "notificationRuleSuppressEdits": "Poista muokkaukset", + "notificationRuleSuppressEditsDescription": "Poistaa ilmoitukset muokatuista viesteistä.", + "notificationRuleCall": "Soita", + "notificationRuleCallDescription": "Ilmoittaa käyttäjälle soitoista.", + "notificationRuleEncryptedRoomOneToOne": "Kahdenkeskinen salattu huone", + "notificationRuleEncryptedRoomOneToOneDescription": "Ilmoittaa käyttäjälle kahdenkeskisissä salatuissa huoneissa olevista viesteistä.", + "notificationRuleRoomOneToOne": "Kahdenkeskinen huone", + "notificationRuleRoomOneToOneDescription": "Ilmoittaa käyttäjälle kahdenkeskisissä huoneissa olevista viesteistä.", + "notificationRuleMessage": "Viesti", + "notificationRuleMessageDescription": "Ilmoittaa käyttäjälle yleisistä viesteistä.", + "notificationRuleEncrypted": "Salattu", + "notificationRuleEncryptedDescription": "Ilmoittaa käyttäjälle salatuissa huoneissa olevista viesteistä.", + "notificationRuleJitsiDescription": "Ilmoittaa käyttäjälle tapahtumista Jitsi-vimpaimesta.", + "notificationRuleServerAcl": "Poista tapahtumat palvelimen pääsyluettelosta", + "notificationRuleServerAclDescription": "Poistaa ilmoitukset palvelimen pääsyluettelosta.", + "unknownPushRule": "Tuntematon työntösääntö '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Ääniviesti {sender}:lta", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Jos poistat tämän ilmoitusasetuksen, sitä ei voi kumota.", + "shareKeysWith": "Jaa avaimet...", + "shareKeysWithDescription": "Mihin laitteisiin tulisi luottaa, jotta ne voivat lukea viestejäsi salatuissa keskusteluissa?", + "crossVerifiedDevicesIfEnabled": "Ristiinvahvistetut laitteet, jos otettu käyttöön", + "crossVerifiedDevices": "Ristiinvahvistetut laitteet", + "verifiedDevicesOnly": "Vain vahvistetut laitteet", + "takeAPhoto": "Ota valokuva", + "optionalMessage": "(Valinnainen) viesti...", + "notSupportedOnThisDevice": "Ei tuettu tällä laitteella", + "hideRedactedMessages": "Piilota valvojan toimesta poistetut viestit", + "hideRedactedMessagesBody": "Jos viesti jonkun toimesta poistetaan, se ei enää näy pikakeskustelussa.", + "enterNewChat": "Aloita uusi pikakeskustelu", + "youHaveKnocked": "Olet koputtanut", + "pleaseWaitUntilInvited": "Odotathan nyt, kunnes joku huoneesta kutsuu sinut.", + "commandHint_logout": "Kirjaudu ulos nykyinen laitteesi", + "commandHint_logoutall": "Kirjaudu ulos kaikki aktiiviset laitteet", + "displayNavigationRail": "Näytä navigointipalkki mobiililaitteella", + "customReaction": "Mukautettu reagointi", + "moreEvents": "Lisää tapahtumia", + "declineInvitation": "Hylkää kutsu", + "noMessagesYet": "Ei vielä viestejä", + "longPressToRecordVoiceMessage": "Pitkä painallus ääniviestin tallentamiseksi.", + "removeFromSpaceDescription": "Pikakeskustelu poistetaan tilasta, mutta se näkyy edelleen pikakeskusteluluettelossasi.", + "countChats": "{chats} pikakeskustelua", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces}:jen tilanjäsen", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces}:jen tilanjäsen saa koputtaa", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Aloita kysely", + "endPoll": "Lopeta kysely", + "answersVisible": "Vastaukset näkyvissä", + "pollQuestion": "Kyselykysymys", + "answerOption": "Vastausvaihtoehto", + "addAnswerOption": "Lisää vastausvaihtoehto", + "allowMultipleAnswers": "Salli useita vastauksia", + "pollHasBeenEnded": "Kysely on päättynyt", + "answersWillBeVisibleWhenPollHasEnded": "Vastaukset näkyvät, kun kysely on päättynyt", + "replyInThread": "Vastaa ketjussa", + "countVotes": "{count, plural, =1{One vote} other{{count} ääntä}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countReplies": "{count, plural, =1{One reply} other{{count} vastausta}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Ketju", + "backToMainChat": "Takaisin pääpikakeskusteluun", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_fil.arb b/lib/l10n/intl_fil.arb new file mode 100644 index 0000000000..7505087f77 --- /dev/null +++ b/lib/l10n/intl_fil.arb @@ -0,0 +1,2002 @@ +{ + "remove": "Tanggalin", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "I-import ngayon", + "importEmojis": "I-import ang mga Emoji", + "importFromZipFile": "Mag-import mula sa .zip file", + "exportEmotePack": "I-export ang Emote pack bilang .zip", + "accept": "Tanggapin", + "@accept": { + "type": "String", + "placeholders": {} + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Magdagdag ng email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alyas", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Lahat", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Magpadala ng mga googly eye", + "commandHint_cuddle": "Magpadala ng yakap", + "cuddleContent": "Niyakap ka ni {senderName}", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "Niyakap ka ni {senderName}", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Pwede sumali ang anumang tao", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Lock ng app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Pwede ba sumali ang mga bisita", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Sigurado ka?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Tanggapin ang hiling ng verification mula sa {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Awtomatikong i-play ang mga gumagalaw na sticker at emote", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendTypingNotifications": "Ipadala ang mga typing notification", + "blockDevice": "I-block ang Device", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Na-block", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Palitan ang pangalan ng device", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "Pinalitan ni {username} ang avatar ng chat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history sa: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "Pinalitan ni {username} ang mga alias ng room", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Palitan ang password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Palitan ang iyong avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Nasira ang encryption", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Pag-backup ng chat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Mga detalye ng chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Mga Chat", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Pumili ng malakas na password", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "I-clear ang archive", + "close": "Isara", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Markahan bilang grupo", + "commandHint_ban": "Pagbawalan ang ibinigay na user sa room na ito", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "repeatPassword": "Ulitin ang password", + "notAnImage": "Hindi isang file na larawan.", + "replace": "Palitan", + "about": "Tungkol sa", + "@about": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 Tinanggap ni {username} ang imbitasyon", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "activatedEndToEndEncryption": "🔐 Na-activate ni {username} ang end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "Dapat ito ay {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Idagdag sa space", + "commandHint_hug": "Magpadala ng yakap", + "googlyEyesContent": "Nagpadala si {senderName} ng googly eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "Sinagot ni {senderName} ang tawag", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Sigurado kang gusto mong mag-log out?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para i-sign ang isa pang tao, pakilagay ang iyong secure store passphrase o recovery key.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Ang homeserver ay sinusuportahan ang sumusunod na uri ng login:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Ipadala sa pagpindot ng enter", + "banFromChat": "Pagbawalan sa chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Pinagbawalan", + "@banned": { + "type": "String", + "placeholders": {} + }, + "cancel": "Kanselahin", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "Pinagbawalan ni {username} si {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "cantOpenUri": "Hindi mabuksan ang URI na {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheJoinRules": "Pinalitan ni {username} ang mga tuntunin sa pagsali", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pagsali sa: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Palitan ang homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Palitan ang iyong istilio", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changedTheChatPermissions": "Pinalitan ni {username} ang mga pahintulot ng chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheNameOfTheGroup": "Palitan ng pangalan ng grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "Pinalitan ni {username} ang kanilang displayname sa: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Markahan bilang direktang mensahe na room para sa ibinigay na Matrix ID", + "changedTheGuestAccessRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita sa: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "commandHint_clearcache": "I-clear ang cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Iwaksi ang sesyon", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_create": "Gumawa ng walang lamang group chat\nGumamit ng --no-encryption para i-disable ang encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "configureChat": "I-configure ang chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Paki-kumpara ang mga numero", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kinopya sa clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopyahin", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopyahin sa clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} mga kasali", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createdTheChat": "💬 Ginawa ni {username} ang chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Gumawa ng grupo", + "createNewSpace": "Bagong space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Kasalukuyang aktibo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Madilim", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Pinalitan na ang display name", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "directChats": "Mga Direktang Chat", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "I-download ang file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "I-edit ang mga naka-block na server", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Mga pahintulot ng chat", + "editDisplayname": "I-edit ang display name", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "I-edit ang mga alyas ng room", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "edit": "I-edit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "I-edit ang avatar ng room", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Umiiral na ang emote!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Walang lamang chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "I-enable ang encryption", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "encryption": "Pag-encrypt", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Naka-encrypt", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Hindi naka-enable ang encryption", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "I-lock ang app kapag hindi ginagamit sa pamamagitan ng pin code", + "commandHint_dm": "Magsimula ng direktong chat\nGumamit ng --no-encryptiom para i-disable ang encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Magpadala ng HTML-formatted na text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Imbitahan ang ibinigay na user sa room na ito", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Sumali sa ibinigay na room", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Tanggalin ang ibinigay na user sa room na ito", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Umalis sa room na ito", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Ilarawan ang iyong sarili", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ilapat ang iyong larawan para sa room na ito (bilang mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Ilapat ang iyong display name para sa room na ito", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Ilapat ang level ng lakas sa ibinigay na user (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Magpadala ng reply bilang reaksyon", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Magpadala ng text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "I-unban ang ibinigay na user sa room na ito", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Hindi wastong command", + "@commandInvalid": { + "type": "String" + }, + "compareEmojiMatch": "Paki-kumpara ang mga emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "create": "Gumawa", + "@create": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Burahin", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Burahin ang mensahe", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Mga Device", + "@devices": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Hindi wastong shortcode ng emote!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Ang mga kamakailang ginamit na emote ay lalabas dito...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "calls": "Mga Tawag", + "customEmojisAndStickers": "Mga custom emoji at sticker", + "customEmojisAndStickersBody": "Magdagdag o magbahagi ng mga custom emoji o sticker na maaring gamitin sa anumang chat.", + "emoteShortcode": "Shortcode ng emoji", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "I-enable ang emote pack globally", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "Tinapos ni {senderName} ang tawag", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Maglagay ng email address", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "commandHint_plain": "Magpadala ng hindi na-format na text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandMissing": "Hindi isang command ang {command}.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "Inimbita ang contact sa group", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Inulat ang nilalaman sa mga pangangasiwa ng server", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Hindi ma-decrypt ang mensahe: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "defaultPermissionLevel": "Default na antas ng pahintulot para sa mga bagong user", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Burahin ang account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Mga Setting ng Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Global chat ID", + "accessAndVisibility": "Pag-access at visibility", + "accessAndVisibilityDescription": "Sino ang pinapayagang sumali sa chat at paano matutuklas ang chat.", + "enableEncryptionWarning": "Hindi mo madi-disable ang encryption. Sigurado ka ba?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Hindi makuha ang lokasyon: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Laki ng font", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "noChatsFoundHere": "Walang pang mga chat na nahanap dito. Magsimula ng bagong chat kasama ang isang tao sa pamamagitan ng paggamit ng button sa ibaba. ⤵️", + "aboutHomeserver": "Tungkol sa {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "space": "Espasyo", + "guestsAreForbidden": "Pinagbabawal ang mga bisita", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Maaring sumali ang mga bisita", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "forward": "I-forward", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Mula sa pagsali", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Mula sa imbitasyon", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "swipeRightToLeftToReply": "Mag-swipe pakaliwa o kanan para tumugon", + "noMoreChatsFound": "Wala nang mga chat na nahanap…", + "unread": "Hindi nabasa", + "groupIsPublic": "Pampubliko ang grupo", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Mga grupo", + "@groups": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Paglalarawan ng chat", + "chatDescriptionHasBeenChanged": "Nabago ang paglalarawan ng chat", + "groupWith": "Grupo kasama kay/sa {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb new file mode 100644 index 0000000000..65dabae531 --- /dev/null +++ b/lib/l10n/intl_fr.arb @@ -0,0 +1,2727 @@ +{ + "@@locale": "fr", + "@@last_modified": "2021-08-14 12:41:10.051787", + "about": "À propos", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accepter", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} a accepté l'invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Compte", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} a activé le chiffrement de bout en bout", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Ajouter un courriel", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Ajouter à l'espace", + "admin": "Administrateur", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "adresse", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tout", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} a répondu à l'appel", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Tout le monde peut rejoindre", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Verrouillage de l’application", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archiver", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Les invités peuvent-i·e·ls rejoindre ?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Êtes-vous sûr·e ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Voulez-vous vraiment vous déconnecter ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Pour pouvoir faire signer l'autre personne, veuillez entrer la phrase de passe de votre trousseau sécurisé ou votre clé de récupération.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accepter cette demande de vérification de la part de {username} ?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Lire automatiquement les autocollants et les émojis animés", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Le serveur d'accueil prend en charge les types de connexion :\n{serverVersions}\nMais cette application ne prend en charge que :\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Bannir de la discussion", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banni", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} a banni {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquer l'appareil", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqué", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Annuler", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Impossible d'ouvrir l'URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Modifier le nom de l'appareil", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} a changé l'image de la discussion", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} a changé les permissions de la discussion", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} a changé son nom en : '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} a changé les règles d'accès à la discussion pour les invités", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} a changé les règles d'accès à la discussion pour les invités en : {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} a changé la visibilité de l'historique de la discussion", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} a changé la visibilité de l'historique de la discussion en : {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} a changé les règles d'accès à la discussion", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} a changé les règles d'accès à la discussion en : {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} a changé son avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} a changé les adresses du salon", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} a changé le lien d'invitation", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Changer de mot de passe", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Changer le serveur d'accueil", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Changez votre style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Changer le nom du groupe", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Changer votre avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Le chiffrement a été corrompu", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Discussion", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sauvegarde des discussions", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Détails de la discussion", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Discussions", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Choisissez un mot de passe fort", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Effacer les archives", + "close": "Fermer", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Bannir l'utilisateur/trice donné(e) de ce salon", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Envoyer du texte au format HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Inviter l'utilisateur/trice donné(e) dans ce salon", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Rejoindre le salon donné", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Supprime l'utilisateur/trice donné(e) de ce salon", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Quitter ce salon", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Décrivez-vous", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Définir votre image pour ce salon (par mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Définir votre nom d'affichage pour ce salon", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Définir le niveau de puissance de l'utilisateur/trice donné(e) (par défaut : 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Envoyer du texte non formaté", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Envoyer une réponse en tant que réaction", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Envoyer du texte", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Débannir l'utilisateur/trice donné(e) de ce salon", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Commande invalide", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} n'est pas une commande.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Veuillez comparer les émojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Veuillez comparer les chiffres", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurer la discussion", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Le contact a été invité au groupe", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Le contenu a été signalé aux administrateurs du serveur", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copié dans le presse-papier", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copier", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copier dans le presse-papiers", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Impossible de déchiffrer le message : {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participant(s)", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Créer", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} a créé la discussion", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Nouvel espace", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Actif en ce moment", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Sombre", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Cette opération va désactiver votre compte. Une fois cette action effectuée, aucun retour en arrière n'est possible ! Êtes-vous sûr·e ?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Niveau d'autorisation par défaut pour les arrivants", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Supprimer", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Supprimer le compte", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Supprimer le message", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Appareils", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Discussions directes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Renommage effectué", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Télécharger le fichier", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Modifier", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Modifier les serveurs bloqués", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Changer de nom d'affichage", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Modifier les adresses du salon", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Modifier l'avatar du salon", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Cette émoticône existe déjà !", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Raccourci d'émoticône invalide !", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Paramètre des émoticônes", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Raccourci de l'émoticône", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Discussion vide", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activer globalement le pack d'émoticônes", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activer le chiffrement", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Vous ne pourrez plus désactiver le chiffrement. Êtes-vous sûr(e) ?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Chiffré", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Chiffrement", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Le chiffrement n'est pas activé", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} a mis fin à l'appel", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Saisissez une adresse de courriel", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erreur lors de l'obtention de la localisation : {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Taille de la police", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Transférer", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "À partir de l'entrée dans le salon", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "À partir de l'invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Groupe", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Le groupe est public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groupes", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Groupe avec {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Les invités ne peuvent pas rejoindre", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Les invités peuvent rejoindre", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} a annulé l'invitation de {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Aide", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Cacher les évènements inconnus", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorer", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utilisateur·ices ignoré·es", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "J'ai cliqué sur le lien", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Phrase de passe ou clé de récupération incorrecte", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Inviter un contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Inviter un contact dans {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invité·e", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} a invité {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Uniquement les utilisateur·ices invité·es", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} vous a invité·e sur FluffyChat.\n1. Visiter fluffychat.im et installer l'application\n2. Inscrivez-vous ou connectez-vous\n3. Ouvrez le lien d'invitation :\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "est en train d'écrire…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} a rejoint la discussion", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Rejoindre le salon", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} a expulsé {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} a expulsé et banni {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulser de la discussion", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Vu·e pour la dernière fois : {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Partir", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "A quitté la discussion", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Clair", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Charger {count} participant·es de plus", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Chargement… Veuillez patienter.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Charger plus…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Les services de localisation sont désactivés. Il est nécessaire de les activer avant de pouvoir partager votre localisation.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "L'application n'a pas la permission d'accéder à votre localisation. Merci de l'accorder afin de pouvoir partager votre localisation.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Se connecter", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Se connecter à {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Se déconnecter", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mentionner", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Modérateur·rice", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mettre la discussion en sourdine", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nouvelle discussion", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nouveau message dans FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nouvelle demande de vérification !", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Suivant", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Non", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Aucune connexion au serveur", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Aucune émoticône trouvée. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Vous pouvez activer le chiffrement seulement quand le salon n'est plus accessible au public.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging ne semble pas être disponible sur votre appareil. Pour continuer à recevoir des notifications poussées, nous vous recommandons d'installer ntfy. Avec ntfy ou un autre fournisseur Unified Push, vous pouvez recevoir des notifications poussées de manière sécurisée. Vous pouvez télécharger ntfy sur le PlayStore ou sur F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} n'est pas un serveur Matrix, souhaitez-vous utiliser {server2} à la place ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Vous n'avez pas encore ajouté de moyen pour récupérer votre mot de passe.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Aucune permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Aucun salon trouvé…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifications", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} utilisateur·ices écrivent…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtention de la localisation…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Valider", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La sauvegarde en ligne des clés est activée", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oups ! Une erreur s'est malheureusement produite lors du réglage des notifications.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oups, un problème est survenu…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Ouvrez l'application pour lire le message", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ouvrir l'appareil photo", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Ouvrir dans maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participant(e)", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Phrase de passe ou clé de récupération", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Mot de passe", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Mot de passe oublié", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Le mot de passe a été modifié", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Récupération du mot de passe", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Épingler", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Veuillez choisir un code d’accès", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Veuillez cliquer sur le lien contenu dans le courriel puis continuez.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Renseignez votre mot de passe", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Veuillez saisir votre code PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Renseignez votre nom d'utilisateur·ice", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Veuillez suivre les instructions sur le site et appuyer sur Suivant.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Vie privée", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salons publics", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Motif", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} a supprimé un évènement", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Supprimer un message", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Refuser", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} a refusé l'invitation", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Supprimer", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Supprimer tous les autres appareils", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Débannissement de la discussion", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Supprimer votre avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Remplacer le salon par une nouvelle version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Répondre", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Signaler un message", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Le salon a été mis à niveau", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Version du salon", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Enregistrer le fichier", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Rechercher", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sécurité", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Envoyer", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Envoyer un message", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Envoyer un texte", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Envoyer un fichier audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Envoyer un fichier", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Envoyer une image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Envoyer des messages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Envoyer une vidéo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} a envoyé un fichier", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} a envoyé un fichier audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} a envoyé une image", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} a envoyé un autocollant", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} a envoyé une vidéo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} a envoyé des informations sur l'appel", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Définir comme adresse principale", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Définir le statut", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Paramètres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Partager", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} a partagé sa position", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Partager la localisation", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Ignorer", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Code source", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "L'espace est public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nom de l'espace", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} a démarré un appel", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Statut", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Comment allez-vous aujourd'hui ?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Soumettre", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronisation... Veuillez patienter.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Système", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Elles ne correspondent pas", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Elles correspondent", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Trop de requêtes. Veuillez réessayer plus tard !", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Retenter l'envoi", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} a annulé le bannissement de {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Retirer le blocage sur l'appareil", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Appareil inconnu", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algorithme de chiffrement inconnu", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Événement de type inconnu : '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Retirer la sourdine de la discussion", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Désépingler", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} et {count} autres sont en train d'écrire…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} et {username2} sont en train d'écrire…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} est en train d'écrire…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} a quitté la discussion", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} a envoyé un évènement de type {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Vérifié", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Commencer la vérification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "La vérification a été effectuée avec succès !", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Vérification de l'autre compte", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Appel vidéo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilité de l'historique de la discussion", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible pour tous les participant·es", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible pour tout le monde", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Message vocal", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "En attente de l'acceptation de la demande par le partenaire…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "En attente de l'acceptation de l'émoji par le partenaire…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "En attente de l'acceptation des nombres par le partenaire…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Attention !", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Nous vous avons envoyé un courriel", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Qui peut faire quelle action", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Qui est autorisé·e à rejoindre ce groupe", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Pourquoi voulez-vous le signaler ?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Grâce à ces adresses, vous pouvez récupérer votre mot de passe si vous en avez besoin.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Écrivez un message…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Oui", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vous", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Vous ne participez plus à cette discussion", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Vous avez été banni·e de cette discussion", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Votre clé publique", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scanner un code QR", + "sendOnEnter": "Envoyer avec Entrée", + "bundleName": "Nom du groupe", + "removeFromBundle": "Retirer de ce groupe", + "addToBundle": "Ajouter au groupe", + "editBundlesForAccount": "Modifier les groupes pour ce compte", + "addAccount": "Ajouter un compte", + "oneClientLoggedOut": "Un de vos clients a été déconnecté", + "link": "Lien", + "unverified": "Non vérifié", + "repeatPassword": "Répétez le mot de passe", + "openGallery": "Ouvrir dans la Galerie", + "time": "Heure", + "sender": "Expéditeur/trice", + "messageInfo": "Informations sur le message", + "removeFromSpace": "Supprimer de l’espace", + "commandHint_create": "Créer un groupe de discussion vide\nUtilisez --no-encryption pour désactiver le chiffrement", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Abandonner la session", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Vider le cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Commencer une discussion directe\nUtilisez --no-encryption pour désactiver le chiffrement", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "markAsRead": "Marquer comme lu", + "reportUser": "Signaler l'utilisateur/trice", + "reactedWith": "{sender} a réagi avec {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Émojis", + "placeCall": "Passer un appel", + "voiceCall": "Appel vocal", + "unsupportedAndroidVersion": "Version d'Android non prise en charge", + "unsupportedAndroidVersionLong": "Cette fonctionnalité nécessite une nouvelle version d'Android. Veuillez vérifier les mises à jour ou la prise en charge de Lineage OS.", + "pinMessage": "Épingler au salon", + "confirmEventUnpin": "Voulez-vous vraiment désépingler définitivement l'événement ?", + "videoCallsBetaWarning": "Veuillez noter que les appels vidéo sont actuellement en version bêta. Ils peuvent ne pas fonctionner comme prévu ou ne oas fonctionner du tout sur toutes les plateformes.", + "experimentalVideoCalls": "Appels vidéo expérimentaux", + "youRejectedTheInvitation": "Vous avez rejeté l'invitation", + "youJoinedTheChat": "Vous avez rejoint la discussion", + "youHaveWithdrawnTheInvitationFor": "Vous avez retiré l'invitation pour {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Vous avez accepté l'invitation", + "youBannedUser": "Vous avez banni {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Vous avez été invité par {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Vous avez invité {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Vous avez dégagé {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Vous avez dégagé et banni {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Vous avez débanni {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Utilisateurs/trices", + "storeInAndroidKeystore": "Stocker dans Android KeyStore", + "storeInAppleKeyChain": "Stocker dans Apple KeyChain", + "user": "Utilisateur/trice", + "custom": "Personnalisé", + "hydrate": "Restaurer à partir du fichier de sauvegarde", + "dehydrateWarning": "Cette action ne peut pas être annulée. Assurez-vous d'enregistrer convenablement le fichier de sauvegarde.", + "dehydrate": "Exporter la session et effacer l'appareil", + "storeSecurlyOnThisDevice": "Stocker de manière sécurisé sur cet appareil", + "countFiles": "{count} fichiers", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Cela peut se produire si le message a été envoyé avant que vous ne vous soyez connecté à votre compte sur cet appareil.\n\nIl est également possible que l'expéditeur ait bloqué votre appareil ou qu'un problème de connexion Internet se soit produit.\n\nÊtes-vous capable de lire le message sur une autre session ? Vous pouvez alors transférer le message à partir de celle-ci ! Allez dans Paramètres > Appareils et assurez-vous que vos appareils se sont vérifiés mutuellement. Lorsque vous ouvrirez le salon la fois suivante et que les deux sessions seront au premier plan, les clés seront transmises automatiquement.\n\nVous ne voulez pas perdre les clés en vous déconnectant ou en changeant d'appareil ? Assurez-vous que vous avez activé la sauvegarde de la discussion dans les paramètres.", + "commandHint_markasdm": "Marquer comme salon de messages directs pour l'identifiant Matrix indiqué", + "commandHint_markasgroup": "Marquer comme groupe", + "confirmMatrixId": "Veuillez confirmer votre identifiant Matrix afin de supprimer votre compte.", + "supposedMxid": "Cela devrait être {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "whyIsThisMessageEncrypted": "Pourquoi ce message est-il illisible ?", + "foregroundServiceRunning": "Cette notification s’affiche lorsque le service au premier plan est en cours d’exécution.", + "screenSharingTitle": "Partage d'écran", + "screenSharingDetail": "Vous partagez votre écran dans FuffyChat", + "newSpace": "Nouvel espace", + "doNotShowAgain": "Ne plus afficher", + "commandHint_googly": "Envoyer des yeux écarquillés", + "commandHint_cuddle": "Envoyer un câlin", + "commandHint_hug": "Envoyer une accolade", + "googlyEyesContent": "{senderName} vous envoie des yeux écarquillés", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} vous fait un câlin", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} vous fait une accolade", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Discussion vide (était {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "encryptThisChat": "Chiffrer cette discussion", + "sorryThatsNotPossible": "Désolé, ce n'est pas possible", + "newSpaceDescription": "Les espaces vous permettent de consolider vos conversations et de construire des communautés privées ou publiques.", + "disableEncryptionWarning": "Pour des raisons de sécurité, vous ne pouvez pas désactiver le chiffrement dans une discussion s'il a été activé avant.", + "reopenChat": "Rouvrir la discussion", + "noOtherDevicesFound": "Aucun autre appareil trouvé", + "noBackupWarning": "Attention ! Sans l'activation de la sauvegarde de la discussion, vous perdrez l'accès à vos messages chiffrés. Il est fortement recommandé d'activer la sauvegarde de la discussion avant de se déconnecter.", + "fileHasBeenSavedAt": "Le fichier a été enregistré dans {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Impossible d'envoyer ! Le serveur accepte uniquement les pièces jointes jusqu'à {max}.", + "jumpToLastReadMessage": "Aller au dernier message lu", + "readUpToHere": "Lisez jusqu’ici", + "chatPermissions": "Permissions du salon", + "importFromZipFile": "Importer depuis un fichier .zip", + "importEmojis": "Importer des Émoticônes", + "notAnImage": "Pas un fichier image.", + "chatDescriptionHasBeenChanged": "La description du salon a changé", + "createGroup": "Créer un groupe", + "importNow": "Importer maintenant", + "tryAgain": "Nouvelle tentative", + "blockedUsers": "Utilisateurs/trices bloqués", + "redactMessageDescription": "Le message sera supprimé pour tous les participants de cette conversation. Il n'est pas possible de revenir en arrière.", + "redactedBy": "Supprimé par {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Discussion directe", + "optionalRedactReason": "(Facultatif) Raison de la suppression de ce message...", + "sendTypingNotifications": "Envoyer des notifications de frappe", + "replace": "Remplacer", + "emoteKeyboardNoRecents": "Les émoticônes récemment utilisées apparaîtront ici...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "nothingFound": "Rien n'a été trouvé...", + "chatDescription": "Description de la discussion", + "invalidServerName": "Nom de serveur invalide", + "shareInviteLink": "Partager un lien d'invitation", + "openLinkInBrowser": "Ouvrir le lien dans le navigateur", + "setColorTheme": "Définir la couleur du thème :", + "databaseMigrationBody": "Veuillez patienter. Cela peut prendre un moment.", + "searchForUsers": "Rechercher des @utilisateurs/trices...", + "passwordsDoNotMatch": "Les mots de passe ne correspondent pas", + "passwordIsWrong": "Votre mot de passe saisi est erroné", + "joinSpace": "Rejoindre l'espace", + "publicSpaces": "Espaces publics", + "addChatOrSubSpace": "Ajouter une discussion ou un sous-espace", + "thisDevice": "Cet appareil :", + "sendReadReceipts": "Envoyer des accusés de réception", + "sendTypingNotificationsDescription": "Les autres participants à une discussion peuvent voir que vous êtes en train de taper un nouveau message.", + "verifyOtherDevice": "🔐 Vérifier l'autre appareil", + "formattedMessagesDescription": "Affichez le contenu formaté des messages comme du texte en gras à l'aide de markdown.", + "incomingMessages": "Messages entrants", + "acceptedKeyVerification": "{sender} a accepté la vérification de clé", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 Inviter à une discussion de groupe", + "jump": "Sauter", + "passwordRecoverySettings": "Paramètres de récupération de mot de passe", + "hasKnocked": "🚪 {user} a frappé", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} a annulé la vérification de clé", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "unreadChatsInApp": "{appname} : {unread} discussions non lus", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} a demandé une vérification de clé", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} a lancé la vérification de clé", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "discover": "Découvrir", + "usersMustKnock": "Les utilisateurs/trices doivent frapper", + "noOneCanJoin": "Personne ne peut rejoindre", + "knock": "Frapper à la porte", + "appLockDescription": "Verrouiller l'application avec un code PIN lorsqu'elle n'est pas utilisée", + "globalChatId": "Identifiant global de la discussion", + "accessAndVisibility": "Accès et visibilité", + "accessAndVisibilityDescription": "Qui est autorisé à rejoindre cette discussion et comment la discussion peut être découverte.", + "calls": "Appels", + "customEmojisAndStickers": "Émoticônes et autocollants personnalisés", + "hideRedactedMessages": "Cacher les messages supprimés", + "pleaseEnterYourCurrentPassword": "Veuillez saisir votre mot de passe actuel", + "swipeRightToLeftToReply": "Glisser de droite à gauche pour répondre", + "hideRedactedMessagesBody": "Si quelqu'un supprime un message, celui-ci ne sera plus visible dans la discussion.", + "customEmojisAndStickersBody": "Ajoutez ou partagez des émoticônes ou autocollants personnalisés qui peuvent être utilisés dans n'importe quelle discussion.", + "blockListDescription": "Vous pouvez bloquer des utilisateurs/trices qui vous dérangent. Vous ne pourrez plus recevoir aucun message ou invitation à un salon d'utilisateurs/trices figurant sur votre liste de blocage personnelle.", + "blockUsername": "Ignorer le nom d'utilisateur/trice", + "hideInvalidOrUnknownMessageFormats": "Masquer les formats de message invalides ou inconnus", + "messagesStyle": "Messages :", + "redactedByBecause": "Supprimé par {username} car : \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Définir la description de la discussion", + "gallery": "Galerie", + "files": "Fichiers", + "sessionLostBody": "Votre session est perdue. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "searchIn": "Rechercher dans la discussion \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Les autres participants à une discussion peuvent voir si vous avez lu un message.", + "formattedMessages": "Messages formatés", + "verifyOtherUser": "🔐 Vérifier l'autre utilisateur/trice", + "searchMore": "Rechercher davantage...", + "verifyOtherUserDescription": "Si vous vérifiez un autre utilisateur/trice, vous pouvez être sûr de savoir à qui vous écrivez réellement. 💪\n\nLorsque vous lancez une vérification, vous et l'autre utilisateur/trice verrez une fenêtre contextuelle dans l'application. Vous y verrez alors une série d'émoticônes ou de chiffres que vous devrez comparer.\n\nLa meilleure façon de procéder est de se rencontrer ou de lancer un appel vidéo. 👭", + "verifyOtherDeviceDescription": "Lorsque vous vérifiez un autre appareil, ces appareils peuvent échanger des clés, ce qui augmente votre sécurité globale. 💪 Lorsque vous lancez une vérification, une fenêtre contextuelle s'affiche dans l'application sur les deux appareils. Vous y verrez alors une série d'émoticônes ou de chiffres que vous devrez comparer. Il est préférable d'avoir les deux appareils à portée de main avant de lancer la vérification. 🤳", + "completedKeyVerification": "{sender} a terminé la vérification de clé", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} est prêt pour la vérification de clé", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Autocollants", + "noDatabaseEncryption": "Le chiffrement de la base de données n'est pas supporté sur cette plateforme", + "commandHint_ignore": "Ignorer l'identifiant Matrix indiqué", + "commandHint_unignore": "Ne plus ignorer l'identifiant Matrix indiqué", + "thereAreCountUsersBlocked": "Actuellement, il y a {count} utilisateurs/trices bloqués.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "groupCanBeFoundViaSearch": "Le groupe peut être trouvé via la recherche", + "groupName": "Nom du groupe", + "invalidInput": "Entrée invalide !", + "block": "Bloquer", + "removeDevicesDescription": "Vous serez déconnecté de cet appareil et ne pourrez plus recevoir de messages.", + "createNewAddress": "Créer une nouvelle adresse", + "publicChatAddresses": "Addresses de discussion publiques", + "space": "Espace", + "noMoreChatsFound": "Aucune autre discussion trouvée...", + "unread": "Non lu", + "commandHint_sendraw": "Envoyer du JSON brut", + "databaseMigrationTitle": "La base de données est optimisée", + "leaveEmptyToClearStatus": "Laisser vide pour effacer votre statut.", + "select": "Sélectionner", + "reportErrorDescription": "😭 Oh non. Quelque chose s'est mal passé. Si vous le souhaitez, vous pouvez signaler ce bogue aux développeurs.", + "report": "signaler", + "wrongPinEntered": "Mauvais code PIN saisi ! Veuillez réessayer dans {seconds} secondes...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pushNotificationsNotAvailable": "Notifications indisponibles", + "yourGlobalUserIdIs": "Votre identifiant utilisateur/trice global est : ", + "chatCanBeDiscoveredViaSearchOnServer": "La discussion peut être découverte via la recherche sur {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "knocking": "Frapper", + "banUserDescription": "L'utilisateur/trice sera banni de la discussion et ne pourra plus y accéder jusqu'à ce qu'il/elle soit débanni.", + "unbanUserDescription": "L'utilisateur/trice pourra entrer à nouveau dans la discussion si il/elle le souhaite.", + "kickUserDescription": "L'utilisateur/trice est expulsé de la discussion mais n'est pas banni. Dans les discussions publiques, l'utilisateur/trice peut revenir à tout moment.", + "makeAdminDescription": "Une fois que vous aurez nommé cet utilisateur/trice administrateur, vous ne pourrez peut-être plus annuler cette opération, car il disposera alors des mêmes autorisations que vous.", + "newPassword": "Nouveau mot de passe", + "pleaseChooseAStrongPassword": "Veuillez choisir un mot de passe fort", + "initAppError": "Une erreur est survenue pendant l'initialisation de l'application", + "markAsUnread": "Marquer comme non lu", + "wrongRecoveryKey": "Désolé... il ne semble pas s'agir de la bonne clé de récupération.", + "searchChatsRooms": "Rechercher des #discussions, @utilisateurs/trices...", + "createGroupAndInviteUsers": "Créer un groupe et inviter des utilisateurs/trices", + "goToSpace": "Aller dans l'espace : {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "exportEmotePack": "Exporter le pack d'émoticônes au format .zip", + "noChatDescriptionYet": "Aucune description de discussion n'a encore été créée.", + "invite": "Inviter", + "pleaseEnterANumber": "Veuillez saisir un nombre supérieur à 0", + "roomUpgradeDescription": "La discussion sera alors recréé avec la nouvelle version de salon. Tous les participants seront informés qu'ils doivent passer à la nouvelle discussion. Pour en savoir plus sur les versions des salons, consultez le site https://spec.matrix.org/latest/rooms/", + "learnMore": "En savoir plus", + "restoreSessionBody": "L'application tente maintenant de restaurer votre session depuis la sauvegarde. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "archiveRoomDescription": "La discussion sera déplacée dans les archives. Les autres utilisateurs/trices pourront voir que vous avez quitté la discussion.", + "noUsersFoundWithQuery": "Malheureusement, aucun utilisateur/trice n'a pu être trouvé avec \"{query}\". Veuillez vérifier si vous n'avez pas fait de faute de frappe.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "noChatsFoundHere": "Aucune discussion trouvée. Utilisez le bouton ci-dessous pour commencer une nouvelle discussion. ⤵️", + "aboutHomeserver": "À propos de {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "changeTheDescriptionOfTheGroup": "Modifier la description de la discussion", + "userLevel": "{level} — Membre", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "chatPermissionsDescription": "Définir quel niveau de droit est nécessaires pour certaines actions dans cette discussion. Les niveaux de droits 0, 50 et 100 représentent généralement les membres, les modérateurs/trices et les administrateurs/trices, mais toute gradation est possible.", + "changeGeneralChatSettings": "Modifier les paramètres généraux de la discussion", + "moderatorLevel": "{level} — Modérateur/trice", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendCanceled": "Envoi annulé", + "adminLevel": "{level} — Administrateur/trice", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Inviter d'autres membres dans cette discussion", + "changeTheChatPermissions": "Modifier les permissions de cette discussion", + "changeTheVisibilityOfChatHistory": "Modifier la visibilité de l'historique de la discussion", + "changeTheCanonicalRoomAlias": "Modifier l'adresse publique principale de la discussion", + "changelog": "Journal des modifications", + "synchronizingPleaseWaitCounter": " Synchronisation… ({percentage} %)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "updateInstalled": "🎉 La mise à niveau {version} est installée !", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "loginWithMatrixId": "Connexion avec l'identifiant Matrix", + "checkList": "Check-list", + "countInvited": "{count} invité(e/s)", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendImages": "Envoyer {count} image(s)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "calculatingFileSize": "Calcul en cours...", + "sendingAttachment": "Envoi en cours...", + "oneOfYourDevicesIsNotVerified": "Un de vos appareils n'est pas vérifié", + "customReaction": "Réaction personalisée", + "declineInvitation": "Refuser l'invitation", + "invalidUrl": "Adresse incorrecte", + "addAnswerOption": "Ajouter une réponse", + "addLink": "Ajouter un lien", + "allowMultipleAnswers": "Autoriser plusieurs réponses", + "serverInformation": "Information du serveur :", + "answersVisible": "Réponses visibles", + "notificationRuleInviteForMeDescription": "Notifie l'utilisateur/trice lorsqu'il est invité dans un salon.", + "notificationRuleMemberEventDescription": "Retire les notifications des évènements des membres.", + "doesNotSeemToBeAValidHomeserver": "Aucun serveur d'acceuil compatible ne semble exister. URL incorrecte ?", + "notificationRuleMaster": "Désactiver toutes les notifications", + "shareKeysWithDescription": "Quels sont les appareils auxquels vous faites confiance afin qu'ils puissent lire les message dans les conversations chiffrées ?", + "logs": "Journaux", + "compress": "Compresser", + "signIn": "Se connecter", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifie l'utilisateur/trice à propos des messages dans les salons chiffrés en duo.", + "pollQuestion": "Question du sondage", + "enterNewChat": "Entrer un nouveau message", + "reset": "Réinitialiser", + "otherNotificationSettings": "Notifications diverses", + "thread": "Fil de discussion", + "notificationRuleRoomOneToOneDescription": "Notifie l'utilisateur/trice à propos des messages dans les salons en duo.", + "stickerPackName": "Nom du groupe d'autocollant", + "notificationRuleIsRoomMentionDescription": "Notifie l'utilisateur/trice lorsqu'il y a une mention de salon.", + "deletePushRuleCanNotBeUndone": "Si vous supprimez ce paramètre de notification, il n'y a pas d'annulation possible.", + "youHaveKnocked": "Vous avez toqué", + "verifiedDevicesOnly": "Appareils vérifiés uniquement", + "continueText": "Continuer", + "notificationRuleSuppressNoticesDescription": "Retire les notifications depuis les clients automatisé comme les robots.", + "createNewTag": "Créer une nouvelle étiquette", + "optionalMessage": "(Facultatif) message...", + "allDevices": "Tous les appareils", + "notificationRuleRoomServerAcl": "ACL des salons du serveur", + "notificationRuleIsUserMention": "Mention Utilisateur/trice", + "countReplies": "{count, plural, =1{Une réponse} other{{count} réponses}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "versionWithNumber": "Version : {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "useAsEmoji": "Utiliser comme émoticône", + "website": "Site web", + "join": "Rejoindre", + "shareKeysWith": "Partager les clés avec...", + "takeAPhoto": "Prendre une photo", + "countChats": "{chats} discussions", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "notificationRuleIsUserMentionDescription": "Notifie l'utilisateur/trice lorsqu'il est mentionné directement dans un message.", + "notificationRuleServerAcl": "Retire les Évènements ACL du Serveur", + "advancedConfigurations": "Configurations avancées", + "signUpGreeting": "FluffyChat est décentralisé ! Selectionnez un hôte sur lequel vous voulez créer un compte et c'est parti !", + "notificationRuleCall": "Appeler", + "baseUrl": "URL racine", + "pause": "Pause", + "answersWillBeVisibleWhenPollHasEnded": "Les réponses seront affichées quand le sondage aura pris fin", + "manageAccount": "Paramètrer le compte", + "setWallpaper": "Changer le fond d'écran", + "notificationRuleContainsDisplayNameDescription": "Notifie l'utilisateur/trice lorsqu'un message contient son nom d'affichage.", + "createNewChat": "Créer une nouvelle discussion", + "backToMainChat": "Retourner à la discussion principale", + "makeModerator": "Promouvoir modérateur/trice", + "italicText": "Italique", + "skipChatBackup": "Passer la sauvegarde de la discussion", + "notificationRuleEncryptedDescription": "Notifies l'utilisateur/trice à propos des messages dans les salons chiffrés.", + "answerOption": "Réponse possible", + "notificationRuleRoomOneToOne": "Salon en Duo", + "sentVoiceMessage": "🎙️ {duration} - Message vocal de {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Vous autorisez l'application et le site web à partager vos informations.", + "notificationRuleEncryptedRoomOneToOne": "Salon Chiffré en Duo", + "name": "Nom", + "tagName": "Nom de l'étiquette", + "moreEvents": "Plus d'évènements", + "resume": "Reprendre", + "commandHint_logoutall": "Se déconnecter de tous les appareils actifs", + "notificationRuleIsRoomMention": "Mention de Salon", + "federationBaseUrl": "Racine de l'URL de Fédération", + "userSpecificNotificationSettings": "Notifications relatives à l'utilisateur/trice", + "notSupportedOnThisDevice": "Non-supporté sur cet appareil", + "setPowerLevelDescription": "Le niveau de droit défini ce qu'un utilisateur est capable de faire dans ce salon et se place généralement entre 0 et 100.", + "notificationRuleRoomnotif": "Notification de Salon", + "noMessagesYet": "Aucun message actuellement", + "stickerPackNameAlreadyExists": "Ce nom est déjà utilisé par un groupe d'autocollant", + "matrixId": "ID Matrix", + "identityServer": "Serveur d'identité :", + "version": "Version", + "notificationRuleMessageDescription": "Notifie l'utilisateur/trice à propos des messages en général.", + "createNewAccount": "Créer un nouveau compte", + "setPowerLevel": "Configurer le niveau de puissance", + "notificationRuleServerAclDescription": "Retire les notifications lors des changement des ACL du serveur.", + "pollHasBeenEnded": "Le sondage à pris fin", + "replyInThread": "Répondre dans un fil de discussion", + "mute": "Muet", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "notificationRuleSuppressEdits": "Supprimer les Modifications", + "pleaseWaitUntilInvited": "Veuillez attendre que quelqu'un du salon vous invite.", + "sendRoomNotifications": "Envoyer une notification de salon", + "useAsSticker": "Utiliser comme un autocollant", + "noMoreResultsFound": "Pas de résultats supplémentaires trouvés", + "longPressToRecordVoiceMessage": "Appuyer longtemps pour envoyer un message vocal.", + "createSticker": "Créer un autocollant ou un émoticône", + "notificationRuleMessage": "Message", + "notificationRuleTombstone": "Pierre tombale", + "removeModeratorRights": "Révoquer les droits modérateurs/trices", + "supportPage": "Page de support", + "noContactInformationProvided": "Le serveur ne possède pas d'informations de contact valides", + "contentNotificationSettings": "Gestion des notifications de contenu", + "addTag": "Ajouter une étiquette", + "previous": "Précédent", + "startPoll": "Démarrer un sondage", + "notificationRuleRoomServerAclDescription": "Désactive les notifications pour les listes de contrôle d'accès (ACL) des salon du serveur.", + "notificationRuleInviteForMe": "Invitation pour Moi", + "spaceMemberOfCanKnock": "Seule les membres de l'espace de {spaces} peuvent toquer", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "removeAdminRights": "Révoquer les droits administrateurs/trices", + "removeFromSpaceDescription": "La discussion sera retirée de l'espace mais apparaitra toujours dans votre liste de discussion.", + "newChatRequest": "📩 Nouvelle demande de discussion", + "boldText": "Gras", + "owner": "Propriétaire", + "powerLevel": "Niveau de droits", + "strikeThrough": "Barré", + "playSoundOnNotification": "Jouer un son quand notifié", + "changedTheChatDescription": "{username} a modifié la description de la discussion", + "skipChatBackupWarning": "Êtes vous certain ? Sans la sauvegarde des discussions vous pourriez perdre l'accès à vos messages si vous changez d'appareil.", + "makeAdmin": "Promouvoir administrateur/trice", + "more": "Plus", + "searchOrEnterHomeserverAddress": "Recherchez ou entrez l'adresse de votre serveur d'acceuil", + "notificationRuleSuppressEditsDescription": "Retirer les notifications pour les éditions de messages.", + "notificationRuleJitsi": "Jitsi", + "unsetLowPriority": "Ne plus définir comme faible priorité", + "setLowPriority": "Définir comme faible priorité", + "notificationRuleContainsUserName": "Contient le nom d'utilisateur/trice", + "notificationRuleSuppressNotices": "Supprime les Messages Automatiques", + "chatSearchedUntil": "Recherché dans la discussion jusqu'au {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "notificationRuleMasterDescription": "Force la désactivation de toutes les notifications.", + "open": "Ouvrir", + "notificationRuleTombstoneDescription": "Notifie l'utilisateur/trice a propos de la désactivation des message dans un salon.", + "notificationRuleContainsUserNameDescription": "Notifie l'utilisateur quand un message contient son nom d'utilisateur/trice.", + "notificationRuleContainsDisplayName": "Contient le nom d'affichage", + "notificationRuleReaction": "Réaction", + "endPoll": "Mettre fin au sondage", + "theProcessWasCanceled": "Le processus a été annulé.", + "unableToJoinChat": "Discussion impossible à rejoindre. L'autre participant.e à peut-être déjà fermé la discussion.", + "unknownPushRule": "Règles de notification push inconnue '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "crossVerifiedDevices": "Appareils vérifiés de façon croisée", + "saveChanges": "Enregistrer les modifications", + "commandHint_logout": "Se déconnecter de l'appareil", + "newStickerPack": "Nouveau groupe d'autocollants", + "signInGreeting": "Vous avez déjà un compte sur Matrix ? Bon retour ! Sélectionnez votre serveur d'acceuil et connectez vous.", + "advancedConfigs": "Configs avancées", + "noticeChatBackupDeviceVerification": "Note : Lorsque vous connectez vos appareils à la sauvegarde de discussion, ils sont automatiquement vérifiés.", + "notificationRuleMemberEvent": "Évenement pour les Membres", + "crossVerifiedDevicesIfEnabled": "Appareils vérifiés de façon croisée si activée", + "contactServerSecurity": "Contacter l'équipe de sécurité du serveur", + "waitingForServer": "En attente du serveur...", + "commandHint_roomupgrade": "Mettez à jour ce salon vers la version donnée", + "roomNotificationSettings": "Paramètre de notification des salons", + "otherPartyNotLoggedIn": "L'autre participant.e n'est pas connecté actuellement et ne peux donc pas recevoir de messages !", + "notificationRuleReactionDescription": "Retire les notifications des réactions.", + "notificationRuleCallDescription": "Notifie l'utilisateur/trice lorsqu'on l'appelle.", + "contactServerAdmin": "Contacter l'administrateur/trice du serveur", + "appWantsToUseForLogin": "Utiliser '{server}' pour se connecter", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "recordAVideo": "Enregistrer une vidéo", + "removeTag": "Retirer l'étiquette", + "countVotes": "{count, plural, =1{Un vote} other{{count} votes}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notificationRuleJitsiDescription": "Notifie l'utilisateur à propos des évènements de l'intégration Jitsi.", + "approve": "Approuver", + "notificationRuleRoomnotifDescription": "Notifie l'utilisateur/trice lorsqu'un message contient '@room'.", + "generalNotificationSettings": "Réglages généraux des notifications", + "supportFluffyChat": "Soutenir FluffyChat", + "notificationRuleEncrypted": "Chiffré", + "pleaseFillOut": "Veuillez remplir", + "changedTheChatName": "{username} a changé le nom de la discussion", + "spaceMemberOf": "Membre de l'espace de {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "discardEdits": "Vous avez des modifications non-sauvegardés. Voulez-vous les supprimer ?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Voir plus", + "showLess": "Voir moins", + "hideRoomsInSpaces": "Cacher les salons qui sont dans un espace", + "possibleByYou": "Cette mise à jour a été possible uniquement grâce à votre support. FluffyChat restera gratuit, open-source et entièrement communautaire.", + "showThumbnailsInTimeline": "Afficher les apperçus des images et vidéos", + "appSubtitle": "Communication [matrix] Sécurisée", + "appDescription": "Communiquez de façon chiffrée sur le réseau décentralisé [matrix] de façon aisée et accessible pour tous.", + "interactiveVerification": "Vérification intéractive", + "interactiveVerificationDescription": "Si vous êtes l'un à coté de l'autre ou que vous communiquez par un canal sécurisé, vous pouvez vérifier tous vos appareils en une seule fois en comparant un numéro de sécurité ou des émoticônes.", + "countUnverifiedDevices": "{count} appareils non-vérifiés dans la discussion.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Message chiffré", + "unencryptedMessage": "Message non-chiffré", + "publicKey": "Clé publique : {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Clé d'identification de l'appareil", + "restoreBootstrapEmptyDevicesDescription": "Veuillez entrer votre mot de passe ou votre clé de récupération pour vérifier cet appareil et déchiffrer la sauvegarde de vos messages.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Veuillez choisir l'un de vos autre appareils, pour vérifier cette session :", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Ré-initialiser le compte", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Restaurer votre Profile Crypto", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Réinitialiser votre Profile Crypto", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Configurer votre Profile Crypto", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "En attente des clés... Veuillez garder l'autre appareil actif.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Aucune clé transmise. Veuillez réessayer.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Déverrouiller", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Ouvrir un fichier", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Lorsque vous réinitialiserez votre compte, vous perdrez l'accès à vos anciens messages pour toujours. Tous vos appareils devront être vérifiés de nouveau. Veuillez réaliser cette action seulement lorsque vous n'avez pas d'autre appareils pour vérifier votre session et que vous avez perdu votre clé de récupération et votre phrase de passe !", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat utilise le chiffrement de bout en bout. Pour ne pas perdre vos messages, veuillez choisir une phrase de passe forte pour sécuriser votre profile crypto et votre sauvegarde chiffrée des messages.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Nouvelle phrase de passe", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Répeter la phrase de passe", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Les phrases de passe correspondent", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Au moins 12 caractères.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Contient des majuscules et des minuscules.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Contient des caractères spéciaux.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Contient un chiffre.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Veuillez noter votre clé de récupération pour pouvoir restaurer vos message chiffrés et votre profile crypto dans le futur.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Sauvegarder le fichier", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Vous êtes prêt à commencer !", + "noUserKeyFound": "Pas de clé utilisateur/trice trouvée", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Connu depuis : {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Appareil non-signé", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Appareil signé", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Aucune clé curve25519 trouvée", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Message non-déchiffrable", + "messageCanOnlyBeReadByUser": "Votre message est chiffré de bout en bout et ne peux être lu que par cet utilisateur :", + "messageCanOnlyBeReadByUsers": "Votre message est chiffré de bout en bout et ne peux être lu que par ces utilisateurs :", + "today": "Aujourd'hui", + "sending": "Envoi", + "generatingThumbnail": "Génération d'une miniature", + "encrypting": "Chiffrement", + "uploading": "Téléversement", + "edited": "(édité)", + "couldNotBeSent": "N'a pas pu être envoyé", + "yesterday": "Hier", + "displayNavigationRail": "Afficher la barre de navigation sur mobile", + "resetRecoveryKey": "Réinitialiser la clé de récupération", + "pleaseEnter6Digits": "Veuillez entrer le code à 6 chiffres pour activer le verouillage de l'application.", + "disableAppLock": "Désactiver le verrouillage de l'application", + "disableAppLockAreYouSure": "Êtes vous sûr de vouloir désactiver le verrouillage de l'application ?", + "enableBiometrics": "Activer l'authentification biométrique", + "disableBiometrics": "Désactiver l'authentification biométrique", + "biometricsDescription": "Avec l'authentification biométrique, vous pouvez déverrouillee l'application avec votre visage ou votre empreinte digitale. Les possibilités dépendent de votre appareil.", + "useAppLock": "Utiliser le verrouillage de l'application", + "unlockWithBiometrics": "Déverrouiller avec l'authentification biométrique", + "resetPin": "Réinitialiser le code pin", + "forwardCountMessages": "Avancer de {count, plural, =1{un message} other{{count} messages}} ?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "clientWellKnownInformation": "Informations Well-Known du client :", + "attribution": "Attribution", + "support": "Soutenir", + "blur": "Flou :", + "opacity": "Opacité :" +} diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb new file mode 100644 index 0000000000..d2ba78d3dc --- /dev/null +++ b/lib/l10n/intl_ga.arb @@ -0,0 +1,2716 @@ +{ + "you": "Tú", + "@you": { + "type": "String", + "placeholders": {} + }, + "yes": "Tá", + "@yes": { + "type": "String", + "placeholders": {} + }, + "warning": "Rabhadh!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "verified": "Deimhnithe", + "@verified": { + "type": "String", + "placeholders": {} + }, + "unpin": "Bain biorán", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Córas", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "submit": "Cuir isteach", + "@submit": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Conas atá tú inniu?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "status": "Staid", + "@status": { + "type": "String", + "placeholders": {} + }, + "skip": "Léim", + "@skip": { + "type": "String", + "placeholders": {} + }, + "share": "Roinn", + "@share": { + "type": "String", + "placeholders": {} + }, + "settings": "Socruithe", + "@settings": { + "type": "String", + "placeholders": {} + }, + "send": "Seol", + "@send": { + "type": "String", + "placeholders": {} + }, + "security": "Slándáil", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "Cuardaigh", + "@search": { + "type": "String", + "placeholders": {} + }, + "reply": "Freagair", + "@reply": { + "type": "String", + "placeholders": {} + }, + "remove": "Bain", + "@remove": { + "type": "String", + "placeholders": {} + }, + "reject": "Diúltaigh", + "@reject": { + "type": "String", + "placeholders": {} + }, + "reason": "Fáth", + "@reason": { + "type": "String", + "placeholders": {} + }, + "privacy": "Príobháideacht", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pin": "Biorán", + "@pin": { + "type": "String", + "placeholders": {} + }, + "password": "Pasfhocal", + "@password": { + "type": "String", + "placeholders": {} + }, + "participant": "Rannpháirtí", + "@participant": { + "type": "String", + "placeholders": {} + }, + "directChats": "Comhráite Díreacha", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Scrios an teachtaireacht", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Scrios an cuntas", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Spás nua", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} rannpháirtithe", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "or": "Nó", + "@or": { + "type": "String", + "placeholders": {} + }, + "ok": "Ceart go leor", + "@ok": { + "type": "String", + "placeholders": {} + }, + "notifications": "Fógraí", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "no": "Níl", + "@no": { + "type": "String", + "placeholders": {} + }, + "next": "Ar Aghaidh", + "@next": { + "type": "String", + "placeholders": {} + }, + "moderator": "Modhnóir", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "messages": "Teachtaireachtaí", + "@messages": { + "type": "String", + "placeholders": {} + }, + "mention": "Luaigh", + "@mention": { + "type": "String", + "placeholders": {} + }, + "logout": "Logáil amach", + "@logout": { + "type": "String", + "placeholders": {} + }, + "login": "Logáil isteach", + "@login": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Solas", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "leave": "Fág", + "@leave": { + "type": "String", + "placeholders": {} + }, + "invited": "Le cuireadh", + "@invited": { + "type": "String", + "placeholders": {} + }, + "ignore": "Tabhair neamhaird ar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "help": "Cabhair", + "@help": { + "type": "String", + "placeholders": {} + }, + "groups": "Grúpaí", + "@groups": { + "type": "String", + "placeholders": {} + }, + "group": "Grúpa", + "@group": { + "type": "String", + "placeholders": {} + }, + "forward": "Seol ar aghaidh", + "@forward": { + "type": "String", + "placeholders": {} + }, + "encryption": "Criptiúchán", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Criptithe", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "edit": "Cuir in eagar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "devices": "Gléasanna", + "@devices": { + "type": "String", + "placeholders": {} + }, + "delete": "Scrios", + "@delete": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "configureChat": "Cumraigh comhrá", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Ordú neamhbhailí", + "@commandInvalid": { + "type": "String" + }, + "commandHint_send": "Seol téacs", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_me": "Déan cur síos ort féin", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "clearArchive": "Glan an cartlann", + "chatDetails": "Sonraí comhrá", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Cúltaca comhrá", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "D'athraigh {username} abhatár an chomhrá", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "Athraigh ainm an ghléis", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ní féidir an URI {uri} a oscailt", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "cancel": "Cealaigh", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bactha", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Bac Gléas", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "Chuir {username} cosc ar {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "Coiscthe", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "Toirmisc ón gcomhrá", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Seol ar iontráil", + "archive": "Cartlann", + "@archive": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bac aip", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Is féidir le aon duine dul isteach", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "D'fhreagair {senderName} an glao", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "all": "Gach", + "@all": { + "type": "String", + "placeholders": {} + }, + "alias": "ailias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "admin": "Riarthóir", + "@admin": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Cuir go spás", + "addEmail": "Cuir ríomhphoist", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} criptithe deireadh go deireadh gníomhachtaithe", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Cuntas", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 Ghlac {username} leis an gcuireadh", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "accept": "Glac", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "Faoi", + "@about": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Glac leis an iarratas fíoraithe seo ó {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "An bhfuil tú cinnte gur mhaith leat logáil amach?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "An bhfuil tú cinnte?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "An bhfuil cead ag úsáideoirí aoi páirt a ghlacadh?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 thug {username} cuireadh do {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsCanJoin": "Is féidir le haíonna páirt a ghlacadh", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Tá cosc ar aíonna", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grúpa le {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "groupIsPublic": "Tá an grúpa poiblí", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Ón gcuireadh", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Gearrchód emote neamhbhailí!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Tá iomaite ann cheana féin!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Cuir in eagar abhatár an tseomra", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Cuir ailiasanna an tseomra in eagar", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Cuir freastalaí blocáilte in eagar", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Leibhéal ceada réamhshocraithe d'úsáideoirí nua", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Díbhlocáil Gléas", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Tugadh cuireadh don theagmháil a thar isteach sa grúpa", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Cuir na huimhreacha i gcomparáid le do thoil", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Cuir na emojis i gcomparáid le do thoil", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "Ní ordú é {command}.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandHint_react": "Seol freagra mar fhreagairt", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_op": "Socraigh leibhéal cumhachta an úsáideora áirithe (réamhshocrú: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Socraigh d'ainm taispeána don seomra seo", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "Cuir do phictiúr don seomra seo (le mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_kick": "Bain an t-úsáideoir áirithe den seomra seo", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Téigh isteach sa seomra áirithe", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_ban": "Cuir cosc ar an úsáideoir áirithe ón seomra seo", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_invite": "Cuir cosc ar an úsáideoir áirithe ón seomra seo", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "chooseAStrongPassword": "Roghnaigh pasfhocal láidir", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Truaillíodh an criptiú", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Athraigh ainm an ghrúpa", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "D'athraigh {username} nasc an chuiridh", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "D'athraigh {username} ailiasanna an tseomra", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "D'athraigh {username} a n-abhatár", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "D'athraigh {username} na rialacha ceangail go: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "D'athraigh {username} na rialacha ceangail", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "D'athraigh {username} infheictheacht na staire go: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "D'athraigh {username} infheictheacht na staire", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "D'athraigh {username} a n-ainm taispeána go: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "D'athraigh {username} na ceadanna comhrá", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Seinn greamáin agus straoiseog beoite go huathoibríoch", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "createdTheChat": "💬 chruthaigh {username} an comhrá", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "copyToClipboard": "Cóipeáil ar an ghearrthaisce", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Cóipeáilte ar an ghearrthaisce", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "commandHint_plain": "Seol téacs neamhfhoirmithe", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_leave": "Fág an seomra seo", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_html": "Seol téacs HTML-formáidithe", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "changeYourAvatar": "Athraigh do abhatár", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Athraigh do stíl", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Athraigh an freastalaí baile", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Glórphost", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Físghlao", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Tosaigh Fíorú", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Neamhciúnaigh comhrá", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Folaigh imeachtaí anaithnide", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Gléas anaithnid", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Tá siad céanna", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Ainm an spáis", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Cód foinseach", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Roinn suíomh", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Cuir stádas", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Seol físeán", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Seol teachtaireachtaí", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Seol íomhá", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Seol comhad", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Seol fuaim", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Sábháil comhad", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Leagan seomra", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Tuairiscigh teachtaireacht", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Bain teachtaireacht amach", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Seomraí Poiblí", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Aisfháil pasfhocail", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Pasfhocal dearmadta", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Oscail ceamara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "ag Aimsiú an suíomh…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Gan cead", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "newChat": "Comhrá nua", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Ciúnaigh comhrá", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Lódáil níos mó…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Téigh isteach sa seomra", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "isTyping": "ag clóscríobh…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Tabhair cuireadh do theagmháil", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Úsáideoirí a dtugann tú neamhaird orthu", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Ó tar isteach", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Méid cló", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Tosaigh criptiú", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Cuir ainm taispeána in eagar", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Gníomhach faoi láthair", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Comhrá folamh", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Gearrchód straoiseoige", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Socruithe straoiseoige", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Íoslódáil comhad", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Athraigh an pasfhocal", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dorcha", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "create": "Cruthaigh", + "@create": { + "type": "String", + "placeholders": {} + }, + "copy": "Cóipeáil", + "@copy": { + "type": "String", + "placeholders": {} + }, + "close": "Dún", + "@close": { + "type": "String", + "placeholders": {} + }, + "chats": "Comhráite", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chat": "Comhrá", + "@chat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scan cód QR", + "inviteText": "Thug {username} cuireadh duit chuig FluffyChat.\n1. Tabhair cuairt ar fluffychat.im agus a shuiteáil an app\n2. Cláraigh nó sínigh isteach\n3. Oscail an nasc cuirí:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "noMatrixServer": "Níl {server1} freastalaí Matrix. Úsáid {server2} ina áit sin?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noGoogleServicesWarning": "Is cosúil nach bhfuil Firebase Cloud Messaging ar fáil ar do ghléas. Chun fógraí brú a fháil fós, molaimid ntfy a shuiteáil. Le ntfy nó soláthraí Unified Push eile is féidir leat fógraí brú a fháil ar bhealach atá slán ó thaobh sonraí. Is féidir leat ntfy a íoslódáil ón PlayStore nó ó F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Ní féidir leat criptiú a ghníomhachtú ach a luaithe nach bhfuil an seomra inrochtana go poiblí a thuilleadh.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Níor aimsíodh aon straoiseoga. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Gan aon nasc leis an bhfreastalaí", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Iarratas fíoraithe nua!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Teachtaireacht nua in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logáil isteach chuig {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "locationPermissionDeniedNotice": "Diúltaíodh cead suímh. Deonaigh dóibh le do thoil go mbeidh tú in ann do shuíomh a roinnt.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Tá seirbhísí suímh díchumasaithe. Cuir ar a gcumas le do thoil a bheith in ann do shuíomh a roinnt.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Ag lódáil… Fan, le do thoil.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Lódáil {count} níos mó rannpháirtithe", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "leftTheChat": "Fágadh an comhrá", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Gníomhach deireanach: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "kickFromChat": "Caith é amach as an comhrá", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 chiceáil {username} {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 chiceáil {username} agus chuir sé cosc ar {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinedTheChat": "Tháinig 👋 {username} isteach sa chomhrá", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Úsáideoirí le cuireadh amháin", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Tabhair cuireadh do theagmháil chuig {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "incorrectPassphraseOrKey": "Pasfhrása nó eochair téarnaimh mícheart", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Chliceáil mé ar an nasc", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "Tharraing {username} an cuireadh do {targetName} siar", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "errorObtainingLocation": "Earráid maidir le suíomh a fháil: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Cuir isteach seoladh ríomhphoist", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "Chuir {senderName} deireadh leis an nglao", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryptionNotEnabled": "Ní chumasaítear criptiú", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ní bheidh in ann an criptiú a dhíchumasú níos mó. An bhfuil tú cinnte?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Cumasaigh pacáiste straoiseoige go huilíoch", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Athraíodh an t-ainm taispeána", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Díghníomhachtaeoidh sé seo do chuntas úsáideora. Ní féidir é seo a chealú! An bhfuil tú cinnte?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Níorbh fhéidir teachtaireacht a dhíchriptiú: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "contentHasBeenReported": "Tuairiscíodh an t-ábhar do lucht riaracháin an fhreastalaí", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_unban": "Cuir deireadh an cosc den úsáideoir áirithe ón seomra seo", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "changedTheGuestAccessRulesTo": "D'athraigh {username} na rialacha maidir le rochtain aoi chuig: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "D'athraigh {username} na rialacha rochtana aoi", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Tá na cineálacha logála isteach seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "askSSSSSign": "Chun a bheith in ann an duine eile a shíniú, cuir isteach do phasfhrása stóir sábháilte nó d'eochair téarnaimh.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "D'eochair phoiblí", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Cuireadh cosc ort ón gcomhrá seo", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Níl tú ag glacadh páirte sa chomhrá seo a thuilleadh", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Scríobh teachtaireacht…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Leis na seoltaí seo is féidir leat do phasfhocal a athshlánú.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Cén fáth ar mhaith leat é seo a thuairisciú?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Cé a bhfuil cead aige/aici dul isteach sa ghrúpa seo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Cé atá in ann an gníomh a dhéanamh", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "D'fhíoraigh tú go rathúil!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 D'fhág {username} an comhrá", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "Tá {username} agus {username2} ag clóscríobh…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "tá {username} agus {count} daoine eile ag clóscríobh…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "unknownEncryptionAlgorithm": "Algartam criptithe anaithnid", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "Chuir {username} deireadh an cosc {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "tryToSendAgain": "Déan iarracht a sheoladh arís", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "An iomarca iarratas. Bain triail eile as níos déanaí!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Níl siad céanna", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "Roinn {username} a suíomh", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Socraigh mar phríomh-ailias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "Sheol {senderName} faisnéis maidir le glaonna", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 sheol {username} físeán", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 sheol {username} greamán", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ sheol {username} pictiúr", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "replaceRoomWithNewerVersion": "Cuir leagan seomra níos nuaí in ionad an tseomra", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Bain d'abhatár", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Cuir deireadh an cosc ón gcomhrá", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Bain gach gléas eile", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "Dhiúltaigh {username} don chuireadh", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedAnEvent": "Rinne {username} cinsire imeacht", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pleaseFollowInstructionsOnWeb": "Lean na treoracha ar an suíomh gréasáin agus tapáil \"ar aghaidh\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Cuir isteach d'ainm úsáideora le do thoil", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Cuir isteach do uap le do thoil", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Iontráil do phasfhocal le do thoil", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Cliceáil ar an nasc sa ríomhphost agus ansin lean ar aghaidh.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Roghnaigh paschód le do thoil", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Athraíodh an pasfhocal", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "pasfhrása nó eochair téarnaimh", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Oscail i léarscáileanna", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Oscail an aip chun teachtaireachtaí a léamh", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Úps, chuaigh rud éigin mícheart …", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Hoips! Ar an drochuair, tharla earráid nuair a bhí na fógraí brú á mbunú.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Tá Cúltaca Eochair Ar Líne cumasaithe", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "Tá {count} úsáideoirí ag clóscríobh…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noRoomsFound": "Níor aimsíodh aon seomraí…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Níor chuir tú bealach leis do phasfhocal a aisghabháil fós.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Sheolamar ríomhphost chugat", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Ag fanacht le comhpháirtí glacadh leis na huimhreacha …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ag fanacht le comhpháirtí glacadh leis na straoiseoga…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ag fanacht le comhpháirtí glacadh leis an iarratas…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Infheicthe do gach duine", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Infheicthe do na rannpháirtithe go léir", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Infheictheacht stair na comhrá", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Ag fíorú cuntas eile", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "Sheol {username} imeacht {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "userIsTyping": "Tá {username} ag clóscríobh…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unknownEvent": "Imeacht anaithnid '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "synchronizingPleaseWait": "Ag sioncrónú... Fan, le do thoil.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "startedACall": "Thosaigh {senderName} glao", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "spaceIsPublic": "Tá an spás poiblí", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤 sheol {username} fuaim", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁 sheol {username} comhad", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendAsText": "Seol mar théacs", + "@sendAsText": { + "type": "String" + }, + "sendAMessage": "Seol teachtaireacht", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Uasghrádaíodh an seomra", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Breisigh cuntas", + "commandHint_create": "Cruthaigh comhrá grúpa folamh\nÚsáid --no-encryption chun criptiúchán a dhíchumasú", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "link": "Nasc", + "commandHint_clearcache": "Glan an taisce", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "videoCallsBetaWarning": "Tabhair faoi deara go bhfuil físglaonna i béite. B'fhéidir nach bhfeidhmíonn siad ar gach ardán chomh atá súil aige ná ar bith.", + "repeatPassword": "Scríobh an pasfhocal arís", + "fileHasBeenSavedAt": "Sábháladh an comhad ag {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "editBundlesForAccount": "Cuir cuachta in eagar don chuntas seo", + "globalChatId": "Aitheantas comhrá domhanda", + "sender": "Seoltóir", + "noOneCanJoin": "Ní féidir le duine ar bith páirt a ghlacadh", + "noOtherDevicesFound": "Níor aimsíodh aon ghléas eile", + "inviteGroupChat": "📨 Cuireadh chuig comhrá grúpa", + "knocking": "Cnagadh", + "addChatOrSubSpace": "Cuir comhrá nó fo-spás leis", + "thisDevice": "An gléas seo:", + "formattedMessages": "Teachtaireachtaí formáidithe", + "verifyOtherDevice": "🔐 Fíoraigh gléas eile", + "commandHint_ignore": "Déan neamhaird d'aitheantas na maitríse sonraithe", + "completedKeyVerification": "{sender} fíorú eochair críochnaithe", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "changeTheCanonicalRoomAlias": "Athraigh an príomhsheoladh comhrá poiblí", + "importEmojis": "Iompórtáil Emoji", + "commandHint_dm": "Cuir tús le comhrá díreach\nÚsáid --no-cription chun criptiúchán a dhíchumasú", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "invalidServerName": "Ainm freastalaí neamhbhailí", + "addToBundle": "Cuir le bundle", + "redactedBy": "Arna chur in eagar ag {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "markAsRead": "Marcáil mar léite", + "searchForUsers": "Cuardaigh @users...", + "removeFromBundle": "Bain as an mbeart seo", + "reactedWith": "D'fhreagair {sender} le {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Thug {user} cuireadh duit", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "doNotShowAgain": "Ná taispeáin arís", + "pleaseEnterANumber": "Iontráil uimhir níos mó ná 0", + "unbanUserDescription": "Beidh an t-úsáideoir in ann dul isteach sa chomhrá arís má dhéanann siad iarracht.", + "pleaseEnterYourCurrentPassword": "Iontráil do phasfhocal reatha le do thoil", + "newPassword": "Pasfhocal nua", + "sendReadReceipts": "Seol admhálacha léite", + "formattedMessagesDescription": "Taispeáin ábhar saibhir teachtaireachta cosúil le téacs trom ag baint úsáide as marcáil síos.", + "verifyOtherUser": "🔐 Fíoraigh úsáideoir eile", + "jump": "Léim", + "reportErrorDescription": "😭 Ó, a mhac go deo. Chuaigh rud éigin mícheart. Más mian leat, is féidir leat an fabht seo a thuairisciú do na forbróirí.", + "invalidInput": "Ionchur neamhbhailí!", + "kickUserDescription": "Ciceáiltear an t-úsáideoir as an gcomhrá ach níl cosc air. I gcomhráite poiblí, is féidir leis an úsáideoir teacht ar ais ag am ar bith.", + "commandHint_sendraw": "Seol json amh", + "leaveEmptyToClearStatus": "Fág folamh chun do stádas a ghlanadh.", + "pleaseChooseAStrongPassword": "Roghnaigh pasfhocal láidir", + "joinSpace": "Glac páirt sa spás", + "initAppError": "Tharla earráid agus an feidhmchlár á thosú", + "requestedKeyVerification": "D'iarr {sender} fíorú eochrach", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Teachtaireachtaí isteach", + "voiceCall": "Glao gutha", + "emojis": "Emojis", + "reportUser": "Déan tuairisc ar úsáideoir", + "custom": "Saincheaptha", + "supposedMxid": "Ba cheart go mbeadh sé seo {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Marcáil mar ghrúpa", + "newSpace": "Spás nua", + "confirmMatrixId": "Deimhnigh d’ID Maitrís chun do chuntas a scriosadh.", + "confirmEventUnpin": "An bhfuil tú cinnte an t-imeacht a dhíphionnáil go buan?", + "hugContent": "Tugann {senderName} barróg duit", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "unread": "Neamhléite", + "noChatsFoundHere": "Níor aimsíodh aon chomhrá anseo fós. Cuir tús le comhrá nua le duine éigin tríd an gcnaipe thíos a úsáid. ⤵️", + "messageInfo": "Eolas teachtaireachta", + "unsupportedAndroidVersionLong": "Éilíonn an ghné seo leagan Android níos nuaí. Seiceáil le haghaidh nuashonruithe nó tacaíocht Lineage OS.", + "experimentalVideoCalls": "Glaonna físe turgnamhacha", + "youKicked": "👞 Chiceáil tú {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Unbanned tú {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Cnoc Mhuire", + "countFiles": "Comhaid {count}", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "foregroundServiceRunning": "Tá an fógra seo le feiceáil nuair atá an tseirbhís tulra ag rith.", + "screenSharingDetail": "Tá do scáileán á roinnt agat i FuffyChat", + "disableEncryptionWarning": "Ar chúiseanna slándála ní féidir leat criptiú a dhíchumasú i gcomhrá, áit ar cumasaíodh é roimhe seo.", + "sorryThatsNotPossible": "Tá brón orm... nach féidir a dhéanamh", + "reopenChat": "Comhrá a athoscailt", + "noBackupWarning": "Rabhadh! Gan cúltaca comhrá a chumasú, caillfidh tú rochtain ar do theachtaireachtaí criptithe. Moltar go mór an cúltaca comhrá a chumasú ar dtús sula logálann tú amach.", + "fileIsTooBigForServer": "Ní féidir seol! Ní thacaíonn an freastalaí ach le ceangaltáin suas le {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Léim go dtí an teachtaireacht léite is déanaí", + "readUpToHere": "Léigh suas go dtí seo", + "openLinkInBrowser": "Oscail nasc sa bhrabhsálaí", + "wrongPinEntered": "Tháinig biorán mícheart isteach! Bain triail eile as i {seconds} soicind...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "Bogfar an comhrá go dtí an chartlann. Beidh úsáideoirí eile in ann a fheiceáil gur fhág tú an comhrá.", + "removeDevicesDescription": "Beidh tú logáilte amach as an ngléas seo agus ní bheidh tú in ann teachtaireachtaí a fháil a thuilleadh.", + "roomUpgradeDescription": "Déanfar an comhrá a athchruthú ansin leis an leagan seomra nua. Cuirfear in iúl do gach rannpháirtí go gcaithfidh siad aistriú chuig an gcomhrá nua. Is féidir leat tuilleadh eolais a fháil faoi leaganacha seomra ag https://spec.matrix.org/latest/rooms/", + "banUserDescription": "Beidh cosc ar an úsáideoir ón gcomhrá agus ní bheidh sé in ann dul isteach sa chomhrá arís go dtí go mbeidh siad gan chosc.", + "makeAdminDescription": "Nuair a dhéanann tú an riarachán úsáideora seo, b'fhéidir nach mbeidh tú in ann é seo a chealú mar go mbeidh na ceadanna céanna acu agus atá agat.", + "learnMore": "Faigh tuilleadh eolais", + "yourGlobalUserIdIs": "Is é d'aitheantas úsáideora domhanda: ", + "noUsersFoundWithQuery": "Ar an drochuair ní fhéadfaí aon úsáideoir a aimsiú le \"{query}\". Seiceáil le do thoil an ndearna tú typo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "searchChatsRooms": "Cuardaigh #chats, @users...", + "createGroupAndInviteUsers": "Cruthaigh grúpa agus tabhair cuireadh d'úsáideoirí", + "groupCanBeFoundViaSearch": "Is féidir teacht ar ghrúpa trí chuardach", + "wrongRecoveryKey": "Tá brón orm... Ní cosúil gurb é seo an eochair aisghabhála ceart.", + "databaseMigrationBody": "Fan, le do thoil. B'fhéidir go dtógfaidh sé seo nóiméad.", + "select": "Roghnaigh", + "passwordsDoNotMatch": "Ní mheaitseálann pasfhocail", + "searchIn": "Cuardaigh i gcomhrá \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "passwordIsWrong": "Tá do phasfhocal iontrála mícheart", + "files": "Comhaid", + "sessionLostBody": "Cailltear do sheisiún. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Déanann an aip iarracht anois do sheisiún a chur ar ais ón gcúltaca. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Má fhíoraíonn tú úsáideoir eile, is féidir leat a bheith cinnte go bhfuil a fhios agat cé leis a bhfuil tú ag scríobh i ndáiríre. 💪\n\nNuair a thosaíonn tú fíorú, feicfidh tú féin agus an t-úsáideoir eile aníos san aip. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile.\n\nIs é an bealach is fearr chun é seo a dhéanamh ná bualadh le chéile nó glao físe a thosú. 👭", + "sendTypingNotificationsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair atá teachtaireacht nua á clóscríobh agat.", + "verifyOtherDeviceDescription": "Nuair a fhíoraíonn tú gléas eile, is féidir leis na gléasanna sin eochracha a mhalartú, do shlándáil fhoriomlán a mhéadú. 💪 Nuair a thosaíonn tú fíorú, beidh preabfhuinneog le feiceáil san aip ar an dá ghléas. Ansin feicfidh tú sraith emojis nó uimhreacha a chaithfidh tú a chur i gcomparáid lena chéile. Is fearr an dá ghléas a bheith áisiúil sula dtosaíonn tú ar an bhfíorú. 🤳", + "acceptedKeyVerification": "{sender} glacadh le fíorú eochair", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} cealaithe fíorú eochrach", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "Unignore an ID maitrís tugtha", + "goToSpace": "Téigh go dtí an spás: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Marcáil mar gan léamh", + "moderatorLevel": "{level} - Modhnóir", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Riarachán", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Tabhair cuireadh d'úsáideoirí eile chuig an gcomhrá seo", + "changeTheChatPermissions": "Athraigh na ceadanna comhrá", + "changeTheVisibilityOfChatHistory": "Athraigh infheictheacht stair an chomhrá", + "chatPermissionsDescription": "Sainmhínigh cén leibhéal cumhachta is gá le haghaidh gníomhartha áirithe sa chomhrá seo. De ghnáth bíonn na leibhéil chumhachta 0, 50 agus 100 ag déanamh ionadaíochta d'úsáideoirí, do mhodhnóirí agus do riarthóirí, ach is féidir aon ghrádú a dhéanamh.", + "changelog": "ChangelogName", + "sendCanceled": "Cealaíodh seoladh", + "loginWithMatrixId": "Logáil isteach le Matrix-ID", + "calculatingFileSize": "Méid an chomhaid á ríomh...", + "sendingAttachment": "Iatán á sheoladh...", + "oneOfYourDevicesIsNotVerified": "Ní fhíoraítear ceann de do ghléasanna", + "noticeChatBackupDeviceVerification": "Nóta: Nuair a nascann tú do ghléasanna go léir leis an gcúltaca comhrá, déantar iad a fhíorú go huathoibríoch.", + "continueText": "Lean ar aghaidh", + "blur": "Doiléirigh:", + "opacity": "Teimhneacht:", + "setWallpaper": "Socraigh cúlbhrat", + "manageAccount": "Bainistigh cuntas", + "noContactInformationProvided": "Ní sholáthraíonn an freastalaí aon fhaisnéis teagmhála bhailí", + "contactServerAdmin": "Déan teagmháil le admin an fhreastalaí", + "contactServerSecurity": "Déan teagmháil le slándáil an fhreastalaí", + "supportPage": "Leathanach tacaíochta", + "name": "Ainm", + "version": "Leagan", + "website": "Suíomh Gréasáin", + "messagesStyle": "Teachtaireachtaí:", + "setColorTheme": "Socraigh téama datha:", + "openGallery": "Oscail gailearaí", + "users": "Úsáideoirí", + "youBannedUser": "Chuir tú cosc ar {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "user": "Úsáideoir", + "databaseMigrationTitle": "Tá an bunachar sonraí optamaithe", + "hasKnocked": "🚪 Tá {user} tar éis cnagadh", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "report": "tuairisc", + "invite": "Tabhair cuireadh", + "publicSpaces": "Spásanna poiblí", + "whyIsThisMessageEncrypted": "Cén fáth nach féidir an teachtaireacht seo a léamh?", + "pinMessage": "Bioráin chuig an seomra", + "dehydrate": "Easpórtáil seisiún agus gléas wipe", + "commandHint_markasdm": "Marcáil mar sheomra teachtaireachta dírí don ID Maitrís tugtha", + "googlyEyesContent": "Seolann {senderName} súile googly chugat", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Seol cuddle", + "commandHint_hug": "Seol barróg", + "encryptThisChat": "Criptigh an comhrá seo", + "importNow": "Iompórtáil anois", + "sendTypingNotifications": "Seol fógraí clóscríofa", + "chatPermissions": "Ceadanna comhrá", + "emoteKeyboardNoRecents": "Beidh mothúcháin a úsáideadh le déanaí le feiceáil anseo ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "chatDescriptionHasBeenChanged": "Athraíodh cur síos ar an gcomhrá", + "pushNotificationsNotAvailable": "Níl fógraí brú ar fáil", + "changeGeneralChatSettings": "Athraigh socruithe ginearálta comhrá", + "sendRoomNotifications": "Seol fógraí @room", + "changeTheDescriptionOfTheGroup": "Athraigh an cur síos ar an gcomhrá", + "aboutHomeserver": "Maidir le {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "cuddleContent": "Cuireann {senderName} do chudacht", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "noMoreChatsFound": "Níor aimsíodh a thuilleadh comhráite...", + "space": "Spás", + "directChat": "Comhrá díreach", + "redactedByBecause": "Athbhreithnithe ag {username} mar: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Socraigh cur síos ar an gcomhrá", + "time": "Am", + "removeFromSpace": "Bain as spás", + "placeCall": "Cuir glaoch", + "unsupportedAndroidVersion": "Leagan Android gan tacaíocht", + "usersMustKnock": "Ní mór d'úsáideoirí cnag a chur ar", + "storeSecurlyOnThisDevice": "Stóráil go daingean ar an ngléas seo", + "userLevel": "{level} - Úsáideoir", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "updateInstalled": "🎉 Nuashonraigh {version} suiteáilte!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "serverInformation": "Eolas freastalaí:", + "createGroup": "Cruthaigh grúpa", + "noChatDescriptionYet": "Níl aon chur síos ar an gcomhrá cruthaithe fós.", + "shareInviteLink": "Roinn an nasc cuireadh", + "passwordRecoverySettings": "Socruithe athshlánaithe pasfhocal", + "youKickedAndBanned": "🙅 Chiceáil tú agus chuir tú cosc ar {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publicChatAddresses": "Seoltaí comhrá poiblí", + "createNewAddress": "Cruthaigh seoladh nua", + "groupName": "Ainm an ghrúpa", + "bundleName": "Ainm an bheartáin", + "wasDirectChatDisplayName": "Comhrá folamh (bhí {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "oneClientLoggedOut": "Tá duine de do chliaint logáilte amach", + "unverified": "Neamhfhíoraithe", + "youRejectedTheInvitation": "Dhiúltaigh tú don chuireadh", + "youHaveWithdrawnTheInvitationFor": "Tharraing tú siar an cuireadh do {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Thug tú cuireadh do {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Stóráil i Android KeyStore", + "storeInAppleKeyChain": "Stóráil i Apple KeyChain", + "newSpaceDescription": "Ligeann spásanna duit do chomhráite a chomhdhlúthú agus pobail phríobháideacha nó phoiblí a thógáil.", + "chatCanBeDiscoveredViaSearchOnServer": "Is féidir comhrá a aimsiú tríd an gcuardach ar {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "nothingFound": "Níor aimsíodh aon rud...", + "searchMore": "Cuardaigh tuilleadh...", + "gallery": "Gailearaí", + "importFromZipFile": "Iompórtáil ó chomhad .zip", + "exportEmotePack": "Easpórtáil Emote pacáiste mar .zip", + "replace": "Ionadaigh", + "appLockDescription": "Cuir glas ar an aip nuair nach bhfuil sé in úsáid le cód bioráin", + "swipeRightToLeftToReply": "Svaidhpeáil ar dheis ar chlé chun freagra a thabhairt", + "commandHint_discardsession": "Scrios an seisiún", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "block": "Bloc", + "blockListDescription": "Is féidir leat bac a chur ar úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann teachtaireachtaí nó cuireadh seomra ar bith a fháil ó na húsáideoirí ar do liosta bloc pearsanta.", + "blockUsername": "Déan neamhaird de ainm úsáideora", + "tryAgain": "Bain triail eile as", + "optionalRedactReason": "(Roghnach) An chúis leis an teachtaireacht seo a chur in eagar...", + "dehydrateWarning": "Ní féidir an gníomh seo a chealú. Cinntigh go stórálann tú an comhad cúltaca go sábháilte.", + "hydrate": "Athchóirigh ó chomhad cúltaca", + "commandHint_googly": "Seol roinnt súile googly", + "notAnImage": "Ní comhad íomhá é.", + "isReadyForKeyVerification": "Tá {sender} réidh le haghaidh fíorú eochair", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "Thosaigh {sender} fíorú eochrach", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Greamáin", + "discover": "Faigh amach", + "unreadChatsInApp": "{appname}: {unread} comhráite gan léamh", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Ní thacaítear le criptiú bunachar sonraí ar an ardán seo", + "thereAreCountUsersBlocked": "Faoi láthair tá bac curtha ar úsáideoirí {count}.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "sendReadReceiptsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair a bhíonn teachtaireacht léite agat.", + "doesNotSeemToBeAValidHomeserver": "Ní cosúil gur freastalaí baile comhoiriúnach é. URL mícheart?", + "youJoinedTheChat": "Chuaigh tú isteach sa chomhrá", + "youAcceptedTheInvitation": "👍 Ghlac tú leis an gcuireadh", + "screenSharingTitle": "comhroinnt scáileáin", + "accessAndVisibility": "Rochtain agus infheictheacht", + "accessAndVisibilityDescription": "Cé a bhfuil cead aige páirt a ghlacadh sa chomhrá seo agus conas is féidir an comhrá a aimsiú.", + "calls": "Glaonna", + "customEmojisAndStickers": "Emojis agus greamáin saincheaptha", + "customEmojisAndStickersBody": "Cuir leis nó roinn emojis nó greamáin saincheaptha is féidir a úsáid in aon chomhrá.", + "chatDescription": "Cur síos ar an gcomhrá", + "hideRedactedMessages": "Folaigh teachtaireachtaí curtha in eagar", + "hideRedactedMessagesBody": "Má athghníomhaíonn duine éigin teachtaireacht, ní bheidh an teachtaireacht seo le feiceáil sa chomhrá a thuilleadh.", + "hideInvalidOrUnknownMessageFormats": "Folaigh formáidí teachtaireachta neamhbhailí nó anaithnid", + "blockedUsers": "Úsáideoirí bactha", + "redactMessageDescription": "Athrófar an teachtaireacht do gach rannpháirtí sa chomhrá seo. Ní féidir é seo a chealú.", + "noKeyForThisMessage": "Féadfaidh sé seo tarlú má seoladh an teachtaireacht sular shínigh tú isteach ar do chuntas ag an ngléas seo.\n\nIs féidir freisin gur chuir an seoltóir bac ar do ghléas nó go ndeachaigh rud éigin mícheart leis an nasc idirlín.\n\nAn bhfuil tú in ann an teachtaireacht a léamh ar sheisiún eile? Ansin is féidir leat an teachtaireacht a aistriú uaidh! Téigh go Socruithe > Gléasanna agus cinntigh go bhfuil do ghléasanna fíoraithe a chéile. Nuair a osclaíonn tú an seomra an chéad uair eile agus an dá sheisiún sa tulra, déanfar na heochracha a tharchur go huathoibríoch.\n\nNár mhaith leat na heochracha a chailleadh agus tú ag logáil amach nó ag aistriú gléasanna? Déan cinnte go bhfuil an cúltaca comhrá cumasaithe agat sna socruithe.", + "boldText": "Téacs trom", + "italicText": "Téacs iodálach", + "strikeThrough": "Stailc tríd", + "addLink": "Cuir nasc leis", + "pleaseFillOut": "Líon amach le do thoil", + "invalidUrl": "URL neamhbhailí", + "unableToJoinChat": "Ní féidir páirt a ghlacadh sa chomhrá. B’fhéidir go bhfuil an comhrá dúnta cheana féin ag an bpáirtí eile.", + "compress": "Comhbhrúigh", + "sendImages": "Seol {count} íomhá", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "appWantsToUseForLoginDescription": "Ligeann tú leis seo don aip agus don suíomh Gréasáin faisnéis a roinnt fút.", + "synchronizingPleaseWaitCounter": " Ag sioncronú… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Úsáid '{server}' chun logáil isteach", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Oscail", + "waitingForServer": "Ag fanacht leis an bhfreastalaí...", + "previous": "Roimhe Seo", + "otherPartyNotLoggedIn": "Níl an páirtí eile logáilte isteach faoi láthair agus mar sin ní féidir leo teachtaireachtaí a fháil!", + "contentNotificationSettings": "Socruithe fógra inneachair", + "generalNotificationSettings": "Socruithe ginearálta fógra", + "roomNotificationSettings": "Socruithe fógra seomra", + "userSpecificNotificationSettings": "Socruithe fógra sainiúla don úsáideoir", + "otherNotificationSettings": "Socruithe fógra eile", + "notificationRuleContainsUserName": "Tá Ainm Úsáideora ann", + "notificationRuleMaster": "Balbhaigh gach fógra", + "notificationRuleMasterDescription": "Sáraíonn sé gach riail eile agus díchumasaítear gach fógra.", + "notificationRuleSuppressNotices": "Bain Teachtaireachtaí Uathoibrithe", + "notificationRuleSuppressNoticesDescription": "Sochtann sé fógraí ó chliaint uathoibrithe amhail róbónna.", + "notificationRuleInviteForMe": "Tabhair cuireadh Do Mhise", + "notificationRuleMemberEvent": "Imeacht Ball", + "notificationRuleMemberEventDescription": "Sochtann fógraí le haghaidh imeachtaí ballraíochta.", + "notificationRuleIsUserMention": "Luaigh Úsáideoir", + "notificationRuleIsUserMentionDescription": "Cuireann sé sin in iúl don úsáideoir nuair a luaitear go díreach iad i dteachtaireacht.", + "notificationRuleContainsDisplayName": "Tá Ainm Taispeána ann", + "notificationRuleIsRoomMention": "Luaigh Seomra", + "notificationRuleIsRoomMentionDescription": "Cuireann sé sin in iúl don úsáideoir nuair a luaitear seomra.", + "notificationRuleRoomnotif": "Fógra Seomra", + "notificationRuleRoomnotifDescription": "Cuireann sé seo in iúl don úsáideoir nuair a bhíonn '@room' i dteachtaireacht.", + "notificationRuleTombstone": "Leac uaighe", + "notificationRuleTombstoneDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí díghníomhaithe seomra.", + "notificationRuleReactionDescription": "Sochtann fógraí le haghaidh frithghníomhartha.", + "notificationRuleRoomServerAcl": "Freastalaí Seomra ACL", + "notificationRuleRoomServerAclDescription": "Sochtann sé fógraí do liostaí rialaithe rochtana freastalaí seomra (ACL).", + "notificationRuleSuppressEdits": "Cuir na hEagarthóirí ar ceal", + "notificationRuleSuppressEditsDescription": "Sochtann fógraí le haghaidh teachtaireachtaí curtha in eagar.", + "notificationRuleCall": "Glaoigh", + "notificationRuleCallDescription": "Cuireann sé an t-úsáideoir ar an eolas faoi ghlaonna.", + "notificationRuleEncryptedRoomOneToOne": "Seomra Duine le Duine Criptithe", + "notificationRuleRoomOneToOne": "Seomra duine le duine", + "notificationRuleRoomOneToOneDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí duine le duine.", + "notificationRuleMessage": "Teachtaireacht", + "notificationRuleMessageDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí ginearálta.", + "notificationRuleEncrypted": "Criptithe", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Cuireann sé seo in iúl don úsáideoir faoi imeachtaí giuirléidí Jitsi.", + "notificationRuleServerAcl": "Seachtaigh Freastalaí ACL Imeachtaí", + "more": "Tuilleadh", + "newChatRequest": "📩 Iarratas comhrá nua", + "shareKeysWith": "Roinn na heochracha le...", + "allDevices": "Gach gléasanna", + "crossVerifiedDevicesIfEnabled": "Gléasanna trasfhíoraithe má tá siad cumasaithe", + "crossVerifiedDevices": "Feistí trasfhíoraithe", + "unknownPushRule": "Riail bhrú anaithnid '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleReaction": "Imoibriú", + "notificationRuleEncryptedDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí criptithe.", + "notificationRuleContainsUserNameDescription": "Cuireann sé sin in iúl don úsáideoir nuair a bhíonn a ainm úsáideora i dteachtaireacht.", + "notificationRuleInviteForMeDescription": "Cuireann sé seo ar an eolas don úsáideoir nuair a thugtar cuireadh dó/di go seomra.", + "deletePushRuleCanNotBeUndone": "Má scriosann tú an socrú fógra seo, ní féidir é seo a chealú.", + "notificationRuleContainsDisplayNameDescription": "Cuireann sé sin in iúl don úsáideoir nuair a bhíonn a ainm taispeána i dteachtaireacht.", + "notificationRuleEncryptedRoomOneToOneDescription": "Cuireann sé seo in iúl don úsáideoir faoi theachtaireachtaí i seomraí duine le duine criptithe.", + "notificationRuleServerAclDescription": "Sochtann fógraí le haghaidh imeachtaí Freastalaí ACL.", + "shareKeysWithDescription": "Cad iad na gléasanna ar cheart muinín a chur iontu ionas gur féidir leo do chuid teachtaireachtaí a léamh i gcomhráite criptithe?", + "verifiedDevicesOnly": "Gléasanna fíoraithe amháin", + "takeAPhoto": "Glac grianghraf", + "recordAVideo": "Taifead físeán", + "notSupportedOnThisDevice": "Ní thacaítear leis ar an ngléas seo", + "optionalMessage": "Teachtaireacht (Roghnach)…", + "enterNewChat": "Cuir isteach comhrá nua", + "commandHint_roomupgrade": "Uasghrádaigh an seomra seo go dtí an leagan seomra a thugtar", + "approve": "Ceadaigh", + "youHaveKnocked": "Bhuail tú", + "pleaseWaitUntilInvited": "Fan anois, le do thoil, go dtí go dtabharfaidh duine éigin ón seomra cuireadh duit.", + "checkList": "Liosta seiceála", + "countInvited": "cuireadh chuig {count}", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Teachtaireacht ghutha ó {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "displayNavigationRail": "Taispeáin ráille nascleanúna ar fhóin phóca", + "commandHint_logout": "Logáil amach as do ghléas reatha", + "commandHint_logoutall": "Logáil amach gach gléas gníomhach", + "customReaction": "Imoibriú saincheaptha", + "moreEvents": "Tuilleadh imeachtaí", + "declineInvitation": "Diúltaigh don chuireadh", + "noMessagesYet": "Gan aon teachtaireachtaí fós", + "longPressToRecordVoiceMessage": "Brúigh go fada chun teachtaireacht gutha a thaifeadadh.", + "pause": "Sos", + "resume": "Atosú", + "removeFromSpaceDescription": "Bainfear an comhrá as an spás ach beidh sé fós le feiceáil i do liosta comhrá.", + "countChats": "comhráite {chats}", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Ball spáis de {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Is féidir le ball spáis de {spaces} cnagadh", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Tosaigh pobalbhreith", + "endPoll": "Deireadh leis an pobalbhreith", + "answersVisible": "Freagraí le feiceáil", + "pollQuestion": "Ceist pobalbhreithe", + "answerOption": "Rogha freagartha", + "addAnswerOption": "Cuir rogha freagra leis", + "allowMultipleAnswers": "Ceadaigh freagraí iolracha", + "pollHasBeenEnded": "Tá deireadh leis an pobalbhreith", + "countVotes": "{count, plural, =1{Vóta amháin} other{{count} vótaí}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Beidh freagraí le feiceáil nuair a bheidh an pobalbhreith thart", + "replyInThread": "Freagra sa snáithe", + "countReplies": "{count, plural, =1{Freagra amháin} other{{count} freagraí}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Snáithe", + "backToMainChat": "Ar ais chuig an bpríomhchomhrá", + "saveChanges": "Sábháil athruithe", + "createSticker": "Cruthaigh greamán nó emoji", + "useAsSticker": "Úsáid mar ghreamán", + "useAsEmoji": "Úsáid mar emoji", + "stickerPackNameAlreadyExists": "Tá ainm an phacáiste greamán ann cheana féin", + "newStickerPack": "Pacáiste greamán nua", + "stickerPackName": "Ainm an phacáiste greamán", + "attribution": "Atribution", + "skipChatBackup": "Seachain cúltaca comhrá", + "skipChatBackupWarning": "An bhfuil tú cinnte? Mura gcumasaíonn tú an cúltaca comhrá, d’fhéadfá rochtain ar do theachtaireachtaí a chailleadh má athraíonn tú do ghléas.", + "changedTheChatDescription": "D'athraigh {username} cur síos an chomhrá", + "changedTheChatName": "D'athraigh {username} ainm an chomhrá", + "noMoreResultsFound": "Ní bhfuarthas aon torthaí eile", + "chatSearchedUntil": "Comhrá a cuardaíodh go dtí {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL Bonn Cónaidhme", + "clientWellKnownInformation": "Faisnéis atá ar eolas ag an gcliant:", + "baseUrl": "Bun-URL", + "identityServer": "Freastalaí Aitheantais:", + "versionWithNumber": "Leagan: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logaí", + "advancedConfigs": "Cumraíochtaí Ardleibhéil", + "advancedConfigurations": "Cumraíochtaí ardleibhéil", + "signIn": "Sínigh isteach", + "createNewAccount": "Cruthaigh cuntas nua", + "signUpGreeting": "Tá FluffyChat díláraithe! Roghnaigh freastalaí inar mian leat do chuntas a chruthú agus déanaimis é!", + "signInGreeting": "An bhfuil cuntas agat i Matrix cheana féin? Fáilte ar ais! Roghnaigh do fhreastalaí baile agus sínigh isteach.", + "theProcessWasCanceled": "Cuireadh an próiseas ar ceal.", + "join": "Téigh i", + "searchOrEnterHomeserverAddress": "Cuardaigh nó cuir isteach seoladh an fhreastalaí baile", + "matrixId": "Aitheantas Maitrís", + "setPowerLevel": "Socraigh leibhéal cumhachta", + "makeModerator": "Déan modhnóir", + "makeAdmin": "Déan riarthóir", + "removeModeratorRights": "Bain cearta an mhodhnóra", + "removeAdminRights": "Bain cearta riarthóra", + "powerLevel": "Leibhéal cumhachta", + "setPowerLevelDescription": "Sainmhíníonn leibhéil chumhachta cad a cheadaítear do bhall a dhéanamh sa seomra seo agus is gnách go mbíonn siad idir 0 agus 100.", + "owner": "Úinéir", + "mute": "Balbhaigh", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Cruthaigh comhrá nua", + "reset": "Athshocraigh", + "supportFluffyChat": "Tacaigh le FluffyChat", + "support": "Tacaíocht", + "setLowPriority": "Socraigh tosaíocht íseal", + "unsetLowPriority": "Díshuiteáil tosaíocht íseal", + "playSoundOnNotification": "Seinn fuaim ar fhógra", + "addTag": "Cuir clib leis", + "removeTag": "Bain an chlib", + "tagName": "Ainm an chlib", + "createNewTag": "Cruthaigh clib nua", + "discardEdits": "Tá athruithe neamhshábháilte agat. Ar mhaith leat do chuid eagarthóireachtaí a chaitheamh amach?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Taispeáin níos mó", + "showLess": "Taispeáin níos lú", + "hideRoomsInSpaces": "Folaigh seomraí atá i spás", + "possibleByYou": "Níorbh fhéidir an scaoileadh seo a dhéanamh ach amháin a bhuíochas le do thacaíocht. Tá FluffyChat fós saor in aisce, foinse oscailte, agus dírithe go hiomlán ar an bpobal.", + "showThumbnailsInTimeline": "Taispeáin mionsamhlacha d'íomhánna agus físeáin", + "appSubtitle": "Cumarsáid [maitrís] Shlán", + "appDescription": "Cumarsáid chriptithe thar an líonra díláraithe [maitrís] ar bhealach éasca agus inrochtana do gach duine.", + "interactiveVerification": "Fíorú idirghníomhach", + "interactiveVerificationDescription": "Má tá sibh in aice le chéile nó má bhíonn sibh ag cumarsáid trí chainéal slán, is féidir libh gach gléas a fhíorú ag an am céanna trí uimhir slándála nó emoji a chur i gcomparáid.", + "countUnverifiedDevices": "{count} gléasanna neamhfhíoraithe sa chomhrá.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Teachtaireacht chriptithe", + "unencryptedMessage": "Teachtaireacht neamhchriptithe", + "publicKey": "Eochair phoiblí: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Eochair aitheantais gléis", + "messageCanOnlyBeReadByUser": "Tá do theachtaireacht criptithe ó cheann ceann agus ní féidir ach leis an úsáideoir seo í a léamh:", + "messageCanOnlyBeReadByUsers": "Tá do theachtaireacht criptithe ó cheann ceann agus ní féidir ach leis na húsáideoirí seo í a léamh:", + "restoreBootstrapEmptyDevicesDescription": "Cuir isteach do phasfhocal nó d’eochair aisghabhála le do thoil chun an gléas seo a fhíorú agus rochtain a fháil ar chúltaca do theachtaireachta criptithe.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Roghnaigh ceann de do ghléasanna eile le do thoil, chun an seisiún seo a fhíorú:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Athshocraigh cuntas", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Athchóirigh Céannacht Cripte", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Athshocraigh Céannacht Chripte", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Socraigh Céannacht Chripte", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Ag fanacht le heochracha... Coinnigh an gléas eile gníomhach le do thoil.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Níor tarchuireadh aon eochracha. Déan iarracht arís.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Díghlasáil", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Oscail comhad", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Nuair a athshocraíonn tú do chuntas caillfidh tú rochtain ar do sheantheachtaireachtaí go deo. Ní mór do ghléasanna reatha go léir a fhíorú arís. Ná déan an gníomh seo ach amháin nuair nach bhfuil aon ghléasanna eile fágtha agat chun do sheisiún a fhíorú agus nuair a bheidh d’eochair aisghabhála agus d’fhrása faire caillte agat!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "Úsáideann FluffyChat criptiú ó cheann ceann go ceann. Chun nach gcaillfidh tú do theachtaireachtaí, roghnaigh frása faire láidir le do chéannacht chripte agus cúltaca do theachtaireachta criptithe a dhaingniú.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Pasfrása nua", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Athdhéan an frása faire", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Tá frásaí faire ag teacht le chéile", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "12 charachtar ar a laghad ar fhad.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Tá carachtair mhóra agus bheaga ann.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Tá carachtair speisialta ann.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Tá uimhir amháin ann.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Scríobh síos d’eochair aisghabhála le go mbeidh tú in ann do theachtaireachtaí criptithe agus d’aitheantas cripte a athchóiriú.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Sábháil mar chomhad", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Tá tú réidh le tosú!", + "noUserKeyFound": "Níor aimsíodh aon eochair úsáideora", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Ar a dtugtar ó: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Gléas neamhshínithe", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Gléas sínithe", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Níor aimsíodh eochair curve25519", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Ní féidir an teachtaireacht a dhíchriptiú", + "today": "Inniu", + "sending": "Ag seoladh", + "generatingThumbnail": "Ag giniúint mionsamhail", + "encrypting": "Criptiú", + "uploading": "Ag uaslódáil", + "edited": "(eagarthóireacht déanta)", + "couldNotBeSent": "Níorbh fhéidir a sheoladh", + "yesterday": "Inné", + "resetRecoveryKey": "Athshocraigh eochair aisghabhála" +} \ No newline at end of file diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb new file mode 100644 index 0000000000..f1a3991117 --- /dev/null +++ b/lib/l10n/intl_gl.arb @@ -0,0 +1,2727 @@ +{ + "@@locale": "gl", + "@@last_modified": "2021-08-14 12:41:10.040321", + "about": "Acerca de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} aceptou o convite", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activou a cifraxe extremo-a-extremo", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Engadir email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Todos", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} respondeu á chamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Calquera pode unirse", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueo da app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arquivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Poden entrar as usuarias convidadas?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tes a certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Tes a certeza de querer saír?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poder asinar a outra persoa, escribe a túa frase de paso ou chave de recuperación.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Aceptar a solicitude de verificación de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Reproducir automáticamente adhesivos e emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "O servidor soporta as seguintes formas de conexión:\n{serverVersions}\nPero esta app só soporta:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Vetar na conversa", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetada", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} vetou a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Non se pode abrir o URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Cambiar nome do dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} cambiou o avatar da conversa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} mudou os permisos da conversa", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} cambiou o nome público a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} mudou as regras de acceso para convidadas", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} mudou as regras de acceso para convidadas a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} mudou a visibilidade do historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} mudou a visibilidade do historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} mudou as regras de acceso", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} mudou as regras de acceso a: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} mudou o avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} mudou os alias da sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} mudou a ligazón de convite", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Mudar contrasinal", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Mudar de servidor de inicio", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambiar o estilo", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Mudar o nome do grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Cambia o avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A cifraxe está estragada", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversa", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Copia de apoio", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalles da conversa", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Escolle un contrasinal forte", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Baleirar arquivo", + "close": "Pechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Vetar a usuaria indicada desta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Enviar texto con formato HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Convidar á usuaria a esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Unirte á sala indicada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Eliminar a usuaria indicada desta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Saír desta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Conta algo sobre ti", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Establece a túa imaxe para esta sala (por mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Establece o teu nome público para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Establecer o nivel de responsabilidade da usuaria (por defecto: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar texto sen formato", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar resposta como reacción", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Enviar texto", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Retirar veto á usuaria para esta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Comando non válido", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} non é un comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Compara estes emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compara estes números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar conversa", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "O contacto foi convidado ao grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "O contido foi denunciado á administración do servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado ao portapapeis", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar ao portapapeis", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Non se descifrou a mensaxe: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crear", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} creou a conversa", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novo espazo", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Actualmente activo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Escuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Esto desactivará a conta. Esto non ten volta atrás. Estás segura?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permisos por defecto para novas usuarias", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Eliminar conta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Eliminar mensaxe", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Conversas Directas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "O nome público mudou", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descargar ficheiro", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueados", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nome público", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar alias da sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar avatar da sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Xa existe ese emote!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Atallo do emote non é válido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Axustes de Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Atallo de Emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Conversa baleira", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activar paquete emote globalmente", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activar cifraxe", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Non poderás desactivar a cifraxe posteriormente, tes certeza?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Cifrado", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Cifraxe", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "A cifraxe non está activada", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} rematou a chamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Escribe un enderezo de email", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erro ao obter a localización: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Tamaño da letra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenviar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Desde que se una", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Desde o convite", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "O grupo é público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Non se permiten convidadas", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Permítense convidadas", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} retirou o convite para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Axuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Agochar eventos descoñecidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuarias ignoradas", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Premín na ligazón", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de paso ou chave de recuperación incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convidar contacto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convidar contacto a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidado", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} convidou a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Só usuarias convidadas", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} convidoute a FluffyChat.\n1. Visita fluffychat.im e instala a app\n2. Crea unha conta ou Accede\n3. Abre a ligazón do convite: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está escribindo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} uníuse á conversa", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Unirse á sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} expulsou a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} expulsou e vetou a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsar da conversa", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Última actividade: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Saír", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Deixar a conversa", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Cargar {count} participantes máis", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Cargando... Agarda.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Cargar máis…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Os servizos de localización están desactivados. Actívaos para poder compartir a localización.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permiso de localización denegado. Concede este permiso para poder compartir a localización.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Acceder", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Entrar en {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Pechar sesión", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mención", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensaxes", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderadora", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Acalar conversa", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova conversa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nova mensaxe en FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova solicitude de verificación!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Seguinte", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Non", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sen conexión co servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Non hai emotes. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Só podes activar a cifraxe tan pronto como a sala non sexa públicamente accesible.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Semella que non tes Firebase Cloud Messaging dispoñible no teu dispositivo. Para recibir notificacións push recomendamos que instales ntfy. Con ntfy ou outro provedor Unified Push podes recibir notificacións push de xeito seguro. Podes descargar ntfy desde a PlayStore ou F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} non é un servidor matrix, usar {server2} no seu lugar?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Aínda non engaiches ningún xeito de recuperar o contrasinal.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sen permiso", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Non se atoparon salas…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificacións", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuarias están escribindo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtendo a localización…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Copia de Apoio en liña das Chaves activada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Vaites! Desgraciadamente algo fallou ao configurar as notificacións push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ooooi, algo fallou…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abrir a app e ler mensaxes", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir cámara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Abrir en mapas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frase de paso ou chave de recuperación", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasinal", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contrasinal esquecido", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Cambiouse o contrasinal", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperación do contrasinal", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Escolle un código de acceso", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Preme na ligazón do email e segue as instrucións.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Escribe o teu contrasinal", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Escribe o teu pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Escribe o teu nome de usuaria", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Segue as instruccións do sitio web e toca en seguinte.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Razón", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} editou un evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Eliminar mensaxe", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Rexeitar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rexeitou o convite", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Quitar", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Quitar todos os outros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Retirar veto na conversa", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Elimina o avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Substituír sala pola nova versión", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denunciar mensaxe", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A sala foi actualizada", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versión da sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Gardar ficheiro", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Buscar", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Seguridade", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Enviar unha mensaxe", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Enviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar ficheiro", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar imaxe", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensaxes", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} enviou un ficheiro", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} enviou un audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} enviou unha imaxe", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} enviou un adhesivo", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} enviou un vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} enviou información da chamada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Establecer como alias principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Establecer estado", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Axustes", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Compartir", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} compartiu a súa localización", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Compartir localización", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Saltar", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Código fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "O Espazo é público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nome do Espazo", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} iniciou unha chamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Estado", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "¿Que tal estás hoxe?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Enviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizando... Agarda.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Non concordan", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Concordan", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Demasiadas solicitudes. Inténtao máis tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Inténtao outra vez", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} retirou o veto a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloquear dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo descoñecido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo de cifraxe descoñecido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento descoñecido '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Reactivar notificacións", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Desafixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} e {count} máis están escribindo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} están escribindo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está escribindo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} deixou a conversa", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} enviou un evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Comezar verificación", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Verificaches correctamente!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificando a outra conta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Chamada de vídeo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilidade do historial da conversa", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible para todas as participantes", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible para todas", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mensaxe de voz", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Agardando a que a outra parte acepte a solicitude…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Agardando a que a outra parte acepte as emoticonas…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Agardando a que a outra parte acepte os números…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Aviso!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Enviamosche un email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Quen pode realizar determinada acción", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Quen se pode unir a este grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Por que queres denunciar esto?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Con estos enderezos podes recuperar o contrasinal.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escribe unha mensaxe…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Si", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ti", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Xa non participas desta conversa", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Foches vetada nesta conversa", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "A túa chave pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Engadir ao espazo", + "scanQrCode": "Escanear código QR", + "sendOnEnter": "Enter para enviar", + "addAccount": "Engadir conta", + "oneClientLoggedOut": "Un dos teus clientes foi desconectado", + "link": "Ligazón", + "unverified": "Sen verificar", + "repeatPassword": "Repite o contrasinal", + "messageInfo": "Info da mensaxe", + "time": "Hora", + "sender": "Remitente", + "openGallery": "Galería pública", + "removeFromSpace": "Retirar do espazo", + "commandHint_discardsession": "Descartar sesión", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_create": "Crear un grupo de conversa baleiro\nUsa --no-encryption para desactivar a cifraxe", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_clearcache": "Baleirar caché", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Iniciar unha charla directa\nUsa --no-encryption para desactivar a cifraxe", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "markAsRead": "Marcar como lido", + "reportUser": "Denunciar usuaria", + "voiceCall": "Chamada de voz", + "emojis": "Emojis", + "placeCall": "Chamar", + "unsupportedAndroidVersionLong": "Esta característica require unha vesión máis recente de Android. Mira se hai actualizacións ou soporte de LineageOS.", + "videoCallsBetaWarning": "Ten en conta que as chamadas de vídeo están en fase beta. Poderían non funcionar correctamente ou non funcionar nalgunhas plataformas.", + "unsupportedAndroidVersion": "Version de Android non soportada", + "reactedWith": "{sender} reaccionou con {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Fixar na sala", + "confirmEventUnpin": "Tes a certeza de querer desafixar o evento?", + "experimentalVideoCalls": "Chamadas de vídeo en probas", + "bundleName": "Nome do feixe", + "editBundlesForAccount": "Editar os feixes desta conta", + "addToBundle": "Engadir ao feixe", + "removeFromBundle": "Eliminar deste feixe", + "youRejectedTheInvitation": "Rexeitaches o convite", + "youBannedUser": "Vetaches a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} convidoute", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Unícheste á conversa", + "youAcceptedTheInvitation": "👍 Aceptaches o convite", + "youHaveWithdrawnTheInvitationFor": "Retiraches o convite para {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Convidaches a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Expulsaches a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Expulsaches e vetaches a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Retiraches o veto a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Gardar en Android KeyStore", + "storeInAppleKeyChain": "Gardar en Apple KeyChain", + "storeSecurlyOnThisDevice": "Gardar de xeito seguro no dispositivo", + "users": "Usuarias", + "countFiles": "{count} ficheiros", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hydrate": "Restablecer desde copia de apoio", + "dehydrateWarning": "Esta acción non é reversible. Pon coidado en gardar o ficheiro de apoio.", + "dehydrate": "Exportar sesión e eliminar dispositivo", + "user": "Usuaria", + "custom": "Personal", + "confirmMatrixId": "Confirma o teu ID Matrix para poder eliminar a conta.", + "supposedMxid": "Debería ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Marcar como sala de mensaxe directa para o ID Matrix indicado", + "commandHint_markasgroup": "Marcar como grupo", + "whyIsThisMessageEncrypted": "Por que non podo ler esta mensaxe?", + "noKeyForThisMessage": "Pode ser que a mensaxe fose enviada antes de que ti accedeses á túa conta neste dispositivo.\n\nTamén é posible que a remitente non validase o teu dispositivo ou tamén que algo fallase na conexión a internet.\n\nPodes ler a mensaxe noutro dispositivo? Entón podes transferila desde el! Vai a Axustes > Dispositivos e comproba que tes tódolos dispositivos verificados. Entón cando abras a sala a próxima vez a sincronización realizarase e as chaves transmitiranse automáticamente.\n\nNon desexas perder as chaves cando pechas sesión ou cambias de dispositivo? Comproba nos axustes que activaches a copia de apoio das conversas.", + "newSpace": "Novo espazo", + "foregroundServiceRunning": "Esta notificación aparece cando se está a executar o servizo en segundo plano.", + "screenSharingTitle": "compartición da pantalla", + "screenSharingDetail": "Estás a compartir a túa pantalla en FluffyChat", + "doNotShowAgain": "Non mostrar outra vez", + "commandHint_googly": "Envía uns ollos desos grandes", + "googlyEyesContent": "{senderName} enviouche uns ollos grandes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} mándache un achuche", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Envía un agarimo", + "commandHint_hug": "Envía un abrazo", + "hugContent": "{senderName} abrázate", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryptThisChat": "Cifrar esta conversa", + "disableEncryptionWarning": "Por razóns de seguridade non podes desactivar a cifraxe dunha conversa onde foi activada previamente.", + "sorryThatsNotPossible": "Lamentámolo... iso non é posible", + "newSpaceDescription": "Os Espazos permítenche consolidar as túas conversas e construir comunidades públicas ou privadas.", + "wasDirectChatDisplayName": "Conversa baleira (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "reopenChat": "Reabrir conversa", + "noOtherDevicesFound": "Non se atopan outros dispositivos", + "noBackupWarning": "Aviso! Se non activas a copia de apoio da conversa, perderás o acceso ás túas mensaxes cifradas. É moi recomendable activar a copia de apoio da conversa antes de pechar a sesión.", + "fileIsTooBigForServer": "Non se puido enviar! O servidor só permite anexos que non superen {max}.", + "fileHasBeenSavedAt": "Gardouse o ficheiro en {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Ir á última mensaxe lida", + "readUpToHere": "Lin ate aquí", + "openLinkInBrowser": "Abrir ligazón no navegador", + "jump": "Ir alá", + "report": "informar", + "reportErrorDescription": "😭 Vaia! Algo fallou. Se queres, podes informar do problema ás persoas desenvolvedoras.", + "notAnImage": "Non é un ficheiro de imaxe.", + "importNow": "Importar agora", + "importEmojis": "Importar Emojis", + "importFromZipFile": "Importar desde ficheiro .zip", + "exportEmotePack": "Exportar paquete Emote como .zip", + "replace": "Substituír", + "sendTypingNotifications": "Permitir ver que estás escribindo", + "createGroup": "Crear grupo", + "messagesStyle": "Mensaxes:", + "shareInviteLink": "Comparte ligazón de convite", + "setColorTheme": "Cor do decorado:", + "tryAgain": "Intentar outra vez", + "optionalRedactReason": "(Optativo) Razón para editar a mensaxe...", + "redactedBy": "Editada por {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "Editada por {username} debido a: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "A mensaxe vai ser editada para todas as participantes na conversa. Non ten volta atrás.", + "invite": "Convidar", + "chatPermissions": "Permisos da conversa", + "chatDescription": "Descrición da conversa", + "chatDescriptionHasBeenChanged": "Cambiou a descrición da conversa", + "noChatDescriptionYet": "Aínda non se escribeu a descrición da conversa.", + "invalidServerName": "Nome de servidor non válido", + "directChat": "Conversa Directa", + "setChatDescription": "Escribir descrición da conversa", + "inviteGroupChat": "📨 Convidar a conversa en grupo", + "emoteKeyboardNoRecents": "Os emotes usados recentemente aparecerán aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "banUserDescription": "Vaise vetar a usuaria na conversa e non poderá entrar outra vez ata que se retire o veto.", + "removeDevicesDescription": "Vas pechar a sesión neste dispositivo e xa non poderás recibir mensaxes nel.", + "unbanUserDescription": "A usuaria vai poder entrar outra vez na conversa se quere.", + "pushNotificationsNotAvailable": "Non están dispoñibles as notificacións push", + "makeAdminDescription": "Cando convirtas a esta usuaria en admin non poderás desfacer a acción xa que terá os mesmos permisos ca ti.", + "archiveRoomDescription": "Vaise mover a charla ao arquivo. Outras usuarias poderán ver que saíches da conversa.", + "invalidInput": "Contido non válido!", + "hasKnocked": "🚪 {user} petou na porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "wrongPinEntered": "PIN incorrecto! Inténtao outra vez en {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "learnMore": "Saber máis", + "roomUpgradeDescription": "Vaise recrear a charla coa nova versión da sala. Todas as participantes recibirán unha notificación para que cambien á nova charla. Podes ler máis información acerca das versións das salas en https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Escribe un número maior de cero", + "kickUserDescription": "A usuaria foi expulsada pero non vetada. En conversas públicas a usuaria pode volver cando queira.", + "createGroupAndInviteUsers": "Crear un grupo e convidar usuarias", + "groupCanBeFoundViaSearch": "O grupo pódese atopar ao buscar", + "noUsersFoundWithQuery": "Lamentamos non atopar ningunha usuaria con \"{query}\". Comproba se está ben escrito.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "O teu ID-usuaria global é: ", + "groupName": "Nome do grupo", + "searchChatsRooms": "Buscar #conversas, @usuarias...", + "commandHint_sendraw": "Enviar json sen editar", + "wrongRecoveryKey": "Desculpa... non semella ser o xeito correcto de recuperar a chave.", + "blockListDescription": "Podes bloquear usuarias que che molesten. Non recibirás mensaxes nin convites para salas procedentes das usuarias da túa lista persoal de bloqueo.", + "blockedUsers": "Usuarias bloqueadas", + "block": "Bloquear", + "blockUsername": "Ignorar identificador", + "thisDevice": "Este dispositivo:", + "publicSpaces": "Espazos públicos", + "passwordIsWrong": "O contrasinal escrito non é correcto", + "pleaseEnterYourCurrentPassword": "Escribe o contrasinal actual", + "nothingFound": "Non atopamos nada...", + "newPassword": "Novo contrasinal", + "passwordsDoNotMatch": "Os contrasinais non concordan", + "select": "Escolle", + "pleaseChooseAStrongPassword": "Elixe un contrasinal forte", + "addChatOrSubSpace": "Engadir charla ou sub espazo", + "leaveEmptyToClearStatus": "Deixa baleiro para limpar o teu estado.", + "joinSpace": "Únete ao espazo", + "searchForUsers": "Buscar @persoas...", + "databaseMigrationTitle": "Base de datos optimizada", + "databaseMigrationBody": "Agarda, podería levarnos un pouco.", + "initAppError": "Houbo un fallo ao iniciar a app", + "sessionLostBody": "Estragouse a túa sesión. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "A app vai intentar restablecer a sesión desde a copia de apoio. Por favor informa deste erro ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Enviar confirmación de lectura", + "sendReadReceiptsDescription": "Outras participantes na conversa poden ver cando liches unha mensaxe.", + "formattedMessages": "Mensaxes con formato", + "verifyOtherDevice": "🔐 Verificar outro dispositivo", + "verifyOtherUser": "🔐 Verificar outra usuaria", + "verifyOtherDeviceDescription": "Ao verificar outro dispositivo estás compartindo as chaves, aumentando a túa seguridade 💪. Ao iniciar a verificación aparecerá unha xanela emerxente nos dous dispositivos. Nesa xanela verás varios emojis ou números que tes que comparar entre eles. O mellor xeito de facelo é ter os dous dispositivos contigo cando inicias o proceso de verificación. 🤳", + "canceledKeyVerification": "{sender} desbotou a verificación da chave", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} xa pode verificar a chave", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "As outras participantes da conversa poden ver cando estás a escribir unha mensaxe.", + "formattedMessagesDescription": "Mostrar texto enriquecido nas mensaxes como letra grosa usando markdown.", + "verifyOtherUserDescription": "Se verificas a outra usuaria, podes ter a certeza de que sabes con quen estás a conversar. 💪\n\nAo iniciar a verificación, ti mais a outra usuaria veredes unha xanela emerxente na app onde aparecerán varios emojis ou números que teredes que comparar entre vós.\n\nO mellor xeito de facelo é en persoa o cunha chamada de vídeo. 👭", + "requestedKeyVerification": "{sender} solicitou verificar a chave", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} aceptou a verificación da chave", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} completou a verificación da chave", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} comezou coa verificación da chave", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Mensaxes recibidas", + "stickers": "Adhesivos", + "discover": "Descubrir", + "commandHint_ignore": "Ignorar o ID matrix indicado", + "commandHint_unignore": "Non ignorar o ID matrix indicado", + "unreadChatsInApp": "{appname}: {unread} charlas sen ler", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Nesta plataforma non temos soporte para cifrar a base de datos", + "accessAndVisibility": "Acceso e Visibilidade", + "accessAndVisibilityDescription": "Quen pode unirse a esta charla e de que xeito e como poden atopala.", + "customEmojisAndStickers": "Emojis personais e adhesivos", + "calls": "Chamadas", + "hideRedactedMessages": "Agochar mensaxes editadas", + "hideRedactedMessagesBody": "Se alguén corrixe unha mensaxe entón esta xa non será visible na charla.", + "hideInvalidOrUnknownMessageFormats": "Agochar formatos de mensaxe non válidos ou descoñecidos", + "usersMustKnock": "As usuarias teñen que pedir entrar", + "knocking": "A solicitar", + "chatCanBeDiscoveredViaSearchOnServer": "A charla pode ser atopada ao buscar en {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "createNewAddress": "Crear novos enderezos", + "appLockDescription": "Bloquear a app cun código PIN cando non a uses", + "globalChatId": "ID Global da charla", + "customEmojisAndStickersBody": "Engade ou comparte emojis personais e adhesivos que poden usarse nas charlas.", + "passwordRecoverySettings": "Axustes de recuperación do contrasinal", + "knock": "Solicitar acceso", + "noOneCanJoin": "Ninguén pode unirse", + "thereAreCountUsersBlocked": "Agora mesmo hai {count} usuarias bloqueadas.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicChatAddresses": "Enderezos públicos da charla", + "searchIn": "Buscar na conversa \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Buscar máis...", + "gallery": "Galería", + "files": "Ficheiros", + "swipeRightToLeftToReply": "Despraza hacia a esquerda para responder", + "noMoreChatsFound": "Non se atopan máis charlas…", + "unread": "Sen ler", + "space": "Espazo", + "goToSpace": "Ir ao espazo: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Marcar como non lido", + "userLevel": "{level} - Usuaria", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderadora", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Administradora", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Cambiar os axustes xerais da charla", + "inviteOtherUsers": "Convidar a outras usuarias a esta charla", + "changeTheChatPermissions": "Cambiar os permisos na charla", + "changeTheVisibilityOfChatHistory": "Cambiar a visibilidade do historial da charla", + "changeTheCanonicalRoomAlias": "Cambiar o enderezo público principal da charla", + "sendRoomNotifications": "Enviar notificacións a @room", + "changeTheDescriptionOfTheGroup": "Cambiar a descrición da charla", + "changelog": "Novidades na versión", + "chatPermissionsDescription": "Define que nivel de permisos son necesarios para realizar certas accións nesta charla. Os niveis de permiso 0, 50 e 100 normalmente representan, usuarias, moderadoras e administradoras, pero son posibles outras escalas.", + "updateInstalled": "🎉 Instalouse a actualización a {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "Cancelouse o envío", + "noChatsFoundHere": "Aínda non hai conversas. Comeza a conversar con alguén premendo no botón de abaixo. ⤵️", + "loginWithMatrixId": "Acceder co ID-Matrix", + "doesNotSeemToBeAValidHomeserver": "Non semella ser un servidor de inicio compatible. É o URL correcto?", + "calculatingFileSize": "Calculando o tamaño do ficheiro…", + "sendingAttachment": "Enviando o anexo…", + "oneOfYourDevicesIsNotVerified": "Un dos teus dispositivos non está verificado", + "noticeChatBackupDeviceVerification": "Nota: Cando conectas todos os teus dispositivos á copia de apoio da conversa quedan verificados automaticamente.", + "blur": "Néboa:", + "opacity": "Opacidade:", + "contactServerSecurity": "Contacto con Seguridade do servidor", + "aboutHomeserver": "Sobre {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "setWallpaper": "Establecer fondo", + "manageAccount": "Xestionar conta", + "noContactInformationProvided": "O servidor non proporciona información de contacto válida", + "contactServerAdmin": "Contacto con Admin do servidor", + "supportPage": "Páxina de axuda", + "serverInformation": "Información do servidor:", + "name": "Nome", + "version": "Versión", + "website": "Páxina web", + "continueText": "Continuar", + "italicText": "Cursiva", + "strikeThrough": "Riscar", + "pleaseFillOut": "Por favor completa", + "invalidUrl": "URL non válido", + "boldText": "Resaltar texto", + "addLink": "Engadir ligazón", + "unableToJoinChat": "Non se puido acceder. Pode que a outra parte xa pechase a conversa.", + "sendImages": "Enviar {count} imaxe", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Comprimir", + "previous": "Anterior", + "otherPartyNotLoggedIn": "A outra parte non está conectada neste momento e pode que non reciba as mensaxes!", + "open": "Abrir", + "appWantsToUseForLogin": "Usar '{server}' para acceder", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "contentNotificationSettings": "Axustes de notificación de contido", + "generalNotificationSettings": "Axustes xerais das notificacións", + "roomNotificationSettings": "Axustes de notificacións da sala", + "userSpecificNotificationSettings": "Axustes de notificación específicos da usuaria", + "otherNotificationSettings": "Outros axustes das notificacións", + "notificationRuleContainsUserName": "Contén nome de usuaria", + "notificationRuleContainsUserNameDescription": "Informa á usuaria cando unha mensaxe contén o seu identificador.", + "notificationRuleMaster": "Acalar todas as notificacións", + "notificationRuleSuppressNotices": "Suprimir mensaxes automatizadas", + "notificationRuleSuppressNoticesDescription": "Suprime as notificacións desde clientes automatizados como os robots.", + "notificationRuleInviteForMe": "Teño un convite", + "notificationRuleInviteForMeDescription": "Informa á usuaria de que recibeu o convite para unha sala.", + "notificationRuleMemberEvent": "Eventos dos participantes", + "notificationRuleIsUserMention": "Mención da usuaria", + "notificationRuleIsUserMentionDescription": "Informa cando se menciona explícitamente a usuaria nunha mensaxe.", + "notificationRuleContainsDisplayName": "Contén o nome público", + "notificationRuleContainsDisplayNameDescription": "Informa á usuaria cando unha mensaxe contén o seu nome público.", + "notificationRuleIsRoomMention": "Mención da sala", + "notificationRuleIsRoomMentionDescription": "Informa á usuaria cando hai unha mención da sala.", + "notificationRuleRoomnotif": "Notificación da sala", + "notificationRuleRoomnotifDescription": "Informa á usuaria cando unha mensaxe contén '@room'.", + "notificationRuleTombstone": "Lápida", + "notificationRuleTombstoneDescription": "Informa á usuaria sobre a desactivación de mensaxes na sala.", + "notificationRuleReaction": "Reacción", + "notificationRuleReactionDescription": "Omite as notificacións sobre reaccións.", + "notificationRuleRoomServerAcl": "ACL da servidor da sala", + "notificationRuleRoomServerAclDescription": "Omite notificacións para as listas de control de acceso (ACL) do servidor da sala.", + "notificationRuleSuppressEdits": "Omite edicións", + "notificationRuleSuppressEditsDescription": "Omite as notificacións sobre mensaxes editadas.", + "notificationRuleCall": "Chamada", + "notificationRuleCallDescription": "Informa á usuaria sobre as chamadas.", + "notificationRuleEncryptedRoomOneToOne": "Sala cifrada conversa persoal", + "notificationRuleEncryptedRoomOneToOneDescription": "Informa á usuaria sobre mensaxes cifradas en salas de conversa persoal.", + "notificationRuleRoomOneToOne": "Sala de conversa persoal", + "notificationRuleRoomOneToOneDescription": "Informa á usuaria sobre mensaxes en salas de conversa persoal.", + "notificationRuleMessage": "Mensaxe", + "notificationRuleMessageDescription": "Informa á usuaria sobre mensaxes xenéricas.", + "notificationRuleEncrypted": "Salas cifradas", + "notificationRuleEncryptedDescription": "Informa á usuaria sobre mensaxes en salas cifradas.", + "notificationRuleJitsiDescription": "Informa á usuaria sobre eventos do widget Jitsi.", + "notificationRuleServerAcl": "Omite eventos do sevidor ACL", + "notificationRuleJitsi": "Jitsi", + "notificationRuleServerAclDescription": "Omite notificación sobre eventos do servidor ACL.", + "unknownPushRule": "Regra push descoñecida '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Se omites este axuste de notificacións non poderás desfacer a acción.", + "more": "Máis", + "newChatRequest": "📩 Nova solicitude de conversa", + "shareKeysWith": "Compartir chaves con…", + "shareKeysWithDescription": "En que dispositivos se pode confiar e poden ler as túas conversas cifradas?", + "allDevices": "Todos os dispositivos", + "crossVerifiedDevicesIfEnabled": "Dispositivos verificados se está activado", + "crossVerifiedDevices": "Dispositivos verificados", + "verifiedDevicesOnly": "Só dispositivos verificados", + "waitingForServer": "Agardando polo servidor…", + "notificationRuleMasterDescription": "Sobrescribe todas as outras regras e desactiva todas as notificacións.", + "appWantsToUseForLoginDescription": "Por tanto permites que a app e o sitio web compartan información sobre ti.", + "notificationRuleMemberEventDescription": "Suprime as notificacións dos eventos de participación.", + "synchronizingPleaseWaitCounter": " Sincronizando…({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "optionalMessage": "(Optativo) mensaxe…", + "notSupportedOnThisDevice": "Non compatible co dispositivo", + "takeAPhoto": "Facer foto", + "recordAVideo": "Gravar vídeo", + "enterNewChat": "Entrar na nova conversa", + "commandHint_roomupgrade": "Actualizar esta sala á versión de sala indicada", + "approve": "Aprobar", + "pleaseWaitUntilInvited": "Agora agarda a que alguén da sala te convide a entrar.", + "youHaveKnocked": "Petaches á porta", + "sentVoiceMessage": "🎙️ {duration} - Mensaxe de voz de {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "countInvited": "{count} convidadas", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "commandHint_logoutall": "Fechar a sesión en todos os dispositivos activos", + "commandHint_logout": "Fechar a sesión no dispositivo actual", + "moreEvents": "Máis eventos", + "customReaction": "Reacción personalizada", + "declineInvitation": "Rexeitar o convite", + "noMessagesYet": "Aínda non hai mensaxes", + "checkList": "Comprobar lista", + "displayNavigationRail": "Mostrar carril de navegación nos móbiles", + "longPressToRecordVoiceMessage": "Pulsación longa para gravar mensaxe de voz.", + "pause": "Deter", + "resume": "Continuar", + "removeFromSpaceDescription": "Vaise quitar a conversa do espazo pero seguirá aparecendo na túa lista de conversas.", + "countChats": "{chats} conversas", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Participa no espazo {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Os membros de {spaces} poden petar á porta", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Publicar enquisa", + "endPoll": "Finalizar enquisa", + "answersVisible": "Resultados visibles", + "pollQuestion": "Pregunta da enquisa", + "answerOption": "Opción de resposta", + "addAnswerOption": "Engadir opción", + "allowMultipleAnswers": "Permitir varias respostas", + "pollHasBeenEnded": "Rematou a enquisa", + "countVotes": "{count, plural, =1{Un voto} other{{count} votos}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "As respostas son visibles ao finalizar a enquisa", + "replyInThread": "Responder ao fío", + "countReplies": "{count, plural, =1{Unha resposta} other{{count} respostas}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Fío", + "backToMainChat": "Volver á conversa principal", + "attribution": "Atribución", + "saveChanges": "Gardar cambios", + "createSticker": "Crear adhesivo ou emoji", + "useAsSticker": "Usar como adhesivo", + "useAsEmoji": "Usar como emoji", + "stickerPackNameAlreadyExists": "Xa existe ese nome de paquete de adhesivos", + "newStickerPack": "Novo paquete de adhesivos", + "stickerPackName": "Nome do paquete de adhesivos", + "skipChatBackup": "Omitir copia da conversa", + "skipChatBackupWarning": "Tes certeza? A non activar a copia de apoio da conversa poderías perder o acceso ás mensaxes se cambias de dispositivo.", + "changedTheChatDescription": "{username} cambiou a descrición da sala", + "changedTheChatName": "{username} cambiou o nome da sala", + "noMoreResultsFound": "Non hai máis resultados", + "chatSearchedUntil": "Buscouse na conversa ata {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL base para federación", + "clientWellKnownInformation": "Información Client-Well-Known:", + "baseUrl": "URL base", + "identityServer": "Servidor de identidade:", + "versionWithNumber": "Versión: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Rexistros", + "advancedConfigs": "Axustes avanzados", + "advancedConfigurations": "Configuracións avanzadas", + "signIn": "Acceder", + "createNewAccount": "Crear nova conta", + "signUpGreeting": "FluffyChat é descentralizada! Elixe un servidor para crear a conta e xa podes utilizar a app!", + "signInGreeting": "Xa tes unha conta en Matrix? Benvida! Selecciona o teu servidor de orixe e accede.", + "theProcessWasCanceled": "Desbotouse o proceso.", + "join": "Unirse", + "searchOrEnterHomeserverAddress": "Busca ou escribe o enderezo do servidor de inicio", + "matrixId": "ID en Matrix", + "setPowerLevel": "Establecer responsabilidade", + "makeModerator": "Facer moderadora", + "makeAdmin": "Facer admin", + "removeModeratorRights": "Retirar permiso de moderación", + "removeAdminRights": "Retirar permiso de administración", + "powerLevel": "Nivel responsabilidade", + "setPowerLevelDescription": "Os niveis de responsabilidade definen o que pode facer unha usuaria na sala, normalmente varía de 0 a 100.", + "owner": "Propietaria", + "mute": "Acalar", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Crear nova conversa", + "reset": "Restablecer", + "supportFluffyChat": "Apoia a FluffyChat", + "support": "Axuda", + "setLowPriority": "Establecer prioridade baixa", + "unsetLowPriority": "Non establecer prioridade baixa", + "playSoundOnNotification": "Reproducir son coas notificacións", + "addTag": "Engadir etiqueta", + "removeTag": "Retirar etiqueta", + "tagName": "Nome da etiqueta", + "createNewTag": "Crear nova etiqueta", + "discardEdits": "Ten cambios sen gardar. Desbotar a edición?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Mostrar máis", + "showLess": "Mostrar menos", + "hideRoomsInSpaces": "Ocultar salas que están nun espazo", + "possibleByYou": "Esta versión foi posible grazas ao teu apoio. FluffyChat segue sendo libre, de código aberto e dirixida pola comunidade.", + "showThumbnailsInTimeline": "Mostrar miniaturas das imaxes e vídeos", + "appSubtitle": "Comunicación Segura en [matrix]", + "appDescription": "Comunícate de xeito cifrado na rede descentralizada [matrix], dunha forma doada e accesible para todas as persoas.", + "interactiveVerification": "Verificación interactiva", + "interactiveVerificationDescription": "Se estades unha a carón da outra ou tedes outra canle segura de comunicación entón podedes verificar os vosos dispositivos comparando os números de seguridade ou emojis.", + "countUnverifiedDevices": "{count} dispositivos na conversa non verificados.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Mensaxe cifrada", + "unencryptedMessage": "Mensaxe sen cifrar", + "messageCanOnlyBeReadByUser": "A túa mensaxe está cifrada de extremo a extremo e só a pode ler a usuaria:", + "messageCanOnlyBeReadByUsers": "A túa mensaxe está cifrada de extremo a extremo e só a poden ler estas usuarias:", + "publicKey": "Clave pública: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Clave de identidade do dispositivo", + "restoreBootstrapEmptyDevicesDescription": "Por favor escribe a túa frase de paso ou a clave de recuperación para verificar este dispositivo e ter acceso á copia de apoio cifrada das mensaxes.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Por favor elixe un dos outros teus dispositivos, para verificar esta sesión:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Restablecer a conta", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Restablecer identidade criptográfica", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Reiniciar identidade criptográfica", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Establecer identidade criptográfica", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Agardando polas claves… mantén o outro dispositivo activo.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Non se transmitiron as claves. Volve a intentalo.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Desbloquear", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Abrir ficheiro", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Cando reinicias a conta perdes o acceso ás mensaxes antigas para sempre. Todos os teus dispositivos actuais deberán verificarse novamente. Considera realizar esta acción só se non tes outros dispositivos desde onde poder verificar a sesión e se perdeches a clave de recuperación e a frase de paso!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat utiliza cifraxe de extremo a extremo. Para non perder as mensaxes elixe unha frase de paso forte para protexer a túa identidade criptográfica e a túa copia de apoio de mensaxes cifradas.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Nova frase de paso", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Repetir a frase de paso", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "As frases de paso concordan", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "12 caracteres como mínimo.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Contén maiúsculas e minúsculas.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Contén caracteres especiais.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Contén un número.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Garda nun lugar seguro a clave de recuperación para poder restablecer as túas mensaxes cifradas e a túa identidade criptográfica.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Gardar como ficheiro", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Todo preparado para comezar!", + "noUserKeyFound": "Non se atopa a clave da usuaria", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Coñecido desde: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Dispositivo non asinado", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Dispositivo asinado", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Non se atopa a clave curve25519", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Mensaxe non descifrable", + "today": "Hoxe", + "sending": "Enviando", + "generatingThumbnail": "Creando a miniatura", + "encrypting": "Cifrando", + "uploading": "Subindo", + "edited": "(editada)", + "couldNotBeSent": "Non se puido enviar", + "yesterday": "Onte", + "resetRecoveryKey": "Restablecer clave de recuperación", + "pleaseEnter6Digits": "Escribe os 6 díxitos para activar o bloqueo da app.", + "disableAppLock": "Desactivar bloqueo da app", + "disableAppLockAreYouSure": "Tes certeza de querer desactivar o bloqueo da app?", + "enableBiometrics": "Activar a autenticación biométrica", + "disableBiometrics": "Desactivar autenticación biométrica", + "biometricsDescription": "Coa autenticación biométrica podes desbloquear a app coa face ou a impresión dactilar. As opcións dependen do teu dispositivo.", + "useAppLock": "Usar bloqueo da app", + "unlockWithBiometrics": "Desbloquear con autenticación biométrica", + "resetPin": "Restablecer PIN", + "forwardCountMessages": "Reenviar {count, plural, =1{unha mensaxe} other{{count} mensaxes}}?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + } +} diff --git a/lib/l10n/intl_he.arb b/lib/l10n/intl_he.arb new file mode 100644 index 0000000000..714f6af7b8 --- /dev/null +++ b/lib/l10n/intl_he.arb @@ -0,0 +1,2053 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.036931", + "about": "אודות", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "קבל", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} קיבל את ההזמנה", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "חשבון", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} הפעיל הצפנה מקצה לקצה", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "מנהל", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "כינוי", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ענה לשיחה", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "כל אחד יכול להצטרף", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "ארכיון", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "האם משתמשים אורחים מורשים להצטרף", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "האם אתה בטוח?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "כדי שתוכל לחתום על משתמש אחר , הזן את הסיסמה שלך או את מפתח השחזור.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "לקבל בקשת אימות זו מ- {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "שנה סיסמא", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "appLock": "נעילת אפליקציה", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "cancel": "ביטול", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "addEmail": "הוסף מייל", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "הכל", + "@all": { + "type": "String", + "placeholders": {} + }, + "banned": "חסום", + "@banned": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "שלח בכניסה", + "badServerLoginTypesException": "שרת הבית תומך בסוגי הכניסה:\n{serverVersions}\nאבל אפליקציה זו תומכת רק ב:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} שינה את כללי הגישה לאורחים ל: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} שינה את כללי ההצטרפות", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} שינה את קישור ההזמנה", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "repeatPassword": "כתוב שוב את הסיסמה", + "areYouSureYouWantToLogout": "האם אתה בטוח שברצונך לצאת?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "chat": "צ׳אט", + "@chat": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "הפעל אוטומטית מדבקות ואנימציות מונפשים", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "banFromChat": "צאט חסום", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} חסם את {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "חסום מכשיר", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "חסום", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "לא ניתן לפתוח את ה-URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "שנה את שם המכשיר", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} שינה את האווטאר של הצ'אט", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} שינה את הרשאות הצ'אט", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} שינה את שם התצוגה שלו ל: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} שינה את כללי הגישה לאורחים", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} שינה את נראות ההיסטוריה", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} שינה את נראות ההיסטוריה ל: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} שינה את כללי ההצטרפות ל: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} שינה את האווטאר שלו", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} שינה את כינוי החדר", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "שנה את שרת הבית", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "שנה את הסגנון שלך", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "שנה את שם הקבוצה", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "שינוי האווטאר שלך", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "ההצפנה נפגמה", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "גיבוי צ'אט", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "חסום את המשתמש הנתון מהחדר הזה", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "נקה מטמון", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "צור צ'אט קבוצתי ריק\nהשתמש ב--no-encryption כדי להשבית את ההצפנה", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "התעלם מהסשן", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "התחל צ'אט ישיר\nהשתמש ב--no-encryption כדי להשבית את ההצפנה", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "שלח טקסט בתבנית HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "הזמן את המשתמש הנתון לחדר זה", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "הצטרף לחדר הנתון", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "הסר את המשתמש הנתון מהחדר הזה", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "עזוב את החדר הזה", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "תאר את עצמך", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "chatDetails": "פרטי צ'אט", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "צ'אטים", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "בחר סיסמה חזקה", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "נקה ארכיון", + "close": "סגור", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "הגדר את התמונה שלך לחדר זה (על ידי mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "הגדר את שם התצוגה שלך עבור חדר זה", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "addToSpace": "הוסף לחלל", + "commandHint_unban": "בטל את החסימה של המשתמש הנתון מהחדר הזה", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "countParticipants": "{count} משתתפים", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "צור", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} יצר את הצ'אט", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "פעיל כעת", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "כהה", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "defaultPermissionLevel": "רמת הרשאת ברירת מחדל", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "מחק חשבון", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "מחק הודעה", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "התקנים", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "צ'אטים ישירים", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "הורד קובץ", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "ערוך", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "ערוך את שם התצוגה", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "ערוך כינויים לחדר", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "אימוט כבר קיים!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "צ'אט ריק", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "encrypted": "מוצפן", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "הזן כתובת דואר אלקטרוני", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "גודל גופן", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "העבר", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "מהצטרפות", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "מההזמנה", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "הקבוצה ציבורית", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "קבוצה עם {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "אורחים אסורים", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "אורחים יכולים להצטרף", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "משתמשים שהתעלמו מהם", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "ביטוי סיסמה או מפתח שחזור שגויים", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "הזמן איש קשר", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "invited": "הזמין", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} הזמין את {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "משתמשים מוזמנים בלבד", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} הזמין אותך ל-FluffyChat.\n1. התקן את FluffyChat: https://fluffychat.im\n2. הירשם או היכנס\n3. פתח את קישור ההזמנה: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "מקליד/ה…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} הצטרף לצ'אט", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "הצטרף לחדר", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} בעט ב {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} בעט וחסם {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "בעיטה מהצ'אט", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "פעילות אחרונה: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leftTheChat": "עזב את הצ'אט", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "טוען אנא המתן.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "טען עוד…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "שירותי המיקום מושבתים. אנא הפעל אותם כדי לשתף את המיקום שלך.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "copy": "העתק", + "@copy": { + "type": "String", + "placeholders": {} + }, + "commandHint_send": "שלח טקסט", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_op": "הגדרת רמת צריכת החשמל של המשתמש הנתון (ברירת מחדל: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "שלח טקסט לא מעוצב", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "שלח תשובה כתגובה", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "createNewSpace": "חלל חדש", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "אפשר הצפנה", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "הזמן איש קשר אל {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "פעולה זו תשבית את חשבון המשתמש שלך. אי אפשר לבטל את זה! האם אתה בטוח?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "group": "קבוצה", + "@group": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "שם התצוגה השתנה", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ערוך שרתים חסומים", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "עריכת אווטאר של חדר", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} סיים את השיחה", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "groups": "קבוצות", + "@groups": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "לא תוכל לבטל את ההצפנה יותר. האם אתה בטוח?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "הצפנה", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "שגיאה בהשגת מיקום: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hasWithdrawnTheInvitationFor": "{username} ביטל את ההזמנה עבור {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "encryptionNotEnabled": "ההצפנה אינה מופעלת", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "הסתר אירועים לא ידועים", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "טען {count} משתתפים נוספים", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ignore": "התעלם", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "לחצתי על הקישור", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "leave": "לעזוב", + "@leave": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "בהיר", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "delete": "מחיקה", + "@delete": { + "type": "String", + "placeholders": {} + }, + "configureChat": "קביעת תצורה של צ'אט", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "איש הקשר הוזמן לקבוצה", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "התוכן דווח למנהלי השרת", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "הועתק ללוח הגזירים", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "הפקודה אינה חוקית", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} אינו פקודה.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "השווה וודא שהאימוג'י הבאים תואמים לאלו של המכשיר השני:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "השווה וודא שהמספרים הבאים תואמים לאלה של המכשיר השני:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "העתק ללוח", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "לא ניתן לפענח הודעה: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "help": "עזרה", + "@help": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "הרשאת המיקום נדחתה. אנא אפשר את היכולת לשתף את מיקומך.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "כניסה", + "@login": { + "type": "String", + "placeholders": {} + }, + "moderator": "מנחה", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "newChat": "צ'אט חדש", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "בקשת אימות חדשה!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "הבא", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "לא", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "אין חיבור לשרת", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "אתה יכול להפעיל הצפנה רק כשהחדר כבר לא נגיש לציבור.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "לא נמצאו חדרים…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "התראות", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} משתמשים מקלידים…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "משיג מיקום…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "גיבוי מפתח מקוון מופעל", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "אופס! למרבה הצער, אירעה שגיאה בעת הגדרת התראות.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "אופס, משהו השתבש…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "פתח את האפליקציה לקריאת הודעות", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "אחד מהמכשירים שלך התנתק", + "addAccount": "הוסף חשבון", + "editBundlesForAccount": "ערוך חבילות עבור חשבון זה", + "participant": "משתתף", + "@participant": { + "type": "String", + "placeholders": {} + }, + "password": "סיסמה", + "@password": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "אנא לחץ על הקישור במייל ולאחר מכן המשך.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "הוסף לחבילה", + "passphraseOrKey": "ביטוי סיסמה או מפתח שחזור", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "שכחתי סיסמה", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "הסיסמה שונתה", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "שחזור סיסמה", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "אנא בחר קוד גישה", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "נא הזן את הסיסמה שלך", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "אנא הזן את קוד הpin שלך", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pin": "קוד pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "אנא הזן שם משתמש", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "הודעה חדשה ב-FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "נראה שאין לך שירותי גוגל בטלפון שלך. זו החלטה טובה לפרטיות שלך! כדי לקבל התרעות ב- FluffyChat אנו ממליצים להשתמש https://microg.org/ או https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} אינו שרת מטריקס, השתמש ב-{server2} במקום זאת?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "עדיין לא הוספת דרך לשחזר את הסיסמה שלך.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "bundleName": "שם החבילה", + "removeFromBundle": "הסר מחבילה זו", + "openInMaps": "פתיחה במפות", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "קישור", + "logout": "יציאה", + "@logout": { + "type": "String", + "placeholders": {} + }, + "muteChat": "השתקת הצ'אט", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "סרוק קוד QR", + "noPermission": "אין הרשאה", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "or": "או", + "@or": { + "type": "String", + "placeholders": {} + }, + "logInTo": "היכנס אל {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "mention": "הזכיר", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "הודעות", + "@messages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "פתח מצלמה", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "הקובץ אינו תמונה.", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_hi.arb b/lib/l10n/intl_hi.arb new file mode 100644 index 0000000000..394f47bdda --- /dev/null +++ b/lib/l10n/intl_hi.arb @@ -0,0 +1,1849 @@ +{ + "remove": "निकालना", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": ".zip फ़ाइल से आयात करें", + "repeatPassword": "पासवर्ड दोहराएं", + "exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें", + "importEmojis": "इमोजी आयात करें", + "notAnImage": "कोई छवि फ़ाइल नहीं।", + "importNow": "अभी आयात करें", + "replace": "बदलें", + "about": "हमारे बारे में", + "aboutHomeserver": "{homeserver} की जानकारी", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "स्वीकार करें", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ने निमंत्रण स्वीकार किया", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "अकाउंट", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ने एंड-टू-एंड एन्क्रिप्शन चालू किया", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "ईमेल ऐड करें", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "कृपया अपना अकाउंट हटाने के लिए अपनी मैट्रिक्स आईडी की पुष्टि करें।", + "supposedMxid": "यह {mxid} होना चाहिए", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_hr.arb b/lib/l10n/intl_hr.arb new file mode 100644 index 0000000000..6a71bed883 --- /dev/null +++ b/lib/l10n/intl_hr.arb @@ -0,0 +1,2500 @@ +{ + "@@locale": "hr", + "@@last_modified": "2021-08-14 12:41:10.025984", + "about": "Informacije", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Prihvati", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} je prihvatio/la poziv", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Račun", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} je aktivirao/la obostrano šifriranje", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Dodaj e-mail adresu", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "pseudonim", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Svi", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} je odgovorio/la na poziv", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Svatko se može pridružiti", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Zaključavanje programa", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Smiju li se gosti pridružiti", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Stvarno to želiš?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Stvarno se želiš odjaviti?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Za potpisivanje druge osobe, upiši svoju sigurnosnu lozinku ili ključ za oporavak.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Prihvatiti ovaj zahtjev za potvrđivanje od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Homeserver podržava vrste prijave:\n{serverVersions}\nMeđutim ovaj program podržava samo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Isključi iz chata", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Isključen", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} je isključio/la {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokiraj uređaj", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokirano", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Odustani", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "URI adresa {uri} se ne može otvoriti", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Promijeni ime uređaja", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} je promijenio/la avatar chata", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} je promijenio/la dozvole chata", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} je promijenio/la svoje prikazno ime u: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} je promijenio/la pravila pristupa za goste", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} je promijenio/la pravila pristupa za goste u: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} je promijenio/la vidljivost kronologije", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} je promijenio/la vidljivost kronologije u: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} je promijenio/la pravila pridruživanja", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} je promijenio/la pravila pridruživanja u: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} je promijenio/la svoj avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} je promijenio/la pseudonime soba", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} je promijenio/la poveznicu poziva", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Promijeni lozinku", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Promijeni domaći server", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Promijeni tvoj stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Promijeni ime grupe", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Promijeni svoj avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifriranje je oštećeno", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sigurnosna kopija chata", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalji chata", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chatovi", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Odaberi snažnu lozinku", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Isprazni arhiv", + "close": "Zatvori", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Isključi navedenog korisnika iz ove sobe", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Pošalji HTML formatirani tekst", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Pozovi navedenog korisnika u ovu sobu", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Pridruži se navedenoj sobi", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Ukloni navedenog korisnika iz ove sobe", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Napusti ovu sobu", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Opiši se", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Postavi svoju sliku za ovu sobu (mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Postavi svoje ime za ovu sobu", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Postavi razinu prava navedenog korisnika (standardno: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Pošalji neformatirani tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Pošalji odgovor kao reakciju", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Pošalji tekst", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Ponovo uključi navedenog korisnika u ovu sobu", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Naredba nevaljana", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} nije naredba.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Usporedi emoji sličice", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Usporedi brojeve", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfiguriraj chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt je pozvan u grupu", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Sadržaj je prijavljen administratorima servera", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopirano u međuspremnik", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiraj", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiraj u međuspremnik", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Neuspjelo dešifriranje poruke: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "Broj sudionika: {count}", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Stvori", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} je stvorio/la chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novi prostor", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Trenutačno aktivni", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tamna", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ovo će nepovratno deaktivirati tvoj korisnički račun. Stvarno to želiš?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standardna razina dozvole za nove korisnike", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Izbriši", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Izbriši račun", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Izbriši poruku", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Uređaji", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Izravni chatovi", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prikazno ime je promijenjeno", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Preuzmi datoteku", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Uredi", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Uredi blokirane servere", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Uredi prikazano ime", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Uredi pseudonime sobe", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Uredi avatar sobe", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikon već postoji!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Neispravna kratica emotikona!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Postavke emotikona", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Kratica emotikona", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Prazan chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktiviraj paket emotikona globalno", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktiviraj šifriranje", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Više nećeš moći deaktivirati šifriranje. Stvarno to želiš?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Šifrirano", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifriranje", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifriranje nije aktivirano", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} je završio/la poziv", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Upiši e-mail adresu", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Veličina fonta", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Proslijedi", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od pridruživanja", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od poziva", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupiraj", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupa je javna", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupe", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupa s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gosti su zabranjeni", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gosti se mogu pridružiti", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} je povukao/la poziv za {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoć", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Sakrij nepoznate događaje", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Zanemari", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Zanemareni korisnici", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Pritisnuo/la sam poveznicu", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Neispravna lozinka ili ključ za obnavljanje", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pozovi kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pozovi kontakt u {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Pozvan/a", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} je pozvao/la {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Samo pozvani korisnici", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} te je pozvao/la u FluffyChat. \n1. Posjeti strnicu fluffychat.im i instaliraj aplikaciju \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "tipka …", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} se pridružio/la chatu", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Pridruži se sobi", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} je izbacio/la {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} je izbacio/la i isključio/la {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Izbaci iz chata", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Zadnja aktivnost: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Napusti", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Napustio/la je chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Svijetla", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Učitaj još {count} sudionika", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Učitava se … Pričekaj.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Učitaj još …", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Prijava", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Prijavi se na {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Odjava", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Spominjanje", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Poruke", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Voditelj", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Isključi zvuk chata", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Novi chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nova poruka u FluffyChatu", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Novi zahtjev za potvrđivanje!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Dalje", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ne postoji veza sa serverom", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nema emotikona. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifriranje možeš aktivirati samo nakon što soba više nije javno dostupna.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Još nisi dodao/la način za obnavljanje lozinke.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Bez dozvole", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nema soba …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Obavijesti", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} korisnika tipkaju …", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "U redu", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Internetski ključ sigurnosnih kopija je aktiviran", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Nažalost se dogodila greška prilikom postavljanja automatskog primanja obavijesti.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, dogodila se greška …", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Za čitanje poruka, otvori program", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otvori kameru", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "Ili", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Sudionik", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "tajni izraz ili ključ za obnavljanje", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Lozinka", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Zaboravljena lozinka", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Lozinka je promijenjena", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Obnavljanje lozinke", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Prikvači", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Odaberi lozinku", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Pritisni poveznicu u e-mailu i zatim nastavi.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Upiši svoju lozinku", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Upiši svoj pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Upiši svoje korisničko ime", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Slijedi upute na web-stranici i dodirni „Dalje”.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatnost", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Javne sobe", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Razlog", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} je preuredio/la događaj", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Ispravi poruku", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Odbij", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} je odbio/la poziv", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Ukloni", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Ukloni sve druge uređaje", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Ponovo uključi u chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ukloni svoj avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Zamijeni sobu s novom verzijom", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Odgovori", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Prijavi poruku", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Soba je nadograđena", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Verzija sobe", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Spremi datoteku", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Traži", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sigurnost", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Pošalji", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Pošalji poruku", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Pošalji kao tekst", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Pošalji audio datoteku", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Pošalji datoteku", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Pošalji sliku", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Pošalji poruke", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Pošalji video datoteku", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ja poslao/la datoteku", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ja poslao/la audio snimku", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ja poslao/la sliku", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} je poslao/la naljepnicu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} je poslao/la video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} je poslao/la podatke poziva", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Postavi kao glavni pseudonim", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Postavi stanje", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Postavke", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Dijeli", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} je dijelio/la svoje mjesto", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Preskoči", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Izvorni kȏd", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Prostor je javan", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Ime prostora", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ja započeo/la poziv", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stanje", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kako si danas?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Pošalji", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinkronizira se … Pričekaj.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sustav", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ne poklapaju se", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Poklapaju se", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Previše zahtjeva. Pokušaj ponovo kasnije!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Pokušaj ponovo poslati", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} je ponovo uključio/la {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Deblokiraj uređaj", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Nepoznat uređaj", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nepoznat algoritam šifriranja", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nepoznat događaj '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Uključi zvuk chata", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Otkvači", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} i još {count} korisnika tipkaju …", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} tipkaju …", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} tipka …", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} je napustio/la chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} ja poslao/la {type} događaj", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Potvrđeno", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Pokreni potvrđivanje", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Uspješno si potvrdio/la!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Potvrđivanje drugog računa", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video poziv", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vidljivost povijesti chata", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Vidljivo za sve sudionike", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Vidljivo za sve", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Glasovna poruka", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čeka se na sugovornika da prihvati zahtjev …", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čeka se na sugovornika da prihvati emoji …", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čeka se na sugovornika da prihvati brojeve …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Upozorenje!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Poslali smo ti e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Tko može izvršiti koju radnju", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Tko se smije pridružiti grupi", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Zašto želiš ovo prijaviti?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Lozinku možeš obnoviti pomoću ovih adresa.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napiši poruku …", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Da", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ti", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Više ne sudjeluješ u ovom chatu", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Isključen/a si iz ovog chata", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Tvoj javni ključ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Dijeli lokaciju", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Lokacijske dozvole su odbijene. Za dijeljenje tvoje lokacije dozvoli ih.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Lokacijske usluge su deaktivirane. Za dijeljenje tvoje lokacije aktiviraj ih.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Dohvaćanje lokacije …", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Greška u dohvaćanju lokacije: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "openInMaps": "Otvori u kartama", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nije matrix server. Da li umjesto njega koristiti {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "autoplayImages": "Automatski pokreni animirane naljepnice i emotikone", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Dodaj u prostor", + "scanQrCode": "Snimi QR kod", + "sendOnEnter": "Pošalji pritiskom tipke enter", + "link": "Poveznica", + "bundleName": "Ime paketa", + "removeFromBundle": "Ukloni iz ovog paketa", + "addToBundle": "Dodaj u paket", + "editBundlesForAccount": "Uredi pakete za ovaj račun", + "addAccount": "Dodaj račun", + "oneClientLoggedOut": "Jedan od tvojih klijenata je odjavljen", + "unverified": "Nepotvrđeno", + "repeatPassword": "Ponovi lozinku", + "messageInfo": "Informacija poruke", + "sender": "Pošiljatelj", + "openGallery": "Otvori galeriju", + "time": "Vrijeme", + "removeFromSpace": "Ukloni iz prostora", + "commandHint_clearcache": "Isprazni predmemoriju", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Stvori prazan grupni chat\nKoristi --no-encryption za deaktiviranje šifriranja", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Odbaci sesiju", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Započni izravni chat\nKoristi --no-encryption za deaktiviranje šifriranja", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "markAsRead": "Označi kao pročitano", + "reportUser": "Prijavi korisnika", + "unsupportedAndroidVersion": "Nepodržana Android verzija", + "unsupportedAndroidVersionLong": "Ova funkcija zahtijeva noviju verziju Androida. Provjeri, postoje li nove verzije ili podrška za Lineage OS.", + "youKickedAndBanned": "🙅 Izbacio/la i isključio/la si korisnika {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dehydrateWarning": "Ovo je nepovratna radnja. Spremi datoteku sigurnosne kopije na sigurno mjesto.", + "emojis": "Emojiji", + "storeSecurlyOnThisDevice": "Spremi sigurno na ovom uređaju", + "countFiles": "Broj datoteka: {count}", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "reactedWith": "{sender} je reagirao/la sa {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Prikvači na sobu", + "confirmEventUnpin": "Stvarno želiš trajno otkvačiti događaj?", + "voiceCall": "Glasovni poziv", + "placeCall": "Nazovi", + "videoCallsBetaWarning": "Napominjemo da se funkcija videopoziva trenutačno nalazi u beta stanju. Možda neće raditi ispravno ili uopće neće raditi na svim platformama.", + "experimentalVideoCalls": "Eksperimentalni videopozivi", + "youRejectedTheInvitation": "Odbio/la si poziv", + "youJoinedTheChat": "Pridružio/la si se chatu", + "youAcceptedTheInvitation": "👍 Prihvatio/la si poziv", + "youHaveWithdrawnTheInvitationFor": "Povukao/la si poziv za korisnika {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} te je pozvao/la", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Pozvao/la si korisnika {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Izbacio/la si korisnika {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Ponovo si uključio/la korisnika {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dehydrate": "Izvezi sesiju i izbriši uređaj", + "storeInAndroidKeystore": "Spremi u Android KeyStore", + "hydrate": "Obnovi pomoću sigurnosne kopije", + "users": "Korisnici", + "youBannedUser": "Isključio/la si korisnika {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Spremi u Apple KeyChain", + "user": "Korisnik", + "custom": "Prilagođeno", + "fileHasBeenSavedAt": "Datoteka je spremljena u {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Neuspjelo slanje! Server podržava samo priloge do {max}.", + "jumpToLastReadMessage": "Skoči na zadnju pročitanu poruku", + "commandHint_markasdm": "Označi kao sobu za izravnu razmjenu poruka za zadani Matrix ID", + "commandHint_markasgroup": "Označi kao grupu", + "doNotShowAgain": "Nemoj više prikazivati", + "readUpToHere": "Pročitaj do ovdje", + "wasDirectChatDisplayName": "Prazan chat (zvao se {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noBackupWarning": "Upozorenje! Bez aktiviranja spremanja sigurnosne kopije chata, izgubit ćeš pristup tvojim šifriranim porukama. Preporučujemo spremanje sigurnosne kopije chata prije odjave.", + "noOtherDevicesFound": "Nijedan drugi uređaj nije pronađen", + "whyIsThisMessageEncrypted": "Zašto nije moguće čitati ovu poruku?", + "jump": "Skoči", + "newSpaceDescription": "Prostori omogućuju konsolidiranje tvojih chatova i izgradnju privatne ili javne zajednice.", + "encryptThisChat": "Šifiraj ovaj chat", + "foregroundServiceRunning": "Ova se obavijest pojavljuje kada se pokreće usluga u prvom planu.", + "commandHint_hug": "Pošalji grljenje", + "commandHint_googly": "Pošalji kotrljajuće oči", + "commandHint_cuddle": "Pošalji maženje", + "confirmMatrixId": "Za brisanje tvog računa potvrdi svoj Matrix ID.", + "supposedMxid": "Trebao bi biti {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "screenSharingDetail": "Dijeliš svoj ekran u FuffyChatu", + "screenSharingTitle": "dijeljenje ekrana", + "newSpace": "Novi prostor", + "sorryThatsNotPossible": "Žao nam je … to nije moguće", + "disableEncryptionWarning": "Iz sigurnosnih razloga ne možeš deaktivirati šifriranje u chatu u kojem je prije bilo aktivirano.", + "googlyEyesContent": "{senderName} ti šalje kotrljajuće oči", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} te mazi", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} te grli", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "noKeyForThisMessage": "To se može dogoditi ako je poruka poslana prije prijave na tvoj račun na ovom uređaju.\n\nTakođer je moguće da je pošiljatelj blokirao tvoj uređaj ili je došlo do greške s internetskom vezom.\n\nMožeš li pročitati poruku na jednoj drugoj sesiji? U tom slučaju možeš prenijeti poruku iz nje! Idi na Postavke > Uređaji i uvjeri se da su se tvoji uređaji međusobno potvrdili. Kada sljedeći put otvoriš sobu i obje sesije su u prednjem planu, ključevi će se automatski prenijeti.\n\nNe želiš izgubiti ključeve kada se odjaviš ili zamijeniš uređaje? Aktiviraj spremanje sigurnosne kopije chata u postavkama.", + "reopenChat": "Ponovo otvori chat", + "openLinkInBrowser": "Otvori poveznicu u pregledniku", + "report": "prijavi", + "reportErrorDescription": "😭 Joj! Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.", + "notAnImage": "Nije slikovna datoteka.", + "importNow": "Uvezi sada", + "importEmojis": "Uvezi emoji slike", + "importFromZipFile": "Uvezi iz .zip datoteke", + "replace": "Zamijeni", + "exportEmotePack": "Izvezi paket emotikona kao .zip", + "sendTypingNotifications": "Šalji obavijesti o tipkanju", + "setColorTheme": "Postavi boju teme:", + "tryAgain": "Pokušaj ponovo", + "messagesStyle": "Poruke:", + "chatDescription": "Opis chata", + "invalidServerName": "Neispravno ime servera", + "chatPermissions": "Dozvole za chat", + "setChatDescription": "Postavi opis rzgovora", + "redactedBy": "Preuređeno od {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcionalno) Razlog za redigiranje ove poruke …", + "redactedByBecause": "Preuređeno od {username} zbog: „{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Poruka će se redigirati za sve sudionike u ovoj konverzaciji. To je nepovratna radnja.", + "directChat": "Izravni chat", + "inviteGroupChat": "📨 Pozivnica u grupni chat", + "noChatDescriptionYet": "Opis chata još nije stvoren.", + "chatDescriptionHasBeenChanged": "Opis chata je promijenjen", + "shareInviteLink": "Dijeli poveznicu za poziv", + "emoteKeyboardNoRecents": "Ovdje će se pojaviti nedavno korišteni emotikoni …", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "createGroup": "Stvori grupu", + "invite": "Pozovi", + "invalidInput": "Neispravan unos!", + "wrongPinEntered": "Unesen je pogrešan PIN! Pokušaj ponovo za {seconds} sekunde …", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "hasKnocked": "🚪 {user} je pokucao/la", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "Upiši broj veći od 0", + "pushNotificationsNotAvailable": "Automatsko slanje obavijesti nije dostupno", + "learnMore": "Saznaj više", + "createGroupAndInviteUsers": "Stvori grupu i pozovi korisnike", + "blockedUsers": "Blokirani korisnici", + "groupCanBeFoundViaSearch": "Grupa se može pronaći putem pretrage", + "block": "Blokiraj", + "yourGlobalUserIdIs": "Tvoj globalni korisnički ID je: ", + "commandHint_sendraw": "Pošalji neobrađeni json", + "wrongRecoveryKey": "Oprosti … čini se da ovo nije ispravan ključ za obnavljanje.", + "blockUsername": "Zanemari korisničko ime", + "groupName": "Ime grupe", + "databaseMigrationTitle": "Baza podataka je optimirana", + "searchChatsRooms": "Traži #chats, @users …", + "databaseMigrationBody": "Pričekaj. Ovo može potrajati.", + "formattedMessages": "Formatirane poruke", + "incomingMessages": "Dolazne poruke", + "passwordsDoNotMatch": "Lozinke se ne poklapaju", + "accessAndVisibility": "Pristup i vidljivost", + "calls": "Pozivi", + "customEmojisAndStickers": "Prilagođeni emojiji i naljepnice", + "customEmojisAndStickersBody": "Dodaj ili dijeli prilagođene emojije ili naljepnice koje se mogu koristiti u bilo kojem chatu.", + "accessAndVisibilityDescription": "Tko se smije pridružiti ovom chatu i kako se chat može otkriti.", + "stickers": "Naljepnice", + "discover": "Otkrij", + "formattedMessagesDescription": "Prikaži formatirani sadržaj poruke poput podebljanog teksta koristeći markdown.", + "nothingFound": "Ništa nije pronađeno...", + "select": "Odaberi", + "newPassword": "Nova lozinka", + "unbanUserDescription": "Korisnik će se ponovo moći pridružiti chatu ako pokuša.", + "publicSpaces": "Javni prostori", + "thisDevice": "Ovaj uređaj:", + "pleaseEnterYourCurrentPassword": "Upiši svoju trenutačnu lozinku", + "passwordIsWrong": "Tvoja upisana lozinka je kriva", + "initAppError": "Dogodila se greška prilikom inicijaliziranja aplikacije", + "hideRedactedMessagesBody": "Ako netko redigira poruku, ta poruka više neće biti vidljiva u chatu.", + "kickUserDescription": "Korisnik je izbačen iz chata, ali nije isključen. U javnim chatovima se korisnik može ponovo pridružiti u bilo kojem trenutku.", + "addChatOrSubSpace": "Dodaj chat ili podpodručje", + "appLockDescription": "Zaključaj aplikaciju kada je ne koristiš s PIN kodom", + "globalChatId": "Globalni ID chata", + "hideRedactedMessages": "Sakrij redigirane poruke", + "hideInvalidOrUnknownMessageFormats": "Sakrij nevažeće ili nepoznate formate poruka", + "passwordRecoverySettings": "Postavke za obnavljanje lozinke", + "usersMustKnock": "Korisnici moraju pokucati", + "noOneCanJoin": "Nitko se ne može pridružiti", + "knock": "Pokucaj", + "knocking": "Kucanje", + "chatCanBeDiscoveredViaSearchOnServer": "Chat se može otkriti pretraživanjem servera {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchForUsers": "Traži @users...", + "pleaseChooseAStrongPassword": "Odaberi snažnu lozinku", + "joinSpace": "Pridruži se prostoru", + "publicChatAddresses": "Adrese javnih chatova", + "createNewAddress": "Stvori novu adresu", + "verifyOtherUser": "🔐 Potvrdi drugog korisnika", + "sendTypingNotificationsDescription": "Drugi sudionici u chatu mogu vidjeti kada tipkaš novu poruku.", + "sendReadReceiptsDescription": "Drugi sudionici u raygovoru mogu vidjeti kada pročitaš poruku.", + "searchIn": "Traži u chatu „{chat}”...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Traži više...", + "gallery": "Galerija", + "files": "Datoteke", + "verifyOtherDevice": "🔐 Potvrdi drugi uređaj", + "unreadChatsInApp": "{appname}: Broj nepročitanih chatova: {unread}", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "commandHint_ignore": "Zanemari navedeni matrix ID", + "blockListDescription": "Možeš blokirati korisnike koji te ometaju. Nećeš moći primati poruke ili pozivnice za sobe od korisnika koji se nalaze u tvom osobnom popisu blokiranih.", + "isReadyForKeyVerification": "{sender} je spreman/na za potvrđivanje ključa", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "banUserDescription": "Korisnik će biti isključen iz chata i moći će ponovo prisustvovati chatu kada ga se ponovo uključi.", + "sessionLostBody": "Tvoja je sesija izgubljena. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} je završio/la potvrđivanje ključa", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "archiveRoomDescription": "Chat će se premjestiti u arhivu. Drugi korisnici će moći vidjeti da si napustio/la chat.", + "removeDevicesDescription": "Bit ćeš odjavljen/a s ovog uređaja i više nećeš moći primati poruke.", + "noUsersFoundWithQuery": "Nažalost nije pronađen nijedan korisnik s „{query}”. Provjeri točnost upisa.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikacija sada pokušava obnoviti tvoju sesiju iz sigurnosne kopije. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} je zatražio/la potvrđivanje ključa", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "roomUpgradeDescription": "Chat će se tada ponovo stvoriti s novom verzijom sobe. Svi sudionici će biti obaviješteni da se moraju prebaciti na novi chat. Više o verzijama soba možeš saznati na https://spec.matrix.org/latest/rooms/", + "noGoogleServicesWarning": "Čini se da Firebase Cloud Messaging nije dostupan na tvom uređaju. Za daljnje primanje push obavijesti, preporučujemo da instaliraš ntfy. S ntfy ili drugim pružateljem Unified Push usluge možeš primati push obavijesti na podatkovno siguran način. Ntfy možeš preuzeti s PlayStorea ili s F-Droida.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "verifyOtherDeviceDescription": "Kada potvrdiš jedan drugi uređaj, ti uređaji mogu razmjenjivati ključeve, povećavajući tvoju ukupnu sigurnost. 💪 Kada pokreneš provjeru, pojavit će se skočni prozor u aplikaciji na oba uređaja. Tamo ćeš tada vidjeti niz emojija ili brojeve koje moraš međusobno usporediti. Najbolje je imati oba uređaja pri ruci prije nego što započneš provjeru. 🤳", + "verifyOtherUserDescription": "Ako potvrdiš jednog drugog korisnika, možeš biti siguran/na da znaš kome zapravo pišeš. 💪\n\nKada pokreneš provjeru, vi i drugi korisnik vidjet ćete skočni prozor u aplikaciji. Tamo ćeš tada vidjeti niz emojija ili brojeve koje morate međusobno usporediti.\n\nNajbolji način za to je da se nađete zajedno ili započnete videopoziv. 👭", + "makeAdminDescription": "Nakon postavljanja ovog korisnika kao administratora, to možda nećeš moći poništiti jer će on tada imati iste dozvole kao i ti.", + "leaveEmptyToClearStatus": "Ostavi prazno za brisanje tvog stanja.", + "sendReadReceipts": "Šalji potvrde o čitanju", + "acceptedKeyVerification": "{sender} je prihvatio/la potvrđivanje ključa", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} je prekinuo/la potvrđivanje ključa", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} je pokrenuo/la potvrđivanje ključa", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "Poništi zanemarivanje navedenog matrix ID-a", + "noDatabaseEncryption": "Šifriranje baze podataka nije podržano na ovoj platformi", + "thereAreCountUsersBlocked": "Broj trenutačno blokiranih korisnika: {count}.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "swipeRightToLeftToReply": "Za odgovaranje povuci prstom zdesna ulijevo", + "sendingAttachment": "Slanje priloga …", + "aboutHomeserver": "Informacije o {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Nadogradi ovu sobu na zadanu verziju sobe", + "noMoreChatsFound": "Nema više chatova …", + "noChatsFoundHere": "Ovdje još nisu pronađeni chatovi. Započni novi chat s nekime pomoću donjeg gumba. ⤵️", + "unread": "Nepročitano", + "space": "Prostor", + "changedTheChatDescription": "{username} je promijenio/la opis chata", + "changedTheChatName": "{username} je promijenio/la ime chata", + "checkList": "Kontrolni popis", + "countInvited": "Broj pozvanih: {count}", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendImages": "Pošalji {count} sliku", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " Sinkronizacija … ({percentage} %)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "goToSpace": "Idi u prostor: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Označi kao nepročitano", + "userLevel": "{level} – Korisnik", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} – Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} – Administrator", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Promijeni opće postavke chata", + "inviteOtherUsers": "Pozovi druge korisnike u ovaj chat", + "changeTheChatPermissions": "Promijeni dozvole za chat", + "changeTheVisibilityOfChatHistory": "Promijeni vidljivost povijesti chatova", + "changeTheCanonicalRoomAlias": "Promijeni glavnu adresu javnog chata", + "sendRoomNotifications": "Pošalji @room obavijesti", + "changeTheDescriptionOfTheGroup": "Promijeni opis chata", + "chatPermissionsDescription": "Definiraj razine dozvola koja su potrebna za određene radnje u ovom chatu. Razine dozvola 0, 50 i 100 obično predstavljaju korisnike, moderatore i administratore, ali je moguća svaka gradacija.", + "updateInstalled": "🎉 Aktualizirana verzija {version} je instalirana!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Dnevnik promjena", + "sendCanceled": "Slanje je prekinuto", + "loginWithMatrixId": "Prijava pomoću Matrix-ID-a", + "doesNotSeemToBeAValidHomeserver": "Čini se da nije kompatibilan homeserver. Pogrešan URL?", + "calculatingFileSize": "Izračunavanje veličine datoteke …", + "oneOfYourDevicesIsNotVerified": "Jedan od tvojih uređaja nije potvrđen", + "noticeChatBackupDeviceVerification": "Napomena: Kada spojiš sve svoje uređaje na sigurnosnu kopiju chata, oni se automatski potvrđuju.", + "continueText": "Nastavi", + "blur": "Zamućenost:", + "opacity": "Neprozirnost:", + "setWallpaper": "Postavi sliku pozadine", + "manageAccount": "Upravljaj računom", + "noContactInformationProvided": "Server ne pruža nikoje valjane kontakt podatke", + "contactServerAdmin": "Kontaktiraj administratora servera", + "contactServerSecurity": "Kontaktiraj zadužene za sigurnost servera", + "supportPage": "Stranica podrške", + "serverInformation": "Podaci servera:", + "name": "Ime", + "version": "Verzija", + "website": "Web-stranica", + "compress": "Komprimiraj", + "boldText": "Podebljani tekst", + "italicText": "Kurzivni tekst", + "strikeThrough": "Precrtano", + "pleaseFillOut": "Ispuni", + "invalidUrl": "Neispravan URL", + "addLink": "Dodaj poveznicu", + "unableToJoinChat": "Neuspjelo pridruživanje chatu. Možda je druga strana već zatvorila konverzaciju.", + "previous": "Prethodni", + "otherPartyNotLoggedIn": "Druga strana trenutačno nije prijavljena i stoga ne može primati poruke!", + "appWantsToUseForLogin": "Koristi '{server}' za prijavu", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Ovime dopuštaš aplikaciji i web-stranici da dijele podatke o tebi.", + "open": "Otvori", + "waitingForServer": "Čekanje na server …", + "newChatRequest": "📩 Novi zahtjev za chat", + "contentNotificationSettings": "Postavke obavijesti o sadržaju", + "generalNotificationSettings": "Opće postavke obavijesti", + "roomNotificationSettings": "Postavke obavijesti sobe", + "userSpecificNotificationSettings": "Koriničke postavke obavijesti", + "otherNotificationSettings": "Druge postavke obavijesti", + "notificationRuleContainsUserName": "Sadrži korisničko ime", + "notificationRuleContainsUserNameDescription": "Obavještava korisnika kada poruka sadrži njegovo korisničko ime.", + "notificationRuleMaster": "Isključi sve obavijesti", + "notificationRuleMasterDescription": "Nadjačava sva druga pravila i deaktivira sve obavijesti.", + "notificationRuleSuppressNotices": "Isključi automatizirane poruke", + "notificationRuleSuppressNoticesDescription": "Isključi obavijesti od automatiziranih klijenata poput botova.", + "notificationRuleInviteForMe": "Poziv za mene", + "notificationRuleInviteForMeDescription": "Obavještava korisnika kada je pozvan u sobu.", + "notificationRuleMemberEvent": "Događaj člana", + "notificationRuleMemberEventDescription": "Isključi obavijesti o događajima članstva.", + "notificationRuleIsUserMention": "Spominjanje korisnika", + "notificationRuleIsUserMentionDescription": "Obavještava korisnika kada je izravno spomenut u poruci.", + "notificationRuleContainsDisplayName": "Sadrži prikazano ime", + "notificationRuleContainsDisplayNameDescription": "Obavještava korisnika kada poruka sadrži njegovo prikazano ime.", + "notificationRuleIsRoomMention": "Spominjanje sobe", + "notificationRuleIsRoomMentionDescription": "Obavještava korisnika kad se spomene soba.", + "notificationRuleRoomnotif": "Obavijest o sobi", + "notificationRuleRoomnotifDescription": "Obavještava korisnika kada poruka sadrži „@room“.", + "notificationRuleTombstone": "Nadgrobni spomenik", + "notificationRuleTombstoneDescription": "Obavještava korisnika o porukama o deaktivaciji sobe.", + "notificationRuleReaction": "Reakcija", + "notificationRuleReactionDescription": "Isključi obavijesti za reakcije.", + "notificationRuleRoomServerAcl": "Kontrolni popis za pristup serveru sobe", + "notificationRuleRoomServerAclDescription": "Isključi obavijesti o kontrolnim popisima za pristup serveru sobe (ACL).", + "notificationRuleSuppressEdits": "Isključi uređivanja", + "notificationRuleSuppressEditsDescription": "Isključi obavijesti za uređene poruke.", + "notificationRuleCall": "Poziv", + "notificationRuleCallDescription": "Obavještava korisnika o pozivima.", + "notificationRuleEncryptedRoomOneToOne": "Šifrirana soba jedan-na-jedan", + "notificationRuleEncryptedRoomOneToOneDescription": "Obavještava korisnika o porukama u šifriranim sobama jedan-na-jedan.", + "notificationRuleRoomOneToOne": "Soba jedan-na-jedan", + "notificationRuleRoomOneToOneDescription": "Obavještava korisnika o porukama u sobama jedan-na-jedan.", + "notificationRuleMessage": "Poruka", + "notificationRuleMessageDescription": "Obavještava korisnika o općim porukama.", + "notificationRuleEncrypted": "Šifrirano", + "notificationRuleEncryptedDescription": "Obavještava korisnika o porukama u šifriranim sobama.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Obavještava korisnika o događajima Jitsi widgeta.", + "notificationRuleServerAcl": "Isključi događaje kontrole pristupa servera (ACL)", + "notificationRuleServerAclDescription": "Isključi obavijesti za kontrolne popise za pristup (ACL).", + "unknownPushRule": "Nepoznato push pravilo '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} – Glasovna poruka od {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Brisanje postavki obavijesti je nopovratna radnja.", + "more": "Više", + "shareKeysWith": "Dijeli ključeve s …", + "shareKeysWithDescription": "Kojim se uređajima treba vjerovati za čitanje tvojih poruka u šifriranim chatovima?", + "allDevices": "Svi uređaji", + "crossVerifiedDevicesIfEnabled": "Unakrsno potvrđeni uređaji, ako je uključeno", + "crossVerifiedDevices": "Unakrsno potvrđeni uređaji", + "verifiedDevicesOnly": "Samo potvrđeni uređaji", + "takeAPhoto": "Snimi sliku", + "recordAVideo": "Snimi video", + "optionalMessage": "(Opcionalna) poruka …", + "notSupportedOnThisDevice": "Nije podržano na ovom uređaju", + "enterNewChat": "Upiši novi chat", + "approve": "Odobri", + "youHaveKnocked": "Pokucao/la si", + "pleaseWaitUntilInvited": "Sad pričekaj, dok te netko iz sobe ne pozove.", + "commandHint_logout": "Odjavi tvoj trenutačni uređaj", + "commandHint_logoutall": "Odjavi sve aktivne uređaje", + "displayNavigationRail": "Prikaži navigacijsku traku na mobilnom uređaju", + "customReaction": "Prilagođena reakcija", + "moreEvents": "Više događaja", + "declineInvitation": "Odbij poziv", + "noMessagesYet": "Još nema poruka", + "longPressToRecordVoiceMessage": "Pritisni dugo za snimanje glasovne poruke.", + "pause": "Pauza", + "resume": "Nastavi", + "removeFromSpaceDescription": "Chat će se ukloniti iz prostora, ali će se i dalje pojaviti na tvom popisu chatova.", + "countChats": "Broj chatova: {chats}", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Član {spaces} prostora", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Član {spaces} prostora smije pokucati", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Početak ankete", + "endPoll": "Kraj ankete", + "answersVisible": "Odgovori vidljivi", + "pollQuestion": "Pitanje u anketi", + "answerOption": "Opcija za odgovor", + "addAnswerOption": "Dodaj opciju za odgovor", + "allowMultipleAnswers": "Dopusti više odgovora", + "pollHasBeenEnded": "Anketa je završena", + "countVotes": "{count, plural, =1{Jedan glas} few{{count} glasa} other{{count} glasova}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Odgovori će biti vidljivi nakon završetka ankete", + "replyInThread": "Odgovori u temi", + "countReplies": "{count, plural, =1{Jedan odgovor} few{{count} odgovora} other{{count} odgovora}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Tema", + "backToMainChat": "Natrag na glavni chat", + "saveChanges": "Spremi promjene", + "createSticker": "Stvori naljepnicu ili emoji", + "useAsSticker": "Koristi kao naljepnicu", + "useAsEmoji": "Koristi kao emoji", + "stickerPackNameAlreadyExists": "Ime paketa naljepnica već postoji", + "newStickerPack": "Novi paket naljepnica", + "stickerPackName": "Ime paketa naljepnica", + "attribution": "Atribucija", + "skipChatBackup": "Preskoči sigurnosno kopiranje chata", + "skipChatBackupWarning": "Sigurno? Bez aktiviranja sigurnosne kopije chata možeš izgubiti pristup svojim porukama ako promijeniš uređaj.", + "noMoreResultsFound": "Nema više rezultata", + "chatSearchedUntil": "Chat je pretražen do {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Osnovni URL federacije", + "clientWellKnownInformation": "Dobro poznate informacije o klijentu:", + "baseUrl": "Osnovni URL", + "identityServer": "Server identiteta:", + "versionWithNumber": "Verzija: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Zapisi", + "advancedConfigs": "Napredne konfiguracije", + "advancedConfigurations": "Napredne konfiguracije", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + } +} \ No newline at end of file diff --git a/lib/l10n/intl_hu.arb b/lib/l10n/intl_hu.arb new file mode 100644 index 0000000000..60402c19ff --- /dev/null +++ b/lib/l10n/intl_hu.arb @@ -0,0 +1,2450 @@ +{ + "@@locale": "hu", + "@@last_modified": "2021-08-14 12:41:10.016566", + "about": "Névjegy", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Elfogad", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} elfogadta a meghívást", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Fiók", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiválta a végpontok közötti titkosítást", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Adminisztrátor", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "álnév", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} válaszolt a hívásra", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Bárki csatlakozhat", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archívum", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Csatlakozhatnak-e vendégek", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Biztos benne?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "A másik fél igazolásához meg kell adnia a biztonságos tároló jelmondatát vagy a visszaállítási kulcsotát.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Elfogadja {username} hitelesítési kérelmét?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Kitiltás a csevegésből", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Kitiltva", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} kitiltva {targetName} által", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Eszköz blokkolása", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Mégse", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Eszköznév módosítása", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} módosította a csevegési profilképét", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} módosította a csevegési engedélyeket", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} módosította a megjelenített nevét erre: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} módosította a vendégek hozzáférési szabályokat", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} módosította a vendégek hozzáférési szabályait a következőre: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} módosította az előzmények láthatóságát", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} módosította az előzmények láthatóságát a következőre: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} módosított a csatlakozási szabályokat", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} módosította a csatlakozási szabályokat a következőre: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} módosította a profilképét", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} módosította a szoba álneveit", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} módosította a meghívó hivatkozást", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Jelszó módosítása", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Matrix-kiszolgáló váltás", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Stílusának módosítása", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Csoport nevének módosítása", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A titkosítás megsérült", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Csevegés", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Csevegés részletei", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Válasszon egy erős jelszót", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Bezár", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Kérem, hasonlítsa össze a hangulatjeleket", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Kérem, hasonlítsa össze a számokat", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kapcsolat meghívásra került a csoportba", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Vágólapra másolva", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Másolás", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nem sikerült visszafejteni az üzenetet: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} résztvevő", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Létrehoz", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} csevegést hozott létre", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Jelenleg aktív", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Sötét", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ez deaktiválja a felhasználói fiókját. Ez nem vonható vissza! Biztos benne?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Törlés", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Fiók törlése", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Üzenet törlése", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Eszközök", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "A megjelenítési név megváltozott", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Fájl letöltése", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Megjelenítési név szerkesztése", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "A hangulatjel már létezik!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Érvénytelen hangulatjel rövidkód!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Hangulatjel Beállítások", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Hangulatjel rövidkód", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Üres csevegés", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Hangulatjel csomag engedélyezése globálisan", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Többé nem fogja tudni kikapcsolni a titkosítást. Biztos benne?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Titkosítás", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Titkosítás nem engedélyezve", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} befejezte a hívást", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "forward": "Továbbítás", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Csatlakozás óta", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Meghívás óta", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Csoport", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "A csoport nyilvános", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Csoport {displayname}-al", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "A vendégek nem engedélyezettek", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Csatlakozhatnak vendégek", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} visszavonta {targetName} meghívását", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Súgó", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ismeretlen események elrejtése", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Figyelmen kívül hagyott felhasználók", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Hibás jelmondat vagy visszaállítási kulcs", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Ismerős meghívása", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Ismerős meghívása a(z) {groupName} csoportba", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Meghívott", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} meghívta {targetName} felhasználót", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Csak meghívott felhasználók", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} meghívta a FluffyChat-be.\n1. Keresse fel a fluffychat.im oldalt, és telepítse az alkalmazást \n2. Regisztráljon vagy jelentkezzen be \n3. Nyissa meg a meghívó linket: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "épp gépel…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} csatlakozott a csevegéshez", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Csatlakozás a szobához", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} kirúgta {targetName}-t", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} kirúgta és kitiltotta {targetName}-t", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kirúgás a csevegésből", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Utoljára aktív: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Elhagy", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Elhagyta a csevegést", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Világos", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "További {count} résztvevő betöltése", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Betöltés… Kérem, várjon.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Továbbiak betöltése…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Bejelentkezés", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Bejelentkezés a(z) {homeserver} Matrix-kiszolgálóra", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Kijelentkezés", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Megemlítés", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Csevegés némítása", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Új FluffyChat üzenet", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Új hitelesítési kérelem!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "Nem", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nem találhatóak hangulatjelek. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Úgy tűnik a Firebase Cloud Messaging nem elérhető a készülékén. Ha mégis push értesítéseket kíván kapni, javasoljuk a ntfy telepítését. A ntfy vagy más egyéb Egyesített Push szolgáltató esetében úgy kaphat értesítést, hogy adatai biztonságban maradnak. Letöltheti a ntfy-t a PlayStore-ból, vagy F-Droid-ról is.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nincs engedély", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nem találhatóak szobák…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online kulcsmentés engedélyezve", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppá, valami hiba lépett fel…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Alkalmazás megnyitása az üzenetek elolvasásához", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamera megnyitása", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "jelmondat vagy visszaállítási kulcs", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Jelszó", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "A jelszó módosításra került", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pin": "Rögzítés", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Kérem, adja meg jelszavát", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Kérem, adja meg a felhasználónevét", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "Adatvédelem", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Nyilvános szobák", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} szerkesztett egy eseményt", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Elutasít", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} elutasította a meghívást", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Eltávolítás", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Minden más eszköz eltávolítása", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Csevegés kitiltás feloldása", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Válasz", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A szoba frissítésre került", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "send": "Küldés", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Üzenet küldése", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Hangüzenet küldése", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Fájl küldése", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Kép küldése", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Videó küldése", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} küldött egy fájlt", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} hangüzenetet küldött", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} képet küldött", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} matricát küldött", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} videót küldött", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} hívásinformációt küldött", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "Állapot beállítása", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Beállítások", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Megosztás", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} megosztotta a pozícióját", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Kihagy", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Forráskód", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} hívást indított", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Hogy érzi magát a mai napon?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Beküldés", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Rendszer", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Nem egyezőek", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Egyezőek", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Újraküldés megpróbálása", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} feloldotta {targetName} kitiltását", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Eszköz blokkolás feloldása", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ismeretlen eszköz", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Ismeretlen titkosítási algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Ismeretlen esemény: '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Csevegés némítás feloldása", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Rögzítés megszüntetése", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} és {count} másik résztvevő gépel…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} és {username2} gépel…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} gépel…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} elhagyta a csevegést", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} felhasználó {type} eseményt küldött", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Hitelesítés megkezdése", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Sikeres hitelesítés!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Másik fiók hitelesítése", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videóhívás", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Csevegési előzmény láthatósága", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Minden résztvevő számára látható", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Bárki számára látható", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Hangüzenet", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Várakozás a partnerre, hogy elfogadja a kérést…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Várakozás a partnerre, hogy elfogadja a hangulatjelet…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Várakozás a partnerre, hogy elfogadja a számokat…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Figyelem!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Ki csatlakozhat a csoporthoz", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Írjon egy üzenetet…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Igen", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ön", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Immáron nem vesz részt ebben a csevegésben", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Kitiltották ebből a csevegésből", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Ezekkel a címekkel vissza tudja állítani a jelszavát.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Küldtünk Önnek egy emailt", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Jelszó visszaállítás", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Még nem adott meg semmilyen módszert a jelszava visszaállítására.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Rákattintottam a linkre", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Adjon meg egy email címet", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Titkosított", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "edit": "Szerkeszt", + "@edit": { + "type": "String", + "placeholders": {} + }, + "directChats": "Privát Csevegések", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Jelszó ismétlése", + "addEmail": "E-mail-cím hozzáadása", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "Összes", + "@all": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Animált matricák és hangulatjelek automatikus lejátszása", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Küldés Enterrel", + "cantOpenUri": "Nem sikerült a következő URI megnyitása: {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeYourAvatar": "Profilkép módosítása", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Hozzáadás a térhez", + "areYouSureYouWantToLogout": "Biztosan kijelentkezik?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "A Matrix-kiszolgáló a következő bejelentkezéseket támogatja:\n{serverVersions}\nDe ez az alkalmazást csak ezeket támogatja:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "blocked": "Blokkolva", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "appLock": "Alkalmazás zár", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomnick": "Megjelenített nevének hozzárendelése a szobához", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "Formázatlan szöveg küldése", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Szöveg küldése", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "contentHasBeenReported": "A tartalom jelentésre került a szerver adminisztrátorok számára", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "Profilképe hozzárendelése a szobához (mxc URI használatával)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "copyToClipboard": "Vágólapra másolás", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Szoba álnevek szerkesztése", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Szoba-profilkép szerkesztése", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Titkosítás engedélyezése", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Betűméret", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "groups": "Csoportok", + "@groups": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "A helymeghatározás visszautasításra került. Kérem engedélyezze, hogy meg tudja osztani helyzetét.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "newChat": "Új csevegés", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR kód beolvasása", + "oopsPushError": "Hoppá! Sajnos hiba lépett fel a push értesítések beállításakor.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "Egy üres csevegő csoport létrehozása\nA --no-encryption paraméterrel feloldhatja a titkosítást", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_invite": "Adott felhasználó meghívása ebbe a szobába", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "locationDisabledNotice": "A helymeghatározás ki van kapcsolva. Kérem, kapcsolja be, hogy meg tudja osztani helyzetét.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Csevegés biztonsági mentés", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "ignore": "Figyelmen kívül hagyás", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "next": "Következő", + "@next": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nem elérhető a szerver", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Csak akkor kapcsolható be a titkosítás, ha a szoba nem nyilvánosan hozzáférhető.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "chats": "Csevegések", + "@chats": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Archívum ürítése", + "commandHint_ban": "Adott felhasználó kitiltása a szobából", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Gyorsítótár törlése", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Munkamenet elvetése", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Közvetlen csevegés indítása\nA --no-encryption paraméterrel kikapcsolhatja a titkosítást", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "HTML formázott szöveg küldése", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_join": "Csatlakozás a megadott szobához", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "A megadott felhasználó kirúgása a szobából", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Szoba elhagyása", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandInvalid": "Érvénytelen parancs", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} nem egy parancs.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "configureChat": "Csevegés konfigurálása", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Új tér", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Alapértelmezett hozzáférési szint új felhasználóknál", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Hiba a helymeghatározáskor: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "messages": "Üzenetek", + "@messages": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nem egy Matrix szerver, akarja használja a {server2} szervert inkább?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "notifications": "Értesítések", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} felhasználó gépel…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Tartózkodási hely lekérése…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Írja le magát", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_op": "Az adott felhasználó hozzáférési szintjének megadása (alapértelmezett: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Válasz küldése reakcióként", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_unban": "Adott felhasználó kitiltásának feloldása a szobához", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "editBlockedServers": "Blokkolt szerverek szerkesztése", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Munkamenet exportálása és az eszköz törlése", + "dehydrateWarning": "Ez nem visszavonható. Bizonyosodjon meg róla, hogy biztonságos helyre menti a fájlt.", + "hydrate": "Visszaállítás mentett fájlból", + "link": "Hivatkozás", + "redactMessage": "Üzenet szerkesztése", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Kérem, írja be PIN kódját", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} hozzád bújik", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Jelölés csoportnak", + "addAccount": "Fiók hozzáadása", + "search": "Keresés", + "@search": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Gülüszemek küldése", + "commandHint_cuddle": "Összebújás küldése", + "sendMessages": "Üzenetek küldése", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Üzenet jelentése", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "participant": "Résztvevő", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Elfelejtett jelszó", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Szoba verzió", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Kérem, igazolja vissza Matrix ID-jét a fiók törléséhez.", + "or": "Vagy", + "@or": { + "type": "String", + "placeholders": {} + }, + "commandHint_hug": "Ölelés küldése", + "reason": "Indok", + "@reason": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Fájl mentése", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "googlyEyesContent": "{senderName} gülüszemeket küld", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "openInMaps": "Megnyitás térképen", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "security": "Biztonság", + "@security": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Nem kép fájl.", + "hugContent": "{senderName} megölel", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Az utoljára olvasott üzenethez ugrás", + "reportErrorDescription": "😭 Sajnos, valami félresiklott. Ha kívánja, jelezheti a bugot a fejlesztőknek.", + "removeYourAvatar": "Profilképének törlése", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Nem támogatott Android verzió", + "oneClientLoggedOut": "Az egyik kliense kijelentkezett", + "setColorTheme": "Szín séma beállítása:", + "supposedMxid": "{mxid}-nek kell lennie", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Felhasználó", + "youAcceptedTheInvitation": "👍 Elfogadta a meghívást", + "youInvitedBy": "📩 {user} jóvoltából kapott meghívást", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "A felhasználó kitiltásra kerül a csevegésből, és nem fog tudni visszajönni egészen a kitiltás feloldásáig.", + "removeDevicesDescription": "Ki fog jelentkezni a készülékről, és többé nem fog tudni fogadni üzeneteket.", + "tryAgain": "Próbálja újra", + "youKickedAndBanned": "🙅 Kirúgta és kitiltotta {user}-t", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "A felhasználó vissza tud jönni a csevegésbe ha akar.", + "pleaseClickOnLink": "Kérem, kattintson a linkre az emailben, és folytassa a műveletet.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "Visszautasította a meghívást", + "messagesStyle": "Üzenetek:", + "newSpaceDescription": "A terek lehetővé teszik a csevegések konszolidációját, ezáltal létrehozva publikus vagy privát közösségeket.", + "chatDescription": "Csevegés leírás", + "pleaseFollowInstructionsOnWeb": "Kérem, kövesse az instrukciókat az oldalon, és nyomjon a tovább gombra.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "encryptThisChat": "A csevegés titkosítása", + "reopenChat": "Csevegés újranyitása", + "addToBundle": "Hozzáadás fiókcsoporthoz", + "spaceIsPublic": "A tér publikus", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "countFiles": "{count} fájl", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Akkor fordulhat elő, ha az üzenet az eszközre való bejelentkezés előtt került küldésre.\n\nAz is elképzelhető, hogy a küldő blokkolta az eszközét, vagy valami probléma lépett fel az internet kapcsolatban.\n\nMás helyen látja az üzenetet? Akkor át tudja másolni ide is! Menjen a Beállítások > Eszközök részbe, és győződjön meg róla, hogy az eszközei megerősítették egymást. Legközelebb amikor ezt a szobát megnyitja, és mind a két kliens az előtérben van, akkor szikronizálódni fognak.\n\nNem akarja elveszíteni a kulcsokat amikor kijelentkezik, vagy eszközt cserél? Győződjön meg róla, hogy bekapcsolta a chat mentést a beállításokban.", + "shareLocation": "Pozíció megosztása", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "pushNotificationsNotAvailable": "Push értesítések nem elérhetőek", + "storeInAppleKeyChain": "Tárolás az Apple KeyChain-be", + "replaceRoomWithNewerVersion": "Szoba cserélése egy újabb verzióra", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "invalidServerName": "Hibás szerver név", + "chatPermissions": "Csevegés engedélyek", + "sender": "Küldő", + "storeInAndroidKeystore": "Tárolás az Android KeyStore-ba", + "makeAdminDescription": "Miután a felhasználót aminisztrátorrá lépteti elő, nem fogja tudni visszavonni döntését, mivel azonos jogosultsági szinttel fognak rendelkezni.", + "synchronizingPleaseWait": "Szinkronizálás... Kérem, várjon.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "editBundlesForAccount": "Fiókcsoportok szerkesztése ehhez a fiókhoz", + "whyIsThisMessageEncrypted": "Miért olvashatatlan ez az üzenet?", + "setChatDescription": "Csevegés leírás beállítása", + "spaceName": "Tér név", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Importálás zip fájlból", + "noOtherDevicesFound": "Nem található más eszköz", + "redactedBy": "{username} által szerkesztve", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Kérem vegye figyelembe, hogy a videó hívások jelenleg béta fázisban vannak. Nem biztos, hogy megfelelően fognak működni, vagy egyáltalán elindulnak egyes platformokon.", + "fileIsTooBigForServer": "Nem küldhető el! A szerver csak {max} határig enged csatolmányokat.", + "verified": "Hitelesített", + "@verified": { + "type": "String", + "placeholders": {} + }, + "readUpToHere": "Olvasás idáig", + "optionalRedactReason": "(Választható) A szerkesztés oka...", + "sendAsText": "Küldés szövegként", + "@sendAsText": { + "type": "String" + }, + "archiveRoomDescription": "A csevegés bekerül az archívumba. Más felhasználók látni fogják, hogy elhagyta a csevegést.", + "exportEmotePack": "Emojicsomag exportálása zip-be", + "setAsCanonicalAlias": "Beállítás alapértelmezett álnévként", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Miért kívánja ezt bejelenteni?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Kísérleti videó hívások", + "redactedByBecause": "{username} által szerkesztve, mivel: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Visszavonta {user} meghívását", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "Kérem, válasszon egy kódot", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Felhasználó jelentése", + "confirmEventUnpin": "Biztosan végleg le akarja venni a kitűzött eseményt?", + "youInvitedUser": "📩 Meghívta {user}-t", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "A fájl mentésre került a következő elérési úton {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "A társalgásban összes résztvevője számára módosításra kerül az üzenet. Ez nem visszavonható.", + "invalidInput": "Hibás bevitel!", + "yourPublicKey": "A publikus kulcsa", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Túl sok egyidejű kérelem. Kérem próbálja meg később!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "doNotShowAgain": "Ne mutassa újra", + "report": "jelentés", + "status": "Állapot", + "@status": { + "type": "String", + "placeholders": {} + }, + "unverified": "Hitelesítetlen", + "screenSharingTitle": "képernyő megosztás", + "youBannedUser": "Letitotta {user} felhasználót", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} bekopogott", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Hivatkozás megnyitása böngészőben", + "messageInfo": "Üzenet információ", + "disableEncryptionWarning": "Biztonsági okokból nem kapcsolható ki egy korábban bekapcsolt csevegés titkosítás.", + "directChat": "Privát csevegés", + "wrongPinEntered": "Hibás pinkódot adott meg! Próbálja újra {seconds} mp múlva...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Gépelési értesítés megjelenítése", + "inviteGroupChat": "📨 Meghívó a csoportba", + "foregroundServiceRunning": "Ez az értesítés akkor jelenik meg ha az előtéri szolgáltatás fut.", + "voiceCall": "Hang hívás", + "importEmojis": "Emojik importálása", + "wasDirectChatDisplayName": "Üres csevegés (korábban {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Még nincs csevegő szoba leírás.", + "removeFromBundle": "Eltávolítás a fiókcsoportból", + "whoCanPerformWhichAction": "Ki milyen műveletet végezhet", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "learnMore": "Tudjon meg többet", + "users": "Felhasználók", + "openGallery": "Galéria megnyitása", + "chatDescriptionHasBeenChanged": "A csevegés leírás megváltozott", + "bundleName": "Fiókcsoport neve", + "removeFromSpace": "Eltávolítás a térről", + "roomUpgradeDescription": "A csevegés újra elkészül az új szoba verzióval. Minden résztvevő értesítést kap, hogy át kell állniuk az új csevegésre. További információkért a szoba verziókról látogasson el a https://spec.matrix.org/latest/rooms/ címre", + "pleaseEnterANumber": "Adjon meg egy 0-nál nagyobb számot", + "youKicked": "👞 Kirúgta {user}-t", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "jump": "Ugrás", + "reactedWith": "{sender} a következőképp reagált: {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Ez sajnos nem lehetséges", + "shareInviteLink": "Meghívó link megosztása", + "commandHint_markasdm": "Szoba megjelölése mint közvetlen csevegő szoba az adott Matrix ID-nél", + "emoteKeyboardNoRecents": "A nemrég használt hangulatjelek fognak itt megjelenni...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Becsatlakozott a csevegésbe", + "markAsRead": "Olvasottként megjelölés", + "replace": "Kicserél", + "youUnbannedUser": "Levette a letiltást {user}-ről", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Új tér", + "emojis": "Hangulatjelek", + "createGroup": "Csoport létrehozása", + "time": "Idő", + "custom": "Egyedi", + "noBackupWarning": "Figyelem! Ha nem kapcsolja be a csevegés mentést, elveszíti a hozzáférést a tikosított üzeneteihez. Erősen ajánlott a csevegés mentés bekapcsolása kijelentkezés előtt.", + "kickUserDescription": "A felhasználó kirúgásra került a csevegésből, de nincs kitiltva. Publikus csevegés esetén a felhasználó bármikor visszatérhet.", + "importNow": "Importálás most", + "pinMessage": "Kitűzés a szobában", + "invite": "Meghívás", + "unsupportedAndroidVersionLong": "Ehhez a funkcióhoz egy újabb Android verzió kell. Kérem ellenőrizze be van e frissítve teljesen készüléke, esetlegesen van e LineageOS támogatás hozzá.", + "storeSecurlyOnThisDevice": "Biztonságos tárolás az eszközön", + "screenSharingDetail": "Megosztja a képernyőjét a FluffyChat-ben", + "placeCall": "Tér hívás", + "block": "Blokkolás", + "blockedUsers": "Blokkolt felhasználók", + "blockListDescription": "Az Önt zavaró felhasználókat blokkolhatja. A blokkolt listán található felhasználóktól nem tud fogadni üzenetet vagy szoba meghívást.", + "blockUsername": "Felhasználónév ignorálása", + "yourGlobalUserIdIs": "A globális felhasználó-ID-je: ", + "noUsersFoundWithQuery": "\"{query}\"-vel nem található felhasználó. Ellenőrizze nincs e elírás.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} elfogadta a kulcs megerősítést", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "searchForUsers": "Keressen @felhasználókat...", + "joinSpace": "Csatlakozás a térre", + "publicSpaces": "Nyilvános terek", + "databaseMigrationTitle": "Adatbázis optimalizálva", + "leaveEmptyToClearStatus": "Hagyja üresen a státusz kitörléséhez.", + "pleaseEnterYourCurrentPassword": "Kérem adja meg jelenlegi jelszavát", + "newPassword": "Új jelszó", + "addChatOrSubSpace": "Csevegés vagy al-tér hozzáadása", + "pleaseChooseAStrongPassword": "Kérem válasszon egy erős jelszót", + "passwordsDoNotMatch": "A jelszavak nem egyeznek", + "passwordIsWrong": "Hibás a beírt jelszava", + "thisDevice": "Ez az eszköz:", + "sendTypingNotificationsDescription": "A csevegés többi tagja látja amikor gépel.", + "sendReadReceiptsDescription": "A csevegés többi tagja láthatja, ha olvasta az üzeneteiket.", + "sendReadReceipts": "Olvasási igazolás küldése", + "formattedMessages": "Formázott üzenetek", + "formattedMessagesDescription": "Formázott szöveg - mint például félkövér - megjelenítése \"markdown\"-al.", + "verifyOtherUser": "🔐 Más felhasználó igazolása", + "verifyOtherDevice": "🔐 Más eszköz hitelesítése", + "sessionLostBody": "A munkamenete elvesződött. Kérem jelentse ezt a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Megpróbálkozunk visszaállítani a munkamenetét egy korábbi mentésből. Kérem jelezze a hibát a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "searchChatsRooms": "Keressen #csevegéseket, @felhasználókat...", + "wrongRecoveryKey": "Sajnos, úgy tűnik hibásan adta meg a visszaállítási kulcsot.", + "commandHint_sendraw": "Tiszta json küldése", + "databaseMigrationBody": "Kérem várjon. Ez igénybe vehet valamennyi időt.", + "initAppError": "Hiba lépett fel az app indítása során", + "canceledKeyVerification": "{sender} visszautasította a kulcs megerősítést", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} befejezte a kulcs megerősítést", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} készen áll a kulcs megerősítésre", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} kulcs megerősítést kér", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} elkezdte a kulcs megerősítést", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Bejövő üzenetek", + "nothingFound": "Nincs találat...", + "select": "Kiválaszt", + "stickers": "Matricák", + "discover": "Felfedezés", + "groupName": "Csoport név", + "createGroupAndInviteUsers": "Hozzon létre egy csoportot és hívjon meg felhasználókat", + "groupCanBeFoundViaSearch": "A csoportokat kereséssel találhatja meg", + "verifyOtherUserDescription": "Ha megerősít egy másik felhasználót, akkor teljesen biztos lehet abban kivel cseveg. 💪\n\nA megerősítési folyamat kezdetekor megjelenik egy felugró ablak mindkettőjüknél. Ekkor egy hangulatjel vagy szám sor összehasonlítási folyamat veszi kezdetét.\n\nA legpraktikusabb módja ennek, hogy találkozzanak, vagy videó hívás során beszéljék meg. 👭", + "verifyOtherDeviceDescription": "Amikor egy másik eszközt hitelesít, az eszközök kulcsokat cserélnek egymás között, ezáltal növelve az összbiztonságot. 💪 Amikor megkezdődik a folyamat, mind a két eszközön megjelenik egy felugró üzenet. Hangulatjelek és számok sorozata fog megjelenni, amit össze tud hasonlítani a két eszközön. Érdemes tehát mind a két eszközt a közelben tartani. 🤳", + "accessAndVisibility": "Hozzáférés és láthatóság", + "accessAndVisibilityDescription": "Ki számára engedélyezett a csevegéshez való csatlakozás, és hogyan találhatja azt meg.", + "calls": "Hívások", + "hideInvalidOrUnknownMessageFormats": "Érvénytelen vagy ismeretlen üzenetformátum elrejtése", + "passwordRecoverySettings": "Jelszó-helyreállítási beállítások", + "noOneCanJoin": "Senki sem csatlakozhat", + "chatCanBeDiscoveredViaSearchOnServer": "Csevegés felfedezhető a {server} szerveren történő kereséssel", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appLockDescription": "Applikáció zárolása PIN kóddal használaton kívül", + "customEmojisAndStickers": "Egyedi hangulatjelek és matricák", + "customEmojisAndStickersBody": "Egyedi hangulatjelek és matricák hozzáadása, amelyek bármely csevegésben felhasználhatóak.", + "publicChatAddresses": "Nyilvános csevegés címek", + "createNewAddress": "Új cím létrehozása", + "noDatabaseEncryption": "Adatbázis titkosítás nem támogatott ezen a platformon", + "thereAreCountUsersBlocked": "Jelenleg {count} felhasználó van letiltva.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "unreadChatsInApp": "{appname}: {unread} olvasatlan csevegések", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "searchIn": "Keresés a \"{chat}\" csevegésben...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "Fájlok", + "commandHint_unignore": "Adott matrix ID figyelembe vétele", + "globalChatId": "Átfogó csevegő ID", + "hideRedactedMessages": "Szerkesztett üzenetek elrejtése", + "hideRedactedMessagesBody": "Ha valaki szerkeszti az üzenetét, ez az üzenet nem jelenik meg a csevegés során.", + "knocking": "Bekopogás", + "usersMustKnock": "A felhasználóknak be kell kopogniuk", + "knock": "Kopogás", + "searchMore": "További keresés...", + "gallery": "Galéria", + "commandHint_ignore": "Adott matrix ID figyelmen kívül hagyása", + "unread": "Olvasatlan", + "space": "Tér", + "markAsUnread": "Olvasatlannak jelölés", + "moderatorLevel": "{level} - Moderátor", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Általános csevegés beállítások módosítása", + "updateInstalled": "🎉 {version} verziójú frissítés telepítve!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Változásnapló", + "sendCanceled": "Küldés visszavonva", + "noChatsFoundHere": "Itt még nem található csevegés. Kezdjen egy új csevegést valakivel a lenti gomb segítéségvel. ⤵️", + "goToSpace": "Ugrás a {space} térre", + "@goToSpace": { + "type": "String", + "space": {} + }, + "changeTheCanonicalRoomAlias": "Csevegés fő, nyilvános címének változtatása", + "chatPermissionsDescription": "Adja meg milyen erősségi szint kell egyes csevegési művelethez. A 0, 50 és 100-as szintek általában felhasználókat, moderátorokat és adminisztrátorokat jelölnek de bármilyen szintezés lehetséges.", + "userLevel": "{level} - Felhasználó", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Adminisztrátor", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Más felhasználók meghívása a csevegésbe", + "changeTheVisibilityOfChatHistory": "Csevegési előzmények láthatóságának változtatása", + "changeTheChatPermissions": "Csevegés engedélyek változtatása", + "sendRoomNotifications": "@szoba értesítés küldése", + "changeTheDescriptionOfTheGroup": "Csevegés leírásának változtatása", + "swipeRightToLeftToReply": "Húzza balra a válaszoláshoz", + "loginWithMatrixId": "Bejelentkezés Matrix-ID-vel", + "doesNotSeemToBeAValidHomeserver": "Nem tűnik kompatibilisnek a Mátrix-kiszolgálónak. Hibás a hivatkozás?", + "noMoreChatsFound": "Nem található több csevegés...", + "checkList": "Tennivalók listája", + "countInvited": "{count} meghívott", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendImages": "{count} kép küldése", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "aboutHomeserver": "Névjegy {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Szoba frissítése a megadott szoba verzióra", + "oneOfYourDevicesIsNotVerified": "Egyik készüléke nem hitelesített", + "synchronizingPleaseWaitCounter": " Szinkronizálás… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "calculatingFileSize": "Fájl méret kalkulálása...", + "sendingAttachment": "Csatolmány küldése...", + "contentNotificationSettings": "Tartalom értesítési beállítások", + "generalNotificationSettings": "Átalános értesítési beállítások", + "roomNotificationSettings": "Szoba értesítési beállítások", + "notificationRuleMasterDescription": "Felülír minden más szabályt, és kikapcsolja az összes értesítést.", + "notificationRuleInviteForMe": "Meghívás Számomra", + "notificationRuleMemberEventDescription": "Némítja a tagi események értesítéseit.", + "notificationRuleIsUserMention": "Felhasználó Említése", + "notificationRuleTombstoneDescription": "Értesíti a felhasználót a szoba deaktiválás üzenetekről.", + "notificationRuleCall": "Hívás", + "notificationRuleEncryptedRoomOneToOneDescription": "Értesíti a felhasználót a titkosított négyszemközti szobákban levő üzenetekről.", + "notificationRuleRoomOneToOne": "Négyszemközti Szoba", + "notificationRuleMessage": "Üzenet", + "notificationRuleMessageDescription": "Értesíti a felhasználót az általános üzenetekről.", + "notificationRuleEncrypted": "Titkosított", + "notificationRuleEncryptedDescription": "Értesíti a felhasználót a titkosított szobákban levő üzenetekről.", + "notificationRuleServerAcl": "Némítja a Szerver ACL Eseményeket", + "unknownPushRule": "'{rule}' egy ismeretlen push szabály", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "compress": "Tömörítés", + "boldText": "Félkövér szöveg", + "italicText": "Dőlt szöveg", + "strikeThrough": "Áthúzott", + "appWantsToUseForLogin": "Használja a '{server}' szervert a bejelentkezéshez", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "otherPartyNotLoggedIn": "A másik fél jelenleg nincs bejelentkezve, emiatt nem fogadhat üzeneteket!", + "appWantsToUseForLoginDescription": "Ezennel engedélyezi az applikáció és weboldal számára, hogy információkat gyűjtsön Önről.", + "waitingForServer": "Várakozás a szerverre...", + "open": "Megnyitás", + "notificationRuleSuppressNotices": "Minden automata üzenetet némít", + "notificationRuleSuppressNoticesDescription": "Némít minden automata klienstől érkező értesítést mint például botok.", + "newChatRequest": "📩 Új csevegés kérelem", + "notificationRuleContainsUserNameDescription": "Értesíti a felhasználót, ha az üzenet tartalmazza a nevét.", + "notificationRuleInviteForMeDescription": "Értesíti a felhasználót szoba meghívás esetén.", + "notificationRuleMemberEvent": "Tagi Esemény", + "notificationRuleIsUserMentionDescription": "Értesíti a felhasználót, ha közvetlenül említésre kerül az üzenetben.", + "notificationRuleIsRoomMention": "Szoba Említés", + "notificationRuleIsRoomMentionDescription": "Értesíti a felhasználót szoba említéskor.", + "notificationRuleRoomnotif": "Szoba Értesítés", + "notificationRuleRoomnotifDescription": "Értesíti a felhasználót ha az üzenet tartalmazza a '@szoba' említést.", + "crossVerifiedDevicesIfEnabled": "Kereszt-hitelesített eszközök ha be van kapcsolva", + "crossVerifiedDevices": "Kereszt-hitelesített eszközök", + "serverInformation": "Szerver információ:", + "unableToJoinChat": "Nem csatlakozhat a csevegéshez. Elképzelhető, hogy a másik fél már kilépett.", + "userSpecificNotificationSettings": "Felhasználó specifikus értesítés beállítások", + "otherNotificationSettings": "Egyéb értesítés beállítások", + "notificationRuleContainsUserName": "Felhasználó nevet tartalmaz", + "notificationRuleContainsDisplayName": "Megjelenített Nevet Tartalmaz", + "notificationRuleReaction": "Reakció", + "notificationRuleReactionDescription": "Némítja a reakciók értesítéseit.", + "notificationRuleRoomServerAcl": "Szoba Szerver ACL", + "notificationRuleRoomServerAclDescription": "Némítja a szoba szerver hozzáférési kezelő lista (ACL) értesítéseket.", + "notificationRuleSuppressEdits": "Szerkesztések némítása", + "notificationRuleSuppressEditsDescription": "Némítja a szerkesztett üzenetek értesítéseit.", + "notificationRuleEncryptedRoomOneToOne": "Titkosított Négyszemközti Szoba", + "notificationRuleRoomOneToOneDescription": "Értesíti a felhasználót a négyszemközti szobában levő üzenetekről.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Értesíti a felhasználót a Jitsi widget eseményekről.", + "sentVoiceMessage": "🎙️ {duration} - {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Ha törli ezt az értesítési beállítást, később nem vonható vissza.", + "manageAccount": "Fiók kezelése", + "enterNewChat": "Belépés új csevegésbe", + "blur": "Homályosít:", + "name": "Név", + "continueText": "Folytatás", + "opacity": "Átlátszóság:", + "addLink": "Hivatkozás hozzáadása", + "invalidUrl": "Helytelen hivatkozás", + "setWallpaper": "Háttér beállítás", + "noContactInformationProvided": "A szervertől nem érkezett vissza kapcsolati információ", + "contactServerSecurity": "Kapcsolatfelvétel a szerver biztonsággal", + "contactServerAdmin": "Kapcsolatfelvétel a szerver adminnal", + "supportPage": "Támogatási oldal", + "version": "Verzió", + "verifiedDevicesOnly": "Csak hitelesített eszközök", + "website": "Weboldal", + "pleaseFillOut": "Kérem töltse ki", + "previous": "Előző", + "optionalMessage": "(Választható) üzenet...", + "takeAPhoto": "Készítsen egy fotót", + "recordAVideo": "Vegyen fel egy videót", + "notSupportedOnThisDevice": "Nem támogatott ezen az eszközön", + "noticeChatBackupDeviceVerification": "Megjegyzés: Minden eszköze amit a csevegés mentéshez kapcsol, automatikusan hitelesítésre kerül.", + "notificationRuleMaster": "Minden értesítés némítása", + "notificationRuleContainsDisplayNameDescription": "Értesíti a felhasználót, ha közvetlenül említésre kerül a megjelenített neve az üzenetben.", + "notificationRuleTombstone": "Sírkő", + "shareKeysWithDescription": "Mely eszközök tekinthetőek megbízhatónak, hogy olvashassák a titkosított csevegéseket is?", + "allDevices": "Minden eszköz", + "notificationRuleServerAclDescription": "Némítja a Szerver ACL események értesítéseit.", + "notificationRuleCallDescription": "Értesíti a felhasználót a hívásokról.", + "more": "Több", + "shareKeysWith": "Kulcsok megosztása...", + "approve": "Jóváhagy", + "youHaveKnocked": "Kopogott", + "pleaseWaitUntilInvited": "Kérem várjon, amíg valaki a szobából behívja Önt.", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ia.arb b/lib/l10n/intl_ia.arb new file mode 100644 index 0000000000..39a0392fed --- /dev/null +++ b/lib/l10n/intl_ia.arb @@ -0,0 +1,1992 @@ +{ + "repeatPassword": "Repeter le contrasigno", + "notAnImage": "Non es un file de imagine.", + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importEmojis": "Importar emojis", + "importFromZipFile": "Importar ab un file .zip", + "importNow": "Importar ora", + "exportEmotePack": "Exportar pacchetto de emotes como un .zip", + "replace": "Reimplaciar", + "about": "A proposito de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Acceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} acceptava tu invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conto", + "@account": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Adder email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "Isto deberea esser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@none": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_id.arb b/lib/l10n/intl_id.arb new file mode 100644 index 0000000000..686e051fa8 --- /dev/null +++ b/lib/l10n/intl_id.arb @@ -0,0 +1,2700 @@ +{ + "@@last_modified": "2021-08-14 12:41:10.002360", + "setAsCanonicalAlias": "Atur sebagai alias utama", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versi ruangan", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "chats": "Obrolan", + "@chats": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Blokir Perangkat", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Apakah kamu yakin ingin keluar?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Apakah kamu yakin?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "archive": "Arsip", + "@archive": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Siapa saja dapat bergabung", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} menjawab panggilan", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "account": "Akun", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} menerima undangannya", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "accept": "Terima", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "Tentang", + "@about": { + "type": "String", + "placeholders": {} + }, + "isTyping": "sedang mengetik…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} mengundang kamu ke FluffyChat. \n1. Kunjungi fluffychat.im dan instal aplikasi\n2. Daftar atau masuk \n3. Buka tautan undangan: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Pengguna yang diundang saja", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} mengundang {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invited": "Diundang", + "@invited": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Undang kontak ke {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "inviteContact": "Undang kontak", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frasa sandi atau kunci pemulihan yang salah", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Saya sudah klik tautannya", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Pengguna yang diabaikan", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Sembunyikan peristiwa tidak dikenal", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "help": "Bantuan", + "@help": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} telah mencabut undangan untuk {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsCanJoin": "Tamu bisa bergabung", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Tamu dilarang", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grup dengan {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "groupIsPublic": "Grup bersifat publik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Dari undangan", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Dari bergabung", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "forward": "Teruskan", + "@forward": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Masukkan alamat email", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} mengakhiri panggilan", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryption": "Enkripsi", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Terenkripsi", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Kamu tidak akan bisa menonaktifkan enkripsi. Apakah kamu yakin?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktifkan paket emote secara global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Chat kosong", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Shortcode emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Pengaturan Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Shortcode emote tidak valid!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote sudah ada!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Edit alias ruangan", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edit nama tampilan", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "edit": "Sunting", + "@edit": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Unduh berkas", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Nama tampilan telah diubah", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chat Langsung", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "devices": "Perangkat", + "@devices": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Hapus pesan", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Hapus akun", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "delete": "Hapus", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Ini akan menonaktifkan akun penggunamu. Ini tidak bisa dibatalkan! Apakah kamu yakin?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "currentlyActive": "Aktif", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} membuat obrolan ini", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "create": "Buat", + "@create": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} anggota", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "couldNotDecryptMessage": "Tidak dapat mendekripsikan pesan: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "copyToClipboard": "Salin ke papan klip", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Salin", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Disalin ke papan klip", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Cadangan obrolan", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chat": "Obrolan", + "@chat": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Enkripsi telah rusak", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ubah avatarmu", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ubah nama grup", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ubah homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Ubah kata sandi", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "{username} mengubah tautan undangan", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} mengubah alias ruangan", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} mengubah avatarnya", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} mengubah aturan bergabung ke: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} mengubah aturan bergabung", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} mengubah visibilitas sejarah ke: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} mengubah visibilitas sejarah", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} mengubah aturan akses tamu ke: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} mengubah aturan akses tamu", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} mengubah nama tampilan ke: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} mengubah izin obrolan", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} mengubah avatar obrolan", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "Ganti nama perangkat", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Tidak bisa membuka URI ini {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "cancel": "Batal", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "blocked": "Diblokir", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} mencekal {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "Dicekal", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "Cekal dari obrolan", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Kirim dengan enter", + "badServerLoginTypesException": "Homeserver ini mendukung tipe masuk ini:\n{serverVersions}\nTetapi aplikasi ini mendukung:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "Mainkan stiker beranimasi dan emote secara otomatis", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "askVerificationRequest": "Terima permintaan verifikasi dari {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "askSSSSSign": "Untuk dapat menandatangani orang lain, silakan masukkan frasa sandi atau kunci pemulihan penyimpanan aman kamu.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Apakah pengguna tamu diizinkan untuk bergabung?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Kunci aplikasi", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "all": "Semua", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Tambah ke space", + "addEmail": "Tambah email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Enkripsi tidak diaktifkan", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontak telah diundang ke grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Bandingkan angka", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Bandingkan emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "close": "Tutup", + "@close": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Bersihkan arsip", + "chooseAStrongPassword": "Pilih kata sandi yang kuat", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detail obrolan", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} mengaktifkan enkripsi ujung ke ujung", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "loadingPleaseWait": "Memuat… Mohon tunggu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Muat {count} anggota", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "leftTheChat": "Keluar dari obrolan", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "leave": "Tinggalkan", + "@leave": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Terakhir aktif: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "kickFromChat": "Keluarkan dari obrolan", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username} mengeluarkan dan mencekal {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kicked": "👞 {username} mengeluarkan {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinRoom": "Bergabung dengan ruangan", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} telah bergabung dengan obrolan", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "loadMore": "Muat lebih banyak…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Tidak ada izin", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Kamu belum menambahkan cara untuk memulihkan kata sandimu.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Perpesanan Awan Firebase sepertinya tidak tersedia di perangkatmu. Untuk dapat menerima notifikasi dorongan, kami menyarankan memasang ntfy. Dengan ntfy atau penyedia UnifiedPush lainnya, kamu bisa menerima notifikasi dorongan dengan cara yang aman. Kamu bisa mengunduh ntfy dari Play Store atau F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Kamu hanya bisa mengaktifkan enkripsi setelah ruangan tidak lagi dapat diakses secara publik.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Tidak ada emote yang ditemukan. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "next": "Lanjut", + "@next": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Permintaan verifikasi baru!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Pesan baru di FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Chat baru", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Bisukan obrolan", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "mention": "Sebutkan", + "@mention": { + "type": "String", + "placeholders": {} + }, + "logout": "Keluar", + "@logout": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Masuk ke {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "login": "Masuk", + "@login": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Tidak ada ruangan yang ditemukan…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "verified": "Terverifikasi", + "@verified": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 {username} keluar dari obrolan", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeYourAvatar": "Hapus avatarmu", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Mohon ikuti petunjuk di situs web dan tekan lanjut.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Sayangnya, terjadi kesalahan saat mengatur pemberitahuan push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Cadangan Kunci Online dinyalakan", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifikasi", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Kunci publikmu", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Kamu telah dicekal dari obrolan ini", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Kamu tidak berpartisipasi lagi di obrolan ini", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "you": "Kamu", + "@you": { + "type": "String", + "placeholders": {} + }, + "yes": "Ya", + "@yes": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Tulis pesan…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Dengan alamat ini kamu bisa memulihkan kata sandimu.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kenapa kamu ingin melaporkannya?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Siapa yang dapat bergabung ke grup ini", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Siapa yang dapat melakukan tindakan apa", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Kami mengirim kamu sebuah email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "warning": "Peringatan!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Menunggu pengguna untuk menerima angka…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Menunggu pengguna untuk menerima emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Menunggu pengguna untuk menerima permintaan…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Pesan suara", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Terlihat untuk semua orang", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Terlihat untuk semua anggota", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilitas sejarah obrolan", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Panggilan video", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Memverifikasi akun lain", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Kamu berhasil memverifikasi!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Mulai Verifikasi", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} mengirim peristiwa {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "userIsTyping": "{username} sedang mengetik…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "{username} dan {username2} sedang mengetik…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} dan {count} lainnya sedang mengetik…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "unpin": "Lepaskan pin", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Bunyikan obrolan", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Peristiwa tidak dikenal '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unknownEncryptionAlgorithm": "Algoritma enkripsi tidak dikenal", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Perangkat tidak dikenal", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Hilangkan Pemblokiran Perangkat", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} menghilangkan cekalan {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "tryToSendAgain": "Coba kirim lagi", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Terlalu banyak permintaan. Coba lagi nanti!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Cocok", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Tidak Cocok", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Menyinkronkan... Mohon tunggu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "submit": "Kirim", + "@submit": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Apa kabar hari ini?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} memulai panggilan", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "spaceName": "Nama space", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space publik", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kode sumber", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "skip": "Lewat", + "@skip": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Bagikan lokasi", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} membagikan lokasinya", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "share": "Bagikan", + "@share": { + "type": "String", + "placeholders": {} + }, + "settings": "Pengaturan", + "@settings": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Tetapkan status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} mengirim informasi panggilan", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} mengirim video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} mengirim stiker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} mengirim gambar", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} mengirim suara", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁 {username} mengirim file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "security": "Keamanan", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "Cari", + "@search": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Laporkan pesan", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "reply": "Balas", + "@reply": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Menggantikan ruangan dengan versi baru", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Hilangkan cekalan dari obrolan", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "remove": "Hapus", + "@remove": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} menolak undangannya", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Tolak", + "@reject": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Hapus pesan", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} menghapus sebuah peristiwa", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pleaseEnterYourPassword": "Mohon masukkan kata sandimu", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Mohon klik tautan di email dan lanjut.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Mohon pilih kode sandi", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Pemulihan kata sandi", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Kata sandi telah diubah", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Lupa kata sandi", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "password": "Kata sandi", + "@password": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frasa sandi atau kunci pemulihan", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "participant": "Peserta", + "@participant": { + "type": "String", + "placeholders": {} + }, + "or": "Atau", + "@or": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Buka di peta", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "bundleName": "Nama bundel", + "removeFromBundle": "Hilangkan dari bundel ini", + "addToBundle": "Tambah ke bundel", + "editBundlesForAccount": "Edit bundel untuk akun ini", + "addAccount": "Tambah akun", + "oneClientLoggedOut": "Salah satu klienmu telah keluar", + "openCamera": "Buka kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Buka aplikasi untuk membaca pesan", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, ada yang salah…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Mendapatkan lokasi…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} pengguna sedang mengetik…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "scanQrCode": "Pindai kode QR", + "noMatrixServer": "{server1} itu bukan server Matrix, gunakan {server2} saja?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "no": "Tidak", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Tidak ada koneksi ke server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "messages": "Pesan", + "@messages": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Layanan lokasi dinonaktifkan. Mohon diaktifkan untuk bisa membagikan lokasimu.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Izin lokasi ditolak. Mohon memberikan izin untuk bisa membagikan lokasimu.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Terang", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "ignore": "Abaikan", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "groups": "Grup", + "@groups": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Ukuran font", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Gagal mendapat lokasi: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "enableEncryption": "Aktifkan enkripsi", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edit avatar ruangan", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Edit server yang diblokir", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Level izin bawaan untuk pengguna baru", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Gelap", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Space baru", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Konten telah dilaporkan ke admin server", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurasi obrolan", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} bukan sebuah perintah.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "Perintah tidak valid", + "@commandInvalid": { + "type": "String" + }, + "commandHint_unban": "Hilangkan cekalan untuk pengguna yang dicantumkan dari ruangan ini", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "Kirim teks", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "Kirim balasan sebagai reaksi", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "Kirim teks yang tidak diformat", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "Tetapkan tingkat kekuatan pengguna yang dicantum (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Tetapkan nama tampilanmu untuk ruangan ini", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "Tetapkan gambarmu untuk ruangan ini (oleh uri-mxc)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_me": "Jelaskan dirimu", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Tinggalkan ruangan ini", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "Keluarkan pengguna yang dicantum dari ruangan ini", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Gabung ke ruangan yang dicantum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "Undang pengguna yang dicantum ke ruangan ini", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_html": "Kirim teks yang diformat dengan HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Cekal pengguna yang dicantumkan dari ruangan ini", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "changeTheme": "Ubah tema", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Kirim video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Kirim pesan", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Kirim gambar", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Kirim file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Kirim suara", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Kirim sebagai teks", + "@sendAsText": { + "type": "String" + }, + "sendAMessage": "Kirim pesan", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "send": "Kirim", + "@send": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Simpan file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Ruangan telah ditingkatkan", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Hapus semua perangkat lain", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "reason": "Alasan", + "@reason": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Ruangan Publik", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privasi", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Mohon masukkan nama penggunamu", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Masukkan pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "link": "Tautan", + "unverified": "Tidak terverifikasi", + "repeatPassword": "Ulangi kata sandi", + "messageInfo": "Informasi pesan", + "time": "Waktu", + "sender": "Pengirim", + "openGallery": "Buka galeri", + "removeFromSpace": "Hilangkan dari space", + "commandHint_clearcache": "Bersihkan tembolok", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Buang sesi", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Mulai sebuah obrolan langsung\nGunakan --no-encryption untuk menonaktifkan enkripsi", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Buat sebuah grup obrolan kosong\nGunakan --no-encryption untuk menonaktifkan enkripsi", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "markAsRead": "Tandai sebagai dibaca", + "reportUser": "Laporkan pengguna", + "reactedWith": "{sender} bereaksi dengan {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emoji", + "pinMessage": "Sematkan ke ruangan", + "confirmEventUnpin": "Apakah kamu yakin untuk melepaskan pin peristiwa ini secara permanen?", + "unsupportedAndroidVersionLong": "Fitur ini memerlukan versi Android yang baru. Mohon periksa untuk pembaruan atau dukungan LineageOS.", + "unsupportedAndroidVersion": "Versi Android tidak didukung", + "placeCall": "Lakukan panggilan", + "voiceCall": "Panggilan suara", + "videoCallsBetaWarning": "Dicatat bahwa panggilan video sedang dalam beta. Fitur ini mungkin tidak berkerja dengan benar atau tidak berkerja sama sekali pada semua platform.", + "experimentalVideoCalls": "Panggilan video eksperimental", + "youInvitedBy": "📩 Kamu telah diundang oleh {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Kamu mengundang {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Kamu mengeluarkan {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Kamu mengeluarkan dan mencekal {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Kamu menolak undangannya", + "youJoinedTheChat": "Kamu bergabung ke obrolan", + "youAcceptedTheInvitation": "👍 Kamu menerima undangannya", + "youBannedUser": "Kamu mencekal {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Kamu telah membatalkan undangan untuk {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Kamu membatalkan cekalan {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Pengguna", + "storeInAppleKeyChain": "Simpan di Apple KeyChain", + "storeInAndroidKeystore": "Simpan di Android KeyStore", + "storeSecurlyOnThisDevice": "Simpan secara aman di perangkat ini", + "countFiles": "{count} file", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hydrate": "Pulihkan dari file cadangan", + "dehydrate": "Ekspor sesi dan bersihkan perangkat", + "dehydrateWarning": "Tindakan ini tidak dapat diurungkan. Pastikan kamu telah menyimpan file cadangan dengan aman.", + "custom": "Kustom", + "user": "Pengguna", + "confirmMatrixId": "Mohon konfirmasi ID Matrix Anda untuk menghapus akun Anda.", + "supposedMxid": "Ini seharusnya {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Tandai sebagai ruangan pesan langsung untuk ID Matrix yang ditentukan", + "commandHint_markasgroup": "Tandai sebagai grup", + "screenSharingTitle": "membagikan layar", + "noKeyForThisMessage": "Hal ini bisa terjadi jika pesan dikirim sebelum kamu masuk ke akunmu di perangkat ini.\n\nMungkin juga pengirim telah memblokir perangkatmu atau ada yang tidak beres dengan koneksi internet.\n\nApakah kamu bisa membaca pesan pada sesi lain? Maka kamu bisa mentransfer pesan dari sesi tersebut! Buka Pengaturan > Perangkat dan pastikan bahwa perangkat Anda telah ditandatangani secara silang. Ketika kamu membuka ruangan di lain waktu dan kedua sesi berada di latar depan, kunci akan ditransmisikan secara otomatis.\n\nApakah kamu tidak mau kehilangan kunci saat keluar atau berpindah perangkat? Pastikan bahwa kamu telah mengaktifkan cadangan obrolan dalam pengaturan.", + "foregroundServiceRunning": "Notifikasi ini ditampilkan ketika layanan latar depan berjalan.", + "whyIsThisMessageEncrypted": "Mengapa pesan ini tidak bisa dibaca?", + "newSpace": "Space baru", + "screenSharingDetail": "Kamu membagikan layarmu di FluffyChat", + "doNotShowAgain": "Jangan tampilkan lagi", + "hugContent": "{senderName} memeluk kamu", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} mengirim mata googly", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} berpelukan dengan kamu", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Kirim mata googly", + "commandHint_hug": "Kirim pelukan", + "commandHint_cuddle": "Kirim berpelukan", + "wasDirectChatDisplayName": "Obrolan kosong (sebelumnya {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Fitur space bisa membantu untuk memisahkan obrolanmu dan membuat komunitas pribadi atau publik.", + "sorryThatsNotPossible": "Maaf... itu tidak mungkin", + "encryptThisChat": "Enkripsi obrolan ini", + "disableEncryptionWarning": "Demi keamanan kamu tidak bisa menonaktifkan enkripsi dalam sebuah obrolan di mana sebelumbya sudah diaktifkan.", + "reopenChat": "Buka obrolan lagi", + "noBackupWarning": "Peringatan! Tanpa mengaktifkan cadangan percakapan, kamu akan kehilangan akses ke pesan terenkripsimu. Disarankan untuk mengaktifkan cadangan percakapan terlebih dahulu sebelum keluar dari akun.", + "noOtherDevicesFound": "Tidak ada perangkat lain yang ditemukan", + "fileIsTooBigForServer": "Tidak dapat mengirim! Server hanya mendukung lampiran sampai dengan {max}.", + "fileHasBeenSavedAt": "Berkas telah disimpan di {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Pergi ke pesan terakhir dibaca", + "readUpToHere": "Baca sampai sini", + "jump": "Lompat", + "openLinkInBrowser": "Buka tautan dalam peramban", + "report": "laporkan", + "reportErrorDescription": "😭 Aduh. Ada yang salah. Jika kamu mau, kamu bisa melaporkan kutu ini kepada para pengembang.", + "notAnImage": "Bukan berkas gambar.", + "importNow": "Impor sekarang", + "importFromZipFile": "Impor dari berkas .zip", + "exportEmotePack": "Ekspor paket Emote sebagai .zip", + "replace": "Ganti", + "importEmojis": "Impor Emoji", + "sendTypingNotifications": "Kirim notifikasi pengetikan", + "createGroup": "Buat grup", + "tryAgain": "Coba ulang", + "messagesStyle": "Pesan:", + "shareInviteLink": "Bagikan tautan undangan", + "invalidServerName": "Nama server tidak valid", + "chatPermissions": "Perizinan obrolan", + "chatDescription": "Deskripsi obrolan", + "chatDescriptionHasBeenChanged": "Deskripsi obrolan diubah", + "noChatDescriptionYet": "Deskripsi obrolan belum dibuat.", + "redactMessageDescription": "Pesan akan dihilangkan untuk semua anggota dalam percakapan ini. Ini tidak dapat diurungkan.", + "optionalRedactReason": "(Opsional) Alasan menghilangkan pesan ini...", + "redactedBy": "Dihilangkan oleh {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Chat langsung", + "redactedByBecause": "Dihilangkan oleh {username} karena: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Lihat deskripsi obrolan", + "setColorTheme": "Atur tema warna:", + "invite": "Undang", + "inviteGroupChat": "📨 Undangan percakapan grup", + "emoteKeyboardNoRecents": "Emote yang telah digunakan akan muncul di sini...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Masukan tidak valid!", + "wrongPinEntered": "PIN yang dimasukkan salah! Coba lagi dalam {seconds} detik...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Pengguna akan dicekal dari percakapan dan tidak akan dapat memasuki percakapan lagi sampai dibatalkan cekalannya.", + "removeDevicesDescription": "Kamu akan dikeluarkan dari perangkat ini dan tidak akan dapat menerima pesan lagi.", + "unbanUserDescription": "Pengguna akan dapat memasuki percakapannya lagi jika dicoba.", + "pushNotificationsNotAvailable": "Notifikasi dorongan tidak tersedia", + "makeAdminDescription": "Setelah kamu membuat pengguna ini admin, kamu tidak akan dapat mengurungkan ini karena penggunanya akan memiliki perizinan yang sama seperti kamu.", + "archiveRoomDescription": "Percakapan akan dipindahkan ke arsip. Pengguna lain akan melihat bahwa kamu telah meninggalkan percakapan.", + "hasKnocked": "🚪 {user} telah dikeluarkan", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Pelajari lebih lanjut", + "roomUpgradeDescription": "Percakapannya akan dibuat ulang dengan versi ruangan yang baru. Semua anggota akan diberi tahu bahwa mereka harus ganti ke percakapan yang baru. Kamu bisa mempelajari lebih lanjut tentang versi ruangan di https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Silakan masukkan angka lebih dari 0", + "kickUserDescription": "Pengguna ini dikeluarkan dari percakapan tetapi tidak dicekal. Dalam percakapan publik, penggunanya dapat bergabung ulang kapan pun.", + "groupCanBeFoundViaSearch": "Grup dapat dicari melalui pencarian", + "groupName": "Nama grup", + "wrongRecoveryKey": "Maaf... ini sepertinya bukan kunci pemulihan yang benar.", + "addChatOrSubSpace": "Tambahkan percakapan atau subspace", + "pleaseChooseAStrongPassword": "Silakan pilih kata sandi yang kuat", + "joinSpace": "Bergabung ke space", + "acceptedKeyVerification": "{sender} menerima verifikasi kunci", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} membatalkan verifikasi kunci", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} siap untuk verifikasi kunci", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDevice": "🔐 Verifikasi perangkat lain", + "requestedKeyVerification": "{sender} meminta verifikasi kunci", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} memulai verifikasi kunci", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Tampilkan konten pesan kaya seperti teks tebal menggunakan Markdown.", + "noUsersFoundWithQuery": "Sayangnya tidak ada pengguna yang dapat ditemukan dengan \"{query}\". Silakan periksa jika ada tipo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "passwordIsWrong": "Kata sandi yang kamu masukkan salah", + "searchChatsRooms": "Cari #percakapan, @pengguna...", + "createGroupAndInviteUsers": "Buat sebuah grup dan undang pengguna", + "pleaseEnterYourCurrentPassword": "Silakan masukkan kata sandimu saat ini", + "passwordsDoNotMatch": "Kata sandi tidak cocok", + "sendTypingNotificationsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu sedang mengetik sebuah pesan baru.", + "sendReadReceipts": "Kirim laporan dibaca", + "formattedMessages": "Pesan yang diformat", + "verifyOtherUser": "🔐 Verifikasi pengguna lain", + "sessionLostBody": "Sesimu hilang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikasi sekarang mencoba memulihkan sesimu dari cadangan. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "publicSpaces": "Space publik", + "commandHint_sendraw": "Kirim JSON mentah", + "sendReadReceiptsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu membaca sebuah pesan.", + "block": "Blokir", + "blockedUsers": "Pengguna yang terblokir", + "blockListDescription": "Kamu bisa memblokir pengguna yang sedang menganggumu. Kamu tidak akan mendapatkan pesan atau undangan ruangan dari pengguna dalam daftar blokiran pribadimu.", + "blockUsername": "Abaikan nama pengguna", + "stickers": "Stiker", + "discover": "Jelajahi", + "yourGlobalUserIdIs": "ID pengguna globalmu adalah: ", + "select": "Pilih", + "nothingFound": "Tidak ada yang ditemukan...", + "thisDevice": "Perangkat ini:", + "newPassword": "Kata sandi baru", + "incomingMessages": "Pesan masuk", + "databaseMigrationTitle": "Basis data sudah dioptimalkan", + "searchForUsers": "Cari @pengguna...", + "completedKeyVerification": "{sender} menyelesaikan verifikasi kunci", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "databaseMigrationBody": "Silakan tunggu. Ini dapat membutuhkan beberapa waktu.", + "leaveEmptyToClearStatus": "Tinggalkan kosong untuk menghapus statusmu.", + "initAppError": "Terjadi kesalahan saat init aplikasi", + "verifyOtherDeviceDescription": "Saat kamu memverifikasi perangkat lain, perangkat tersebut dapat bertukar kunci, sehingga meningkatkan keamananmu secara keseluruhan. 💪 Saat Anda memulai verifikasi, sebuah pemberitahuan akan muncul di aplikasi pada kedua perangkat. Di situ kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain. Sebaiknya siapkan kedua perangkat sebelum kamu memulai verifikasi. 🤳", + "verifyOtherUserDescription": "Jika kamu memverifikasi pengguna lain, kamu bisa yakin bahwa kamu tahu kepada siapa sebenarnya kamu menulis pesan kepadanya. 💪\n\nSaat kamu memulai verifikasi, kamu dan pengguna lain akan melihat pemberitahuan di aplikasi. Di sana kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain.\n\nCara terbaik untuk melakukannya adalah dengan bertemu secara langsung atau memulai panggilan video. 👭", + "commandHint_ignore": "Abaikan ID Matrix yang diberikan", + "commandHint_unignore": "Batalkan pengabaian ID Matrix yang diberikan", + "unreadChatsInApp": "{appname}: {unread} obrolan belum dibaca", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Enkripsi basis data tidak didukung di platform ini", + "customEmojisAndStickersBody": "Tambakan atau bagikan emoji atau stiker kustom yang dapat digunakan dalam obrolan apa pun.", + "hideRedactedMessages": "Sembunyikan pesan yang dihapus", + "appLockDescription": "Kunci aplikasi ketika tidak digunakan dengan kode PIN", + "accessAndVisibility": "Akses dan keterlihatan", + "globalChatId": "ID obrolan global", + "accessAndVisibilityDescription": "Siapa yang diperbolehkan bergabung ke obrolan ini dan bagaimana obrolannya dapat ditemukan.", + "calls": "Panggilan", + "customEmojisAndStickers": "Emoji dan stiker kustom", + "hideRedactedMessagesBody": "Jika seseorang menghapus pesan, pesannya tidak akan terlihat lagi dalam obrolan.", + "hideInvalidOrUnknownMessageFormats": "Sembunyikan format pesan yang tidak valid atau tidak diketahui", + "passwordRecoverySettings": "Pengaturan pemulihan kata sandi", + "usersMustKnock": "Pengguna harus mengetuk", + "noOneCanJoin": "Tidak ada siapa pun yang dapat bergabung", + "knock": "Ketuk", + "knocking": "Mengetuk", + "chatCanBeDiscoveredViaSearchOnServer": "Obrolan dapat ditemukan melalui pencarian di {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Saat ini ada {count} pengguna yang diblokir.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicChatAddresses": "Alamat obrolan umum", + "createNewAddress": "Buat alamat baru", + "swipeRightToLeftToReply": "Usap dari kanan ke kiri untuk membalas", + "searchMore": "Cari lebih banyak...", + "gallery": "Galeri", + "searchIn": "Cari dalam obrolan \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "Berkas", + "sendCanceled": "Pengiriman dibatalkan", + "noChatsFoundHere": "Belum ada chat di sini. Mulai chat baru dengan seseorang menggunakan tombol di bawah. ⤵️", + "markAsUnread": "Tandai sebagai belum dibaca", + "goToSpace": "Pergi ke space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "changeTheChatPermissions": "Ubah perizinan chat", + "changeTheCanonicalRoomAlias": "Ubah alamat chat publik utama", + "changeTheVisibilityOfChatHistory": "Ubah keterlihatan riwayat chat", + "changeTheDescriptionOfTheGroup": "Ubah deskripsi chat", + "sendingAttachment": "Mengirim lampiran...", + "calculatingFileSize": "Menghitung ukuran berkas...", + "userLevel": "{level} - Pengguna", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Ubah pengaturan chat umum", + "loginWithMatrixId": "Masuk dengan ID Matrix", + "doesNotSeemToBeAValidHomeserver": "Sepertinya bukan homeserver yang kompatibel. URL salah?", + "unread": "Tidak dibaca", + "space": "Space", + "noMoreChatsFound": "Tidak ada chat lagi yang ditemukan...", + "changelog": "Catatan perubahan", + "sendRoomNotifications": "Kirim notifikasi @room", + "updateInstalled": "🎉 Pembaruan {version} terpasang!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "inviteOtherUsers": "Undang pengguna lain ke chat ini", + "chatPermissionsDescription": "Tentukan tingkat kekuasaan yang diperlukan untuk tindakan tertentu dalam chat ini. Tingkat kekuasaan 0, 50 dan 100 biasanya mewakili pengguna, moderator dan admin, tetapi gradasi apa pun dimungkinkan.", + "oneOfYourDevicesIsNotVerified": "Salah satu perangkat Anda tidak terverifikasi", + "noticeChatBackupDeviceVerification": "Catatan: Ketika Anda menghubungkan semua perangkat Anda ke cadangan chat, mereka akan diverifikasi secara otomatis.", + "continueText": "Lanjutkan", + "aboutHomeserver": "Tentang {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "blur": "Buram:", + "contactServerAdmin": "Hubungi admin server", + "opacity": "Opasitas:", + "setWallpaper": "Atur later belakang", + "serverInformation": "Informasi server:", + "noContactInformationProvided": "Server tidak menyediakan informasi kontak valid apa pun", + "supportPage": "Laman dukungan", + "version": "Versi", + "website": "Situs Web", + "manageAccount": "Kelola akun", + "contactServerSecurity": "Hubungi keamanan server", + "name": "Nama", + "strikeThrough": "Coret", + "pleaseFillOut": "Silakan isi", + "addLink": "Tambahkan tautan", + "invalidUrl": "URL tidak valid", + "boldText": "Teks tebal", + "italicText": "Teks miring", + "unableToJoinChat": "Tidak dapat bergabung dalam chat. Mungkin pihak lain telah menutup percakapan.", + "sendImages": "Kirim {count} gambar", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Kompres", + "contentNotificationSettings": "Pengaturan notifikasi konten", + "generalNotificationSettings": "Pengaturan notifikasi umum", + "roomNotificationSettings": "Pengaturan notifikasi ruangan", + "userSpecificNotificationSettings": "Pengaturan notifikasi spesifik pengguna", + "otherNotificationSettings": "Pengaturan notifikasi lainnya", + "notificationRuleContainsUserName": "Berisi Nama Pengguna", + "notificationRuleContainsUserNameDescription": "Memberi tahu pengguna ketika pesan memiliki nama penggunanya.", + "notificationRuleMaster": "Bisukan semua notifikasi", + "notificationRuleMasterDescription": "Menimpa peraturan lainnya dan menonaktifkan semua notifikasi.", + "notificationRuleSuppressNotices": "Dimakan Pesan Terautomasi", + "notificationRuleSuppressNoticesDescription": "Mendiamkan notifikasi dari klien terautomasi seperti bot.", + "notificationRuleInviteForMe": "Undang untuk Aku", + "notificationRuleInviteForMeDescription": "Memberi tahu pengguna ketika diundang ke ruangan.", + "notificationRuleMemberEvent": "Peristiwa Anggota", + "notificationRuleMemberEventDescription": "Mendiamkan notifikasi peristiwa keanggotaan.", + "notificationRuleIsUserMention": "Sebutan Pengguna", + "notificationRuleIsUserMentionDescription": "Memberi tahu pengguna ketika disebut secara langsung dalam pesan.", + "notificationRuleContainsDisplayName": "Berisi Nama Tampilan", + "notificationRuleIsRoomMention": "Sebutan Ruangan", + "notificationRuleIsRoomMentionDescription": "Memberi tahu pengguna ketika ada sebutan ruangan.", + "notificationRuleRoomnotif": "Notifikasi Ruangan", + "notificationRuleRoomnotifDescription": "Memberi tahu pengguna ketika pesan berisi '@room'.", + "notificationRuleTombstone": "Nisan", + "notificationRuleTombstoneDescription": "Memberi tahu pengguna tentang pesan deaktivasi ruangan.", + "notificationRuleReaction": "Reaksi", + "notificationRuleReactionDescription": "Mendiamkan notifikasi reaksi.", + "notificationRuleRoomServerAcl": "ACL Server Ruangan", + "notificationRuleRoomServerAclDescription": "Mendiamkan notifikasi daftar kontrol akses server ruangan (ACL).", + "notificationRuleSuppressEdits": "Diamkan Penyuntingan", + "notificationRuleSuppressEditsDescription": "Mendiamkan notifikasi pesan tersunting.", + "notificationRuleCall": "Panggilan", + "notificationRuleCallDescription": "Memberi tahu pengguna tentang panggilan.", + "notificationRuleEncryptedRoomOneToOne": "Ruangan Terenkripsi Satu ke Satu", + "notificationRuleEncryptedRoomOneToOneDescription": "Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.", + "notificationRuleRoomOneToOne": "Ruangan Satu ke Satu", + "notificationRuleRoomOneToOneDescription": "Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.", + "notificationRuleMessage": "Pesan", + "notificationRuleMessageDescription": "Memberi tahu pengguna tentang pesan umum.", + "notificationRuleEncrypted": "Terenkripsi", + "notificationRuleEncryptedDescription": "Memberi tahu pengguna tentang pesan dalam ruangan terenkripsi.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Memberi tahu pengguna tentang peristiwa widget Jitsi.", + "notificationRuleServerAcl": "Diamkan Peristiwa ACL Server", + "notificationRuleServerAclDescription": "Mendiamkan notifikasi peristiwa ACL server.", + "unknownPushRule": "Aturan dorongan '{rule}' tidak diketahui", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Jika kamu menghapus pengaturan notifikasi ini, maka tidak dapat diurungkan.", + "more": "Tambahan", + "newChatRequest": "📩 Permintaan pesan baru", + "allDevices": "Semua perangkat", + "crossVerifiedDevices": "Perangkat terverifikasi silang", + "waitingForServer": "Menunggu server...", + "notificationRuleContainsDisplayNameDescription": "Memberi tahu pengguna ketika pesan berisi nama tampilannya.", + "shareKeysWith": "Bagikan kunci dengan...", + "synchronizingPleaseWaitCounter": " Sinkronisasi… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "shareKeysWithDescription": "Perangkat apa saja yang dipercayai supaya mereka bisa membaca bersama dengan pesanmu dalam obrolan terenkripsi?", + "verifiedDevicesOnly": "Perangkat terverifikasi saja", + "crossVerifiedDevicesIfEnabled": "Verifikasi silang perangkat jika diaktifkan", + "previous": "Sebelumnya", + "otherPartyNotLoggedIn": "Pihak lain belum masuk dan tidak dapat menerima pesan!", + "appWantsToUseForLogin": "Gunakan '{server}' untuk masuk", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Anda memperbolehkan aplikasi dan situs web membagikan informasi tentang Anda.", + "open": "Buka", + "takeAPhoto": "Ambil foto", + "recordAVideo": "Rekam video", + "optionalMessage": "Pesan (opsional)...", + "notSupportedOnThisDevice": "Tidak didukung pada perangkat ini", + "enterNewChat": "Masuk ke obrolan baru", + "commandHint_roomupgrade": "Tingkatkan ruangan ini ke versi ruangan yang ditentukan", + "pleaseWaitUntilInvited": "Silakan menunggu sampai seseorang dari ruangan mengundang Anda.", + "approve": "Terima", + "youHaveKnocked": "Anda telah mengetuk", + "sentVoiceMessage": "🎙️ {duration} - Pesan suara dari {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "checkList": "Ceklis", + "countInvited": "{count} diundang", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "commandHint_logout": "Keluar dari perangkatmu saat ini", + "commandHint_logoutall": "Keluarkan semua perangkat aktif", + "displayNavigationRail": "Tampilkan jalur navigasi pada ponsel", + "customReaction": "Reaksi khusus", + "moreEvents": "Peristiwa tambahan", + "declineInvitation": "Tolak undangan", + "noMessagesYet": "Belum ada pesan", + "longPressToRecordVoiceMessage": "Tekan lama untuk merekam pesan suara.", + "pause": "Jeda", + "resume": "Lanjut", + "changedTheChatDescription": "{username} mengubah deskripsi obrolan", + "changedTheChatName": "{username} mengubah nama obrolan", + "removeFromSpaceDescription": "Obrolan akan dihapus dari space tetapi masih muncul di daftar obrolan Anda.", + "countChats": "{chats} obrolan", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Anggota space dari {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Anggota space dari {spaces} dapat mengetuk", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Mulai polling", + "endPoll": "Akhiri polling", + "answersVisible": "Jawaban terlihat", + "pollQuestion": "Pertanyaan polling", + "answerOption": "Opsi jawaban", + "addAnswerOption": "Tambah opsi jawaban", + "allowMultipleAnswers": "Izinkan beberapa jawaban", + "pollHasBeenEnded": "Polling telah diakhiri", + "countVotes": "{count, plural, =1{Satu suara} other{{count} suara}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Jawaban akan terlihat saat polling telah diakhiri", + "replyInThread": "Balas dalam thread", + "countReplies": "{count, plural, =1{Satu balasan} other{{count} balasan}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Thread", + "backToMainChat": "Kembali ke obrolan utama", + "saveChanges": "Simpan perubahan", + "createSticker": "Buat stiker atau emoji", + "useAsSticker": "Gunakan sebagai stiker", + "useAsEmoji": "Gunakan sebagai emoji", + "stickerPackNameAlreadyExists": "Nama paket stiker sudah ada", + "newStickerPack": "Paket stiker baru", + "stickerPackName": "Nama paket stiker", + "attribution": "Atribusi", + "skipChatBackup": "Lewati cadangan obrolan", + "skipChatBackupWarning": "Anda yakin? Tanpa mengaktifkan cadangan obrolan, Anda mungkin kehilangan akses ke pesan Anda jika Anda mengganti perangkat.", + "noMoreResultsFound": "Tidak ada hasil lagi yang ditemukan", + "chatSearchedUntil": "Obrolan dicari hingga {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL Dasar Federasi", + "clientWellKnownInformation": "Informasi Client-Well-Known:", + "baseUrl": "URL Dasar", + "identityServer": "Server Identitas:", + "versionWithNumber": "Versi: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Log", + "advancedConfigs": "Konfigurasi Lanjutan", + "advancedConfigurations": "Konfigurasi lanjutan", + "signIn": "Masuk", + "createNewAccount": "Buat akun baru", + "signUpGreeting": "FluffyChat terdesentralisasi! Pilih server tempat Anda ingin membuat akun dan mari kita mulai!", + "signInGreeting": "Anda sudah memiliki akun di Matrix? Selamat datang kembali! Pilih homeserver Anda dan masuk.", + "theProcessWasCanceled": "Proses dibatalkan.", + "join": "Bergabung", + "searchOrEnterHomeserverAddress": "Cari atau masukkan alamat homeserver", + "matrixId": "Matrix ID", + "setPowerLevel": "Atur level kekuasaan", + "makeModerator": "Jadikan moderator", + "makeAdmin": "Jadikan admin", + "removeModeratorRights": "Hapus hak moderator", + "removeAdminRights": "Hapus hak admin", + "powerLevel": "Level kekuasaan", + "setPowerLevelDescription": "Level kekuasaan menentukan apa yang boleh dilakukan seorang anggota di ruangan ini dan biasanya berkisar antara 0 hingga 100.", + "owner": "Pemilik", + "mute": "Bisukan", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Buat obrolan baru", + "reset": "Atur ulang", + "supportFluffyChat": "Dukung FluffyChat", + "support": "Dukungan", + "setLowPriority": "Atur prioritas rendah", + "unsetLowPriority": "Batalkan prioritas rendah", + "playSoundOnNotification": "Putar suara saat notifikasi", + "addTag": "Tambah tag", + "removeTag": "Hapus tag", + "tagName": "Nama tag", + "createNewTag": "Buat tag baru", + "discardEdits": "Anda memiliki perubahan yang belum disimpan. Buang suntingan Anda?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Tampilkan lebih banyak", + "showLess": "Tampilkan lebih sedikit", + "hideRoomsInSpaces": "Sembunyikan room yang berada dalam sebuah space", + "possibleByYou": "Rilis ini hanya dapat terwujud berkat dukungan Anda. FluffyChat tetap gratis, open-source, dan sepenuhnya digerakkan oleh komunitas.", + "showThumbnailsInTimeline": "Tampilkan thumbnail gambar dan video", + "appSubtitle": "Komunikasi [matrix] yang aman", + "appDescription": "Berkomunikasi secara terenkripsi melalui jaringan [matrix] terdesentralisasi dengan cara yang mudah dan dapat diakses oleh semua orang.", + "interactiveVerification": "Verifikasi interaktif", + "interactiveVerificationDescription": "Jika Anda berada bersebelahan atau berkomunikasi melalui saluran yang aman, Anda dapat memverifikasi semua perangkat sekaligus dengan membandingkan nomor keamanan atau emoji.", + "countUnverifiedDevices": "{count} perangkat yang belum diverifikasi di dalam chat.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Pesan terenkripsi", + "unencryptedMessage": "Pesan tidak terenkripsi", + "messageCanOnlyBeReadByUser": "Pesan Anda terenkripsi end-to-end dan hanya dapat dibaca oleh pengguna ini:", + "messageCanOnlyBeReadByUsers": "Pesan Anda terenkripsi end-to-end dan hanya dapat dibaca oleh para pengguna ini:", + "publicKey": "Kunci publik: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Kunci identitas perangkat", + "restoreBootstrapEmptyDevicesDescription": "Silakan masukkan passphrase atau recovery key Anda untuk memverifikasi perangkat ini dan mendapatkan akses ke cadangan pesan terenkripsi Anda.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Silakan pilih salah satu perangkat Anda yang lain untuk memverifikasi sesi ini:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Reset akun", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Pulihkan Identitas Kripto", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Reset Identitas Kripto", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Siapkan Identitas Kripto", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Menunggu kunci... Harap tetap aktifkan perangkat lainnya.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Tidak ada kunci yang dikirim. Silakan coba lagi.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Buka kunci", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Buka file", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Saat Anda mereset akun, Anda akan kehilangan akses ke pesan lama Anda selamanya. Semua perangkat Anda saat ini perlu diverifikasi kembali. Lakukan tindakan ini hanya jika Anda tidak memiliki perangkat lain lagi untuk memverifikasi sesi Anda dan Anda telah kehilangan recovery key serta passphrase Anda!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat menggunakan enkripsi end-to-end. Agar tidak kehilangan pesan Anda, silakan pilih passphrase yang kuat untuk mengamankan identitas kripto Anda dan cadangan pesan terenkripsi Anda.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Passphrase baru", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Ulangi passphrase", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Passphrase cocok", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Panjang minimal 12 karakter.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Mengandung huruf besar dan huruf kecil.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Mengandung karakter khusus.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Mengandung satu angka.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Harap catat recovery key Anda agar dapat memulihkan pesan terenkripsi dan identitas kripto Anda.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Simpan sebagai file", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Anda siap untuk memulai!", + "noUserKeyFound": "Tidak ditemukan kunci pengguna", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Diketahui sejak: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Perangkat tanpa tanda tangan", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Perangkat bertanda tangan", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Tidak ditemukan kunci curve25519", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Pesan tidak dapat didekripsi" +} \ No newline at end of file diff --git a/lib/l10n/intl_ie.arb b/lib/l10n/intl_ie.arb new file mode 100644 index 0000000000..0466d011bc --- /dev/null +++ b/lib/l10n/intl_ie.arb @@ -0,0 +1,2025 @@ +{ + "group": "Gruppe", + "@group": { + "type": "String", + "placeholders": {} + }, + "close": "Cluder", + "@close": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversationes", + "@chats": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiat al Paperiere", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar al Paperiere", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createNewSpace": "Crear un spacie", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Activ actualmen", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deleteAccount": "Destructer li conto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Remover li missage", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Modificar blocat servitores", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Dimension de fonde", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Pro adhesion", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Pro invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppe es public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "help": "Auxilie", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Celar ínconosset evenimentes", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorat usatores", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Solmen invitat usatores", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "login": "Aperter li session", + "@login": { + "type": "String", + "placeholders": {} + }, + "isTyping": "tippa…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Adherer al chambre", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Cargar plu…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ultim activité: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "mention": "Mentionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "next": "Sequent", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Assurdar li conversation", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Crear un conversation", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nov demanda de verification!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scannar un code QR", + "noRoomsFound": "Null chambres trovat…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Aperter in mappas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasigne", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Li contrasigne esset obliviat", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Reganiar li contrasigne", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Redacter li missage", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Gardar li file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Inviar missages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Inviar video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Partir un localisation", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nómine de spacie", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Deblocar li aparate", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ínconosset aparate", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voce-missage", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Information pri li missage", + "openGallery": "Aperter li galerie", + "reportUser": "Raportar li usator", + "voiceCall": "Telefonada", + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "all": "Omni", + "@all": { + "type": "String", + "placeholders": {} + }, + "create": "Crear", + "@create": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Obscur", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "messages": "Missages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificationes", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "delete": "Remover", + "@delete": { + "type": "String", + "placeholders": {} + }, + "search": "Sercha", + "@search": { + "type": "String", + "placeholders": {} + }, + "devices": "Aparates", + "@devices": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Lucid", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "edit": "Redacter", + "@edit": { + "type": "String", + "placeholders": {} + }, + "security": "Securitá", + "@security": { + "type": "String", + "placeholders": {} + }, + "settings": "Parametres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Partir", + "@share": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Del sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "submit": "Inviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "unpin": "Defixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "warning": "Avise!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "yes": "Yes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "time": "Hora", + "sender": "Autor", + "custom": "Personalisat", + "emojis": "Emoji", + "users": "Usatores", + "user": "Usator", + "forward": "Avan", + "@forward": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruppes", + "@groups": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "invited": "Invitat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "leave": "Forlassar", + "@leave": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "link": "Ligament", + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "reason": "Cause", + "@reason": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatie", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "reject": "Refuser", + "@reject": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Repetir li contrasigne", + "addEmail": "Adjunter e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Cambiar li contrasigne", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Vacuar li archive", + "commandHint_clearcache": "Vacuar li cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_send": "Inviar li textu", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "configureChat": "Configurar li conversation", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direct conversationes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activar li ciffration", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descargar li file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Parametres de emotiones", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Curt-code de emotion", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Vacui conversation", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videotelefonada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Raportar li missage", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sin permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Aperter li cámera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Inviar un file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Inviar un image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Corresponde", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Alquí posse adherer se", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Obtenente li localisation…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Adjunter un conto", + "publicRooms": "Public chambres", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Iniciar li verification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Version del chambre", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Inviar audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Assignar li statu", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Code de fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "about": "Pri", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Acceptar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Ples confirmar vor Matrix ID por destructer vor conto.", + "addToSpace": "Adjunter al spacie", + "askVerificationRequest": "Esque acceptar ti demanda de verification de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automaticmen reproducter animat images", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Inviar per Enter", + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Blocar li aparate", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Cambiar li nómine de aparate", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Cambiar li hem-servitor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversation", + "@chat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Cambiar vor avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Archive de conversation", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detallies del conversation", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Ples descrir vos", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Forlassar ti chambre", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandInvalid": "Comande es ínvalid", + "@commandInvalid": { + "type": "String" + }, + "banFromChat": "Bannir del conversation", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambiar li stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Marcar quam gruppe", + "screenSharingTitle": "partir li ecran", + "bannedUser": "{username} ha bannit {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "commandHint_html": "Inviar contenete HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_plain": "Inviar textu sin formate", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "editRoomAliases": "Modificar pseudonimos del chambre", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotion ja existe!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Modificar li avatar del chambre", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppe con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "invitedUser": "{username} invitat {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "leftTheChat": "Surtit ex li conversation", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Cargante... ples atender.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} ha acceptat li invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "To deve esser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Esque vu vole cluder li session?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Li hem-servitor supporta ti tipes de autentication:\n{serverVersions}\nMa ti-ci application supporta solmen:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "cantOpenUri": "Ne successat aperter li adresse {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "account": "Conto", + "@account": { + "type": "String", + "placeholders": {} + }, + "alias": "pseudonim", + "@alias": { + "type": "String", + "placeholders": {} + }, + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannit", + "@banned": { + "type": "String", + "placeholders": {} + }, + "cancel": "Anullar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Ciffrat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Ciffration", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "newSpace": "Crear un spacie", + "logout": "Cluder li session", + "@logout": { + "type": "String", + "placeholders": {} + }, + "send": "Inviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "you": "Vu", + "@you": { + "type": "String", + "placeholders": {} + }, + "skip": "Omisser", + "@skip": { + "type": "String", + "placeholders": {} + }, + "status": "Statu", + "@status": { + "type": "String", + "placeholders": {} + }, + "unverified": "Ínverificat", + "editDisplayname": "Redacter li visibil nómine", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invitar un contacte", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Esque vu es cert?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb new file mode 100644 index 0000000000..5c2299f949 --- /dev/null +++ b/lib/l10n/intl_it.arb @@ -0,0 +1,2459 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.992206", + "about": "Informazioni", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accetta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ha accettato l'invito", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ha abilitato la crittografia end to end", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Aggiungi e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Amministratore", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tutto", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ha risposto alla chiamata", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Tutti possono partecipare", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blocco dell'app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivia", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Gli utenti ospiti possono partecipare", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Sei sicuro/a?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Sei sicuro/a di voler uscire?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Per far accedere l'altra persona, per favore inserisci la tua frase segreta o chiave di recupero.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accettare questa richiesta di verifica da {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "L'homeserver supporta i tipi di accesso:\n{serverVersions}\nMa questa applicazione supporta solo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Bandisci dalla chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bandito", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} ha bandito {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blocca dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloccato", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Annulla", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Cambia nome dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ha cambiato l'avatar della discussione", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ha cambiato i permessi della chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ha cambiato nome in: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ha cambiato le regole di accesso per ospiti", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ha cambiato le regole di accesso per ospiti con: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ha cambiato la visibilità della cronologia", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ha cambiato la visibilità della cronologia in: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ha cambiato le regole per unirsi", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ha cambiato le regole per unirsi in: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ha cambiato il suo avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ha modificato gli alias della stanza", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ha cambiato il link di invito", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Cambia la password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Cambia il server principale", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Cambia il tuo stile", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Cambia il nome del gruppo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "La crittografia è corrotta", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Backup delle discussioni", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Dettagli chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Discussioni", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Scegli una password complessa", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Chiudi", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Per favore confronta gli emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Per favore confronta i numeri", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configura la discussione", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Il contatto è stato invitato nel gruppo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Il contenuto è stato segnalato agli amministratori del server", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiato negli Appunti", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copia", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copia negli appunti", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Impossibile decriptare messaggio: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} partecipanti", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crea", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} ha creato la chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Attualmente attivo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Scuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Disabiliterà il tuo account. Non puoi tornare indietro! Sei sicuro/a?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Livello di autorizzazione predefinito per i nuovi utenti", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Cancella", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Elimina l'account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Elimina il messaggio", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivi", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chat dirette", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Il nominativo è stato cambiato", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Scarica il file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Modifica", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Modifica i server bloccati", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Modifica il nominativo", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Modifica l'avatar della stanza", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "L'emote già esiste!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Shortcode emote invalido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Impostazioni emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Scorciatoia emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Discussione vuota", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Abilita i pacchetti emotes globalmente", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Abilita la crittografia", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Non potrai disabilitare la crittografia in futuro. Sei sicuro?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Crittografato", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Crittografia", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Crittografia non abilitata", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} è entrato in chiamata", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Inserisci un indirizzo e-mail", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Dimensione carattere", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Inoltra", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Dall'adesione", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Dall'invito", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Gruppo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Il gruppo è pubblico", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruppi", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppo con {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gli ospiti sono vietati", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gli ospiti possono partecipare", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha ritirato l'invito per {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Aiuto", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Nascondi gli eventi sconosciuti", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignora", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utenti ignorati", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ho cliccato sul collegamento", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase segrata o chiave di ripristino errate", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invita contatto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invita un contatto a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitato/a", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} ha invitato {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Solo utenti invitati", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} ti ha invitato/a a FluffyChat.\n1. Visita fluffychat.im e installa l'applicazione\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "sta scrivendo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} si è unito/a alla chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Unisciti alla stanza", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ha espulso {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ha espulso e bandito {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Espelli dalla chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ultima attività: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abbandona", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ha lasciato la chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Chiaro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carica altri {count} partecipanti", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Caricamento… Attendere prego.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carica di più…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Accedi", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Accedi a {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Esci", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Menzione", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messaggi", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatore", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenzia discussione", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nuova discussione", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nuovo messaggio in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nuova richiesta di verifica!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Avanti", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nessuna connessione al server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nessun emote trovato. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Puoi attivare la crittografia solo quando la stanza non è più accessibile pubblicamente.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging non sembra essere disponibile sul tuo dispositivo. Per continuare a ricevere notifiche push, ti consigliamo di installare ntfy. Con ntfy o un altro provider Unified Push puoi ricevere notifiche push in modo sicuro per i dati. Puoi scaricare ntfy dal PlayStore o da F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Non hai ancora aggiunto un modo per recuperare la tua password.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nessuna autorizzazione", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nessuna stanza trovata…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifiche", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} utenti stanno scrivendo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Il backup delle chiavi in linea è abilitato", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ops, qualcosa è andato storto…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Apri l'app per leggere i messaggi", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Apri fotocamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Partecipante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frase segreta o chiave di recupero", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Password", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Password dimenticata", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La password è stata cambiata", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recupero della password", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fissa", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Si prega di scegliere un codice di accesso", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Clicca sul collegamenti nell'e-mail e poi procedi.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Inserisci la tua password", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Inserisci il tuo nome utente", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Segui le istruzioni sul sito web e tocca Avanti.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Stanze pubbliche", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Motivo", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ha eliminato un evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Elimina un messaggio", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Rifiuta", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} ha rifiutato l'invito", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Rimuovi", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Rimuovi tutti gli altri dispositivi", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Rimuovi il ban dalla chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Sostituisci la stanza con la versione più recente", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Rispondi", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Segnala il messaggio", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La stanza è stata aggiornata", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versione della stanza", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Cerca", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sicurezza", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Invia", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Invia un messaggio", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Invia un file audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Invia un file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Invia un'immagine", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Invia messaggi", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Invia un video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ha inviato un file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ha inviato un file audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ha inviato un'immagine", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} ha inviato un adesivo", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ha inviato un video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} ha inviato informazioni sulla chiamata", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "Imposta lo stato", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Impostazioni", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Condividi", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} ha condiviso la sua posizione", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Ignora", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codice sorgente", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ha iniziato una chiamata", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Stato", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Come stai oggi?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Invia", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Non corrispondono", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Corrispondono", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Troppe richieste. Per favore riprova più tardi!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Prova a inviare di nuovo", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} ha rimosso il bando di {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Sblocca il dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo sconosciuto", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo di crittografia sconosciuto", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento sconosciuto '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Riattiva l'audio della discussione", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Rimuovi", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} e {count} altri stanno scrivendo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} stanno scrivendo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} sta scrivendo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} ha abbandonato la chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} ha inviato un evento {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificato", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Avvia la verifica", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Hai verificato con successo!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifica dell'altro account", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videochiamata", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilità della cronologia della discussione", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visibile a tutti i partecipanti", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visibile a tutti", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Messaggio vocale", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "In attesa che il partner accetti la richiesta…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "In attesa che il partner accetti l'emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "In attesa che il partner accetti i numeri…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Attenzione!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Ti abbiamo inviato un'e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Chi può eseguire quale azione", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Chi è autorizzato a unirsi a questo gruppo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Perché vuoi segnalarlo?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Con questi indirizzi puoi recuperare la tua password se necessario.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Scrivi un messaggio…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sì", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Tu", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Non stai più partecipando a questa chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Sei stato/a bandito/a da questa chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "La tua chiave pubblica", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Imposta come alias principale", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Rimuovi il tuo avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Per favore inserisci il tuo PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ops! Purtroppo si è verificato un errore durante l'impostazione delle notifiche push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Modifica gli alias della stanza", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Cancella archivio", + "changeYourAvatar": "Cambia il tuo avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Aggiungi a uno spazio", + "commandHint_leave": "Abbandona questa stanza", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_ban": "Banna l'utente specificato da questa stanza", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Invia testo formattato in HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_plain": "Invia testo non formattato", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Invia testo", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "locationDisabledNotice": "I servizi di localizzazione sono disabilitati. Per favore abilitali per poter condividere la tua posizione.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salva file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Apri in maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scansiona codice QR", + "addAccount": "Aggiungi account", + "unverified": "Non verificato", + "sendAsText": "Invia come testo", + "@sendAsText": { + "type": "String" + }, + "repeatPassword": "Ripeti password", + "autoplayImages": "Riproduci automaticamente adesivi ed emote animati", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "cantOpenUri": "Impossibile aprire l'URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "commandInvalid": "Comando non valido", + "@commandInvalid": { + "type": "String" + }, + "link": "Link", + "shareLocation": "Condividi posizione", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} ti abbraccia", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Salta all'ultimo messaggio letto", + "obtainingLocation": "Ottengo la posizione…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Invia una coccola", + "reportErrorDescription": "😭 Oh no. Qualcosa è andato storto. Se vuoi, puoi segnalare questo bug agli sviluppatori.", + "unsupportedAndroidVersion": "Versione di Android non supportata", + "oneClientLoggedOut": "Uno dei tuoi client è stato disconnesso", + "setColorTheme": "Imposta tema colore:", + "commandHint_create": "Crea una chat di gruppo vuota\nUtilizza --no-encryption per disattivare la criptazione", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "supposedMxid": "Dovrebbe essere {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Utente", + "youAcceptedTheInvitation": "👍 Hai accettato l'invito", + "noMatrixServer": "{server1} non è un server matrix, vuoi invece usare {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Sei stato invitato/a da {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "L'utente sarà bannato dalla chat e non sarà in grado di rientrare finché non verrà sbannato.", + "removeDevicesDescription": "Sarai disconnesso da questo dispositivo e non potrai più ricevere messaggi.", + "tryAgain": "Riprova", + "youKickedAndBanned": "🙅 Hai rimosso e bannato {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "L'utente potrà rientrare nella chat.", + "sendOnEnter": "Invia quando premi Invio", + "youRejectedTheInvitation": "Hai rifiutato l'invito", + "messagesStyle": "Messaggi:", + "newSpaceDescription": "Gli spazi ti permettono di consolidare le tue chat e di creare comunità private o pubbliche.", + "chatDescription": "Descrizione della chat", + "encryptThisChat": "Cifra questa chat", + "reopenChat": "Riapri la chat", + "addToBundle": "Aggiungi al bundle", + "spaceIsPublic": "Lo spazio è pubblico", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "countFiles": "{count} file", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Questo può accadere se il messaggio è stato inviato prima che hai fatto l'accesso in questo dispositivo.\n\nÈ anche possibile che il mittente abbia bloccato il tuo dispositivo o che qualcosa sia andato storto con la tua connessione ad internet.\n\nSei in grado di leggere il messaggio su altre sessioni? Allora puoi trasferire il messaggio da lì! Vai su Impostazioni > Dispositivi e verifica che i tuoi dispositivi siano verificati l'un l'altro. Quando aprirai la stanza la prossima volta ed entrambe le sessioni sono in primo piano, le chiavi saranno trasmesse automaticamente.\n\nNon vuoi perdere le chiavi quando ti disconnetti o cambi dispositivo? Assicurati di aver attivato il backup delle chat nelle impostazioni.", + "commandHint_markasgroup": "Segna come gruppo", + "errorObtainingLocation": "Errore cercando di ottenere la posizione: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "pushNotificationsNotAvailable": "Notifiche push non disponibili", + "storeInAppleKeyChain": "Salva nel portachiavi di Apple", + "hydrate": "Ripristina dal file di backup", + "invalidServerName": "Nome server non valido", + "chatPermissions": "Permessi della chat", + "sender": "Mittente", + "storeInAndroidKeystore": "Salva nel KeyStore di Android", + "makeAdminDescription": "Una volta che fai questo utente amministratore, potresti non essere in grado di rimuoverlo, in quanto avrà i tuoi stessi privilegi.", + "synchronizingPleaseWait": "Sincronizzazione... Attendere prego.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Pulisci cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "editBundlesForAccount": "Modifica i bundle per questo account", + "whyIsThisMessageEncrypted": "Perché questo messaggio è illeggibile?", + "setChatDescription": "Imposta la descrizione della chat", + "spaceName": "Nome dello spazio", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Importa da file .zip", + "dehydrateWarning": "Questa azione non può essere annullata. Assicurarsi di aver salvato il file di backup.", + "noOtherDevicesFound": "Nessun altro dispositivo trovato", + "redactedBy": "Rimosso da {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Nota che le video chiamate sono attualmente in beta. Potrebbero non funzionare come previsto o non funzionare del tutto su alcune piattaforme.", + "fileIsTooBigForServer": "Impossibile inviare! Il server supporta solo allegati fino a {max}.", + "readUpToHere": "Letto fino a qui", + "optionalRedactReason": "(Opzionale) Ragione per rimuovere questo messaggio...", + "dehydrate": "Esporta la sessione e cancella il dispositivo", + "locationPermissionDeniedNotice": "Permesso per accedere alla posizione negato. Per favore concedilo per essere in grado di condividere la tua posizione.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "archiveRoomDescription": "Questa chat sarà archiviata. Gli altri utenti saranno in grado di vedere che hai abbandonato la chat.", + "exportEmotePack": "Esporta pack di Emote come .zip", + "experimentalVideoCalls": "Video chiamate sperimentali", + "redactedByBecause": "Rimosso da {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Hai revocato l'invito per {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "reportUser": "Segnala utente", + "confirmEventUnpin": "Sei sicuro di voler permanentemente sfissare l'evento?", + "youInvitedUser": "📩 Hai invitato {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Il file è stato salvato in {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "commandMissing": "{command} non è un comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "redactMessageDescription": "Questo messaggio sarà rimosso per tutti i partecipanti di questa conversazione. Questa operazione non può essere annullata.", + "commandHint_discardsession": "Scarta sessione", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "invalidInput": "Contenuto non valido!", + "commandHint_myroomnick": "Imposta il nome visualizzato per questa stanza", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "doNotShowAgain": "Non mostrare più", + "report": "segnala", + "screenSharingTitle": "condivisione schermo", + "googlyEyesContent": "{senderName} ti ha inviato degli occhi finti", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Hai bannato {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "commandHint_myroomavatar": "Importa la foto profilo per questa stanza ( mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "hasKnocked": "🚪 {user} ha bussato", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Apri il collegamento nel browser", + "commandHint_react": "Rispondi con una reazione", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_me": "Descriviti", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "messageInfo": "Informazioni del messaggio", + "disableEncryptionWarning": "Per motivi di sicurezza non puoi disabilitare la crittografia in una chat, se era stata abilitata in precedenza.", + "directChat": "Chat diretta", + "wrongPinEntered": "È stato inserito il pin sbagliato! Riprova tra {seconds} secondi...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Invia notifiche di scrittura", + "inviteGroupChat": "📨 Invita a una chat di gruppo", + "foregroundServiceRunning": "Questa notifica viene mostrata quando il servizio in primo piano è in esecuzione.", + "voiceCall": "Chiamata vocale", + "commandHint_kick": "Rimuovi l'utente fornito da questa stanza", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "createNewSpace": "Nuovo spazio", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "commandHint_unban": "Sbanna l'utente fornito da questa stanza", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa Emoji", + "wasDirectChatDisplayName": "Chat vuota (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "La descrizione della chat non è ancora stata creata.", + "removeFromBundle": "Rimuovi da questo bundle", + "confirmMatrixId": "Per eliminare il tuo account, conferma il tuo Matrix ID.", + "learnMore": "Scopri di più", + "notAnImage": "Non è un file immagine.", + "users": "Utenti", + "openGallery": "Apri la galleria", + "chatDescriptionHasBeenChanged": "Descrizione della chat cambiata", + "bundleName": "Nome del bundle", + "removeFromSpace": "Rimuovi dallo spazio", + "commandHint_op": "Imposta il livello di privilegi dell'utente specificato (predefinito: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_join": "Unisciti alla stanza fornita", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "roomUpgradeDescription": "Questa chat sarà ricreata con la nuova versione della stanza. Tutti i partecipanti saranno avvertiti che devono passare alla nuova chat. Puoi leggere di più riguardo le versioni delle stanze su https://spec.matrix.org/latest/rooms/", + "commandHint_invite": "Invia l utente fornito in questa stanza", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "pleaseEnterANumber": "Per favore inserisci un numero maggiore di 0", + "youKicked": "👞 Hai rimosso {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "jump": "Salta", + "reactedWith": "{sender} ha reagito con {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Scusa... questo non è possibile", + "shareInviteLink": "Condividi link d'invito", + "commandHint_markasdm": "Contrassegna questo Matrix ID come stanza di messaggi diretti", + "cuddleContent": "{senderName} ti coccola", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "emoteKeyboardNoRecents": "Le emoticon recentemente usate appariranno qui...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Sei entrato/a nella chat", + "markAsRead": "Segna come letto", + "commandHint_dm": "Avvia una chat diretta\nUsa --no-encryption per disabilitare la crittografia", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Invia un abbraccio", + "replace": "Sostituisci", + "youUnbannedUser": "Hai sbannato {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Nuovo spazio", + "emojis": "Emoji", + "commandHint_googly": "Invia degli occhi finti", + "createGroup": "Crea gruppo", + "time": "Tempo", + "custom": "Personalizzato", + "noBackupWarning": "Attenzione! Senza abilitare il backup della chat, perderai l'accesso ai tuoi messaggi crittografati. Si consiglia vivamente di abilitare il backup della chat prima di disconnettersi.", + "kickUserDescription": "L'utente è stato rimosso, ma non bannato. Nelle chat pubbliche, l'utente potrà rientrare quando vuole.", + "importNow": "Importa ora", + "pinMessage": "Fissa alla stanza", + "invite": "Invitare", + "unsupportedAndroidVersionLong": "Questa funzionalità richiede una versione di Android più recente. Si prega di verificare la presenza di aggiornamenti o supporto per Lineage OS.", + "storeSecurlyOnThisDevice": "Salva in modo sicuro su questo dispositivo", + "screenSharingDetail": "Stai condividendo il tuo schermo in FuffyChat", + "placeCall": "Fai una chiamata", + "blockListDescription": "Puoi bloccare gli utenti che ti disturbano. Non sarai più in grado di ricevere messaggi o inviti alle stanze dalle persone che hai bloccato.", + "blockedUsers": "Utenti bloccati", + "blockUsername": "Nome utente da ignorare", + "createGroupAndInviteUsers": "Crea un gruppo e invita gli utenti", + "groupCanBeFoundViaSearch": "Il gruppo può essere cercato", + "noUsersFoundWithQuery": "Sfortunatamente non è stato trovato nessun utente con \"{query}\". Per favore controlla se hai fatto un errore di battitura.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Blocca", + "yourGlobalUserIdIs": "Il tuo ID dell'utente globale è: ", + "commandHint_sendraw": "Manda un json grezzo", + "wrongRecoveryKey": "Mi dispiace... questa non sembra essere la chiave di recupero corretta.", + "groupName": "Nome gruppo", + "databaseMigrationTitle": "Il database è ottimizzato", + "searchChatsRooms": "Cerca per #chat, @utenti...", + "databaseMigrationBody": "Attendere prego. L'operazione potrebbe richiedere un momento.", + "addChatOrSubSpace": "Aggiungi chat o sottospazio", + "publicSpaces": "Spazio pubblico", + "pleaseEnterYourCurrentPassword": "Per favore inserisci la tua password attuale", + "passwordIsWrong": "La password inserita è sbagliata", + "select": "Seleziona", + "newPassword": "Nuova password", + "pleaseChooseAStrongPassword": "Per favore scegli una password forte", + "thisDevice": "Questo dispositivo:", + "verifyOtherUser": "🔐 Verifica altro utente", + "verifyOtherUserDescription": "Se verifichi un altro utente, puoi essere certo di sapere a chi stai realmente scrivendo. 💪\n\nQuando inizi una verifica, tu e l'altro utente vedrete un popup nell'app. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro.\n\nIl modo migliore per farlo è incontrarsi o avviare una videochiamata. 👭", + "verifyOtherDevice": "🔐 Verifica altro dispositivo", + "verifyOtherDeviceDescription": "Quando verifichi un altro dispositivo, questi dispositivi possono scambiarsi le chiavi, aumentando la tua sicurezza complessiva. 💪 Quando inizi una verifica, apparirà un popup nell'app su entrambi i dispositivi. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro. È meglio avere entrambi i dispositivi a portata di mano prima di iniziare la verifica. 🤳", + "discover": "Scopri", + "leaveEmptyToClearStatus": "Lascia vuoto per cancellare il tuo stato.", + "incomingMessages": "Messaggi in arrivo", + "noChatsFoundHere": "Nessuna chat trovata. Inizia una nuova chat con qualcuno usando il pulsante qui sotto. ⤵️", + "unread": "Non letti", + "space": "Spazio", + "knock": "Bussa", + "hideInvalidOrUnknownMessageFormats": "Nascondi formati di messaggi non validi o sconosciuti", + "swipeRightToLeftToReply": "Scorri da destra a sinistra per rispondere", + "globalChatId": "ID chat globale", + "appLockDescription": "Blocca l'app con un codice PIN quando non è in uso", + "noOneCanJoin": "Nessuno può unirsi", + "usersMustKnock": "Gli utenti devono bussare", + "accessAndVisibility": "Accesso e visibilità", + "accessAndVisibilityDescription": "Chi è autorizzato a partecipare a questa chat e come è possibile scoprirla.", + "calls": "Chiamate", + "customEmojisAndStickers": "Emoji e adesivi personalizzati", + "customEmojisAndStickersBody": "Aggiungi o condividi emoji o adesivi personalizzati che possono essere utilizzati in qualsiasi chat.", + "hideRedactedMessages": "Mostra i messaggi rimossi", + "hideRedactedMessagesBody": "Se qualcuno rimuove un messaggio, il messaggio non sarà più visibile nella chat.", + "passwordRecoverySettings": "Impostazioni di recupero password", + "noMoreChatsFound": "Non sono state trovate altre chat...", + "stickers": "Adesivi", + "searchMore": "Cerca di più...", + "sessionLostBody": "La tua sessione è andata persa. Segnala questo errore agli sviluppatori all'indirizzo {url}. Il messaggio di errore è: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "formattedMessagesDescription": "Visualizza contenuti di messaggi complessi, come testo in grassetto, utilizzando il markdown.", + "canceledKeyVerification": "{sender} ha annullato la verifica della chiave", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "chatPermissionsDescription": "Definisci quale livello di privilegi è necessario per determinate azioni in questa chat. I livelli di privilegi 0, 50 e 100 rappresentano solitamente utenti, moderatori e amministratori, ma qualsiasi valore intermedio è possibile.", + "passwordsDoNotMatch": "Le password non corrispondono", + "initAppError": "Si è verificato un errore durante l'inizializzazione dell'app", + "startedKeyVerification": "{sender} ha avviato la verifica della chiave", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "La chat può essere trovata tramite la ricerca su {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "unreadChatsInApp": "{appname}: {unread} chat non lette", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Al momento ci sono {count} utenti bloccati.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "nothingFound": "Non è stato trovato nulla...", + "joinSpace": "Unisciti allo spazio", + "commandHint_ignore": "Ignora il Matrix ID fornito", + "commandHint_unignore": "Ignora il Matrix ID specificato", + "noDatabaseEncryption": "La crittografia del database non è supportata su questa piattaforma", + "knocking": "Bussare", + "sendReadReceipts": "Invia ricevute di lettura", + "publicChatAddresses": "Indirizzi di chat pubblici", + "createNewAddress": "Crea un nuovo indirizzo", + "searchIn": "Cerca nella chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "gallery": "Galleria", + "formattedMessages": "Messaggi formattati", + "files": "File", + "restoreSessionBody": "L'app ora tenta di ripristinare la sessione dal backup. Segnala questo errore agli sviluppatori all'indirizzo {url}. Il messaggio di errore è: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} ha accettato la verifica della chiave", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} ha completato la verifica della chiave", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} è pronto per la verifica della chiave", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "searchForUsers": "Cerca @utenti...", + "sendTypingNotificationsDescription": "Gli altri partecipanti alla chat possono vedere quando stai scrivendo un nuovo messaggio.", + "sendReadReceiptsDescription": "Gli altri partecipanti alla chat possono vedere quando hai letto un messaggio.", + "requestedKeyVerification": "{sender} ha richiesto la verifica della chiave", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "changeTheChatPermissions": "Cambia i permessi della chat", + "changeTheVisibilityOfChatHistory": "Cambia la visibilità della cronologia chat", + "changeTheCanonicalRoomAlias": "Cambia l'indirizzo principale della chat pubblica", + "sendRoomNotifications": "Invia notifiche alla @stanza", + "sendCanceled": "Invio annullato", + "calculatingFileSize": "Calcolo della dimensione del file...", + "sendingAttachment": "Invio allegato...", + "oneOfYourDevicesIsNotVerified": "Uno dei tuoi dispositivi non è verificato", + "noticeChatBackupDeviceVerification": "Nota: quando colleghi tutti i tuoi dispositivi al backup della chat, vengono verificati automaticamente.", + "moderatorLevel": "{level} - Moderatore", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheDescriptionOfTheGroup": "Cambia la descrizione della chat", + "updateInstalled": "🎉 Aggiornamento {version} installato!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "inviteOtherUsers": "Invita altri utenti a questa chat", + "userLevel": "{level} - Utente", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Amministratore", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Modifica le impostazioni generali della chat", + "loginWithMatrixId": "Accedi con il Matrix ID", + "changelog": "Registro delle modifiche", + "doesNotSeemToBeAValidHomeserver": "Non sembra essere un homeserver compatibile. URL sbagliato?", + "goToSpace": "Vai allo spazio: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Contrassegna come non letto", + "aboutHomeserver": "Informazioni su {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "continueText": "Continua", + "blur": "Sfocatura:", + "opacity": "Opacità:", + "setWallpaper": "Imposta sfondo", + "manageAccount": "Gestisci account", + "noContactInformationProvided": "Il server non fornisce alcuna informazione di contatto valida", + "contactServerAdmin": "Contatta l'amministratore del server", + "contactServerSecurity": "Contatta la sicurezza del server", + "supportPage": "Pagina di supporto", + "serverInformation": "Informazioni sul server:", + "name": "Nome", + "version": "Versione", + "website": "Sito web", + "boldText": "Testo in grassetto", + "italicText": "Testo in corsivo", + "strikeThrough": "Barrato", + "pleaseFillOut": "Si prega di compilare", + "invalidUrl": "URL non valido", + "addLink": "Aggiungi collegamento", + "unableToJoinChat": "Impossibile partecipare alla chat. Forse l'altra parte ha già chiuso la conversazione.", + "sendImages": "Invia {count} immagine", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Comprimere", + "contentNotificationSettings": "Impostazioni del contenuto di notifica", + "generalNotificationSettings": "Impostazioni di notifica generale", + "roomNotificationSettings": "Impostazioni di notifica della stanza", + "userSpecificNotificationSettings": "Impostazioni di notifica specifiche dell'utente", + "otherNotificationSettings": "Altre impostazioni di notifica", + "notificationRuleContainsUserName": "Contiene il nome utente", + "notificationRuleContainsUserNameDescription": "Notifica l'utente quando un messaggio contiene il proprio nome utente.", + "notificationRuleMaster": "Silenzia tutte le notifiche", + "notificationRuleMasterDescription": "Sovrascive tutte le altre regole e disabilita tutte le notifiche.", + "notificationRuleSuppressNotices": "Silenziare i messaggi automatizzati", + "notificationRuleSuppressNoticesDescription": "Silenzia le notifiche da client automatizzati come i bot.", + "notificationRuleInviteForMeDescription": "Notifica l'utente quando viene invitato a una stanza.", + "notificationRuleMemberEvent": "Eventi per i membri", + "notificationRuleInviteForMe": "Inviti per me", + "notificationRuleIsUserMentionDescription": "Notifica l'utente quando viene menzionato direttamente in un messaggio.", + "notificationRuleContainsDisplayNameDescription": "Notifica l'utente quando un messaggio contiene il proprio nome visualizzato.", + "notificationRuleIsRoomMention": "Menzioni della stanza", + "notificationRuleIsUserMention": "Menzioni dell'utente", + "notificationRuleRoomnotif": "Notifiche della stanza", + "notificationRuleRoomnotifDescription": "Notifica l'utente quando un messaggio contiene '@room'.", + "notificationRuleTombstone": "Tombstone", + "notificationRuleTombstoneDescription": "Notifica all'utente i messaggi di disattivazione della stanza.", + "notificationRuleReaction": "Reazioni", + "notificationRuleReactionDescription": "Silenzia le notifiche per le reazioni.", + "notificationRuleRoomServerAcl": "ACL del server della stanza", + "notificationRuleRoomServerAclDescription": "Silenzia le notifiche per gli elenchi di controllo degli accessi del server della stanza (ACL).", + "notificationRuleSuppressEdits": "Silenzia le modifiche", + "notificationRuleSuppressEditsDescription": "Silenzia le notifiche per i messaggi modificati.", + "notificationRuleCallDescription": "Notifica all'utente le chiamate.", + "notificationRuleEncryptedRoomOneToOne": "Stanze crittografate One-to-One", + "notificationRuleRoomOneToOne": "Stanze One-to-One", + "notificationRuleRoomOneToOneDescription": "Notifica all'utente i messaggi nelle stanze one-to-one.", + "notificationRuleMessage": "Messaggi", + "notificationRuleMessageDescription": "Notifica all'utente i messaggi generali.", + "notificationRuleEncryptedDescription": "Notifica all'utente i messaggi nelle stanze crittografate.", + "notificationRuleEncrypted": "Crittografate", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Notifica all'utente gli eventi del widget Jitsi.", + "notificationRuleServerAcl": "Silenziare gli eventi ACL del server", + "notificationRuleServerAclDescription": "Silenzia le notifiche per gli eventi ACL del server.", + "unknownPushRule": "Regola push '{rule}' sconosciuta", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Se si elimina questa impostazione di notifica, questo non può essere annullato.", + "more": "Di più", + "newChatRequest": "📩 Nuova richiesta di chat", + "shareKeysWith": "Condividi le chiavi con...", + "shareKeysWithDescription": "Quali dispositivi dovrebbero essere fidati in modo che possano leggere i tuoi messaggi in chat crittografate?", + "allDevices": "Tutti i dispositivi", + "crossVerifiedDevicesIfEnabled": "Verifica incrociata dei dispositivi, se abilitata", + "crossVerifiedDevices": "Dispositivi con verifica incrociata", + "verifiedDevicesOnly": "Solo dispositivi verificati", + "appWantsToUseForLogin": "Usa '{server}' per accedere", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Apri", + "appWantsToUseForLoginDescription": "Con la presente consenti all'app e al sito web di condividere informazioni su di te.", + "waitingForServer": "In attesa del server...", + "synchronizingPleaseWaitCounter": " Sincronizzazione… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "notificationRuleMemberEventDescription": "Silenzia le notifiche per gli eventi dei membri.", + "notificationRuleContainsDisplayName": "Contiene nome visualizzato", + "notificationRuleIsRoomMentionDescription": "Notifica l'utente quando c'è una menzione della stanza.", + "notificationRuleCall": "Chiamate", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica all'utente i messaggi in stanze crittografate one-to-one.", + "previous": "Precedente", + "otherPartyNotLoggedIn": "L'altra parte non è attualmente connessa e quindi non può ricevere messaggi!", + "takeAPhoto": "Scatta una foto", + "recordAVideo": "Registra un video", + "notSupportedOnThisDevice": "Non supportato su questo dispositivo", + "enterNewChat": "Inizia nuova chat", + "commandHint_roomupgrade": "Aggiorna questa stanza alla versione specificata", + "optionalMessage": "Messaggio (opzionale)...", + "approve": "Approva", + "youHaveKnocked": "Hai bussato", + "pleaseWaitUntilInvited": "Ora attendi, finché qualcuno dalla stanza non ti invita.", + "checkList": "Checklist", + "countInvited": "{count} invitati", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Messaggio vocale da {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "commandHint_logout": "Disconnetti questo dispositivo", + "commandHint_logoutall": "Disconnetti tutti i dispositivi attivi", + "displayNavigationRail": "Mostra barra di navigazione su mobile", + "customReaction": "Reazione personalizzata", + "moreEvents": "Altri eventi", + "declineInvitation": "Rifiuta invito", + "noMessagesYet": "Ancora nessun messaggio", + "longPressToRecordVoiceMessage": "Premi a lungo per registrare un messaggio vocale.", + "pause": "Pausa", + "resume": "Riprendi", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb new file mode 100644 index 0000000000..2588c3da05 --- /dev/null +++ b/lib/l10n/intl_ja.arb @@ -0,0 +1,2149 @@ +{ + "@@locale": "ja", + "@@last_modified": "2021-08-14 12:41:09.978060", + "about": "このアプリについて", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "承諾する", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍{username}が招待を承諾しました", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "アカウント", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐{username}がエンドツーエンド暗号化を有効にしました", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Eメールを追加", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "管理者", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "エイリアス", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "すべて", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName}は通話に出ました", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "誰でも参加できる", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "アプリのロック", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "アーカイブ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "ゲストユーザーの参加を許可する", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "これでよろしいですか?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "ログアウトしてよろしいですか?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "他の人を署名するためにはパスフレーズやリカバリーキーを入力してください。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}の検証リクエストを承認しますか?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "ホームサーバーでサポートされているログインタイプ:\n{serverVersions}\nアプリがサポートしているログインタイプ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "チャットからBANする", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "BANされています", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}が{targetName}をBANしました", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "デバイスをブロックする", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "ブロックしました", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "キャンセル", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "デバイス名を変更", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username}がチャットアバターを変更しました", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username}がチャットの権限を変更しました", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}が表示名を「{displayname}」に変更した", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username}がゲストのアクセスルールを変更しました", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username}がゲストのアクセスルールを{rules}に変更しました", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username}が履歴の表示設定を変更しました", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username}が履歴の表示設定を{rules}に変更しました", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username}が参加ルールを変更しました", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username}が参加ルールを{joinRules}に変更しました", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}がアバターを変更しました", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username}が部屋のエイリアスを変更しました", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username}が招待リンクを変更しました", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "パスワードを変更", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "ホームサーバーの変更", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "スタイルを変更する", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "グループの名前を変更する", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "暗号が破損しています", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "チャット", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "チャットのバックアップ", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "チャットの詳細", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "チャット", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "強いパスワードを選択してください", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "アーカイブを消去", + "close": "閉じる", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "表示されている絵文字が他のデバイスで表示されているものと一致するか確認してください:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "表示されている数字が他のデバイスで表示されているものと一致するか確認してください:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "チャットの設定", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "連絡先に登録された人が招待されました", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "サーバー管理者に通報されました", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "クリップボードにコピーされました", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "コピー", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "クリップボードにコピー", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "メッセージを解読できませんでした: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count}名の参加者", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "作成", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username}がチャットを作成しました", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "現在アクティブです", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "ダーク", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "あなたのアカウントを無効化します。この操作は元に戻せません!よろしいですか?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "デフォルトの権限レベル", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "削除", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "アカウントの削除", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "メッセージの削除", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "デバイス", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "ダイレクトチャット", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "表示名が変更されました", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "ファイルのダウンロード", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "編集", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ブロックしたサーバーを編集", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "表示名を編集", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "ルームエイリアスを編集", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "部屋のアバターを編集する", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoteはすでに存在します!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "不正なEmoteショートコード!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote設定", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoteショートコード", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "空のチャット", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "emoteをグローバルに有効にする", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "暗号化を有効にする", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "一度暗号化を有効にするともとに戻せません。よろしいですか?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "暗号化", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "暗号化", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "暗号化されていません", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName}は通話を切断しました", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "メールアドレスを入力してください", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "フォントサイズ", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "転送", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "参加時点から閲覧可能", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "招待時点から閲覧可能", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "グループ", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "グループは公開されています", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "グループ", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname}とグループを作成する", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "ゲストは許可されていません", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "ゲストが許可されています", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{targetName}の招待を{username}が取り下げました", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "ヘルプ", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "不明なイベントを非表示にする", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "無視する", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "無視されたユーザー", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "リンクをクリックしました", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "パスフレーズかリカバリーキーが間違っています", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "連絡先から招待する", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "連絡先から{groupName}に招待する", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "招待されました", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} が {targetName} を招待しました", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "招待されたユーザーのみ", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username}があなたをFluffyChatに招待しました。\n1. FluffyChatをインストール: fluffychat.im \n2. アカウントの作成、またはサインインを行う\n3. 招待リンクを開く\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "が入力しています…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} がチャットに参加しました", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "部屋に参加", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} は {targetName} をキックしました", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} が {targetName} をキックしブロックしました", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "チャットからキックする", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "最終アクティブ: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "退室する", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "退室しました", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "ライト", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "あと{count}名参加者を読み込む", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "読み込み中…お待ちください。", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "更に読み込む…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "ログイン", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver}にログインする", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "ログアウト", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "メンション", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "メッセージ", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "モデレータ", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "チャットのミュート", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "新規チャット", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChatに新しいメッセージがあります", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "認証リクエスト!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "次へ", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "いいえ", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "サーバーに接続できません", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Emoteは見つかりませんでした😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "ルームを非公開にした後暗号化を有効にできます。", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "あなたのスマホにはGoogleサービスがないようですね。プライバシーを保護するための良い選択です!プッシュ通知を受け取るには https://microg.org/ または https://unifiedpush.org/ を使うことをお勧めします。", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "パスワードを回復する方法をまだ追加していません。", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "権限がありません", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "部屋は見つかりませんでした…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "通知", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count}人が入力中…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "オンライン鍵バックアップは使用されています", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "おっと、何かがうまくいきませんでした…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "アプリを開いてメッセージを確認してください", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "カメラを開く", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "参加者", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "パスフレーズかリカバリーキー", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "パスワード", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "パスワードを忘れた", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "パスワードが変更されました", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "パスワードリカバリー", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "ピン", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "パスコードを選んでください", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "メールのリンクから進めてください。", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "パスワードを入力してください", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "PINを入力してください", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "ユーザー名を入力してください", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "ウェブサイトにあるやり方を見てから次をタップしてください。", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "プライバシー", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "公開された部屋", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "理由", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username}がイベントを編集しました", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "メッセージを削除", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "拒否", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username}は招待を拒否しました", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "消去", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "他のデバイスをすべて削除", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "チャットからのブロックを解除する", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "部屋を新しいバージョンに変更する", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "返信", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "メッセージを通報", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "部屋はアップグレードされました", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "ルームバージョン", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "検索", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "セキュリティ", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "送信", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "メッセージを送信", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "音声の送信", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "ファイルを送信", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "画像の送信", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "メッセージを送る", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "動画を送信", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username}はファイルを送信しました", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username}は音声を送信しました", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username}は画像を送信しました", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username}はステッカーを送信しました", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username}は動画を送信しました", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName}は通話情報を送信しました", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "メインエイリアスに設定", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "ステータスの設定", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "設定", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "共有", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username}は現在地を共有しました", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "スキップ", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "ソースコード", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName}は通話を開始しました", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "ステータス", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "お元気ですか?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "送信", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "システム", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "違います", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "一致しています", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "リクエストが多すぎます。また後で試してみてください!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "送信し直してみる", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}が{targetName}のBANを解除しました", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "デバイスをブロック解除する", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "未知デバイス", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "未知の暗号化アルゴリズム", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "未知のイベント'{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "チャットをミュート解除する", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "ピンを外す", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username}と他{count}名が入力しています…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username}と{username2}が入力しています…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username}が入力しています…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username}はチャットから退室しました", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username}は{type}イベントを送信しました", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "検証済み", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "確認を始める", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "確認が完了しました!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "他のアカウントを確認中", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "音声通話", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "チャット履歴の表示", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "すべての参加者が閲覧可能", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "すべての人が閲覧可能", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "ボイスメッセージ", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "パートナーのリクエスト承諾待ちです…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "パートナーの絵文字承諾待ちです…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "パートナーの数字承諾待ちです…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "警告!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "あなたにメールを送信しました", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "誰がどの操作を実行できるか", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "誰がこのチャットに入れますか", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "これを通報する理由", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "これらのアドレスを使用すると、パスワードを回復することができます。", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "メッセージを入力してください…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "はい", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "あなた", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "あなたはもうこのチャットの参加者ではありません", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "チャットからBANされてしまいました", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "あなたの公開鍵", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "スペースに追加", + "cantOpenUri": "URIが開けません {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "パスワードを繰り返そ", + "autoplayImages": "GIFを自動的に再生する", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Enterで送信", + "changeYourAvatar": "アバタるを変化しする", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "このユーザーを禁止する", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "キャッシュをクリアする", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandInvalid": "コマンドが無効", + "@commandInvalid": { + "type": "String" + }, + "commandHint_create": "空のグループチャットを作成\n暗号化を無効にするには、--no-encryption を使用", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "セッションを破棄", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "confirmMatrixId": "アカウントを削除するには、Matrix IDを確認してください。", + "commandHint_markasgroup": "グループとしてマーク", + "commandHint_join": "指定した部屋に参加", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_send": "テキストを送信", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "hydrate": "バックアップファイルから復元", + "commandHint_html": "HTML形式のテキストを送信", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "指定したユーザーをこの部屋に招待", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandMissing": "{command} はコマンドではありません。", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "oneClientLoggedOut": "クライアントの 1つがログアウトしました", + "addAccount": "アカウントを追加", + "editBundlesForAccount": "このアカウントのバンドルを編集", + "unverified": "未検証", + "sender": "送信者", + "placeCall": "電話をかける", + "voiceCall": "音声通話", + "unsupportedAndroidVersionLong": "この機能を利用するには、より新しいAndroidのバージョンが必要です。アップデートまたはLineage OSのサポートをご確認ください。", + "dehydrateWarning": "この操作は元に戻せません。バックアップファイルを安全に保存してください。", + "dehydrate": "セッションのエクスポートとデバイスの消去", + "youBannedUser": "{user} を禁止しました", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "チャットに参加しました", + "youHaveWithdrawnTheInvitationFor": "{user} への招待を取り下げました", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "ユーザー", + "youRejectedTheInvitation": "招待を拒否しました", + "screenSharingDetail": "FuffyChatで画面を共有しています", + "scanQrCode": "QRコードをスキャン", + "obtainingLocation": "位置情報を取得しています…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "バンドルに追加", + "removeFromBundle": "このバンドルから削除", + "bundleName": "バンドル名", + "noMatrixServer": "{server1} はMatrixのサーバーではありません。代わりに {server2} を使用しますか?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "link": "リンク", + "or": "または", + "@or": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "アバターを削除する", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "saveFile": "ファイルを保存", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "スペースは公開されています", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "スペース名", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "メッセージの情報", + "openGallery": "ギャラリーを開く", + "removeFromSpace": "スペースから削除", + "experimentalVideoCalls": "実験的なビデオ通話", + "youAcceptedTheInvitation": "👍 招待を承諾しました", + "youUnbannedUser": "{user} の禁止を解除しました", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} から招待されました", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user} をキックしました", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 {user} をキックしてブロックしました", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Apple KeyChainに保存", + "storeInAndroidKeystore": "Android KeyStoreに保存する", + "screenSharingTitle": "画面共有", + "foregroundServiceRunning": "この通知は、フォアグラウンド サービスの実行中に表示されます。", + "custom": "カスタム", + "countFiles": "{count}個のファイル", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeSecurlyOnThisDevice": "このデバイスに安全に保管する", + "whyIsThisMessageEncrypted": "このメッセージが読めない理由", + "synchronizingPleaseWait": "同期中...お待ちください。", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "emojis": "絵文字", + "markAsRead": "既読にする", + "videoCallsBetaWarning": "ビデオ通話は、現在ベータ版であることにご注意ください。すべてのプラットフォームで期待通りに動作しない、あるいはまったく動作しない可能性があります。", + "confirmEventUnpin": "イベントの固定を完全に解除してもよろしいですか?", + "unsupportedAndroidVersion": "サポートされていないAndroidのバージョン", + "user": "ユーザー", + "noBackupWarning": "警告!チャットのバックアップを有効にしないと、暗号化されたメッセージにアクセスできなくなります。ログアウトする前に、まずチャットのバックアップを有効にすることを強くお勧めします。", + "disableEncryptionWarning": "セキュリティ上の理由から、以前は暗号化が有効だったチャットで暗号化を無効にすることはできません。", + "youInvitedUser": "📩 {user} を招待しました", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "reactedWith": "{sender} が {reaction} で反応しました", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "createNewSpace": "新しいスペース", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "reportUser": "ユーザーを報告", + "errorObtainingLocation": "位置情報の取得中にエラーが発生しました: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "pinMessage": "部屋にピン留めする", + "oopsPushError": "おっと!残念ながら、プッシュ通知の設定中にエラーが発生しました。", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "noOtherDevicesFound": "他のデバイスが見つかりません", + "shareLocation": "位置情報の共有", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "time": "時間", + "sendAsText": "テキストとして送信", + "@sendAsText": { + "type": "String" + }, + "commandHint_googly": "ぎょろ目を送る", + "commandHint_hug": "ハグを送る", + "encryptThisChat": "このチャットを暗号化する", + "commandHint_markasdm": "ダイレクトメッセージの部屋としてマークする", + "commandHint_dm": "ダイレクトチャットを開始する\n暗号化を無効にするには、--no-encryptionを使用してください", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "この部屋を退出", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "この部屋の写真を設定する (mxc-uriで)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "この部屋の表示名を設定する", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "書式設定されていないテキストを送信する", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "リアクションとして返信を送信する", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "locationDisabledNotice": "位置情報サービスが無効になっています。位置情報を共有できるようにするには、位置情報サービスを有効にしてください。", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "位置情報の権限が拒否されました。位置情報を共有できるように許可してください。", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "sorryThatsNotPossible": "申し訳ありません...それは不可能です", + "wasDirectChatDisplayName": "空のチャット (以前は {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "doNotShowAgain": "今後表示しない", + "newSpace": "新しいスペース", + "reopenChat": "チャットを再開する", + "notAnImage": "画像ファイルではありません。", + "aboutHomeserver": "{homeserver} について", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "noMoreChatsFound": "これ以上のチャットが見つかりません…", + "unread": "未読", + "space": "スペース", + "changedTheChatDescription": "{username}がチャットの説明を変更した", + "changedTheChatName": "{username}がチャットの名前を変更した", + "commandHint_kick": "入力のユーザーをこの部屋からキックする", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "countInvited": "{count}人を招待済み", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "グループを作成する", + "emoteKeyboardNoRecents": "最近使われた絵文字がここに表示されます…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "グローバルチャットID", + "calls": "通話", + "chatDescription": "チャットの説明", + "chatDescriptionHasBeenChanged": "チャットの説明が変更された", + "block": "ブロック", + "blockedUsers": "ブロック済みのユーザー", + "blockUsername": "ユーザー名を無視する", + "noChatDescriptionYet": "チャットの説明はまだ作成されていません。", + "tryAgain": "再試行", + "messagesStyle": "メッセージ:", + "shareInviteLink": "招待リンクを共有", + "openInMaps": "マップで開く", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "{username}によって削除済み", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "ダイレクトチャット", + "redactedByBecause": "{username}によって削除済み。理由:「{reason}」", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "sendImages": "{count}つの画像を送信", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " 同期中…({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "importEmojis": "絵文字をインポート", + "importNow": "今すぐインポート", + "importFromZipFile": ".zipファイルからインポート", + "exportEmotePack": "エモートパックを.zipでエクスポート", + "replace": "置き換え", + "commandHint_roomupgrade": "このルームを特定のルームバージョンにアップグレード", + "commandHint_cuddle": "笑顔を送る", + "googlyEyesContent": "{senderName}がギョロ目を送りました", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName}が笑顔を送りました", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName}がハグしました", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLockDescription": "未使用時にアプリをPINコードでロック", + "sendTypingNotifications": "入力通知を送信", + "swipeRightToLeftToReply": "左にスワイプして返信", + "noChatsFoundHere": "ここにはまだチャットがありません。下のボタンを使ってみんなと新しいチャットを始めましょう。⤵️", + "commandHint_unban": "このルームから禁止されたユーザーを解禁する", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "chatPermissions": "チャット権限", + "checkList": "チェックリスト", + "accessAndVisibility": "アクセスと範囲", + "accessAndVisibilityDescription": "誰がこのチャットに参加できて、どのように発見することができるか。", + "customEmojisAndStickers": "カスタム絵文字とステッカー", + "customEmojisAndStickersBody": "どのチャットでも利用可能なカスタム絵文字やステッカーを追加・共有します。", + "hideRedactedMessages": "削除されたメッセージを隠す", + "hideRedactedMessagesBody": "誰かがメッセージを削除した場合、このメッセージはそれ以降チャット内では見えなくなります。", + "hideInvalidOrUnknownMessageFormats": "無効であるか不明なメッセージ形式を隠す", + "blockListDescription": "迷惑なユーザーをブロックすることができます。あなたの個人的なブロックリストに記載されたユーザーは、あらゆるメッセージやルームへの招待を受け取ることができません。", + "invalidServerName": "無効なサーバー名", + "redactMessageDescription": "メッセージはこの会話のすべての参加者から削除されます。これは取り消すことができません。", + "commandHint_op": "ユーザーの権限レベルを付与する(デフォルト:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "optionalRedactReason": "(オプション)メッセージを削除する理由…", + "passwordRecoverySettings": "パスワードの復元設定", + "setChatDescription": "チャットの説明を設定", + "hasKnocked": "🚪 {user}がノックしました", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "ユーザーはノックする必要があります", + "noOneCanJoin": "誰も参加できません", + "knock": "ノック", + "fileIsTooBigForServer": "送信できません!このサーバーは添付数は{max}個までです。", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "ファイルは {path} に保存されています", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "最後に閲覧したメッセージまで移動する", + "readUpToHere": "ここまで既読です", + "jump": "移動", + "openLinkInBrowser": "リンクをブラウザで開く", + "reportErrorDescription": "😭 おっと。問題が発生しました。必要があれば、このバグを開発者に報告することができます。", + "setColorTheme": "カラーテーマの設定:", + "invite": "招待", + "inviteGroupChat": "📨 グループチャットへ招待する", + "invalidInput": "無効な入力です!", + "wrongPinEntered": "誤ったPINが入力されました!{seconds}秒後に再試行してください…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "0以上の数値を入力してください", + "archiveRoomDescription": "チャットはアーカイブに移動されます。他のユーザーはあなたが退出したチャットを見ることができます。", + "roomUpgradeDescription": "チャットは新しい部屋バージョンで再作成されます。全参加者に新しいチャットへ切り替える必要があることが通知されます。部屋バージョンについては https://spec.matrix.org/latest/rooms/ をご覧ください", + "removeDevicesDescription": "このデバイスからログアウトするとメッセージを受け取ることができません。", + "banUserDescription": "ユーザーをチャットからBANすると、BANを解除されるまで再入室することはできません。", + "unbanUserDescription": "ユーザーが再試行時に再入室することができます。", + "pushNotificationsNotAvailable": "プッシュ通知は利用できません", + "learnMore": "詳しく知る", + "yourGlobalUserIdIs": "あなたのグローバルユーザーID: ", + "knocking": "ノックしています", + "searchChatsRooms": "#チャット,@ユーザーで検索…", + "nothingFound": "何も見つかりませんでした…", + "groupName": "グループ名", + "createGroupAndInviteUsers": "グループを作成してユーザーを招待する", + "groupCanBeFoundViaSearch": "グループは検索で見つけることができます", + "commandHint_sendraw": "生のJSONを送信する", + "databaseMigrationTitle": "データベースは最適化されています", + "databaseMigrationBody": "しばらくお待ちください。この操作は時間がかかります。", + "searchForUsers": "@ユーザー で検索…", + "pleaseEnterYourCurrentPassword": "現在のパスワードを入力してください", + "newPassword": "新しいパスワード", + "pleaseChooseAStrongPassword": "強力なパスワードを選択してください", + "markAsUnread": "未読としてマーク", + "userLevel": "{level} - ユーザー", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - モデレーター", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - 管理者", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "全体のチャット設定を変更する", + "inviteOtherUsers": "他のユーザーをこのチャットに招待する", + "changeTheChatPermissions": "チャット権限を変更する", + "changeTheDescriptionOfTheGroup": "チャットの説明を変更する", + "updateInstalled": "🎉 アップデート {version} をインストールしました!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "変更履歴", + "sendCanceled": "送信を取り消しました", + "loginWithMatrixId": "Matrix-IDでログイン", + "calculatingFileSize": "ファイルサイズを計算しています…", + "sendingAttachment": "添付ファイルを送信しています…", + "oneOfYourDevicesIsNotVerified": "いずれかのデバイスが認証されていません", + "noticeChatBackupDeviceVerification": "注意:すべてのデバイスをチャットのバックアップに接続している場合、それらは自動的に認証されます。", + "continueText": "続ける", + "blur": "ぼかし:", + "opacity": "透過度:", + "setWallpaper": "壁紙を設定する", + "manageAccount": "アカウント管理", + "noContactInformationProvided": "サーバーから有効な連絡先情報が提供されていません", + "supportPage": "サポートページ", + "serverInformation": "サーバー情報:", + "name": "名前", + "version": "バージョン", + "website": "ウェブサイト", + "compress": "圧縮", + "boldText": "太字", + "italicText": "斜体", + "invalidUrl": "無効なURL", + "addLink": "リンクを追加", + "appWantsToUseForLogin": "'{server}' を使用してログインする", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "開く", + "waitingForServer": "サーバーを待機中…", + "newChatRequest": "📩 新しいチャットを要求", + "contentNotificationSettings": "コンテンツ通知設定", + "generalNotificationSettings": "全体通知設定", + "roomNotificationSettings": "部屋通知設定", + "userSpecificNotificationSettings": "ユーザー毎の通知設定", + "otherNotificationSettings": "その他の通知設定", + "notificationRuleContainsUserName": "ユーザー名を含む", + "notificationRuleContainsUserNameDescription": "ユーザー名がメッセージに含まれる場合に通知します。", + "notificationRuleMaster": "すべての通知をミュート", + "notificationRuleSuppressNotices": "自動化されたメッセージを控える", + "notificationRuleSuppressNoticesDescription": "Botのような自動化されたクライアントからの通知を抑制します。", + "notificationRuleInviteForMeDescription": "ユーザーが部屋に招待されたときに通知します。", + "notificationRuleMasterDescription": "全ルールを上書きして通知をすべて無効にします。", + "notificationRuleIsUserMention": "ユーザーの言及", + "notificationRuleIsUserMentionDescription": "ユーザーがメッセージ内で直接言及されたときに通知します。", + "join": "参加", + "today": "今日", + "yesterday": "昨日", + "replyInThread": "スレッドで返信", + "select": "選択" +} \ No newline at end of file diff --git a/lib/l10n/intl_ka.arb b/lib/l10n/intl_ka.arb new file mode 100644 index 0000000000..ddaa9d8c93 --- /dev/null +++ b/lib/l10n/intl_ka.arb @@ -0,0 +1,1967 @@ +{ + "alias": "მეტსახელი", + "@alias": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება", + "commandHint_hug": "მეგობრული ჩახუტვის გაგზავნა", + "areYouSure": "დარწმუნებული ხართ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "დარწმუნებული ხართ, რომ გამოსვლა გსურთ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} მეგობრულად გეხუტება", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askSSSSSign": "სხვა მომხმარებლის დადასტურებლად, გთხოვთ, ჩაწეროთ თქვენი ან საიდუმლო ფრაზა, ან აღდგენის გასაღები.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "ანიმირებული სტიკერებისა და ემოჯების ავტომატური ჩართვა", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "banFromChat": "ჩატიდან გაგდება და ბლოკირება", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "დაბლოკილია", + "@banned": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "ამ სერვერს აქვს შესვლის მეთოდების მხარდაჭერა:\n{serverVersions}\nმაგრამ ამ აპლიკაციას აქვს მხარდაჭერა მხოლოდ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "გაგზავნა enter-ის დაჭერისას", + "bannedUser": "{username} დაბლოკა {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "მოწყობილების ბლოკირება", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "დაბლოკილია", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "გაუქმება", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} შეცვალა ისტორიის ხილვადობა: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} გაწევრიანების წესები შეცვალა", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} შეცვალა პროფილის ფოტო", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chat": "ჩატი", + "@chat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "პროფილის ფოტოს შეცვლა", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "დაშიფვრა დაზიანდა", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "სესიის გაუქმება", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_invite": "მოცემული მომხმარებლის მოწვევა ამ ოთახში", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_plain": "არაფორმატირებული ტექსტის გაგზავნა", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "ტექსტის გაგზავნა", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandMissing": "{command} არაა ბრძანება.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "countParticipants": "{count} მონაწილე", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "ჯგუფის შექმნა", + "deactivateAccountWarning": "ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "devices": "მოწყობილებები", + "@devices": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "ბნელი", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "ჩატის უფლებები", + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "editRoomAliases": "ოთახის მეტსახელების შეცვლა", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "ეს ემოცია უკვე არსებობს!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "ემოციის არასწორი მოკლე კოდი!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "importNow": "დაიმპორტება", + "importEmojis": "ემოჯის დაიმპორტება", + "importFromZipFile": "იმპორტი .zip ფაილიდან", + "exportEmotePack": "ემოციების .zip ფაილში ექსპორტი", + "replace": "ჩანაცვლება", + "accept": "თანხმობა", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username}-მ(ა) მიიღო მოწვევა", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "ანგარიში", + "@account": { + "type": "String", + "placeholders": {} + }, + "addEmail": "ელ.ფოსტის დამატება", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.", + "addToSpace": "სივრცეში დამატება", + "admin": "ადმინი", + "@admin": { + "type": "String", + "placeholders": {} + }, + "all": "ყველა", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "ჩახუტების გაგზავნა", + "answeredTheCall": "{senderName} უპასუხა ზარს", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "ყველას შეუძლია გაწევრიანება", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "აპლიკაციის ბლოკირება", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "არქივი", + "@archive": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "გამოშტერილი თვალების გაგზავნა", + "googlyEyesContent": "{senderName} გამოშტერილ თვალებს გიგზავნის", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} გეხუტება", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areGuestsAllowedToJoin": "შეუძლიათ სტუმარ მომხმარებლებს გაწევრება?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "მიიღებთ {username} დადასტურების მოთხოვნას?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendTypingNotifications": "წერის შეტყობინების გაგზავნა", + "cantOpenUri": "ვერ იხსნება ბმული {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "მოწყობილების გადარქმევა", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ჩატის ფოტო შეცვალა", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ჩატის უფლებები შეცვალა", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} შეცვალა სტუმრების წვდომის წესები", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} შეცვალა სტუმრების წვდომის წესები: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} შეცვალა ისტორიის ხილვადობა", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} გაწევრიანების წესები შეცვალა: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ოთახის მეტსახელები შეცვალა", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} მოწვევის ბმული შეცვალა", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "პაროლის შეცვლა", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "სახლის სერვერის შეცვლა", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "სტილის შეცვლა", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "ჯგუფის გადარქმევა", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "ჩატის სარეზერვო საშუალება", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "ჩატის დეტალები", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "ჩატები", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "ძლიერი პაროლი აარჩიეთ", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "არქივის გაწმენდა", + "close": "დახურვა", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "აღნიშვნა, როგორც ჯგუფის", + "commandHint_ban": "მოცემული მომხმარებლის ბლოკირება ამ ოთახში", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "­ქეშის გაწმენდა", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_join": "მოცემულ ოთახში გაწევრიანება", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "მოცემული მომხმარებლის წაშლა ამ ოთახიდან", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "ამ ოთახიდან გასვლა", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "აღწერეთ თქვენი თავი", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_unban": "ამ ოთახში მომხმარებლისგან ბლოკის მოხსნა", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "არასწორი ბრძანება", + "@commandInvalid": { + "type": "String" + }, + "compareEmojiMatch": "გთხოვთ, შეადაროთ ეს ემოჯი", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "გთხოვთ, შეადაროთ ეს რიცხვები", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "ჩატის კონფიგურაცია", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "კონტაქტი მოწვეული იქნა ჯგუფში", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "კოპირებულია ბუფერში", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "კოპირება", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "კოპირება ბუფერში", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "შეტყობინების გაშიფვრის შეცდომა: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "შექმნა", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} შექმნა ჩატი", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "ახალი სივრცე", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "ახლა აქტიურია", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "delete": "წაშლა", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "ანგარიშის წაშლა", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "შეტყობინების წაშლა", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "directChats": "პირდაპირი ჩატები", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "ფაილის ჩატვირთვა", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "რედაქტირება", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ბლოკირებული სერვერების რედაქტირება", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "ოთახის ფოტოს შეცვლა", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "ემოციების პარამეტრები", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "გლობალური ჩატის ID", + "repeatPassword": "გაიმეორეთ პაროლი", + "notAnImage": "ფაილი არაა სურათი.", + "remove": "წაშლა", + "@remove": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username}-მ(ა) გააქტიურა end to end დაშიფვრა", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "ეს უნდა იყოს {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "about": "შესახებ", + "@about": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} შეცვალა ნაჩვენები სახელი: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "commandHint_create": "ცარიელი ჯგუფური ჩატის შექმნა\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "პირდაპირი ჩატის დაწყება\nგამოიყენეთ --no-encryption გაშიფვრის გასათიშად", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "HTML ფორმატირებული ტექსტის გაგზავნა", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_myroomavatar": "თქვენი ფოტოს დაყენება ამ ოთახისათვის(mxc-uri-ს დახმარებით)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "ამ ოთახისათვის ნაჩვენები სახელის დაყენება", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "მოცემული მომხმარებლისათვის უფლებების დონის დაყენება (ჩვეულებრივ: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "რეაქციის სახით პასუხის გაგზავნა", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "contentHasBeenReported": "ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "ნაგულისხმევი უფლების დონე", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "ნაჩვენები სახელი შეიცვალა", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "ნაჩვენები სახელის შეცვლა", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "{homeserver}-ის შესახებ", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb new file mode 100644 index 0000000000..048f30e63f --- /dev/null +++ b/lib/l10n/intl_kab.arb @@ -0,0 +1,2370 @@ +{ + "@@locale": "kab", + "repeatPassword": "Ales awal n uɛeddi", + "notAnImage": "Mačči d afaylu n tugna.", + "remove": "Kkes", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Kter tura", + "importEmojis": "Kter imujiten", + "importFromZipFile": "Kter seg ufaylu .zip", + "exportEmotePack": "Sifeḍ akemmus n Izamulen uḥulfu am .zip", + "replace": "Semselsi", + "about": "Ɣef", + "aboutHomeserver": "Ɣef {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Qbel", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} yeqbel tinubga", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Amiḍan", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} irmed awgelhen seg yixef ɣer yixef", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Rnu imayl", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Ttxil-ik·im, sentem asulay-ik·im n Matriks akken ad tekkseḍ amiḍan-ik·im.", + "supposedMxid": "A win yufan, ad yili d {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Rnu ɣer tallunt", + "admin": "Anedbal", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "Tazaẓlut", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Meṛṛa", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Sali aswir n txxamt-agi ɣer lqem n texxamt i d-yettunefken", + "answeredTheCall": "{senderName} yerra-d i usiwel", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Yal yiwen yezmer ad yettekki", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Asekkeṛ n usnas", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Sekkeṛ asnas ticki ur tseqdaceḍ ara s tengalt n pin", + "archive": "Aɣbaṛ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Iseqdacen inebgiwen ttusirgen ad ttekkin", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tetḥeqqeḍ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "D tidet tebɣiḍ ad teffɣeḍ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Iwakken ad teszmeleḍ amdan-nniḍen, ttxil-k·m sekcem tafyirt-ik·im n uḥraz s wudem aɣelsan neɣ tasarut n tririt.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Qbel asuter-agi n usenqed seg {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Gdel seg adiwenni", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Yettwagdel", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} yegdel {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Sewḥel ibenk", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Yettusewḥel", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Sefsex", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ur yezmir ara ad yeldi URl {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Snifel isem n yibenk", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} yesnifel avaṭar n udiwenni", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescription": "{username} yesnifel aglam n udiwenni", + "changedTheChatName": "{username} yesnifel isem n udiwenni", + "changedTheChatPermissions": "{username} yesnifel tisirag n udiwenni", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} yesnifel tisirag n udiwenni ɣer: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "chat": "Adiwenni", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Aḥraz n udiwenni", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Ifatusen n udiwenni", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Idiwenniyen", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Fren awal n uɛeddi iǧehden", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Sfeḍ aɣbaṛ", + "close": "Mdel", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Creḍ d akken taxxamt n yizen usrid i Usulay Matriks i d-yettunefken", + "commandHint_markasgroup": "Creḍ am ugraw", + "commandHint_ban": "Gdel aseqdac i d-ittunefken seg texxamt-agi", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Sfeḍ tazarkatut", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Snulfu-d agraw n udiwenni ilem\nSeqdec -- war awgelhen i tukksa n uwgelhen", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Kkes tiɣimit", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Senker adiwenni usrid\nSeqdec --war awgelhen i tukksa n uwgelhen", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Azen aḍris s umasal HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Snubg aseqdac i d-ittunefken ɣer texxamt-agi", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Ddu ɣer texxamt i d-ittunefken", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Kkes aseqdac i d-ittunefken seg texxamt-agi", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Ffeɣ seg texxamt-a", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Glem-d iman-ik·im", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Sbadu tawlaft-ik·im i texxamt-a (s mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Sbadu isem n uskan i texxamt-agi", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Sbadu aswir n tnezmert n useqdac i d-ittunefken (amezwer: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "createNewSpace": "Tallunt tamaynut", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Yermed akka tura", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Ubrik", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ayagi ad yekkes armed i umiḍan-ik·im n useqdac. Aya ur yezmir ara ad yettwasefsex. Tetḥeqqeḍ s tidet?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Aswir n turagt amezwer i yiseqdacen imaynuten", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "kkes", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "kkes amiḍan", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "kkes izen", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Ibenkan", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Idiwenniyen Usriden", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Isem n uskan yettusnifel", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Sider afaylu", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Ẓreg", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Ẓreg iqeddacen yettusweḥlen", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Isirigen n Udiwenni", + "encrypted": "Yettwawgelhen", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Awgelhen", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Awgelhen ur yettwarmed ara", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ifukk asiwel", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Sekcem tansa n yimayl", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Tuccḍa deg wawway n yideg: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Tiddi n tsefsit", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Ɣer zdat", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Seg unekcam-is", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Seg tinubga", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Agraw", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Aglam n udiwenni", + "chatDescriptionHasBeenChanged": "Aglam n udiwenni yettwabeddel", + "groupIsPublic": "Agraw d azayez", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Igrawen", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Agraw s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "tryAgain": "Ɛreḍ tikkelt-nniḍen", + "invalidServerName": "Isem n uqeddac d armeɣtu", + "invited": "Yettwaɛreḍ", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "Izen ad yettwakkesn i imttekkiyen merra deg udiwenni-agi. Ur tezmireḍ ara ad tesfesxeḍ.", + "optionalRedactReason": "(Afrayan) Sebba n tukksa n izen-agi…", + "invitedUser": "📩 {username} yenced {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Iseqdacen kan yettwaɛerḍen", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "isTyping": "la yettaru…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋{username} yekcem ɣer udiwenni", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Tekki deg texxamt", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞{username} yessuffeɣ-d {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} yessuffeɣ-d udiɣ igdel {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Suffeɣ seg udiwenni", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Yermed i tikkelt taneggarut: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Eǧǧ", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ffeɣ seg udiwenni", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Aceɛlal", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Sali-d ugar n {count} yimttekkiyen", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Sifeḍ tiɣimit akked usfaḍ n yibenk", + "dehydrateWarning": "Tigawt-agi ur tezmir ara ad tettwasefsex. Tḥeqqeq belli tesseklaseḍ afaylu n weḥraz.", + "hydrate": "Err-d seg ufaylu n weḥraz", + "loadingPleaseWait": "Asali... Ttxil-k·m arǧu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Yettwanɣel ɣer tecfawit", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Nɣel", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Nɣel ɣer tecfawit", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Ur izmer ara tukksa n uwgelhen n yizen: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "checkList": "Senqed tabdart", + "countParticipants": "{count} imttekkiyen", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countInvited": "{count} yettwaɛerḍen", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Snulfu-d", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} yesnulfa-d adiwenni", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Snulfu-d agraw", + "editDisplayname": "Ẓreg isem n ubeqqeḍ", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Ẓreg avaṭar n texxamt", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Azamul uḥulfu yella yakan!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Tangalt tawezlant n uzamul uḥulfu d tarmeɣtut!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Izamulen uḥulfu yettwasqedcen melmi kan ad banen dagi…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Iɣewwaṛen n uzamul uḥulfu", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Asulay n udiwenni amatu", + "accessAndVisibility": "Addaf d twalit", + "accessAndVisibilityDescription": "Anwa i yesɛan turagt ad yernu ɣer udiwenni-agi u amek adiwenni yezmer ad yettwaf.", + "calls": "Isawalen", + "customEmojisAndStickers": "Imujiten yugnen akked tcṛeṭ n tesfift", + "customEmojisAndStickersBody": "Rnu neɣ bḍu imujiten yugnen neɣ tcṛeṭ n tesfift i zemren ad ttwasqedcen deg yal adiwenni.", + "emptyChat": "Adiwenni d ilem", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Sermed akemmus n uzamul uḥulfu s wudem amatu", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Rmed awgelhen", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ur tettizmireḍ ara ad tessenseḍ awgelhen syagi ɣer zdat. Tetḥeqqeḍ s tidet?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "login": "Anekcam", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Anekcam ɣer {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Tuffɣa", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Abdar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Iznan", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Iznan:", + "muteChat": "Sgugem adiwenni", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Adiwenni Amaynut", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Izen amaynut deg FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Asuter amaynut n uselken!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Uḍfir", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ala", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ulac tuqqna ɣer uqeddac", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Tzemreḍ kan ad tesremdeḍ awgelhen akken kan ara tuɣal taxxamt s war anekcum azayez.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ulac izamulen uḥulfu yettwafen. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ur yelli d aqeddac matriks, seqdec axir {server2} ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Bḍu aseɣwen n tinubga", + "noPasswordRecoveryDescription": "Mazal ur terniḍ ara tarrayt akken ad terreḍ awal-ik·im n uɛeddi.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ulac tasiregt", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Ulac taxxamt i yettwafen…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Ilɣa", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} n iseqdacen la yettarun…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Aguccel n wadig…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Ẓreg tizeẓla n taxxamt", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "link": "Aseɣwen", + "or": "Neɣ", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Imttekki", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "tafyirt n uɛeddi neɣ tasarut n tririt", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Awal n uɛeddi", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Awal n uɛeddi yettwattun", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Awal n uɛeddi yettusnifel", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecoverySettings": "Iɣewwaṛen n tririt n wawal n uɛeddi", + "passwordRecovery": "Tiririt n wawal n uɛeddi", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Ttxil-k·m fren tangalt n uɛeddi", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Ma ulac aɣilif, sit ɣef useɣwen yellan deg imayl sakin kemmel.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} akked {count} nniḍen la ad ttarun…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} akked {username2} la ad ttarun…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} la yettaru…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} yeffeɣ seg udiwenni", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} yuzen-d tadyant {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Ur yettwaselken ara", + "verified": "Yettwaselken", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Bdu Aselken", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Yedda uselken-ik·im akken iwata!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Aselken n imiḍanen nniḍen", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Asiwel s tvidyut", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Tawalit n uzray n udiwenni", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Yettban i yimttekkiyen meṛṛa", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Yettban i yal yiwen", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Izen n taɣect", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Araǧu n uneblag ad yeqbel asuter…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Araǧu n uneblag ad yeqbel imujit…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Araǧu n uneblag ad yeqbel uṭṭunen…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Ɣur-k·m!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Nuzen-ak-d imayl", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Anwa i izemren ad yexdem anta tigawt", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Anwa i izemren ad yernu ɣer ugraw-agi", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Ayɣer tebɣiḍ ad temleḍ aya?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "S tansiwin-agi i tzemreḍ ad terreḍ awal-ik·im n uɛeddi.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Aru izen…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ih", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "kečč·em", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ur mazal ara tettekkaḍ deg udiwenni-a", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Tettwagedleḍ seg udiwenni-agi", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Tasarut-ik·im tazayezt", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Talɣut n yizen", + "time": "Akud", + "sender": "Amazan", + "openGallery": "Ldi timidelt", + "removeFromSpace": "Kkes seg tallunt", + "markAsRead": "Creḍ amzun yettwaɣṛa", + "reportUser": "Cetki aseqdac", + "reactedWith": "{sender} err-d s {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Senteḍ ɣer texxamt", + "confirmEventUnpin": "Tebɣiḍ ad tekkseḍ s wudem imezgi asenṭed n tadyant-nni?", + "emojis": "Imujiten", + "placeCall": "Sɛeddi Asiwel", + "voiceCall": "Asiwel n taɣect", + "removeAllOtherDevices": "Kkes akk ibenkan-nniḍen", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Kkes agdal seg udiwenni", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Kkes avaṭar-ik·im", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Semselsi taxxamt s lqem amaynut", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Err", + "@reply": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Anermis yettwaɛreḍ ɣer ugraw", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Agbur yettwammel i inedbalen n uqeddac", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ttekkiɣ ɣef useɣwen", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Tafyirt n uɛeddi neɣ tasarut n tririt d tarameɣtut", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Snubg anermis", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Snubg anermis ɣer {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Ulac aglam n udiwenni i d-yenulfan yakan.", + "inviteText": "{username} yeɛreḍ-ik·m ɣer FluffyChat.\n1. Rzu ɣer fluffychat.im syin sbedd asnas \n2. Jerred neɣ kcem \n3. Ldi aseɣwen n tinubga: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "configureChat": "Swel adiwenni", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "block": "Iḥder", + "blockedUsers": "Iseqdacen yettusweḥlen", + "blockUsername": "Zgel isem n useqdac", + "loadMore": "Sali-d ugar…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Imeẓla n wadig nsan. Ma ulac aɣilif, rmed-iten akken ad izmiren ad bḍun ideg-ik·im.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Tisirag n wadig tettwagdel. Ttxil-k·m efk-asen amek ara bḍun ideg-ik·im.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Semḍen tangalt QR", + "ok": "iH", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Aḥraz n tsarut deg uẓeṭṭa yermed", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "unread": "Ur yettwaɣri ara", + "sendOnEnter": "Azen ɣef Kcem", + "space": "Tallunt", + "oopsPushError": "Ayhu! nesḥissif, teḍra-d tuccḍa deg usbadu n yilɣa usriden.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ihuh, yella wayen ur neddi ara…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Ldi asnas akken ad teɣreḍ iznan", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ldi takamiṛat", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "moreEvents": "Ugar n ineḍruyen", + "declineInvitation": "Agi tinnubga", + "noMessagesYet": "Ulac iznan akka tura", + "longPressToRecordVoiceMessage": "Asiti aɣezzfan i usekles n yizen n taɣect.", + "pause": "Serǧu", + "resume": "Kemmel", + "removeFromSpaceDescription": "Adiwenni ad yettwakkes seg tallunt maca mazal ad yettban deg tebdart-ik·im n udiwenni.", + "countChats": "{chats} idiwenniyen", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Aɛeggal n tallunt n {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Senker tafrent", + "endPoll": "Eg taggara n tafrent", + "answersVisible": "Tiririyin yettbanen", + "pollQuestion": "Isteqsiyen n tefrent", + "answerOption": "tanefrunt n tririt", + "addAnswerOption": "Rnu tanefrunt n tririt", + "allowMultipleAnswers": "Sireg aget n tiririyin", + "pollHasBeenEnded": "Tafrent tfukk", + "answersWillBeVisibleWhenPollHasEnded": "Tiririyin ad banent ticki tafrent tfukk", + "replyInThread": "Err deg udras udiwenni", + "thread": "Adras udiwenni", + "oneOfYourDevicesIsNotVerified": "iwen seg ibenkan-ik·im ur yettusenqed ara", + "noticeChatBackupDeviceVerification": "Tamawt: Mi ara teqqneḍ akk ibenkan-ik·im ɣer weḥraz udiwenni, ttusneqden s wudem awurman.", + "continueText": "Ddu", + "blur": "Asluɣu:", + "opacity": "Tiḍullest:", + "setWallpaper": "Sbadu tugna ugilal", + "manageAccount": "Sefrek amiḍan", + "noContactInformationProvided": "Aqeddac ur yezmir ara ad d-yefk talɣut n unermis tameɣtut", + "contactServerAdmin": "Nermes anedbal n uqeddac", + "contactServerSecurity": "Taɣellist uqeddac n unermis", + "supportPage": "Asebter n tallalt", + "serverInformation": "Talɣut n uqeddac:", + "name": "Isem", + "version": "Lqem", + "website": "Asmel Web", + "compress": "Sekussem", + "boldText": "Aḍris azuran", + "italicText": "Aḍris uknan", + "strikeThrough": "Yettwajeṛṛeḍ", + "pleaseFillOut": "Ttxil-k·m, ččar", + "invalidUrl": "url armeɣtu", + "addLink": "Rnu aseɣwen", + "unableToJoinChat": "Ur yezmir ara ad yernu ɣer udiwenni. Ahat aseqdac n udiwenni-agi imdel-it yakan.", + "previous": "Uzwir", + "otherPartyNotLoggedIn": "Aḥric nniḍen ur yeqqin ara akka tura, ihi ur yezmir ara ad d-yeṭṭef iznan!", + "appWantsToUseForLogin": "Seqdec '{server}' akken ad teqqneḍ", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Ldi", + "waitingForServer": "Araǧu n uqeddac...", + "newChatRequest": "📩 Asuter n udiwenni amaynut", + "contentNotificationSettings": "Iɣewwaṛen n telɣut n ugbur", + "generalNotificationSettings": "Iɣewwaren imuta n ilɣa", + "roomNotificationSettings": "Iɣewwaṛen n telɣut n texxamt", + "userSpecificNotificationSettings": "Iɣewwaṛen n telɣut n useqdac", + "otherNotificationSettings": "Iɣewwaṛen-nniḍen n telɣut", + "notificationRuleContainsUserName": "Yegber isem n useqdac", + "notificationRuleContainsUserNameDescription": "Azen tilɣa i useqdac ma yella yizen yegber isem-is useqdac.", + "notificationRuleMaster": "Sgugem akk tilɣa", + "notificationRuleMasterDescription": "Ad isemselsi akk ilugan-nniḍen sakin ad sexsi akk tilɣa.", + "notificationRuleSuppressNotices": "Kkes iznan s wudem awurman", + "notificationRuleSuppressNoticesDescription": "Kkes ilɣa seg imsaɣen iwurmanen am yiṛubuten.", + "notificationRuleInviteForMe": "Asnubget i nekk", + "notificationRuleInviteForMeDescription": "Azen ilɣa i useqdac ticki yettwaɛreḍ ɣer texxamt.", + "notificationRuleMemberEvent": "Tadyant i yiɛeggalen", + "notificationRuleIsUserMention": "Abdar n useqdac", + "notificationRuleIsUserMentionDescription": "Azen ilɣa i useqdac ma yella yettwabder s srid deg yizen.", + "notificationRuleContainsDisplayName": "Yegber Isem n ubeqqeḍ", + "notificationRuleContainsDisplayNameDescription": "Azen ilɣa i useqdac ma yella yizen yegber Isem-is n ubeqqeḍ.", + "notificationRuleIsRoomMention": "Abdar n Texxamt", + "notificationRuleIsRoomMentionDescription": "Azen ilɣa i useqdac ticki yella ubdar n texxamt.", + "badServerLoginTypesException": "Aqeddac agejdan issefrak anawen n tuqqna:\n{serverVersions}\nMaca asnas-agi issefrak kan:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Azen alɣu ttaruɣ", + "swipeRightToLeftToReply": "Zuɣer seg uyeffus ɣer uzelmaḍ akken ad d-terreḍ", + "noMoreChatsFound": "Ulac ugar n idiwenniyen yettwafen…", + "noChatsFoundHere": "Ur d-nufi ula d yiwen n udiwenni da. Bdu adiwenni akked yiwen s useqdec n tqeffalt ukessar-a. ⤵️", + "youRejectedTheInvitation": "Tugiḍ tinnubga", + "youJoinedTheChat": "Tekcemeḍ ɣer udiwenni", + "youAcceptedTheInvitation": "👍 Tqebleḍ tinubga", + "youBannedUser": "Tgedleḍ {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Tekkseḍ tinnubga i {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Tettwaɛerḍeḍ sɣur {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Tɛerḍeḍ-d {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Tegliḍ s rrkel {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Tegliḍ s rrkel u tgedleḍ {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Tekkseḍ agdel n {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪{user} yesṭebṭbed", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Iseqdacen yessefk ad sṭebṭben", + "noOneCanJoin": "Yiwen ur yezmir ad d-yernu", + "users": "Iseqdacen", + "storeInAndroidKeystore": "Sekles deg Android KeyStore", + "storeInAppleKeyChain": "Sekles deg uzrar n tsura n Apple", + "storeSecurlyOnThisDevice": "Ḥrez s wudem aɣelsan ɣef yibenk-a", + "countFiles": "{count} n yifuyla", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Aseqdac", + "custom": "Yugnen", + "foregroundServiceRunning": "Alɣu-agi yettban-d ticki ameẓlu n uɣawas amezwaru iteddu.", + "screenSharingTitle": "beṭṭu n ugdil", + "screenSharingDetail": "Tbeṭṭuḍ agdil-ik·im deg FluffyChat", + "whyIsThisMessageEncrypted": "Acuɣer izen-agi ur yettwaɣri ara?", + "send": "Azen", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Azen izen", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Azen am uḍris", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Azen ameslaw", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Azen afaylu", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Azen tugna", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Azen {count} n tugna(iwin)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Azen iznan", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Azen avidyu", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} yuzen afaylu", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} yuzen ameslaw", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} yuzen tugna", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} yuzen ticṛeṭ n tesfift", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} yuzen tavidyut", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} yuzen talɣut n usiwel", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Sbadu-t d tazaẓlut tagejdant", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "noOtherDevicesFound": "Ulac ibenkan nniḍen yettwafen", + "fileIsTooBigForServer": "Ur izmir ara ad yazen! Aqeddac yessefrak kan ifuyla imeddayen almi ɣer {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Afaylu yettwasekles deg {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Ddu ɣer yizen aneggaru yettwaɣen", + "readUpToHere": "Ɣeṛ dagi", + "jump": "Neggez", + "openLinkInBrowser": "Ldi aseɣwen deg yiminig", + "reportErrorDescription": "😭 Uhu. Yella kra n wugur ay yellan. Ma tebɣiḍ, tzemreḍ ad tazneḍ aneqqis-a i yineflayen.", + "report": "aneqqis", + "setColorTheme": "Sbadu asentel n yini:", + "invite": "Snubget", + "inviteGroupChat": "📨Snubget ɣer udiwenni n ugraw", + "invalidInput": "Anekcam d armeɣtu!", + "wrongPinEntered": "Tettwasekcem tangalt PIN d armeɣtut! Ɛreḍ tikkelt nniḍen deg {seconds} n tasinin…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Ma ulac aɣilif sekcem amḍan yugaren 0", + "unknownEncryptionAlgorithm": "Alguritm n uwgelhen d arussin", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Tadyant tarussint '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Kkes asgugem i udiwenni", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Lqem Android ur yettwasefrak ara", + "unsupportedAndroidVersionLong": "Tamahilt-a tesra lqem Android tamaynut. Ttxil-k·m senqed ileqman neɣ asefrak n Lineage OS.", + "status": "Addad", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Amek telliḍ ass-a?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Ceyyeɛ", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Amtawi... Ttxil-k·m arǧu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Amtawi… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "Anagraw", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ur mṣadan ara", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "mṣadan", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Deqs n tuttriwin. Ttxil-k·m, ɛreḍ tikelt nniḍen ticki!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Ɛreḍ ad tazneḍ tikkelt nniḍen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} yekkes agdek n {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Kkes asewḥel n yibenk", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ibenk arussin", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "skip": "Zgel", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Tangalt taɣbalutt", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Tallunt d tazayezt", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Isem n tallunt", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} yebda-d asiwel", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "experimentalVideoCalls": "Isawalen uvidya s wudem armitan", + "newSpace": "Tallunt tamaynut", + "verifiedDevicesOnly": "Ibenkan yettwasneqden kan", + "optionalMessage": "(D afrayan) izen…", + "notSupportedOnThisDevice": "Ur itteddu ara deg yibenk-agi", + "approve": "Sqbel", + "enterNewChat": "Sekcem adiwenni amaynut", + "pleaseWaitUntilInvited": "Ttxil-k·m, rǧu arma yeɛreḍ-ik-id yiwen seg texxamt.", + "commandHint_logout": "Senser seg yibenk-ik·im amiran", + "commandHint_logoutall": "Senser akk ibenkan urmiden", + "displayNavigationRail": "Sken afeggag n yinig deg uziraz", + "customReaction": "Tasedmirt yugnen", + "backToMainChat": "Uɣal ɣer udiwenni agejdan", + "createSticker": "Snulfu-d ticṛeṭ n tesfift neɣ imujiten", + "useAsSticker": "Seqdec am tcṛeṭ n tesfift", + "useAsEmoji": "Seqdec am imujit", + "stickerPackNameAlreadyExists": "Isem ukemmus n tcṛeṭ n tesfift yella yakan", + "newStickerPack": "Akemmus n tcṛeṭ n tesfift", + "stickerPackName": "Isem ukemmus n tcṛeṭ n tesfift", + "skipChatBackup": "Zgel aḥraz n udiwenni", + "skipChatBackupWarning": "tetḥeqqeḍ? S war armad n weḥraz n udiwenni, tzemreḍ ad tesruḥeḍ anekcum ɣer yiznan-ik·im ma tbeddeleḍ ibenk-ik·im.", + "noMoreResultsFound": "Ulac ugar n igmaḍ yettwafen", + "clientWellKnownInformation": "Talɣut yettwasnen ɣef umsaɣ:", + "advancedConfigs": "Tawila leqqayen", + "advancedConfigurations": "Tawila tinaẓiyin", + "signUpGreeting": "FluffyChat d araslemmes! Fren aqeddac anda tebɣiḍ ad ternuḍ amiḍan-ik·im, u yyaw ad neddu!", + "signInGreeting": "Tesɛiḍ yakan amiḍan deg Matriks? Anṣuf yes-k·m tikkelt niḍen! Fren aqeddac-ik·im, u tkecmeḍ.", + "theProcessWasCanceled": "Tettwasefsex ukala-nni.", + "searchOrEnterHomeserverAddress": "Nadi neɣ sekcem tansa n uqeddac agejdan", + "setPowerLevel": "Sbadu aswir n tezmert", + "removeAdminRights": "Kkes izerfan n unedbal", + "powerLevel": "Aswir n tezmert", + "help": "Tallelt", + "@help": { + "type": "String", + "placeholders": {} + }, + "privacy": "Tabaḍnit", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "reason": "Taɣẓint", + "@reason": { + "type": "String", + "placeholders": {} + }, + "reject": "Aggi", + "@reject": { + "type": "String", + "placeholders": {} + }, + "search": "Nadi", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Taɣellist", + "@security": { + "type": "String", + "placeholders": {} + }, + "settings": "Iɣewwaren", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Bḍu", + "@share": { + "type": "String", + "placeholders": {} + }, + "unpin": "Kkes anṭaḍ", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "knock": "Sqeṛbeb", + "knocking": "Sqeṛbeb", + "select": "Fren", + "gallery": "Timidelt", + "files": "Ifuyla", + "discover": "Snirem", + "changelog": "Aɣmis n ibeddilen", + "notificationRuleCall": "Asiwel", + "notificationRuleMessage": "Izen", + "notificationRuleEncrypted": "Yettwawgelhen", + "notificationRuleJitsi": "Jitsi", + "more": "Ugar", + "logs": "Iɣmisen", + "join": "Ttekki", + "owner": "Amli", + "changePassword": "Asnifel n wawal n uɛeddi", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_send": "Azen aḍris", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "addAccount": "Rnu amiḍan", + "directChat": "Adiwenni usrid", + "redactMessage": "Kkes izen", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Sekles afaylu", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Sbadu addad", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Bḍu adig", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "learnMore": "Issin ugar", + "groupName": "Isem n ugraw", + "newPassword": "Awal n uɛeddi amaynut", + "thisDevice": "Ibenk-a:", + "searchMore": "Nadi ugar…", + "allDevices": "Akk ibenkan", + "saveChanges": "Sekles ibeddilen", + "baseUrl": "URL n taffa", + "identityServer": "Aseqdac n tmagit:", + "versionWithNumber": "Lqem: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "signIn": "Qqen", + "matrixId": "Asulay ID Matrix", + "makeAdmin": "Err-it d anedbal", + "openInMaps": "Ldi-t deg maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "encryptThisChat": "Wgelhen adiwenni-a", + "searchForUsers": "Nadi iseqdacen…", + "createNewAddress": "Snulfu-d tansa tamaynut", + "adminLevel": "{level} - Tadbelt", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "loginWithMatrixId": "Tuqqna s usulay ID n Matrix", + "calculatingFileSize": "Asiḍen n tiddi n ufaylu...", + "shareKeysWith": "Bḍu tisura akked…", + "takeAPhoto": "Ṭṭef tawlaft", + "recordAVideo": "Sekles tavidyut", + "createNewAccount": "Snulfu-d amiḍan amaynut", + "pleaseEnterYourPassword": "Ma ulac aɣilif, sekcem-d awal-ik n uɛeddi", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "doNotShowAgain": "Ur t-id-sskan ara tikkelt nniḍen", + "passwordsDoNotMatch": "Awalen n uɛeddi mgarraden", + "searchIn": "Nadi deg udiwenni \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "pleaseEnterYourPin": "Ttxil-k·m sekcem tangalt-ik·im pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Ma ulac aɣilif sekcem isem n useqdac", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Ma ulac aɣilif, ḍfeṛ iwellihen n usmel web sakin sit ɣef uḍfir.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Tixxamin tizuyaz", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} yugi tinnubga-nni", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reportMessage": "Mmel-d izen", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Taxxamt tettwaleqqem", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Lqem n texxamt", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Sbadu aglam n udiwenni", + "sharedTheLocation": "{username} yebḍa adig-is", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "notificationRuleRoomnotif": "Alɣu n texxamt", + "notificationRuleRoomnotifDescription": "Azen alɣu i useqdec mi ara yelli yizen yegber '@room'.", + "notificationRuleTombstoneDescription": "Azen alɣu i useqdec ɣef yiznan n usens n texxamt.", + "notificationRuleReaction": "Tasedmirt", + "notificationRuleReactionDescription": "Kkes ilɣa i tsedmirin.", + "notificationRuleSuppressEdits": "Kkes Asiẓreg", + "notificationRuleSuppressEditsDescription": "Kkes ilɣa i yeznan yettwaẓergen.", + "notificationRuleCallDescription": "Azen alɣu i useqdac ɣef isawalen.", + "notificationRuleEncryptedRoomOneToOne": "Taxxamt yettwawgelhen s wudem n yiwen ɣer yiwen", + "notificationRuleRoomOneToOne": "Taxxamt s wudem n yiwen ɣer yiwen", + "userLevel": "{level} - Aseqdac", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "passwordIsWrong": "Ur iṣeḥḥa ara wawal-ik n uɛeddi i d-teskecmeḍ", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "createNewChat": "Snulfu-d adiwenni amaynut", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "tagName": "Isem n tebzimt", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@commandInvalid": { + "type": "String" + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "addTag": "Rnu tabzimt", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pleaseChooseAStrongPassword": "Ttxil, fren awal n uɛeddi iǧehden, ma ulac aɣilif", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "removeTag": "Kkes tabzimt", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "showMore": "Sken-d ugar", + "publicKey": "Tasarut tazayazt: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ko.arb b/lib/l10n/intl_ko.arb new file mode 100644 index 0000000000..bb4df2c675 --- /dev/null +++ b/lib/l10n/intl_ko.arb @@ -0,0 +1,2417 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.975135", + "about": "소개", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "수락", + "@accept": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "URI {uri}를 열 수 없습니다", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "chats": "채팅", + "@chats": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "이 방에서 주어진 유저 영구 추방하기", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "HTML 형식의 문자 보내기", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "주어진 유저 이 룸에 초대하기", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_leave": "이 룸 나가기", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "자신을 소개하세요", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_plain": "형식이 지정되지 않은 문자 보내기", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "문자 보내기", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "주어진 유저를 이 방에서 영구추방 해제하기", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "loadMore": "더 불러오기…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "{count}명의 참가자 더 표시", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lightTheme": "라이트", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "help": "도움", + "@help": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "게스트가 참가할 수 있음", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "groups": "그룹 채팅", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "그룹 채팅 공개", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "group": "그룹 채팅", + "@group": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "초대받은 후부터", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "참가시점 이후로", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "forward": "전달", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fontSize": "폰트 크기", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "이메일 주소 입력", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} 이 통화를 종료했습니다", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "encryptionNotEnabled": "암호화가 비활성화됨", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "encryption": "암호화", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "암호화됨", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "당신은 다시 암호화를 비활성화할 수 없습니다. 확실한가요?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "암호화 사용", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "이모트 팩 항상 사용하기", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "빈 채팅", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "이모트 단축키", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "이모트 설정", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "올바르지 않은 이모트 단축키!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "이모트가 이미 존재합니다!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "방 아바타 수정", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "방 별명 수정", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "표시 이름 수정", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "edit": "수정", + "@edit": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "파일 다운로드", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "표시 이름이 변경되었습니다", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "devices": "기기", + "@devices": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "메시지 삭제", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "계정 삭제", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "delete": "삭제", + "@delete": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "새로 참가하는 유저들의 기본 권한 레벨", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "이것은 당신의 계정을 비활성화할 것입니다. 이것은 되돌릴 수 없습니다! 확실한가요?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "현재 활동 중", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "새로운 스페이스", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username}님이 채팅을 생성함", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "create": "생성", + "@create": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} 참여자", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "couldNotDecryptMessage": "메시지 복호화할 수 없음: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "copyToClipboard": "클립보드에 복사", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "복사", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "클립보드에 복사됨", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "콘텐츠가 서버 운영자에게 신고되었습니다", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "연락처가 채팅에 초대되었습니다", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "configureChat": "채팅 설정", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "아래의 숫자가 일치하는지 비교하세요", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "아래의 이모지가 일치하는지 비교하세요", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} 는 명령어가 아닙니다.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "잘못된 명령어", + "@commandInvalid": { + "type": "String" + }, + "commandHint_react": "답장 반응으로 보내기", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_op": "주어진 유저의 권한 레벨 설정 (기본:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "이 방의 표시 이름 설정하기", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "이 방의 사진 설정하기 (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_kick": "주어진 유저 방에서 삭제하기", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "주어진 방 참가하기", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "close": "닫기", + "@close": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "저장 지우기", + "chooseAStrongPassword": "안전한 비밀번호를 설정하세요", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "채팅 정보", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "채팅 백업", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chat": "채팅", + "@chat": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "암호화가 손상되었습니다", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "아바타 바꾸기", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "채팅의 이름 바꾸기", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "스타일 바꾸기", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "홈서버 바꾸기", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changePassword": "비밀번호 바꾸기", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "{username}님이 초대 링크를 바꿈", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username}님이 방 별명을 바꿈", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}님이 자신의 아바타를 바꿈", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username}님이 참가 규칙을 {joinRules} 로 바꿈", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username}님이 참가 규칙을 바꿈", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username}님이 대화 기록 설정을 {rules} 로 바꿈", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username}님이 대화 기록 설정을 변경함", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username}님이 게스트 접근 규칙을 {rules} 로 변경함", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username}님이 게스트 접근 규칙을 변경함", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}님이 닉네임을 '{displayname}' 로 바꿈", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username}님이 채팅 권한을 바꿈", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username}님이 채팅 아바타를 바꿈", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "기기 이름 바꾸기", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cancel": "취소", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "blocked": "차단됨", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "기기 차단", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}님이 {targetName}님을 영구 추방함", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "영구 추방됨", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "채팅에서 영구 추방", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "엔터로 보내기", + "badServerLoginTypesException": "홈서버가 지원하는 로그인 유형:\n{serverVersions}\n하지만 이 앱에서 지원하는 것은:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "자동으로 움직이는 스티커와 이모트 재생", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "askVerificationRequest": "{username}님의 인증 요청을 수락할까요?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "askSSSSSign": "다른 사람을 서명하기 위해서, 저장 비밀번호나 복구 키를 입력해주세요.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "로그아웃하고 싶은 것이 확실한가요?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "확실한가요?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "게스트 유저의 참가 여부", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "저장", + "@archive": { + "type": "String", + "placeholders": {} + }, + "appLock": "앱 잠금", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "누구나 참가할 수 있음", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName}님이 전화에 응답했습니다", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "별명", + "@alias": { + "type": "String", + "placeholders": {} + }, + "admin": "운영자", + "@admin": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "스페이스에 추가", + "addEmail": "이메일 추가", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username}님이 종단간 암호화를 활성화함", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "계정", + "@account": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username}님이 초대를 수락함", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "ignore": "무시", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "알 수 없는 이벤트 숨기기", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username}님이 {targetName}님에 대한 초대를 철회함", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsAreForbidden": "게스트가 들어올 수 없음", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname}님과의 그룹", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "errorObtainingLocation": "위치 얻는 중 오류: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editBlockedServers": "차단된 서버 수정", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "directChats": "다이렉트 채팅", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "darkTheme": "다크", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "yes": "확인", + "@yes": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "메시지 작성…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "이 주소로 당신의 비밀번호를 복구할 수 있습니다.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "왜 이것을 신고하려고 하나요?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "참가 제한 설정", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "누가 어떤 행동을 할 수 있는지", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "우리가 당신에게 이메일을 보냈습니다", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "warning": "경고!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "상대가 숫자를 수락하길 기다리는 중…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "상대가 이모지를 수락하길 기다리는 중…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "상대가 요청을 수락하길 기다리는 중…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "음성 메시지", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "모두에게 보임", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "모든 참가자에게 보임", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "videoCall": "영상 통화", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "다른 계정 확인 중", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "성공적으로 확인했어요!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "확인 시작", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verified": "확인됨", + "@verified": { + "type": "String", + "placeholders": {} + }, + "userLeftTheChat": "🚪 {username}님이 채팅을 나감", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userIsTyping": "{username}님이 입력 중…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "{username}님과 {username2}님이 입력 중…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username}님 + {count}명이 입력 중…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "unpin": "고정 해제", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "알 수 없는 암호화 알고리즘", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "기기 차단 해제", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "pin": "고정", + "@pin": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "비밀번호 복구", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "비밀번호 까먹음", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "password": "비밀번호", + "@password": { + "type": "String", + "placeholders": {} + }, + "participant": "참여자", + "@participant": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "지도에서 열기", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "addAccount": "계정 추가", + "openCamera": "카메라 열기", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "앱을 열어서 메시지를 읽으세요", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "앗, 무언가가 잘못되었습니다…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "앗! 안타깝게도, 푸시 알림을 설정하는 중 오류가 발생했습니다.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "ok": "확인", + "@ok": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "위치 얻는 중…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count}명이 입력 중…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifications": "알림", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "noPermission": "권한 없음", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR 코드 스캔", + "noMatrixServer": "{server1}은 matrix 서버가 아닙니다, {server2}를 대신 사용할까요?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "next": "다음", + "@next": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} 에 로그인", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "login": "로그인", + "@login": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "위치 권한이 거부되었습니다. 위치를 공유하기 위해서 허용해주세요.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "위치 서비스가 비활성화되었습니다. 위치를 공유하려면 활성화시켜주세요.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "no": "아니요", + "@no": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "새로운 확인 요청!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat에서 새로운 메시지", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "새 채팅", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "muteChat": "채팅 음소거", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "messages": "메시지", + "@messages": { + "type": "String", + "placeholders": {} + }, + "mention": "멘션", + "@mention": { + "type": "String", + "placeholders": {} + }, + "logout": "로그아웃", + "@logout": { + "type": "String", + "placeholders": {} + }, + "all": "모두", + "@all": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "당신의 공개 키", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "당신은 이 채팅에서 영구 추방되었습니다", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "당신은 더 이상 이 채팅에 참여하지 않습니다", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "you": "당신", + "@you": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "대화 기록 설정", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username}님이 {type} 이벤트 보냄", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unmuteChat": "음소거 해제", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "알 수 없는 이벤트 '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unknownDevice": "알 수 없는 기기", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}님이 {targetName}님에대한 영구추방을 해제함", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "tryToSendAgain": "다시 보내도록 시도", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "너무 많은 요청. 잠시 후에 다시 시도해주세요!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "일치합니다", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "일치하지 않습니다", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "시스템", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "동기화 중... 기다려주세요.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "submit": "제출", + "@submit": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "오늘은 어떤 기분인가요?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "status": "상태", + "@status": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} 가 통화 시작함", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "spaceName": "스페이스 이름", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "스페이스 공개", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "마지막 활동: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "ignoredUsers": "무시된 사용자", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "비밀번호를 골라주세요", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "비밀번호가 변경됨", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "비밀번호나 복구 키", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "or": "이나", + "@or": { + "type": "String", + "placeholders": {} + }, + "bundleName": "번들 이름", + "removeFromBundle": "이 번들에서 삭제", + "addToBundle": "번들에 추가", + "editBundlesForAccount": "이 계정의 번들 수정", + "oneClientLoggedOut": "당신의 클라이언트 중 하나가 로그아웃 됨", + "onlineKeyBackupEnabled": "온라인 키 백업이 활성화됨", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "아무 방도 발견되지 않았어요…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "당신은 비밀번호를 복구할 방법을 추가하지 않았습니다.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "이 휴대폰에 Firebase Cloud Messaging 서비스가 없는 것 같습니다. FluffyChat에서 푸시 알림을 받으려면 ntfy 사용을 추천합니다. ntfy 혹은 다른 푸시 알림 제공자를 사용하면 알림을 보안적인 방법으로 받을 수 있습니다. ntfy는 PlayStore와 F-Droid에서 설치 가능합니다.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "당신은 방이 공개적으로 접근 가능하지 않을 때만 암호화를 켤 수 있습니다.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "이모트 발견되지 않음. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "서버에 연결 없음", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "moderator": "관리자", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "로딩 중... 기다려 주세요.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "채팅을 나갔습니다", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "leave": "나가기", + "@leave": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "소스 코드", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "skip": "스킵", + "@skip": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "위치 보내기", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username}님이 위치를 공유함", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "share": "공유", + "@share": { + "type": "String", + "placeholders": {} + }, + "settings": "설정", + "@settings": { + "type": "String", + "placeholders": {} + }, + "setStatus": "상태 설정", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "주 별명으로 설정", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} 이 통화 정보 보냄", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username}님이 영상을 보냄", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendMessages": "메시지 보내기", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendImage": "이미지 보내기", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "파일 보내기", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "오디오 보내기", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "텍스트로 보내기", + "@sendAsText": { + "type": "String" + }, + "sendAMessage": "메시지 보내기", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "send": "보내기", + "@send": { + "type": "String", + "placeholders": {} + }, + "security": "보안", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "검색", + "@search": { + "type": "String", + "placeholders": {} + }, + "saveFile": "파일 저장", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "방 버전", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "방이 업그레이드되었습니다", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "reason": "이유", + "@reason": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "공개 방", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "privacy": "프라이버시", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "웹사이트의 가이드를 따르고 다음 버튼을 눌러주세요.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "유저 이름을 입력해주세요", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "PIN을 입력해주세요", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "비밀번호를 입력해주세요", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "방 참가하기", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username}님이 채팅에 참가함", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "isTyping": "입력 중…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username}님이 당신을 FluffyChat에 초대했습니다.\n1. FluffyChat 설치: https://fluffychat.im \n2. 가입하거나 로그인 \n3. 초대 링크 열기: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "invitedUsersOnly": "초대된 유저만", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username}님이 {targetName}님을 초대함", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invited": "초대됨", + "@invited": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "연락처를 {groupName}에 초대", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "inviteContact": "연락처 초대", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "올바르지 않은 복구 키나 비밀번호", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "링크를 클릭했어요", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "sentASticker": "😊 {username}님이 스티커를 보냄", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username}님이 사진을 보냄", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username}님이 오디오를 보냄", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁 {username}님이 파일을 보냄", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendVideo": "영상 보내기", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "메시지 신고", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "reply": "답장", + "@reply": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "방 새로운 버전으로 대체하기", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "아바타 지우기", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "채팅에서 영구추방 해제됨", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "모든 다른 기기에서 지우기", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "remove": "지우기", + "@remove": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username}님이 초대를 거절함", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "거절", + "@reject": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "메시지 지우기", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username}님이 이벤트를 지움", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "이메일의 링크를 클릭하고 진행해주세요.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "채팅에서 추방", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username}님이 {targetName}님을 추방하고 차단함", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kicked": "👞 {username}님이 {targetName}님을 추방함", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "link": "링크", + "unverified": "확인되지 않음", + "time": "시간", + "openGallery": "갤러리 열기", + "sender": "발신자", + "messageInfo": "메시지 정보", + "repeatPassword": "비밀번호 다시 입력", + "removeFromSpace": "스페이스에서 삭제", + "commandHint_discardsession": "세션 삭제", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "다이렉트 채팅 시작\t\n--no-encryption을 사용해 암호화 비활성화", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_clearcache": "캐시 지우기", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "빈 그룹 채팅을 생성\n--no-encryption을 사용해 암호화를 비활성화", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "markAsRead": "읽음으로 표시하기", + "reportUser": "유저 신고", + "reactedWith": "{sender}가 {reaction}로 반응함", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "이벤트를 영구적으로 고정 해제할 것이 확실한가요?", + "pinMessage": "방에 고정", + "emojis": "이모지", + "voiceCall": "음성 통화", + "placeCall": "전화 걸기", + "experimentalVideoCalls": "실험적인 영상 통화", + "unsupportedAndroidVersion": "지원되지 않는 안드로이드 버전", + "unsupportedAndroidVersionLong": "이 기능은 새로운 안드로이드 버전을 요구합니다. Lineage OS 지원이나 업데이트를 확인해주세요.", + "videoCallsBetaWarning": "영상 통화는 베타임을 확인해주세요. 의도한 대로 작동하지 않거나 모든 플랫폼에서 작동하지 않을 수 있습니다.", + "confirmMatrixId": "계정을 삭제하려면 Matrix ID를 입력해 주세요.", + "commandHint_googly": "왕눈이 눈알 보내기", + "googlyEyesContent": "{senderName} 님이 왕눈이 눈알을 보냈습니다", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "그룹 채팅으로 만들기", + "dehydrate": "세션을 내보내고 기기 초기화 하기", + "dehydrateWarning": "이 동작은 되돌릴 수 없습니다. 백업 파일을 꼭 안전하게 보관하세요.", + "hugContent": "{senderName}님이 당신을 허그합니다", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "마지막으로 읽은 메시지로 이동", + "commandHint_cuddle": "미소 보내기", + "reportErrorDescription": "😭 이런. 무언가 잘못되었습니다. 원한다면, 개발자에게 버그를 신고할 수 있습니다.", + "setColorTheme": "색상 테마 설정:", + "supposedMxid": "{mxid} 이어야 함", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "유저", + "youAcceptedTheInvitation": "👍 초대를 수락했습니다", + "youInvitedBy": "📩 {user}님에 의해 초대되었습니다", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "유저는 채팅에서 영구 추방되며 추방 해제 전까지 채팅을 다시 입력할 수 없습니다.", + "removeDevicesDescription": "이 기기에서 로그아웃되며 더 이상 메시지를 받을 수 없습니다.", + "tryAgain": "다시 시도하기", + "youKickedAndBanned": "🙅 {user}님을 영구 추방했습니다", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "유저가 다시 채팅을 입력할 수 있습니다.", + "youRejectedTheInvitation": "초대를 거부했습니다", + "messagesStyle": "메세지:", + "newSpaceDescription": "스페이스를 사용하면 채팅을 통합하고 비공개 또는 공개 커뮤니티를 구축할 수 있습니다.", + "chatDescription": "채팅 설명", + "encryptThisChat": "이 채팅을 암호화", + "reopenChat": "채팅 다시 열기", + "countFiles": "{count}개의 파일", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "이것은 이 메시지가 당신이 이 기기를 서명하기 전에 발송되었기 때문에 일어났을 수 있습니다.\n\n이것은 또한 발송자가 당신의 기기를 차단하였거나 혹은 인터넷 연결이 잘못되었을 수 있습니다.\n\n다른 세션에서 이 메시지를 읽을 수 있나요? 그렇다면 그 메시지를 옮길 수 있습니다! 설정 > 기기로 가서 기기를 서로 증명하세요. 다음번에 방을 열었을 때 두 세션이 모두 작동중이라면, 키가 자동으로 옮겨질것입니다.\n\n로그아웃하거나 기기를 바꿀 때 키를 잃고싶지 않으신가요? 설정에서 채팅 백업을 사용중인지 확인하세요.", + "pushNotificationsNotAvailable": "푸시 알림 사용 불가", + "storeInAppleKeyChain": "Apple KeyChain에 저장하기", + "hydrate": "백업 파일로부터 가져오기", + "invalidServerName": "잘못된 서버 이름", + "chatPermissions": "채팅 권한", + "storeInAndroidKeystore": "Android KeyStore에 저장하기", + "makeAdminDescription": "유저를 한 번 관리자로 만들면, 당신과 같은 권한을 가지기때문에 권한 회수가 불가능합니다.", + "whyIsThisMessageEncrypted": "왜 이 메시지를 읽을 수 없나요?", + "setChatDescription": "채팅 설명 설정", + "importFromZipFile": ".zip 파일에서 불러오기", + "noOtherDevicesFound": "다른 기기 발견되지 않음", + "redactedBy": "{username}님이 삭제함", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "전송에 실패했습니다. 서버는 {max}가 넘는 파일을 지원하지 않습니다.", + "readUpToHere": "여기까지 읽음", + "optionalRedactReason": "(선택) 이 메시지를 편집하는 이유...", + "archiveRoomDescription": "채팅이 보관함으로 이동합니다. 다른 유저들은 당신이 떠난다는것을 볼 수 있습니다.", + "exportEmotePack": ".zip 파일로 이모트 내보내기", + "redactedByBecause": "{username}님이 삭제함. 사유: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}님에 대한 초대를 철회함", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user}님을 초대했습니다", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "{path}에 파일 저장됨", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "메시지는 이 대화의 모든 참여자에게 삭제될 것 입니다. 되돌릴 수 없습니다.", + "invalidInput": "잘못된 입력!", + "doNotShowAgain": "다시 보지 않기", + "report": "신고", + "screenSharingTitle": "화면 공유", + "youBannedUser": "{user}님을 영구 추방함", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user}님이 참가를 요청했습니다", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "브라우저에서 링크 열기", + "disableEncryptionWarning": "보안상의 이유로 암호화가 활성화된 채팅에서 암호화를 비활성화 할 수 없습니다.", + "directChat": "다이렉트 채팅", + "wrongPinEntered": "잘못된 pin입니다! {seconds}초 후에 다시 시도하세요...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "입력 알림 보내기", + "inviteGroupChat": "📨 그룹 채팅에 초대", + "foregroundServiceRunning": "이 알림은 백그라운드 서비스가 실행중일때 표시됩니다.", + "importEmojis": "이모지 불러오기", + "wasDirectChatDisplayName": "빈 채팅 (전 {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "채팅 설명이 아직 추가되지 않음.", + "learnMore": "더 알아보기", + "notAnImage": "이미지 파일이 아닙니다.", + "users": "유저", + "chatDescriptionHasBeenChanged": "채팅 설명 변경됨", + "roomUpgradeDescription": "채팅이 새로운 방 버전으로 다시 생성됩니다. 모든 참가자는 새로운 채팅으로 전환해야합니다. https://spec.matrix.org/latest/rooms/ 에서 방 버전에 대해 자세히 알아볼 수 있습니다.", + "pleaseEnterANumber": "0보다 큰 숫자를 입력하세요", + "youKicked": "👞 {user}님을 추방했습니다", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "jump": "점프", + "sorryThatsNotPossible": "죄송합니다...그것은 불가능합니다", + "shareInviteLink": "초대 링크 공유", + "commandHint_markasdm": "Matrix ID를 위한 다이렉트 메시지 방으로 표시", + "cuddleContent": "{senderName} 님이 당신에게 미소짓습니다", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "emoteKeyboardNoRecents": "최근 사용한 이모트가 여기 나타납니다...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "채팅에 참가하였습니다", + "commandHint_hug": "허그 보내기", + "replace": "대체", + "youUnbannedUser": "{user}님의 영구 추방을 해제했습니다", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "새 스페이스", + "createGroup": "새 그룹 채팅", + "custom": "커스텀", + "noBackupWarning": "경고! 채팅 백업을 켜지 않을경우, 당신은 암호화된 메시지에 대한 접근권한을 잃을것 입니다. 로그아웃 하기 전에 채팅을 백업하는것이 강력히 권장됩니다.", + "kickUserDescription": "유저는 채팅에서 추방되지만 영구 추방되지 않습니다. 공개 채팅의 경우, 언제든 유저가 다시 참가할 수 있습니다.", + "importNow": "지금 불러오기", + "invite": "초대", + "storeSecurlyOnThisDevice": "이 기기에 안전하게 저장", + "screenSharingDetail": "FluffyChat에 당신의 화면을 공유하는중", + "blockUsername": "유저 이름 무시", + "block": "차단", + "blockedUsers": "차단된 유저", + "groupName": "그룹 채팅 이름", + "commandHint_sendraw": "raw json 전송", + "pleaseChooseAStrongPassword": "강력한 비밀번호를 사용하세요", + "addChatOrSubSpace": "채팅 또는 하위 스페이스 추가", + "databaseMigrationBody": "잠시만 기다리세요. 시간이 걸릴 수 있습니다.", + "select": "선택", + "joinSpace": "스페이스 참가", + "formattedMessagesDescription": "마크다운을 이용한 볼드등의 서식이 있는 메시지를 봅니다.", + "completedKeyVerification": "{sender}가 키 검증을 완료함", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender}가 키 검증을 취소함", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "createGroupAndInviteUsers": "그룹 채팅을 생성하고 유저를 초대", + "passwordsDoNotMatch": "비밀번호가 일치하지 않습니다", + "passwordIsWrong": "비밀번호가 틀립니다", + "thisDevice": "이 기기:", + "sendReadReceipts": "읽음 확인 보내기", + "sendReadReceiptsDescription": "채팅의 다른 참가자들이 당신이 메시지를 읽었는지 볼 수 있습니다.", + "verifyOtherUser": "🔐 다른 유저 확인", + "searchChatsRooms": "#chats, @users 검색...", + "groupCanBeFoundViaSearch": "검색으로 그룹 채팅을 찾을 수 있음", + "restoreSessionBody": "앱이 백업에서 세션을 복원하려 시도중입니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender}가 키 검증을 수락함", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "wrongRecoveryKey": "죄송합니다... 올바른 복구키가 아닌것 같습니다.", + "newPassword": "새 비밀번호", + "searchForUsers": "@users 검색...", + "leaveEmptyToClearStatus": "비워서 상태를 지우세요.", + "commandHint_ignore": "주어진 matrix ID를 무시", + "commandHint_unignore": "주어진 matrix ID 무시 해제", + "blockListDescription": "당신은 당신을 방해하는 유저들을 차단할 수 있습니다. 당신은 당신의 개인 차단 목록에 있는 어떠한 유저의 메시지와 방 초대도 받지 않을것 입니다.", + "sessionLostBody": "세션을 잃었습니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "글로벌 유저 ID: ", + "noUsersFoundWithQuery": "안타깝게도 \"{query}\"로 유저를 찾을 수 없습니다. 오타가 없는지 확인하십시오.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "nothingFound": "아무것도 찾지 못했습니다...", + "databaseMigrationTitle": "데이터베이스가 최적화됨", + "pleaseEnterYourCurrentPassword": "현재 비밀번호 입력", + "publicSpaces": "공개 스페이스들", + "initAppError": "앱 초기화중 오류 발생", + "sendTypingNotificationsDescription": "채팅의 다른 참가자들이 당신이 새 메시지를 입력중인것을 볼 수 있습니다.", + "formattedMessages": "형식이 지정된 메시지", + "verifyOtherDevice": "🔐 다른 기기를 확인", + "verifyOtherUserDescription": "다른 유저를 확인하면, 당신은 당신이 누구에게 말하고있는지 알 수 있습니다. 💪\n\n확인을 시작할 때, 다른 유저는 앱에서 팝업을 볼 수 있습니다. 당신은 그런 다음 서로 비교해야 이모지 또는 숫자의 목록을 볼 수 있습니다.\n\n이 작업을 수행하는 가장 좋은 방법은 직접 만나거나 영상통화를 하는것입니다. 👭", + "verifyOtherDeviceDescription": "다른 장치를 확인하면, 장치와 키를 교환하고, 전반적인 보안을 증가시킵니다. 💪 확인을 시작하면 팝업은 두 장치에 나타납니다. 그런 다음 서로 비교해야 이모지 또는 숫자의 목록를 볼 수 있습니다. 확인을 시작하기 전에 모든 장치를 준비하세요. 🤳", + "isReadyForKeyVerification": "{sender}가 키 검증 준비를 완료함", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender}가 키 검증을 요청함", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender}가 키 검증을 시작함", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "메시지 수신함", + "stickers": "스티커", + "discover": "탐색", + "unreadChatsInApp": "{appname}: {unread}개의 읽지 않은 채팅", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "appLockDescription": "앱을 사용하지 않을 때 pin으로 잠금", + "calls": "전화", + "globalChatId": "글로벌 채팅 ID", + "customEmojisAndStickers": "커스텀 이모지와 스티커", + "accessAndVisibilityDescription": "채팅에 참가 할 수 있는 사람과 채팅을 볼 수 있는 범위", + "accessAndVisibility": "채팅 가입과 대화 기록", + "customEmojisAndStickersBody": "모든 채팅에서 사용할 수있는 커스텀 이모지와 스티커를 추가하거나 공유합니다.", + "hideRedactedMessages": "삭제된 메시지 숨기기", + "hideRedactedMessagesBody": "누군가가 메시지를 삭제하면 메시지를 더 이상 볼 수 없습니다.", + "hideInvalidOrUnknownMessageFormats": "잘못되거나 알 수 없는 메시지 형식 숨김", + "passwordRecoverySettings": "비밀번호 복구 설정", + "knock": "참가 요청", + "usersMustKnock": "유저들이 참가를 허가받아야함", + "knocking": "참가 요청중", + "chatCanBeDiscoveredViaSearchOnServer": "채팅은 {server} 에서 검색하여 찾을 수 있습니다.", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "noOneCanJoin": "아무도 참가할 수 없음", + "thereAreCountUsersBlocked": "{count}명의 차단된 유저가 있습니다.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "noDatabaseEncryption": "데이터베이스 암호화는 이 플랫폼에서 지원되지 않음", + "publicChatAddresses": "공개 채팅 주소", + "createNewAddress": "새 주소 만들기", + "searchMore": "더 검색...", + "files": "파일", + "searchIn": "{chat}에서 검색...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "gallery": "갤러리", + "swipeRightToLeftToReply": "오른쪽에서 왼쪽으로 스와이프해서 답장", + "unread": "읽지 않은", + "space": "스페이스", + "goToSpace": "스페이스로: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "읽지 않음으로 표시", + "noMoreChatsFound": "채팅을 찾을 수 없습니다...", + "moderatorLevel": "{level} - 관리자", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - 운영자", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "userLevel": "{level} - 유저", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "noChatsFoundHere": "대화가 발견되지 않았습니다. 아래 버튼을 사용하여 새 대화를 시작해 보세요. ⤵️", + "changeTheVisibilityOfChatHistory": "채팅 기록 표시 여부 바꾸기", + "changeTheCanonicalRoomAlias": "메인 공개 채팅 주소 바꾸기", + "sendCanceled": "전송 최소됨", + "noContactInformationProvided": "서버가 유효한 연락처 정보를 제공하지 않음", + "changeGeneralChatSettings": "일반 채팅 설정 번경하기", + "inviteOtherUsers": "다른 사용자를 이 채팅에 초대하기", + "changeTheChatPermissions": "채팅 권한 바꾸기", + "calculatingFileSize": "파일 크기 계산 중...", + "oneOfYourDevicesIsNotVerified": "당신의 기기 중 하나가 인증되지 않았음", + "noticeChatBackupDeviceVerification": "참고: 모든 기기에 채팅 백업을 설정하면 자동으로 서로 인증됩니다.", + "opacity": "불투명:", + "setWallpaper": "배경화면 설정하기", + "manageAccount": "계정 관리하기", + "aboutHomeserver": "{homeserver}의 대해서", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "contactServerAdmin": "서버 관리자에게 연락하기", + "contactServerSecurity": "서버 보안 관리자에게 연락하기", + "supportPage": "지원 페이지", + "name": "이름", + "serverInformation": "서버 정보:", + "version": "버전", + "website": "웹사이트", + "changeTheDescriptionOfTheGroup": "채팅 설명 바꾸기", + "sendRoomNotifications": "@room 알림 보내기", + "chatPermissionsDescription": "이 채팅에서 특정 작업에 요구할 권한 레벨을 정의합니다. 권한 레벨 0, 50, 100은 일반적으로 유저, 관리자, 운영자를 나타내지만, 모든 숫자가 가능합니다.", + "loginWithMatrixId": "Matrix-ID로 로그인", + "doesNotSeemToBeAValidHomeserver": "호환되는 홈서버가 아닌 것 같습니다. URL을 올바르게 입력됐나요?", + "continueText": "계속하기", + "updateInstalled": "🎉 {version} 업데이트가 설치되었습니다!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "변경 기록", + "sendingAttachment": "첨부된 파일 전송 중...", + "blur": "블러:", + "sendImages": "이미지 {count}개 보내기", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "italicText": "기울어진 글꼴", + "boldText": "두꺼운 글꼴", + "appWantsToUseForLoginDescription": "웹사이트와 당신에 대한 정보를 공유하게됩니다.", + "appWantsToUseForLogin": "'{server}'로 로그인", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "otherPartyNotLoggedIn": "다른 구성원이 현재 로그인하지 않아 메시지를 수신하지 못합니다!", + "open": "열기", + "unableToJoinChat": "채팅에 참가할 수 없습니다. 다른 구성원이 이미 대화를 종료했을 수 있습니다.", + "compress": "압축", + "invalidUrl": "유효하지 않은 url", + "addLink": "링크 추가", + "strikeThrough": "취소선", + "pleaseFillOut": "작성해주세요", + "previous": "이전", + "newChatRequest": "📩 새 채팅 요청", + "synchronizingPleaseWaitCounter": " 동기화중… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "waitingForServer": "서버를 기다리는중...", + "contentNotificationSettings": "콘텐츠 알림 설정", + "generalNotificationSettings": "일반 알림 설정", + "roomNotificationSettings": "채팅방 알림 설정", + "otherNotificationSettings": "기타 알림 설정", + "notificationRuleContainsUserName": "유저 이름을 포함함", + "notificationRuleMaster": "모든 알림 음소거", + "notificationRuleContainsUserNameDescription": "메시지가 유저의 이름을 포함할때 알림합니다.", + "notificationRuleMasterDescription": "모든 규칙을 무시하고 모든 알림을 비활성화합니다.", + "notificationRuleSuppressNotices": "자동화된 메시지 무시", + "notificationRuleSuppressNoticesDescription": "봇을 비롯한 자동화된 메시지로부터 발생하는 알림을 무시합니다.", + "notificationRuleInviteForMe": "초대를 받음", + "notificationRuleInviteForMeDescription": "채팅방에 초대받았을 때 알림합니다.", + "notificationRuleMemberEvent": "멤버 이벤트", + "notificationRuleMemberEventDescription": "멤버 이벤트로 발생하는 알림을 무시합니다.", + "notificationRuleIsUserMentionDescription": "유저가 메시지에 멘션됐을 때 알림합니다.", + "notificationRuleContainsDisplayName": "표시 이름을 포함함", + "notificationRuleIsUserMention": "유저가 멘션됨", + "notificationRuleContainsDisplayNameDescription": "메시지에 표시 이름이 포함되면 알림합니다.", + "notificationRuleIsRoomMention": "방 멘션", + "notificationRuleIsRoomMentionDescription": "방 멘션이 있을경우 알림합니다.", + "notificationRuleRoomnotif": "방 알림", + "notificationRuleRoomnotifDescription": "메시지가 '@room'을 포함하면 알림합니다.", + "notificationRuleTombstone": "비활성화", + "notificationRuleTombstoneDescription": "채팅방 비활성화 메시지를 알림합니다.", + "notificationRuleReaction": "반응", + "notificationRuleReactionDescription": "반응으로 발생하는 알림을 무시합니다.", + "notificationRuleRoomServerAcl": "채팅방 서버 ACL", + "notificationRuleRoomServerAclDescription": "채팅방 서버의 접근 권한(ACL)으로부터 오는 알림을 무시합니다.", + "notificationRuleSuppressEdits": "수정 음소거", + "notificationRuleSuppressEditsDescription": "수정된 메시지로부터 오는 알림을 무시합니다.", + "notificationRuleCall": "전화", + "commandHint_roomupgrade": "이 방을 주어진 방 버전으로 업그레이드합니다", + "checkList": "체크리스트", + "countInvited": "{count}초대받은", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_lt.arb b/lib/l10n/intl_lt.arb new file mode 100644 index 0000000000..c391002803 --- /dev/null +++ b/lib/l10n/intl_lt.arb @@ -0,0 +1,2258 @@ +{ + "commandHint_leave": "Palikti pokalbių kambarį", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "cancel": "Atšaukti", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "edit": "Redaguoti", + "@edit": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Atsisiųsti failą", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "about": "Apie", + "@about": { + "type": "String", + "placeholders": {} + }, + "all": "Viskas", + "@all": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Keisti slaptažodį", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "close": "Uždaryti", + "@close": { + "type": "String", + "placeholders": {} + }, + "archive": "Archyvas", + "@archive": { + "type": "String", + "placeholders": {} + }, + "skip": "Praleisti", + "@skip": { + "type": "String", + "placeholders": {} + }, + "share": "Bendrinti", + "@share": { + "type": "String", + "placeholders": {} + }, + "time": "Laikas", + "settings": "Nustatytmai", + "@settings": { + "type": "String", + "placeholders": {} + }, + "sender": "Siuntėjas", + "yes": "Taip", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Jūs", + "@you": { + "type": "String", + "placeholders": {} + }, + "logout": "Atsijungti", + "@logout": { + "type": "String", + "placeholders": {} + }, + "messages": "Žinutės", + "@messages": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Nuskanuokite QR kodą", + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Pridėti paskyrą", + "or": "Arba", + "@or": { + "type": "String", + "placeholders": {} + }, + "password": "Slaptažodis", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Slaptažodis pakeistas", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Įveskite savo slaptažodį", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Įveskite savo vartotojo vardą", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "reply": "Atsakyti", + "@reply": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Blokuoti įrenginį", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Užblokuotas", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Pasirinkite saugų slaptažodį", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ištrinti žinutę", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Įrenginiai", + "@devices": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Šrifto dydis", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Išvalyti archyvą", + "create": "Sukurti", + "@create": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatorius", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Nutildyti pokalbį", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Naujas pokalbis", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Nėra leidimo", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nerasta kambarių…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Pranešimai", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Gaunama vieta…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oi! Deja, nustatant tiesioginius pranešimus įvyko klaida.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oi, kažkas nutiko ne taip…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Atidarykite programėlę, kad perskaityti žinutes", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "link": "Nuoroda", + "participant": "Dalyvis", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Slapta frazė arba atkūrimo raktas", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Slaptažodis užmirštas", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Slaptažodžio atkūrimas", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Prisegti", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Pasirinkite slaptą kodą", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Paspauskite nuorodą el. pašte ir tęskite toliau.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Įveskite savo PIN kodą", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vadovaukitės svetainėje pateiktais nurodymais ir bakstelėkite Toliau.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privatumas", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Vieši kambariai", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Priežastis", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Pašalinti žinutę", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Atmesti", + "@reject": { + "type": "String", + "placeholders": {} + }, + "remove": "Šalinti", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Pašalinti visus kitus įrenginius", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Pašalinti savo avatarą", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Pakeisti kambarį naujesne versija", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Kambarys buvo atnaujintas", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Kambario versija", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Ieškoti", + "@search": { + "type": "String", + "placeholders": {} + }, + "accept": "Priimti", + "@accept": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Pakartokite slaptažodį", + "addEmail": "Įtraukti el. paštą", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administratorius", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "pseudonimas", + "@alias": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Bet kas gali prisijungti", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ar esate tikri?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ar tikrai norite atsijungti?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Pakeisti namų serverį", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Keisti savo stilių", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Keisti grupės pavadinimą", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Keisti savo avatarą", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chat": "Pokalbis", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Pokalbio detalės", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Pokalbiai", + "@chats": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Užblokuoti vartotoją šiame kambaryje", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Išvalyti laikiną talpyklą", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Atmesti sesiją", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_html": "Siųsti tekstą HTML formatu", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Pakviesti vartotoją į šitą kambarį", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Prisijungti prie nurodyto kambario", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Pašalinti vartotoja iš šito kambario", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomnick": "Nustatyti savo rodomą vardą šiame kambaryje", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "Siųsti neformatuotą tekstą", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Siųsti tekstą", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Atblokuoti vartotoją šiame kambaryje", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Neteisinga komanda", + "@commandInvalid": { + "type": "String" + }, + "configureChat": "Konfigūruoti pokalbį", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Nukopijuota į iškarpinę", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopijuoti", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Koipjuoti į iškarpinę", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Šiuo metu aktyvus", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tamsi", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "delete": "Ištrinti", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Panaikinti paskyra", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "directChats": "Tiesioginiai pokalbiai", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Užšifruotas", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifravimas aktyvuotas", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Įveskite el. pašto adresą", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "forward": "Toliau", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Nuo prisijungimo", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Nuo pakvietimo", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupė", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupė yra vieša", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupės", + "@groups": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Svečiams draudžiama", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Svečiai gali prisijungti", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "help": "Pagalba", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Slėpti nežinomus įvykius", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignoruoti", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignoruoti vartotojai", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "leave": "Palikti", + "@leave": { + "type": "String", + "placeholders": {} + }, + "mention": "Paminėti", + "@mention": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifravimas", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktyvuoti šifravimą", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Redaguoti blokuotus serverius", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "login": "Prisijungti", + "@login": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Išsiųsti paspaudus Enter", + "banFromChat": "Užblokuoti iš pokalbio", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Užblokuotas", + "@banned": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Pakeisti įrenginio vardą", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Pokalbio atsargine kopija", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "Apibūdinkite save", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "displaynameHasBeenChanged": "Rodomas vardas buvo pakeistas", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Redaguoti rodomą vardą", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Redaguoti kambario pseudonimus", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Redaguoti kambario avatarą", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Aš paspaudžiau nuorodą", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Neteisinga slaptafrazė arba atkūrimo raktas", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pakviesti kontaktą", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "invited": "Pakviestas", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Tik pakviesti vartotojai", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "isTyping": "rašo…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Prisijungti prie kambario", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "Išmesti iš pokalbio", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Paliko pokalbį", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Šviesi", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Kraunama… Prašome palaukti.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Rodyti daugiau…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nauja žinutė FluffyChat'e", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nauja patvirtinimo užklausa!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Toliau", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ne", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nėra ryšio su serveriu", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Programinis kodas", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Erdvė yra vieša", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Erdvės pavadinimas", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "Būsena", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kaip sekasi šiandien?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Pateikti", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinchronizuojama… Prašome palaukti.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Pradėti patvirtinimą", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Jūs sėkmingai patvirtinote!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Patvirtinama kita paskyra", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Pokalbių istorijos matomumas", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Matoma visiems dalyviams", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Laukiama, kol dalyvis priims užklausą…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Rašyti žinutę…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Jūs nebedalyvaujate šiame pokalbyje", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Jums buvo uždrausta dalyvauti šiame pokalbyje", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Žinutės informacija", + "removeFromSpace": "Pašalinti iš erdvės", + "security": "Apsauga", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Siųsti kaip tekstą", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Siųsti garso įrašą", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Siųsti paveiksliuką", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Sųsti bylą", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Siųsti žinutes", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Siųsti video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Nustatyti kaip pagrindinį slapyvardį", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Nustatyti būseną", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Bendrinti vietą", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Atblokuoti įrenginį", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nežinomas šifravimo algoritmas", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Įjungti pokalbio garsą", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Atsegti", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unverified": "Nepatvirtinta", + "verified": "Patvirtinta", + "@verified": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Vaizdo skambutis", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Jūsų viešasis raktas", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "account": "Paskyra", + "@account": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Pridėti prie erdvės", + "appLock": "Programos užraktas", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Ar svečiams leidžiama prisijungti", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifravimas buvo sugadintas", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Palyginkite jaustukus", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Palyginkite skaičius", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontaktas buvo pakviestas į grupę", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Apie turinį pranešta serverio administratoriams", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nauja erdvė", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Tai deaktyvuos jūsų vartotojo paskyrą. Tai negali būti atšaukta! Ar jūs tuo tikri?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Numatytasis teisių lygis", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifravimo nebegalėsite išjungti. Ar jūs tuo tikri?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "send": "Siųsti", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Siųsti žinutę", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Per daug užklausų. Pabandykite dar kartą vėliau!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Laukiama, kol dalyvis priims jaustukus…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Laukiama, kol dalyvis priims skaičius…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Įspėjimas!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Išsiuntėme jums el. laišką", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kas gali atlikti kokį veiksmą", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kam leidžiama prisijungti prie šios grupės", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kodėl norite apie tai pranešti?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Naudodami šiuos adresus galite atkurti savo slaptažodį.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openGallery": "Atverti galeriją", + "unknownDevice": "Nežinomas įrenginys", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Balso žinutė", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Matoma visiems", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Pabandykite išsiųsti dar kartą", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Vietos leidimas atmestas. Suteikite leidimą kad galėtumėte bendrinti savo vietą.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifravimą galite suaktyvinti tik tada, kai kambarys nebebus viešai pasiekiamas.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nerasta jaustukų. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Atrodo, kad jūsų telefone nėra Google Services. Tai geras sprendimas jūsų privatumui! Norėdami gauti tiesioginius pranešimus FluffyChat, rekomenduojame naudoti https://microg.org/ arba https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Dar nepridėjote slaptažodžio atkūrimo būdo.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Vienas iš jūsų klientų atsijungė", + "onlineKeyBackupEnabled": "Internetinė atsarginė raktų kopija įjungta", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Atidarykite kamerą", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "editBundlesForAccount": "Redaguoti šios paskyros paketus", + "addToBundle": "Pridėti prie paketų", + "removeFromBundle": "Pašalinkite iš šio paketo", + "bundleName": "Paketo vardas", + "redactedAnEvent": "{username} pašalino įvykį", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejectedTheInvitation": "{username} atmetė kvietimą", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unbanFromChat": "Atblokuoti pokalbyje", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Pranešti apie žinutę", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Išsaugoti failą", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} atsiuntė failą", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} atsiuntė garso įrašą", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} atsiuntė lipduką", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sharedTheLocation": "{username} bendrino savo vietą", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "startedACall": "{senderName} pradėjo skambutį", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "theyDontMatch": "Jie nesutampa", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Jie sutampa", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} atblokavo {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEvent": "Nežinomas įvykis '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} ir dar {count} kiti rašo…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ir {username2} rašo…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} rašo…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} išsiuntė {type} įvykį", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "reportUser": "Pranešti apie vartotoją", + "reactedWith": "{sender} sureagavo su {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "unsupportedAndroidVersion": "Nepalaikoma Android versija", + "acceptedTheInvitation": "👍 {username} priėmė kvietimą", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "activatedEndToEndEncryption": "🔐 {username} aktyvavo visapusį šifravimą", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} atsiliepė į skambutį", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Priimti šią patvirtinimo užklausą iš {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Namų serveris palaiko šiuos prisijungimo tipus:\n{serverVersions}\nTačiau ši programa palaiko tik:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "bannedUser": "{username} užblokavo {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} pakeitė istorijos matomumą", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} pakeitė istorijos matomumą į: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "commandHint_create": "Sukurti tuščią grupinį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Pradėti tiesioginį pokalbį\nNaudokite --no-encryption kad išjungti šifravimą", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_myroomavatar": "Nustatyti savo nuotrauką šiame kambaryje (su mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "Nustatyti naudotojo galios lygį (numatytasis: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Siųsti atsakymą kaip reakciją", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandMissing": "{command} nėra komanda.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "couldNotDecryptMessage": "Nepavyko iššifruoti pranešimo: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} dalyviai", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createdTheChat": "💬 {username} sukūrė pokalbį", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "emptyChat": "Tuščias pokalbis", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Jaustukas jau egzistuoja!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Neteisingas jaustuko trumpasis kodas!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Jaustukų nustatymai", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Jaustuko trumpasis kodas", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Įgalinti jaustukų paketą visur", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} baigė skambutį", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "errorObtainingLocation": "Klaida nustatant vietą: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "groupWith": "Grupė su {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "hasWithdrawnTheInvitationFor": "{username} atšaukė {targetName} kvietimą", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteContactToGroup": "Pakviesti kontaktą į {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invitedUser": "📩 {username} pakvietė {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteText": "{username} pakvietė jus prisijungti prie FluffyChat. \n1. Įdiekite FluffyChat: https://fluffychat.im \n2. Prisiregistruokite arba prisijunkite \n3. Atidarykite pakvietimo nuorodą: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinedTheChat": "👋 {username} prisijungė prie pokalbio", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "👞 {username} išmetė {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} išmetė ir užblokavo {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "Paskutinis aktyvumas: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "loadCountMoreParticipants": "Įkelti dar {count} dalyvius", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logInTo": "Prisijungti prie {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "cantOpenUri": "Nepavyksta atidaryti URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} pakeitė pokalbio avatarą", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} pakeitė pokalbių leidimus", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} pakeitė rodomą vardą į: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} pakeitė svečio prieigos taisykles", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} pakeitė svečio prieigos taisykles į: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} pakeitė prisijungimo taisykles", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} pakeitė prisijungimo taisykles į: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} pakeitė savo avatarą", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} pakeitė kambario pseudonimus", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} pakeitė pakvietimo nuorodą", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "pinMessage": "Prisegti prie kambario", + "confirmEventUnpin": "Ar tikrai norite visam laikui atsegti įvykį?", + "emojis": "Jaustukai", + "placeCall": "Skambinti", + "voiceCall": "Balso skambutis", + "unsupportedAndroidVersionLong": "Šiai funkcijai reikalinga naujesnė Android versija. Patikrinkite, ar nėra naujinimų arba Lineage OS palaikymo.", + "videoCallsBetaWarning": "Atminkite, kad vaizdo skambučiai šiuo metu yra beta versijos. Jie gali neveikti taip kaip tikėtasi, arba iš viso neveikti visose platformose.", + "experimentalVideoCalls": "Eksperimentiniai vaizdo skambučiai", + "youRejectedTheInvitation": "Jūs atmetėte kvietimą", + "youJoinedTheChat": "Jūs prisijungėte prie pokalbio", + "youAcceptedTheInvitation": "👍 Jūs priėmėte kvietimą", + "youBannedUser": "Jūs užblokavote {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Jūs atšaukėte kvietimą {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Jus pakvietė {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Jūs išmetėte {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Pakvietėte {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Jūs išmetėte ir užblokavote {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Jūs atblokavote {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "locationDisabledNotice": "Vietos nustatymo paslaugos yra išjungtos. Kad galėtumėte bendrinti savo buvimo vietą, įjunkite jas.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nėra Matrix serveris, ar vietoj jo naudoti {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "numUsersTyping": "{count} vartotojai rašo…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "openInMaps": "Atidaryti žemėlapiuose", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} atsiuntė nuotrauką", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} atsiuntė vaizdo įrašą", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} išsiuntė skambučio informaciją", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} paliko pokalbį", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "markAsRead": "Žymėti kaip skaitytą", + "askSSSSSign": "Kad galėtumėte prijungti kitą asmenį, įveskite savo saugyklos slaptafrazę arba atkūrimo raktą.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Automatiškai leisti animuotus lipdukus ir jaustukus", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "commandHint_markasdm": "Pažymėti kaip tiesioginio pokalbio kambarį", + "dehydrateWarning": "Šio veiksmo negalima atšaukti. Įsitikinkite, kad saugiai saugote atsarginę kopiją.", + "commandHint_markasgroup": "Pažymėti kaip grupę", + "storeInAppleKeyChain": "Saugoti Apple raktų grandinėje", + "newSpace": "Nauja erdvė", + "user": "Vartotojas", + "custom": "Pasirinktinis", + "confirmMatrixId": "Norėdami ištrinti savo paskyrą, patvirtinkite savo Matrix ID.", + "supposedMxid": "Tai turėtų būti {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "dehydrate": "Eksportuoti sesiją ir išvalyti įrenginį", + "hydrate": "Atkurti iš atsarginės kopijos failo", + "countFiles": "{count} failai", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "users": "Vartotojai", + "storeSecurlyOnThisDevice": "Saugiai laikyti šiame prietaise", + "storeInAndroidKeystore": "Saugoti Android raktų saugykloje", + "noKeyForThisMessage": "Taip gali atsitikti, jei žinutė buvo išsiųsta prieš prisijungiant prie paskyros šiame prietaise.\n\nTaip pat gali būti, kad siuntėjas užblokavo jūsų prietaisą arba kažkas sutriko su interneto ryšiu.\n\nAr galite perskaityti žinutę kitoje sesijoje? Tada galite perkelti žinutę iš jos! Eikite į Nustatymai > Prietaisai ir įsitikinkite, kad jūsų prietaisai patvirtino vienas kitą. Kai kitą kartą atidarysite kambarį ir abi sesijos bus pirmame plane, raktai bus perduoti automatiškai.\n\nNenorite prarasti raktų atsijungdami arba keisdami įrenginius? Įsitikinkite, kad nustatymuose įjungėte pokalbių atsarginę kopiją.", + "foregroundServiceRunning": "Šis pranešimas rodomas, kai veikia pirmojo plano paslauga.", + "screenSharingTitle": "ekrano bendrinimas", + "whyIsThisMessageEncrypted": "Kodėl ši žinutė neperskaitoma?", + "screenSharingDetail": "Bendrinate savo ekraną per FuffyChat", + "hugContent": "{senderName} jus apkabina", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Siųskite glebimą", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "appLockDescription": "Užrakinti programą, kai jos naudojama, nustatant PIN kodą", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "importFromZipFile": "Importuoti iš .zip failo", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "aboutHomeserver": "Apie {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "exportEmotePack": "Eksportuoti jaustukų paketą kaip .zip", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} siunčia jums išsipūtusias akutes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "importEmojis": "Importuoti jaustukus", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "notAnImage": "Nėra vaizdo failas.", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} jus glėbia", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Atnaujinkite šį kambarį iki nurodytos kambario versijos", + "commandHint_hug": "Siųskite apkabinimą", + "replace": "Pakeisti", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "commandHint_googly": "Siųskite išsipūtusias akutes", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "importNow": "Importuoti dabar", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "yesterday": "vakar", + "edited": "(redaguota)", + "uploading": "Įkeliamas", + "encrypting": "Šifruojamas", + "generatingThumbnail": "Generuojama miniatiūra", + "sending": "Siunčiama", + "today": "šiandien", + "youAreReadyToStart": "Esate pasirengę pradėti!", + "saveAsFile": "Išsaugoti kaip failą", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "unlock": "Atrakinti", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Atverti failą", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Atkūrus paskyrą, prarasite prieigą prie senų pranešimų visam laikui. Visus šiuo metu naudojamus įrenginius reikės patvirtinti iš naujo. Šį veiksmą atlikite tik tuo atveju, jei nebeliko jokių kitų įrenginių, kuriais būtų galima patvirtinti sesaną, ir praradote atkūrimo raktą bei slaptafrazę!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "„FluffyChat“ naudoja visapusišką šifravimą. Kad neprarastumėte savo žinučių, pasirinkite saugią slaptafrazę, kuri apsaugos jūsų kriptografinę tapatybę ir užšifruotą žinučių atsarginę kopiją.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Nauja slaptafrazė", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Pakartokite slaptafrazę", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Slaptafrazės sutampa", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_lv.arb b/lib/l10n/intl_lv.arb new file mode 100644 index 0000000000..fe18bd51f7 --- /dev/null +++ b/lib/l10n/intl_lv.arb @@ -0,0 +1,2632 @@ +{ + "hugContent": "{senderName} apskauj Tevi", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "darkTheme": "Tumšs", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "paroles vārdkopa vai atkopes atslēga", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Lūgums ievadīt savu paroli", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Tās sakrīt", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "jumpToLastReadMessage": "Pārlēkt uz pēdējo izlasīto ziņu", + "obtainingLocation": "Iegūst atrašanās vietu…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Nosūtīt samīļojienu", + "chats": "Tērzēšanas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Nezināma ierīce", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emocijas īskods", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Šifrēšanu var iespējot tikai tad, kad istaba vairs nav publiski pieejama.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "admin": "Pārvaldītājs", + "@admin": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Ak nē! Kaut kas nogāja greizi. Ja ir vēlēšanas, par šo nepilnību var ziņot izstrādātājiem.", + "directChats": "Tiešās tērzēšanas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Uzaicināt kontaktpersonu {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "addAccount": "Pievienot kontu", + "close": "Aizvērt", + "@close": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurēt tērzēšanu", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Atbildēt", + "@reply": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Pašreiz darbīgi", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Noņemt savu attēlu", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Neatbalstīta Android versija", + "blockDevice": "Liegt ierīci", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Nosūtīt ar HTML formatētu tekstu", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "youAreNoLongerParticipatingInThisChat": "Tu vairs nepiedalies šajā tērzēšanā", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifrēšana", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Viens no klientiem ir atteicies", + "unsupportedAndroidVersionLong": "Šai iespējai ir nepieciešama jaunāka Android versija. Lūgums pārbaudīt atjauninājumus vai Lineage OS atbalstu.", + "kicked": "👞 {username} izmeta {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "changeTheNameOfTheGroup": "Mainīt kopas nosaukumu", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} nomainīja tērzēšanas attēlu", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "verifySuccess": "Apliecināšana bija sekmīga.", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Nosūtīt datni", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Jauns apliecināšanas pieprasījums.", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} nosūtīja attēlu", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "invited": "Uzaicināts", + "@invited": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} nomainīja savu attēlojamo vārdu uz '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "setColorTheme": "Iestatīt krāsu izskatu:", + "commandHint_create": "Izveidot tukšu kopas tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "warning": "Uzmanību!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "password": "Parole", + "@password": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "Tam būtu jābūt {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "editDisplayname": "Labot attēlojamo vārdu", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "user": "Lietotājs", + "roomVersion": "Istabas versija", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} nosūtīja datni", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCall": "Videozvans", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "youAcceptedTheInvitation": "👍 Tu pieņēmi uzaicinājumu", + "banFromChat": "Izslēgt no tērzēšanas", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nav Matrix serveris, tā vietā izmantot {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} un {count} citi raksta…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "youInvitedBy": "📩 {user} Tevi uzaicināja", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userIsTyping": "{username} raksta…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "openAppToReadMessages": "Atvērt lietotni, lai lasītu ziņas", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "sentAVideo": "🎥 {username} nosūtīja video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banUserDescription": "Lietotājam tiks liegta piekļuve tērzēšanai, un vairs nevarēs vēlreiz pievienoties tērzēšanai, līdz liegums tiks atcelts.", + "inviteContact": "Uzaicināt kontaktpersonu", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Lai varētu parakstīt otru cilvēku, lūgums ievadīt savu drošo krātuves paroles vārdkopu vai atkopes atslēgu.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Gaida, līdz biedrs apstiprinās pieprasījumu…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "remove": "Noņemt", + "@remove": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Rakstīt ziņu…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Mainīt izskatu", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "removeDevicesDescription": "Tu tiksi izrakstīts no šīs ierīces un vairs nevarēsi saņemt ziņas.", + "countParticipants": "{count} dalībnieki", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tryAgain": "Jāmēģina vēlreiz", + "areGuestsAllowedToJoin": "Vai vieslietotāji drīkst pievienoties?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "blocked": "Liegta", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "youKickedAndBanned": "🙅 Izraidīji {user} un liedzi piekļuvi", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "Lietotājs varēs atkal pievienoties tērzēšanai, ja mēģinās.", + "userAndUserAreTyping": "{username} un {username2} raksta…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "Lūgums klikšķināt uz saites e-pastā un tad turpināt.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Saglabāt datni", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Nosūtīt ar Enter", + "answeredTheCall": "{senderName} atbildēja uz zvanu", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Tu noraidīji uzaicinājumu", + "messagesStyle": "Ziņas:", + "couldNotDecryptMessage": "Nevarēja atšifrēt ziņu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Tikai uzaicināti lietotāji", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "link": "Saite", + "newSpaceDescription": "Vietas ļauj apvienot tērzēšanas un veidot privātas vai publiskas kopienas.", + "chatDescription": "Tērzēšanas apraksts", + "next": "Nākamais", + "@next": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Lūgums sekot norādēm tīmekļvietnē un piesist \"Nākamais\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "changedTheGuestAccessRules": "{username} nomainīja viesu piekļuves nosacījumus", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "editRoomAliases": "Labot istabu aizstājvārdus", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "encryptThisChat": "Šifrēt šo tērzēšanu", + "publicRooms": "Publiskas istabas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "No uzaicinājuma", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Nosūtīt ziņas", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nepareiza paroles vārdkopa vai atkopes atslēga", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "Atkārtoti atvērt tērzēšanu", + "create": "Izveidot", + "@create": { + "type": "String", + "placeholders": {} + }, + "no": "Nē", + "@no": { + "type": "String", + "placeholders": {} + }, + "alias": "aizstājvārds", + "@alias": { + "type": "String", + "placeholders": {} + }, + "unpin": "Atspraust", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Pievienot komplektam", + "reportMessage": "Ziņot par ziņu", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Vieta ir publiska", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "all": "Viss", + "@all": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Noņemt visas pārējās ierīces", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Atslēgt ierīci", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "countFiles": "{count} datnes", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Tā var notikt, ja ziņa tika nosūtīta, pirms pieteicies savā kontā šajā ierīcē.\n\nIr arī iespējams, ka sūtītājs noliedza Tavu ierīci vai kaut kas nogāja greizi ar interneta savienojumu.\n\nVai ziņas ir lasāmas citā sesijā? Tad Tu vari pārsūtīt ziņu no tās. Jādodas uz Iestatījumi > Ierīces un jāpārliecinās, ka ierīces viena otru ir apliecinājušas. Kad nākamreiz atvērsi istabu un abas sesijas būs priekšplānā, atslēgas tiks automātiski pārsūtītas.\n\nVai nevēlies zaudēt atslēgas, kad atsakies vai maini ierīces? Jāpārliecinās, ka iestatījumos ir iespējota tērzēšanu rezerves kopija.", + "enableEncryptionWarning": "Vairs nebūs iespējams atspējot šifrēšanu. Vai tiešām to darīt?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} uzaicināja pievienoties FluffyChat.\n1. Jāapmeklē fluffychat.im un jāuzstāda lietotne \n2. Jāizveido konts vai jāpiesakās \n3. Jāatver uzaicinājuma saite: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "shareLocation": "Kopīgot atrašanās vietu", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "reason": "Iemesls", + "@reason": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Atzīmēt kā kopu", + "errorObtainingLocation": "Kļūda atrašanās vietas iegūšanā: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "pushNotificationsNotAvailable": "Pašpiegādes paziņojumi nav pieejami", + "passwordRecovery": "Paroles atkope", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "storeInAppleKeyChain": "Glabāt Apple KeyChain", + "replaceRoomWithNewerVersion": "Aizvietot istabu ar jaunāku versiju", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "hydrate": "Atjaunot no rezerves kopijas datnes", + "invalidServerName": "Nederīgs servera nosaukums", + "chatPermissions": "Tērzēšanas atļaujas", + "voiceMessage": "Balss ziņa", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Mājasserveris nodrošina pieteikšanās veidus:\n{serverVersions}\nSavukārt, šī lietotne atbalsta tikai:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "cantOpenUri": "Nevar atvērt adresi {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "sender": "Sūtītājs", + "storeInAndroidKeystore": "Glabāt Android KeyStore", + "lastActiveAgo": "Pēdējoreiz tiešsaistē: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} nomainīja viesu piekļuves nosacījumus uz {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "weSentYouAnEmail": "Mēs nosūtīja e-pasta ziņu", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "makeAdminDescription": "Tiklīdz šis lietotājs tiks padarīts par pārvaldītāju, to vairs nevarēs atdarīt, jo tad tam būs tādas pašas atļaujas kā Tev.", + "edit": "Labot", + "@edit": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Ielādēt vēl…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Netika atrasta neviena emocija. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinhronizē... Lūgums uzgaidīt.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parole tikai nomainīta", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Iztīrīt kešatmiņu", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "loadingPleaseWait": "Ielādē... Lūgums uzgaidīt.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "copy": "Ievietot starpliktuvē", + "@copy": { + "type": "String", + "placeholders": {} + }, + "editBundlesForAccount": "Labot šī konta komplektus", + "enableEncryption": "Iespējot šifrēšanu", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "whyIsThisMessageEncrypted": "Kādēļ šī ziņa ir nelasāma?", + "rejectedTheInvitation": "{username} noraidīja uzaicinājumu", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setChatDescription": "Iestatīt tērzēšanas aprakstu", + "userLeftTheChat": "🚪 {username} pameta tērzēšanu", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "spaceName": "Vietas nosaukums", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Ievietot no .zip datnes", + "or": "Vai", + "@or": { + "type": "String", + "placeholders": {} + }, + "dehydrateWarning": "Šī darbība nav atdarāma. Jānodrošina, ka rezerves kopijas datne tiek droši uzglabāta.", + "noOtherDevicesFound": "Netika atrastas citas ierīces", + "whoIsAllowedToJoinThisGroup": "Kuram ir ļauts pievienoties šai kopai", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tukša tērzēšana", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "storeSecurlyOnThisDevice": "Droši uzglabāt šajā ierīcē", + "chatBackup": "Tērzēšanu rezerves kopēšana", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "Laboja {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "submit": "Iesniegt", + "@submit": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "Lūgums ņemt vērā, ka video zvani pašreiz ir beta stāvoklī. Tie visās platformās var nedarboties kā paredzēs vai pat nedarboties vispār.", + "unmuteChat": "Atcelt tērzēšanas apklusināšanu", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} izveidoja tērzēšanu", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} laboja notikumu", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automātiski atskaņot animētas uzlīmes un emocijas", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "compareEmojiMatch": "Lūgums salīdzināt emocijzīmes", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "participant": "Dalībnieks", + "@participant": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Pieteikties {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "yes": "Jā", + "@yes": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} nomainīja istabas aizstājvārdus", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Nevar nosūtīt. Serveris nodrošina pielikums līdz {max}.", + "help": "Palīdzība", + "@help": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Tērzēšanas izvērsums", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} nomainīja vēstures redzamību uz {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "leftTheChat": "Pameta tērzēšanu", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "verified": "Apliecināta", + "@verified": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Atkārtot paroli", + "setStatus": "Iestatīt stāvokli", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Kopa ar {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "delete": "Izdzēst", + "@delete": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Jauna ziņa FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "readUpToHere": "Izlasīts līdz šejienei", + "downloadFile": "Lejupielādēt datni", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "changedTheJoinRulesTo": "{username} nomainīja pievienošanās nosacījumus uz {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} nomainīja tērzēšanas atļaujas", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "moderator": "Moderators", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "optionalRedactReason": "(Pēc izvēles) Ziņas labošanas iemesls...", + "acceptedTheInvitation": "👍 {username} pieņēma uzaicinājumu", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "waitingPartnerEmoji": "Gaida, līdz biedrs apstiprinās emocijzīmes…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrēšana tika bojāta", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Mēģināt nosūtīt vēlreiz", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Viesi var pievienoties", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "ok": "Labi", + "@ok": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Ievietot starpliktuvē", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Izgūt sesiju un iztīrīt ierīci", + "locationPermissionDeniedNotice": "Atrašanās vietas atļauja noliegta. Lūgums nodrošināt to, lai būtu iespējams kopīgot savu atrašanās vietu.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "send": "Nosūtīt", + "@send": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} atsauca uzaicinājumu {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "visibleForAllParticipants": "Redzama visiem dalībniekiem", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Istabas netika atrastas…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "banned": "Izslēgts", + "@banned": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Nosūtīt kā tekstu", + "@sendAsText": { + "type": "String" + }, + "archiveRoomDescription": "Tērzēšana tiks pārvietota uz arhīvu. Citi lietotāji redzēs, ka pameti tērzēšanu.", + "exportEmotePack": "Izgūt emociju paku kā .zip", + "account": "Konts", + "@account": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Nederīga komanda", + "@commandInvalid": { + "type": "String" + }, + "setAsCanonicalAlias": "Iestatīt kā galveno aizstājvārdu", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Kādēļ vēlies ziņot par šo?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Atrašanās vietas pakalpojumi ir atspējoti. Lūgums tos iespējot, lai būtu iespējams kopīgot savu atrašanās vietu.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "placeCall": "Veikt zvanu", + "changedTheRoomInvitationLink": "{username} nomainīja uzaicinājuma saiti", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "newChat": "Jauna tērzēšana", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "notifications": "Paziņojumi", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "commandHint_plain": "Nosūtīt neformatētu tekstu", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "emoteSettings": "Emociju iestatījumi", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Izmēģinājuma video zvani", + "openCamera": "Atvērt kameru", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Viesi nav ļauti", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "mention": "Pieminēt", + "@mention": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Atvērt kartēs", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Ar šīm adresēm var atjaunot savu paroli.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emocija jau pastāv!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "Laboja {username}, jo: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "isTyping": "raksta…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "youHaveWithdrawnTheInvitationFor": "Tu atsauci {user} uzaicinājumu", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chat": "Tērzēšana", + "@chat": { + "type": "String", + "placeholders": {} + }, + "group": "Kopa", + "@group": { + "type": "String", + "placeholders": {} + }, + "leave": "Pamest", + "@leave": { + "type": "String", + "placeholders": {} + }, + "skip": "Izlaist", + "@skip": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Istaba tika atjaunināta", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Iespējot kā vispārēju emociju paku", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Vai tiešām?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Lūgums izvēlēties piekļuves kodu", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Vēl nav pievienots paroles atjaunošanas veids.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "changedTheProfileAvatar": "{username} nomainīja savu attēlu", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reportUser": "Ziņot par lietotāju", + "sharedTheLocation": "{username} kopīgoja savu atrašanās vietu", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_send": "Nosūtīt tekstu", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "onlineKeyBackupEnabled": "Tiešsaistes atslēgas rezerves kopēšana ir iespējota", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} atcēla {targetName} piekļuves liegumu", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Vai tiešām neatgriezeniski atspraust šo notikumu?", + "youInvitedUser": "📩 Tu uzaicināji {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} izmeta {targetName} un liedza piekļuvi", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "Nav savienojuma ar serveri", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Datne tika saglabāta {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "addToSpace": "Pievienot vietai", + "unbanFromChat": "Atcelt liegumu tērzēšanā", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} nav komanda.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "redactMessageDescription": "Ziņa tiks labota visiem šīs sarunas dalībniekiem. To nevar atdarīt.", + "redactMessage": "Labot ziņu", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "forward": "Pārsūtīt", + "@forward": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "Atmest sesiju", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "invalidInput": "Nederīga ievade.", + "about": "Par", + "@about": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Jāizvēlas droša parole", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Tava publiskā atslēga", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Pārāk daudz pieprasījumu. Lūdzu, vēlāk mēģini vēlreiz!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} uzaicināja {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Izmest no tērzēšanas", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomnick": "Iestatīt savu attēlojamo vārdu šajā istabā", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "noPermission": "Nav atļaujas", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "doNotShowAgain": "Vairs nerādīt", + "activatedEndToEndEncryption": "🔐 {username} iespējoja pilnīgu šifrēšanu", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "report": "Ziņot", + "status": "Stāvoklis", + "@status": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Lūgums salīdzināt skaitļus", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Kopa ir publiska", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Uzsākt apliecināšanu", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Pievienoties istabai", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "unverified": "Neapliecināta", + "screenSharingTitle": "ekrāna kopīgošana", + "sentCallInformations": "{senderName} nosūtīja informāciju par zvanu", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} sūta izbolītas acis", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Tu {user} liedzi piekļuvi", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "theyDontMatch": "Tās nesakrīt", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Tev tika liegta piekļuve šai tērzēšanai", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Attēlojamais vārds tika nomainīts", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤 {username} nosūtīja skaņu", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "editRoomAvatar": "Labot istabas attēlu", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Šifrēta", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "commandHint_leave": "Pamest šo istabu", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Iestatīt savu attēlu šajā istabā (ar mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "cancel": "Atcelt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pieklauvēja", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Atvērt saiti pārlūkā", + "clearArchive": "Iztīrīt arhīvu", + "appLock": "Lietotnes aizslēgšana", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "commandHint_react": "Nosūtīt atbildi kā reakciju", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "changedTheHistoryVisibility": "{username} mainīja vēstures redzamību", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_me": "Apraksti sevi", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "pleaseEnterYourUsername": "Lūgums ievadīt savu lietotājvārdu", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Informācija par ziņu", + "disableEncryptionWarning": "Drošības iemeslu dēļ tērzēšanā nevar atspējot šifrēšanu, ja tā ir pirms tam ir bijusi iespējota.", + "directChat": "Tiešā tērzēšana", + "encryptionNotEnabled": "Šifrēšana nav iespējota", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "wrongPinEntered": "Ievadīts nepareizs PIN. Jāmēģina vēlreiz pēc {seconds} sekundēm...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Nosūtīt rakstīšanas paziņojumus", + "lightTheme": "Gaišs", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "inviteGroupChat": "📨 Uzaicinājums uz kopas tērzēšanu", + "verifyTitle": "Apliecina citu kontu", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "foregroundServiceRunning": "Šis paziņojums parādās, kad darbojas priekšplāna pakalpojums.", + "enterAnEmailAddress": "Jāievada e-pasta adrese", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "voiceCall": "Balss zvans", + "commandHint_kick": "Noņemt norādīto lietotāju no šīs istabas", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "copiedToClipboard": "Ievietots starpliktuvē", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Jauna vieta", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "commandHint_unban": "Atcelt norādītā lietotāja izslēgšanu no šīs istabas", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "unknownEncryptionAlgorithm": "Nezināms šifrēšanas algoritms", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Izslēgt norādīto lietotāju no šīs istabas", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "importEmojis": "Ievietot emocijzīmes", + "wasDirectChatDisplayName": "Tukša tērzēšana (bija {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Tērzēšanas apraksts vēl nav izveidots.", + "defaultPermissionLevel": "Noklusējuma atļauju līmenis jauniem lietotājiem", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Noņemt no šī komplekta", + "numUsersTyping": "{count} lietotāji raksta…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "fontSize": "Fonta izmērs", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kurš var veikt kādas darbības", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Lūgums apliecināt savu Matrix Id, lai varētu izdzēst savu kontu.", + "learnMore": "Uzzināt vairāk", + "iHaveClickedOnLink": "Es uzklikšķināju uz saites", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "you": "Tu", + "@you": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Nav attēla datne.", + "users": "Lietotāji", + "openGallery": "Atvērt galeriju", + "chatDescriptionHasBeenChanged": "Tērzēšanas apraksts ir mainījies", + "search": "Meklēt", + "@search": { + "type": "String", + "placeholders": {} + }, + "bundleName": "Komplekta nosaukums", + "removeFromSpace": "Noņemt no vietas", + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "commandHint_op": "Iestatīt norādītā lietotāja pilnvaru līmeni (noklusējums: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_join": "Pievienoties norādītajai istabai", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "sourceCode": "Pirmkods", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "roomUpgradeDescription": "Tērzēšana tad tiks atkārtoti izveidota ar jauno istabas versiju. Visiem dalībniekiem tiks paziņots, ka viņiem ir jāpārslēdzas uz jauno tērzēšanu. Vairāk par istabu versijām var atrast https://spec.matrix.org/latest/rooms/", + "commandHint_invite": "Uzaicināt norādīto lietotāju šajā istabā", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "userSentUnknownEvent": "{username} nosūtīja notikumu {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "scanQrCode": "Nolasīt kvadrātkodu", + "logout": "Atteikties", + "@logout": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterANumber": "Lūgums ievadīt skaitli lielāku par 0", + "contactHasBeenInvitedToTheGroup": "Kontaktpersona tika uzaicināta kopā", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "youKicked": "👞 Tu izraidīji {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Vai tiešām atteikties?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changedTheJoinRules": "{username} nomainīja pievienošanās nosacījumus", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "jump": "Pārlēkt", + "groups": "Kopas", + "@groups": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} atsaucās ar {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "bannedUser": "{username} izslēdza {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Atvaino! Tas nav iespējams", + "oopsSomethingWentWrong": "Ak vai! Kaut kas nogāja greizi…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Ielādēt vēl {count} dalībniekus", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "shareInviteLink": "Kopīgot uzaicinājuma saiti", + "commandHint_markasdm": "Atzīmēt kā tiešo ziņu istabu norādītajam Matrix Id", + "cuddleContent": "{senderName} samīļo Tevi", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "Pieņemt apliecināšanas pieprasījumu no {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "messages": "Ziņas", + "@messages": { + "type": "String", + "placeholders": {} + }, + "login": "Pieteikties", + "@login": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Gaida, līdz biedrs apstiprinās skaitļus…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Izskatās, ka Firebase mākoņziņojumapmaiņa nav pieejama šajā ierīcē. Lai joprojām saņemtu pašpiegādes paziņojumus, mēs iesakām uzstādīt ntfy. Ar ntfy vai citu UnifiedPush nodrošinātāju ir iespējams saņemt pašpiegādes paziņojumus drošā veidā. ntfy var lejupielādēt no Play Store vai F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Pievienot e-pasta adresi", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Nesen izmantotās emocijas parādīsies šeit...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} uzsāka zvanu", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "emoteInvalid": "Nederīgs emocijas īskods.", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistēmas", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Izdzēst ziņu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Tērzēšanas vēstures redzamība", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "settings": "Iestatījumi", + "@settings": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Mainīt mājasserveri", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Tu pievienojies tērzēšanai", + "changeDeviceName": "Mainīt ierīces nosaukumu", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Aizmirsta parole", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Kā Tev šodien klājas?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "security": "Drošība", + "@security": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Atzīmēt kā lasītu", + "sendAudio": "Nosūtīt skaņu", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sentASticker": "😊 {username} nosūtīja uzlīmi", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_dm": "Uzsākt tiešu tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_hug": "Nosūtīt apskāvienu", + "replace": "Aizstāt", + "reject": "Noraidīt", + "@reject": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Labot liegtos serverus", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ak vai! Diemžēl atgadījās kļūda pašpiegādes paziņojumu iestatīšanas laikā.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "youUnbannedUser": "Tu atcēli {user} piekļuves liegumu", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Tas atspējos Tavu lietotāja kontu. To nevar atdarīt. Vai tiešām?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhīvs", + "@archive": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} pievienojās tērzēšanai", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "visibleForEveryone": "Redzama visiem", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "newSpace": "Jauna vieta", + "changePassword": "Nomainīt paroli", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "devices": "Ierīces", + "@devices": { + "type": "String", + "placeholders": {} + }, + "accept": "Pieņemt", + "@accept": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nezināms notikums '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "emojis": "Emocijzīmes", + "pleaseEnterYourPin": "Lūgums ievadīt savu PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "share": "Kopīgot", + "@share": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Nosūtīt izbolītu acu pāri", + "createGroup": "Izveidot kopu", + "privacy": "Privātums", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Mainīt savu attēlu", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Nosūtīt attēlu", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "time": "Laiks", + "contentHasBeenReported": "Par saturu tika ziņos servera pārvaldītājiem", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "custom": "Pielāgots", + "noBackupWarning": "Uzmanību! Bez tērzēšanu rezerves kopiju veidošanas iespējošanas tiks zaudēta piekļuve savām šifrētajām ziņām. Ir ļoti ieteicams iespējot tērzēšanu rezerves kopiju veidošanu pirms atteikšanās.", + "fromJoining": "No pievienošanās", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Nosūtīt video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "kickUserDescription": "Lietotājs ir izmests no tērzēšanas, bet piekļuve nav liegta. Publiskās tērzēšanās lietotājs var atkārtoti pievienoties jebkurā laikā.", + "sendAMessage": "Nosūtīt ziņu", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "pin": "Piespraust", + "@pin": { + "type": "String", + "placeholders": {} + }, + "importNow": "Ievietot tagad", + "deleteAccount": "Izdzēst kontu", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "pinMessage": "Piespraust istabai", + "screenSharingDetail": "Tu kopīgo savu ekrānu FluffyChat", + "muteChat": "Apklusināt tērzēšanu", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "invite": "Uzaicināt", + "anyoneCanJoin": "Ikviens var pievienoties", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} beidza zvanu", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLockDescription": "Aizslēgt lietotni, kad tā netiek izmantota, ar PIN kodu", + "globalChatId": "Vispārējais tērzēšanas Id", + "accessAndVisibilityDescription": "Kam ir ļauts pievienoties šai tērzēšanai un kā tērzēšana var tikt atklāta.", + "customEmojisAndStickers": "Pielāgotas emocijzīmes un uzlīmes", + "customEmojisAndStickersBody": "Pievienot vai kopīgot pielāgotas emocijzīmes vai uzlīmes, kas var tikt izmantotas jebkurā tērzēšanā.", + "hideInvalidOrUnknownMessageFormats": "Paslēpt nederīgus vai nezināmus ziņu formātus", + "blockUsername": "Neņemt vērā lietotājvārdu", + "accessAndVisibility": "Piekļuve un redzamība", + "calls": "Zvani", + "hideRedactedMessages": "Paslēpt labošanas ziņas", + "hideRedactedMessagesBody": "Ja kāds labo ziņu, tā vairs nebūs redzama tērzēšanā.", + "blockListDescription": "Ir iespējams atslēgt traucējošus lietotājus. Nebūs iespējams saņem jebkādas ziņas vai uzaicinājumus uz istabām no lietotājiem, kas ir personīgajā izslēgšanas sarakstā.", + "wrongRecoveryKey": "Atvaino... Nešķiet, ka šī būtu pareiza atkopes atslēga.", + "block": "Izslēgt", + "passwordRecoverySettings": "Paroles atkopes iestatījumi", + "blockedUsers": "Atslēgtie lietotāji", + "searchForUsers": "Meklēt @lietotājus...", + "pleaseEnterYourCurrentPassword": "Lūgums ievadīt savu pašreizējo paroli", + "publicSpaces": "Publiskas vietas", + "joinSpace": "Pievienoties vietai", + "createGroupAndInviteUsers": "Izveidot kopu un uzaicināt lietotājus", + "groupCanBeFoundViaSearch": "Kopu var atrast meklēšanā", + "commandHint_sendraw": "Nosūtīt neapstrādātu JSON", + "newPassword": "Jauna parole", + "sendReadReceipts": "Nosūtīt lasīšanas atskaites", + "verifyOtherUser": "🔐 Apliecināt otru lietotāju", + "verifyOtherDevice": "🔐 Apliecināt otru ierīci", + "yourGlobalUserIdIs": "Vispārējais lietotāja Id ir: ", + "select": "Atlasīt", + "initAppError": "Atgadījās kļūda lietotnes sāknēšanas laikā", + "formattedMessages": "Formatētas ziņas", + "canceledKeyVerification": "{sender} atcēla atslēgas apliecināšanu", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} pabeidza atslēgas apliecināšanu", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} pieprasīja atslēgas apliecināšanu", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} uzsāka atslēgas apliecināšanu", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Ienākošās ziņas", + "isReadyForKeyVerification": "{sender} ir gatavs atslēgas apliecināšanai", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_unignore": "Atcelt norādītā Matrix Id neņemšanu vērā", + "commandHint_ignore": "Neņemt vērā norādīto Matrix Id", + "searchChatsRooms": "Meklēt #tērzēšanas, @lietotājus...", + "groupName": "Kopas nosaukums", + "knock": "Pieklauvēt", + "stickers": "Uzlīmes", + "usersMustKnock": "Lietotājiem jāpieklauvē", + "noOneCanJoin": "Neviens nevar pievienoties", + "knocking": "Klauvē", + "chatCanBeDiscoveredViaSearchOnServer": "Tērzēšana var tikt atklāta ar meklēšanu {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "nothingFound": "Nekas netika atrasts...", + "databaseMigrationTitle": "Datubāze ir optimizēta", + "leaveEmptyToClearStatus": "Atstāt tukšu, lai notīrītu savu stāvokli.", + "pleaseChooseAStrongPassword": "Lūgums izvēlēties spēcīgu paroli", + "passwordIsWrong": "Ievadītā parole ir nepareiza", + "thisDevice": "Šī ierīce:", + "acceptedKeyVerification": "{sender} apstiprināja atslēgas apliecināšanu", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Šajā platformā datubāzes šifrēšana netiek nodrošināta", + "databaseMigrationBody": "Lūgums uzgaidīt. Tas var aizņemt kādu brīdi.", + "passwordsDoNotMatch": "Paroles nesakrīt", + "publicChatAddresses": "Publiskas tērzēšanas adreses", + "createNewAddress": "Izveidot jaunu adresi", + "discover": "Atklāt", + "unreadChatsInApp": "{appname}: {unread} nelasītas tērzēšanas", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "addChatOrSubSpace": "Pievienot tērzēšanu vai apakškopienu", + "formattedMessagesDescription": "Attēlot bagātinātu ziņu saturu, piemēram, ar Markdown iezīmētu treknrakstu.", + "sessionLostBody": "Sesija ir zaudēta. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Ar cita lietotāja apliecināšanu vari pārliecināties, ka zini, kam Tu tiešām raksti. 💪\n\nKad uzsāc apliecināšanu, Tu un otrs lietotājs lietotnē redzēs uznirstošo logu. Tajā jūs redzēsiet dažādas emocijzīmes vai skaitļus, kas ir jāsalīdzina savā starpā.\n\nLabākais veids, kā to izdarīt, ir satikties vai uzsākt videozvanu. 👭", + "sendTypingNotificationsDescription": "Citi tērzēšanas dalībnieki var redzēt, kad raksti jaunu ziņu.", + "noUsersFoundWithQuery": "Diemžēl ar \"{query}\" netika atrasts neviens lietotājs. Lūgums pārbaudīt, vai ir pieļauta drukas kļūda.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "restoreSessionBody": "Lietotne tagad mēģina atjaunot sesiju no rezerves kopijas. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Citi tērzēšanas dalībnieki var redzēt, kad izlasīji ziņu.", + "thereAreCountUsersBlocked": "Šobrīd ir izslēgti {count} lietotāji.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "verifyOtherDeviceDescription": "Kad apliecini citu ierīci, šīs ierīces var apmainīt atslēgas, palielinot vispārējo drošību. 💪 Pēc apliecināšanas uzsākšanas abās ierīcēs lietotnē parādīsies uznirstošais logs. Tajā būs redzamas dažādas emocijzīmes vai skaitļi, kas jāsalīdzina abās ierīcēs. Vislabāk, ja abas ierīces ir pieejamas, pirms tiek uzsākta apliecināšana. 🤳", + "swipeRightToLeftToReply": "Pavilkt no labās puses uz kreiso, lai atbildētu", + "searchIn": "Meklēt tērzēšanā \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Meklēt vairāk...", + "gallery": "Galerija", + "files": "Datnes", + "sendCanceled": "Sūtīšana atcelta", + "noChatsFoundHere": "Šeit vēl nav tērzēšanu. Jauna saruna ar kādu ir uzsākama ar zemāk esošo pogu. ⤵️", + "moderatorLevel": "{level} - Moderators", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Pārvaldītājs", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheVisibilityOfChatHistory": "Mainīt tērzēšanas vēstures redzamību", + "changeTheCanonicalRoomAlias": "Mainīt tērzēšanas galveno publisko adresi", + "sendRoomNotifications": "Sūtīt @istaba paziņojumus", + "changeTheDescriptionOfTheGroup": "Mainīt tērzēšanas aprakstu", + "userLevel": "{level} - Lietotājs", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "goToSpace": "Doties uz vietu: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "changeGeneralChatSettings": "Mainīt vispārējos tērzēšanas iestatījumus", + "inviteOtherUsers": "Uzaicināt šajā tērzēšanā citus lietotājus", + "changeTheChatPermissions": "Mainīt tērzēšanas atļaujas", + "chatPermissionsDescription": "Noteikt, kurš spēka līmenis ir nepieciešams noteiktām darbībām šajā tērzēšanā. Spēka līmeņi 0, 50 un 100 parasti atbilst lietotājiem, moderatoriem un pārvaldītājiem, bet ir iespējams jebkāds iedalījums.", + "doesNotSeemToBeAValidHomeserver": "Neizskatās pēc saderīga mājasservera. Nepareizs URL?", + "loginWithMatrixId": "Pieteikties ar Matrix-Id", + "updateInstalled": "🎉 Atjauninājums {version} uzstādīts.", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Izmaiņu žurnāls", + "noMoreChatsFound": "Vairs netika atrasta neviena tērzēšana...", + "unread": "Nelasītas", + "space": "Vieta", + "markAsUnread": "Atzīmēt kā nelasītu", + "sendingAttachment": "Nosūta pielikumu...", + "calculatingFileSize": "Aprēķina datnes lielumu...", + "oneOfYourDevicesIsNotVerified": "Viena no ierīcēm nav apliecināta", + "noticeChatBackupDeviceVerification": "Piezīme: kad visas ierīces tiek savienotas ar tērzēšanu rezerves kopiju, tās tiek automātiski apliecinātas.", + "continueText": "Turpināt", + "blur": "Aizmiglojums:", + "setWallpaper": "Iestatīt ekrāntapeti", + "opacity": "Necaurredzamība:", + "manageAccount": "Pārvaldīt kontu", + "noContactInformationProvided": "Serveris nesniedz nekādu derīgu saziņas informāciju", + "serverInformation": "Informācija par serveri:", + "aboutHomeserver": "Par {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "contactServerAdmin": "Sazināties ar servera pārvaldītāju", + "contactServerSecurity": "Sazināties ar servera drošības uzturētājiem", + "supportPage": "Atbalsta lapa", + "name": "Nosaukums", + "version": "Versija", + "website": "Tīmekļvietne", + "boldText": "Teksts treknrakstā", + "strikeThrough": "Pārsvītrots", + "invalidUrl": "Nederīgs URL", + "addLink": "Pievienot saiti", + "italicText": "Teksts slīprakstā", + "pleaseFillOut": "Lūgums aizpildīt", + "sendImages": "Nosūtīt {count} attēlu(s)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Saspiest", + "unableToJoinChat": "Nevarēja pievienoties tērzēšanai. Varbūt otra puse jau ir aizvērusi sarunu.", + "appWantsToUseForLoginDescription": "Ar šo tiek ļauts lietotnei un tīmekļvietnei kopīgot informāciju par Tevi.", + "synchronizingPleaseWaitCounter": " Sinhronizē... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "previous": "Iepriekšējais", + "otherPartyNotLoggedIn": "Otra puse pašlaik nav pieteikusies un tādēļ nevar saņemt ziņas.", + "appWantsToUseForLogin": "Izmantot '{server}', lai pieteiktos", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Atvērt", + "waitingForServer": "Gaida serveri...", + "notificationRuleContainsDisplayNameDescription": "Paziņo lietotājam, kad ziņa satur viņa attēlojamo vārdu.", + "notificationRuleServerAcl": "Apspiest servera ACL notikumus", + "notificationRuleSuppressNoticesDescription": "Apspiež paziņojumus no automatizētiem klientiem, piemēram, robotprogrammatūras.", + "notificationRuleInviteForMeDescription": "Paziņo lietotājam, kad viņš ir uzaicināts pievienoties istabai.", + "generalNotificationSettings": "Vispārēji paziņojumu iestatījumi", + "otherNotificationSettings": "Citi paziņojumu iestatījumi", + "notificationRuleContainsUserName": "Saturs lietotāja vārdu", + "notificationRuleMasterDescription": "Aizvieto visas pārējās kārtulas un atspējo visus paziņojumus.", + "notificationRuleInviteForMe": "Uzaicinājums man", + "notificationRuleMemberEvent": "Dalībnieka notikums", + "notificationRuleMemberEventDescription": "Apspiež paziņojums par dalības notikumiem.", + "notificationRuleIsUserMentionDescription": "Paziņo lietotājam, kad viņš ziņā ir tieši pieminēts.", + "notificationRuleIsRoomMention": "Istabas pieminēšana", + "notificationRuleRoomnotif": "Istabas paziņojums", + "notificationRuleReaction": "Reakcija", + "notificationRuleRoomServerAcl": "Istabas servera ACL", + "notificationRuleCall": "Zvans", + "notificationRuleCallDescription": "Paziņo lietotājam par zvaniem.", + "deletePushRuleCanNotBeUndone": "Ja tiek izdzēsts šis paziņojuma iestatījums, to nevar atsaukt.", + "more": "Vairāk", + "roomNotificationSettings": "Istabu paziņojumu iestatījumi", + "notificationRuleEncrypted": "Šifrēts", + "notificationRuleJitsi": "Jitsi videozvani", + "notificationRuleIsUserMention": "Lietotāja pieminēšana", + "notificationRuleIsRoomMentionDescription": "Paziņo lietotājam, kad tiek pieminēta istaba.", + "notificationRuleMessageDescription": "Paziņo lietotājam par vispārējām ziņām.", + "notificationRuleServerAclDescription": "Apspiež notikumus par servera ACL notikumiem.", + "notificationRuleReactionDescription": "Apspiež paziņojums par reakcijām.", + "unknownPushRule": "Nezināma pašpiegādes kārtula '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "newChatRequest": "📩 Jauns tērzēšanas pieprasījums", + "notificationRuleContainsUserNameDescription": "Paziņo lietotājam, kad ziņa satur viņa lietotājvārdu.", + "notificationRuleRoomnotifDescription": "Paziņo lietotājam, kad ziņa satur \"@istaba\".", + "notificationRuleEncryptedRoomOneToOneDescription": "Paziņo lietotājam par ziņām šifrētās viens pret viens istabās.", + "notificationRuleRoomServerAclDescription": "Apspiež paziņojumus par istabas servera piekļuves kontroles sarakstiem (ACL).", + "contentNotificationSettings": "Satura paziņojumu iestatījumi", + "notificationRuleContainsDisplayName": "Satur attēlojamo vārdu", + "notificationRuleRoomOneToOne": "Viens pret viens istaba", + "notificationRuleJitsiDescription": "Paziņo lietotājam par Jitsi logrīka notikumiem.", + "notificationRuleSuppressEditsDescription": "Apspiež paziņojumus par labotām ziņām.", + "notificationRuleTombstone": "Kapakmens", + "notificationRuleTombstoneDescription": "Paziņo lietotājam par istabu aizvēršanas ziņām.", + "notificationRuleSuppressEdits": "Apspiest labojumus", + "notificationRuleEncryptedRoomOneToOne": "Šifrēta viens pret viens istaba", + "notificationRuleRoomOneToOneDescription": "Paziņo lietotājam par ziņām viens pret viens istabās.", + "notificationRuleMessage": "Ziņa", + "notificationRuleEncryptedDescription": "Paziņo lietotājam par ziņām šifrētās istabās.", + "userSpecificNotificationSettings": "Lietotāja paziņojumu iestatījumi", + "notificationRuleMaster": "Apklusināt visus paziņojumus", + "notificationRuleSuppressNotices": "Apspiest automātiskās ziņas", + "crossVerifiedDevices": "Savstarpēji apliecinātas ierīces", + "shareKeysWith": "Kopīgot atslēgas ar...", + "shareKeysWithDescription": "Kurām ierīcēm vajadzētu uzticēties, lai tajās varētu lasīt ziņas šifrētajās tērzēšanās?", + "allDevices": "Visas ierīces", + "crossVerifiedDevicesIfEnabled": "Savstarpēji apliecinātas ierīces, ja iespējots", + "verifiedDevicesOnly": "Tikai apliecinātas ierīces", + "optionalMessage": "(Pēc izvēles) Ziņojums...", + "takeAPhoto": "Uzņemt attēlu", + "recordAVideo": "Ierakstīt video", + "notSupportedOnThisDevice": "Šajā ierīcē nav atbalstīts", + "enterNewChat": "Ieiet jaunajā tērzēšanā", + "commandHint_roomupgrade": "Uzlabot šo istabu uz norādīto istabas versiju", + "youHaveKnocked": "Tu pieklauvēji", + "pleaseWaitUntilInvited": "Lūgums tagad uzgaidīt, līdz kāds no istabas uzaicinās Tevi.", + "approve": "Apstiprināt", + "checkList": "Pārbaužu saraksts", + "countInvited": "{count} uzaicināti", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Balss ziņa no {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "commandHint_logout": "Atteikties pašreizējā ierīcē", + "commandHint_logoutall": "Atteikties visās izmantotajās ierīcēs", + "displayNavigationRail": "Rādīt pārvietošanās sliedi viedierīcēs", + "customReaction": "Pielāgota reakcija", + "moreEvents": "Vairāk notikumu", + "declineInvitation": "Noraidīt uzaicinājumu", + "noMessagesYet": "Vēl nav ziņu", + "longPressToRecordVoiceMessage": "Ilga piespiešana, lai ierakstītu balss ziņu.", + "pause": "Apturēt", + "resume": "Atsākt", + "removeFromSpaceDescription": "Tērzēšana tiks noņemta no vietas, bet tā joprojām būs redzama tērzēšanu sarakstā.", + "countChats": "{chats} tērzēšanas", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces} dalībnieks", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} dalībnieks var pieklauvēt", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Sākt aptauju", + "endPoll": "Noslēgt aptauju", + "answersVisible": "Atbildes ir redzamas", + "pollQuestion": "Aptaujas jautājums", + "answerOption": "Atbildes iespēja", + "addAnswerOption": "Pievienot atbildes iespēju", + "allowMultipleAnswers": "Atļaut vairākas atbildes", + "pollHasBeenEnded": "Aptauja ir noslēgusies", + "countVotes": "{count, plural, =0{{count} balsu} =1{{count} balss} other{{count} balsis}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Atbildes būs redzams, kad aptauja noslēgsies", + "replyInThread": "Atbildēt pavedienā", + "countReplies": "{count, plural, =0{{count} atbilžu} =1{{count} atbilde} other{{count} atbildes}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Pavediens", + "backToMainChat": "Atgriezties galvenajā tērzēšanā", + "saveChanges": "Saglabāt izmaiņas", + "createSticker": "Izveidot uzlīmi vai emocijzīmi", + "useAsSticker": "Izmantot kā uzlīmi", + "useAsEmoji": "Izmantot kā emocijzīmi", + "stickerPackNameAlreadyExists": "Uzlīmju pakas nosaukums jau pastāv", + "newStickerPack": "Jauna uzlīmju paka", + "stickerPackName": "Uzlīmju pakas nosaukums", + "attribution": "Piedēvējums", + "skipChatBackup": "Izlaist tērzēšanu rezerves kopēšanu", + "skipChatBackupWarning": "Vai tiešām? Bez tērzēšanu rezerves kopēšanas var tikt zaudēta piekļuve savām ziņām, kad tiks mainīta ierīce.", + "changedTheChatDescription": "{username} nomainīja tērzēšanas aprakstu", + "changedTheChatName": "{username} nomainīja tērzēšanas nosaukumu", + "noMoreResultsFound": "Vairs nekas netika atrasts", + "chatSearchedUntil": "Tērzēšanā meklēts līdz {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Federācijas pamata URL", + "clientWellKnownInformation": "Client-Well-Known informācija:", + "baseUrl": "Pamata URL", + "identityServer": "Identitāšu serveris:", + "versionWithNumber": "Versija: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Žurnāli", + "advancedConfigs": "Izvērsta konfigurācijas", + "advancedConfigurations": "Izvērstas konfigurācijas", + "theProcessWasCanceled": "Darbība tika atcelta.", + "signIn": "Pieteikties", + "createNewAccount": "Izveidot jaunu kontu", + "signUpGreeting": "FluffyChat ir decentralizēta. Jāatlasa serveris, kurā ir vēlēšanās izveidot savu kontu, un aiziet!", + "signInGreeting": "Jau ir Matrix konts? Laipni lūdzam atpakaļ! Jāatlasa savs mājasserveris un jāpiesakās.", + "reset": "Atiestatīt", + "createNewTag": "Izveidot jaunu birku", + "join": "Pievienoties", + "createNewChat": "Izveidot jaunu tērzēšanu", + "makeModerator": "Padarīt par satura pārraudzītāju", + "tagName": "Birkas nosaukums", + "setPowerLevelDescription": "Tiesību līmeņi nosaka, ko dalībniekam ir ļauts darīt šajā istabā, un parasti ir starp 0 un 100.", + "matrixId": "Matrix Id", + "support": "Atbalstīt", + "setPowerLevel": "Iestatīt tiesību līmeni", + "mute": "Apklusināt", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "removeModeratorRights": "Noņemt satura pārraudzītāja tiesības", + "addTag": "Pievienot birku", + "removeAdminRights": "Noņemt pārvaldītāja tiesības", + "owner": "Īpašnieks", + "powerLevel": "Tiesību līmenis", + "playSoundOnNotification": "Atskaņot paziņojuma skaņu", + "makeAdmin": "Padarīt par pārvaldītāju", + "searchOrEnterHomeserverAddress": "Meklēt vai ievadīt mājasservera adresi", + "unsetLowPriority": "Noņemt zemu svatīgumu", + "setLowPriority": "Iestatīt zemu svarīgumu", + "removeTag": "Noņemt birku", + "supportFluffyChat": "Atbalstīt FluffyChat", + "discardEdits": "Ir nesaglabātas izmaiņas. Atmest labojumus?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "possibleByYou": "Šis laidiens bija iespējams pateicoties Tavam atbalstam. FluffyChat joprojām ir brīva, atvērta pirmkoda un pilnībā kopienas virzīta.", + "hideRoomsInSpaces": "Paslēpt istabas, kas ir vietā", + "showThumbnailsInTimeline": "Rādīt attēlu un video sīktēlus", + "appSubtitle": "Droša [matrix] saziņa", + "appDescription": "Šifrēta saziņa decentralizētā [matrix] tīklā visiem vienkāršā un pieejamā veidā.", + "interactiveVerification": "Mijiedarbība apliecināšana", + "interactiveVerificationDescription": "Ja esat viens otram blakus vai sazināties drošā veidā, tad varat apliecināt visas ierīces uzreiz ar drošības skaitļa vai emocijzīmju salīdzināšanu.", + "countUnverifiedDevices": "Tērzēšanā ir {count} neapliecinātas ierīces.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Šifrēta ziņa", + "unencryptedMessage": "Nešifrēta ziņa", + "publicKey": "Publiskā atslēga: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Ierīces identificēšanas atslēga", + "showMore": "Parādīt vairāk", + "showLess": "Rādīt mazāk", + "messageCanOnlyBeReadByUser": "Ziņojums ir pilnībā šifrēts, un to var izlasīt tikai šis lietotājs:", + "messageCanOnlyBeReadByUsers": "Ziņojums ir pilnībā šifrēts, un to var izlasīt tikai šie lietotāji:", + "unlock": "Atslēgt", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Atvērt datni", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Atkārtot paroles vārdkopu", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Paroles vārdkopas sakrīt", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Vismaz 12 rakstzīmes gara.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Satur lielos un mazos burtus.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Satur īpašas rakstzīmes.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Satur vismaz vienu ciparu.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Ziņojums nav atšifrējams", + "today": "Šodien", + "sending": "Sūta", + "generatingThumbnail": "Veido sīktēlu", + "encrypting": "Šifrē", + "uploading": "Augšupielādē", + "edited": "(labots)", + "couldNotBeSent": "Nevarēja nosūtīt", + "yesterday": "Vakar", + "resetRecoveryKey": "Atiestatīt atkopes atslēgu", + "resetAccount": "Atiestatīt kontu", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Saglabāt kā datni", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "unsignedDevice": "Neapstiprināta ierīce", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Apstiprināta ierīce", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Curve25519 atslēga nav atrasta", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter6Digits": "Lūdzu, ievadiet 6 ciparus, lai iespējotu lietotnes aizslēgšanu.", + "disableAppLock": "Atspējot lietotnes aizslēgšanu", + "disableAppLockAreYouSure": "Vai tiešām vēlaties atspējot lietotnes aizslēgšanu?", + "enableBiometrics": "Iespējot biometrisko autentifikāciju", + "disableBiometrics": "Atspējot biometrisko autentifikāciju", + "biometricsDescription": "Ar biometrisko autentifikāciju jūs variet atslēgt lietotni ar savu seju vai pirksta nospiedumu. Iespējas ir atkarīgas no jūsu konkrētās ierīces.", + "useAppLock": "Izmantot lietotnes aizslēgšanu", + "unlockWithBiometrics": "Atslēgt ar biometrisko autentifikāciju", + "resetPin": "Atiestatīt PIN kodu" +} diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb new file mode 100644 index 0000000000..44f7eeb710 --- /dev/null +++ b/lib/l10n/intl_nb.arb @@ -0,0 +1,2535 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.967351", + "about": "Om", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Godta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} godtok invitasjonen", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} skrudde på ende-til-ende -kryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alle", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} besvarte anropet", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Hvem som helst kan delta", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Programlås", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arkiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Kan gjester bli med?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Er du sikker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Er du sikker på at du vil logge ut?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "For å kunne signere den andre personen, skriv inn ditt sikre lagerpassord eller gjenopprettingsnøkkel.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Godta denne bekreftelsesforespørselen fra {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Bannlys fra sludring", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannlyst", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} bannlyste {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokker enhet", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Avbryt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Endre enhetsnavn", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} endret sludreavatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} endret sludretilgangene", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} endret visningsnavn til: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} endret gjestetilgangsreglene", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} endret gjestetilgangsregler til: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} endret historikksynlighet", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} endret historikksynlighet til: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} endret tilgangsreglene", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} endret tilgangsreglene til: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} endret avataren sin", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} endret rom-aliasene", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} endret invitasjonslenken", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Endre passord", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Endre hjemmetjener", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Endre din stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Endre gruppens navn", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Krypteringen er skadet", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Sludring", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sludringssikkerhetskopi", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Sludringsdetaljer", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Velg et sterkt passord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Lukk", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Sammenlign og forsikre at følgende emojiene samsvarer med de på den andre enheten", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Sammenlign og forsikre at følgende tall samsvarer med de på den andre enheten", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Sett opp sludring", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt invitert til gruppen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Innholdet har blitt rapportert til tjeneradministratorene", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopiert til utklippstavle", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopier", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopier til utklippstavle", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kunne ikke dekryptere melding: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} deltagere", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Opprett", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} opprettet sludringen", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Aktiv nå", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Mørk", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Dette vil skru av din brukerkonto for godt, og kan ikke angres! Er du sikker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Forvalgt tilgangsnivå", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Slett", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Slett konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Slett melding", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Enheter", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direktesludringer", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Visningsnavn endret", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Last ned fil", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Rediger", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Rediger blokkerte tjenere", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Rediger visningsnavn", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Rediger romavatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Smilefjeset finnes allerede!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ugyldig smilefjes-kode!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Smilefjes-innstillinger", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Smilefjes-kode", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tom sludring", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Skru på smilefjespakke for hele programmet", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Skru på kryptering", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du vil ikke kunne skru av kryptering lenger. Er du sikker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Kryptert", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Kryptering", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Kryptering er ikke påskrudd", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} avsluttet samtalen", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Skriv inn en e-postadresse", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Skriftstørrelse", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Videre", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Fra å ta del", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Fra invitasjonen", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Gruppe", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppen er offentlig", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupper", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppe med {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gjester forbudt", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gjester kan ta del", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} har trukket tilbake invitasjonen til {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hjelp", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Skjul ukjente hendelser", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorer", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorerte brukere", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Jeg har klikket på lenken", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Feilaktig passord eller gjenopprettingsnøkkel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Inviter kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Inviter kontakt til {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Invitert", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} inviterte {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Kun inviterte brukere", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} har invitert deg til FluffyChat. \n1. Installer FluffyChat: https://fluffychat.im \n2. Registrer deg eller logg inn \n3. Åpne invitasjonslenken: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "skriver…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username}ble med i samtalen", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Ta del i rom", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} kastet ut {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} kastet ut og bannlyste {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kast ut av sludringen", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Sist aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Forlat", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Forlat sludringen", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Lys", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Last inn {count} deltagere til", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laster inn… Vent.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Last inn mer…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Logg inn", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logg inn på {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logg ut", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Nevn", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Meldinger", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Forstum sludring", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ny sludring", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Ny melding i FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Ny bekreftelsesforespørsel!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Neste", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nei", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Fant ingen smilefjes. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging ser ikke ut til å være tilgjengelig på enheten din. For å fortsatt kunne motta push-varsler, anbefaler vi at du installerer ntfy. Med ntfy eller en annen UnifiedPush-leverandør kan du motta push-varsler på en datasikker måte. Du kan laste ned ntfy fra Play Store eller F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du har ikke lagt til en måte å gjenopprette passordet ditt på.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ingen tilgang", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Fant ingen rom …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Merknader", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} brukere skriver …", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Nettbasert sikkerhetskopiering av nøkler på", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oida, noe gikk galt …", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Åpne programmet for å lese meldinger", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Åpne kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Deltager", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "Passord eller gjenopprettingsnøkkel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Passord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Passord glemt", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Passord endret", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Passordgjenoppretting", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fest", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klikk på lenken i e-posten og fortsett.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Skriv inn passordet ditt", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Skriv inn brukernavnet ditt", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Følg instruksen på nettsiden og trykk på «Neste».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Personvern", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Offentlige rom", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Grunn", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} har trukket tilbake en hendelse", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Avslå", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} avslo invitasjonen", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Fjern", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Fjern alle andre enheter", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Opphev bannlysning", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Erstatt rom med nyere versjon", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Svar", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Rapporter melding", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Rommet har blitt oppgradert", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Søk", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Sikkerhet", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Send", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Send en melding", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Send lyd", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Send fil", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Send bilde", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Send meldinger", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Send video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} sendte en fil", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} sendte lyd", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} sendte et bilde", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} sendte et klistremerke", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} sendte en video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sendte anropsinfo", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "Angi status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Innstilinger", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Del", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} delte posisjonen", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Hopp over", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kildekode", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} startet en samtale", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hvordan har du det i dag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Send inn", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Samsvarer ikke", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Samsvarer", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "For mange forespørsler. Prøv igjen senere!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Prøv å sende igjen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} opphevet bannlysning av {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Opphev blokkering av enhet", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ukjent enhet", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Ukjent krypteringsalgoritme", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Ukjent hendelse '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Opphev forstumming av sludring", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Løsne", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} og {count} andre skriver…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} og {username2} skriver…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} skriver…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} har forlatt sludringen", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} sendte en {type}-hendelse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Start bekreftelse", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Du har bekreftet!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Bekrefter annen konto", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videosamtale", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Sludrehistorikkens synlighet", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Synlig for alle deltagere", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Synlig for alle", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Lydmelding", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Venter på at samtalepartner skal godta tallene …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Advarsel!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Du har fått en e-post", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Hvem kan utføre hvilken handling", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Hvem tillates å ta del i denne gruppen", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Hvorfor ønsker du å rapportere dette?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Med disse adressene kan du gjenopprette passordet ditt hvis du trenger det.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skriv en melding …", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Deg", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du deltar ikke lenger i denne sludringen", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du har blitt bannlyst fra denne sludringen", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Din offentlige nøkkel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ingen tilkobling til tjeneren", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Legg til e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Gjenta passord", + "addToSpace": "Legg til område", + "autoplayImages": "Automatisk spill av animerte stickers og emojis", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Denne hjemme serveren støtter følgende innloggings-typer:\n{serverVersions}\nMen denne applikasjonen støtter kun:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Trykk på enter for å sende", + "blocked": "Blokkert", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan ikke åpne URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeYourAvatar": "Bytt profilbilde", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Ikke en bildefil.", + "importNow": "Importer nå", + "hugContent": "{senderName} klemmer deg", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "space": "Område", + "cuddleContent": "{senderName} koser med deg", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLockDescription": "Lås appen med en PIN-kode når den ikke er i bruk", + "replace": "Erstatt", + "noMoreChatsFound": "Ingen flere chatter funnet ...", + "confirmMatrixId": "Bekreft Matrix-IDen din for å slette kontoen din.", + "unread": "Ulest", + "aboutHomeserver": "Om {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_hug": "Send en klem", + "markAsRead": "Marker som lest", + "openLinkInBrowser": "Åpne lenke i nettleser", + "passwordsDoNotMatch": "Passordene stemmer ikke overens", + "encryptThisChat": "Krypter denne chatten", + "doNotShowAgain": "Ikke vis igjen", + "notificationRuleContainsUserName": "Inneholder brukernavn", + "notificationRuleMaster": "Demp alle varslinger", + "verified": "Verifisert", + "@verified": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Lagre fil", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Del lokasjon", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synkroniserer … Vent litt.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "Gjenåpne chat", + "changeTheDescriptionOfTheGroup": "Endre beskrivelsen til chatten", + "inviteOtherUsers": "Inviter andre brukere til denne chatten", + "open": "Åpne", + "waitingForServer": "Venter på server...", + "notificationRuleJitsi": "Jitsi", + "takeAPhoto": "Ta et bilde", + "setChatDescription": "Sett chat beskrivelse", + "openGallery": "Åpne galleri", + "pushNotificationsNotAvailable": "Push-varsler er ikke tilgjengelige", + "gallery": "Galleri", + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "updateInstalled": "🎉 Oppdatering {version} installert!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "calculatingFileSize": "Beregner filstørrelse...", + "continueText": "Fortsett", + "serverInformation": "Serverinformasjon:", + "previous": "Forrige", + "name": "Navn", + "version": "Versjon", + "invalidUrl": "Ugyldig url", + "notificationRuleReaction": "Reaksjon", + "notificationRuleMessage": "Melding", + "notificationRuleEncrypted": "Kkryptert", + "more": "Mer", + "passwordIsWrong": "Det inntastede passordet ditt er feil", + "manageAccount": "Administrer konto", + "nothingFound": "Ingenting funnet...", + "incomingMessages": "Innkommende meldinger", + "changelog": "Endringslogg", + "contactServerAdmin": "Kontakt serveradministrator", + "setWallpaper": "Sett bakgrunnsbilde", + "unsupportedAndroidVersion": "Usupportert Android-versjon", + "youJoinedTheChat": "Du har blitt med i chatten", + "youRejectedTheInvitation": "Du har avvist invitasjonen", + "formattedMessages": "Formaterte meldinger", + "allDevices": "Alle enheter", + "learnMore": "Lær mer", + "sorryThatsNotPossible": "Beklager... det er ikke mulig", + "markAsUnread": "Marker som ulest", + "addLink": "Legg til lenke", + "synchronizingPleaseWaitCounter": " Synkroniserer… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "unverified": "Ikke verifisert", + "thisDevice": "Denne enheten:", + "sendingAttachment": "Sender vedlegg...", + "removeYourAvatar": "Fjern din avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Importer fra .zip-fil", + "select": "Velg", + "databaseMigrationTitle": "Databasen er optimalisert", + "newPassword": "Nytt passord", + "files": "Filer", + "searchIn": "Søk i chatten «{chat}»...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "approve": "Godkjenn", + "goToSpace": "Gå til område: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "userLevel": "{level} - Bruker", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "En av dine enheter er ikke verifisert", + "website": "Nettside", + "boldText": "Fet skrift", + "pleaseFillOut": "Vennligst fyll ut", + "importEmojis": "Importer emojier", + "supposedMxid": "Denne bør være {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Oppgrader dette rommet til den gitte romversjonen", + "passwordRecoverySettings": "Innstillinger for gjenoppretting av passord", + "pleaseChooseAPasscode": "Vennligst velg en passordkode", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Oppgi din PIN-kode", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Global chat-ID", + "chatPermissions": "Chat tillatelser", + "commandHint_invite": "Inviter den gitte brukeren til dette rommet", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Bli med i det gitte rommet", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "chats": "Chatter", + "@chats": { + "type": "String", + "placeholders": {} + }, + "discover": "Oppdag", + "thereAreCountUsersBlocked": "Akkurat nå er det {count} blokkerte brukere.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "sendCanceled": "Sending avbrutt", + "loginWithMatrixId": "Logg på med Matrix ID", + "shareInviteLink": "Del invitasjonslenke", + "scanQrCode": "Skann QR-kode", + "messagesStyle": "Meldinger:", + "hydrate": "Gjenopprett fra sikkerhetskopifil", + "oneClientLoggedOut": "En av klientene dine har blitt logget ut", + "addAccount": "Legg til konto", + "openInMaps": "Åpne i kart", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Lenke", + "or": "Eller", + "@or": { + "type": "String", + "placeholders": {} + }, + "custom": "Egendefinert", + "user": "Bruker", + "users": "Brukere", + "countInvited": "{count} inviterte", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "Opprett gruppe", + "editRoomAliases": "Rediger rom aliaser", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "accessAndVisibility": "Tilgang og synlighet", + "hideInvalidOrUnknownMessageFormats": "Skjul ugyldige eller ukjente meldingsformater", + "block": "Blokkér", + "blockedUsers": "Blokkerte brukere", + "tryAgain": "Prøv igjen", + "invalidServerName": "Ugyldig servernavn", + "messageInfo": "Meldingsinformasjon", + "time": "Tid", + "sender": "Avsender", + "reportUser": "Rapporter bruker", + "youHaveWithdrawnTheInvitationFor": "Du har trukket tilbake invitasjonen for {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Du har akseptert invitasjonen", + "youBannedUser": "Du stengte ute {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "chatDescriptionHasBeenChanged": "Chatbeskrivelsen er endret", + "screenSharingTitle": "skjermdeling", + "screenSharingDetail": "Du deler skjermen din i FuffyChat", + "whyIsThisMessageEncrypted": "Hvorfor er denne meldingen uleselig?", + "yourGlobalUserIdIs": "Din globale bruker-ID er: ", + "searchChatsRooms": "Søk etter #chatter, @brukere...", + "groupName": "Gruppenavn", + "createGroupAndInviteUsers": "Opprett en gruppe og inviter brukere", + "invite": "Inviter", + "wrongPinEntered": "Feil PIN-kode oppgitt! Prøv igjen om {seconds} sekunder...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendAsText": "Send som tekst", + "@sendAsText": { + "type": "String" + }, + "sendImages": "Send {count} bilde", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "voiceCall": "Taleanrop", + "accessAndVisibilityDescription": "Hvem som har lov til å bli med i denne chatten og hvordan chatten kan oppdages.", + "calls": "Anrop", + "customEmojisAndStickers": "Egendefinerte emojier og klistremerker", + "oopsPushError": "Oops! Dessverre oppsto det en feil under oppsettet av push-varsler.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Henter sted …", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "noDatabaseEncryption": "Databasekryptering støttes ikke på denne plattformen", + "changeGeneralChatSettings": "Endre generelle chatinnstillinger", + "changeTheChatPermissions": "Endre chattillatelsene", + "youInvitedBy": "📩 Du har blitt invitert av {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Du inviterte {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 You sparket ut {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Du sparket og stengte ute {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "countFiles": "{count} filer", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noOtherDevicesFound": "Ingen andre enheter funnet", + "fileIsTooBigForServer": "Kan ikke sende! Serveren støtter bare vedlegg opptil {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Filen er lagret på {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Hopp til sist leste melding", + "blur": "Uskarphet:", + "opacity": "Ugjennomsiktighet:", + "noContactInformationProvided": "Serveren oppgir ingen gyldig kontaktinformasjon", + "supportPage": "Supportside", + "compress": "Komprimer", + "italicText": "Kursiv tekst", + "strikeThrough": "Gjennomstreking", + "youUnbannedUser": "Du opphevet utestengelsen av {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "Av sikkerhetshensyn kan du ikke deaktivere kryptering i en chat der det har vært aktivert tidligere.", + "readUpToHere": "Lest frem til her", + "jump": "Hopp", + "reportErrorDescription": "😭 Å nei. Noe gikk galt. Hvis du ønsker det, kan du rapportere denne feilen til utviklerne.", + "invalidInput": "Ugyldig inndata!", + "pleaseEnterANumber": "Vennligst skriv inn et tall større enn 0", + "archiveRoomDescription": "Chatten vil bli flyttet til arkivet. Andre brukere vil kunne se at du har forlatt chatten.", + "removeDevicesDescription": "Du vil bli logget ut av denne enheten og vil ikke lenger kunne motta meldinger.", + "setColorTheme": "Angi fargetema:", + "inviteGroupChat": "📨 Invitasjon til gruppechat", + "pleaseChooseAStrongPassword": "Vennligst velg et sterkt passord", + "publicChatAddresses": "Offentlige chatadresser", + "createNewAddress": "Opprett ny adresse", + "initAppError": "Det oppsto en feil under oppstart av appen", + "sendReadReceipts": "Send lesebekreftelser", + "searchMore": "Søk mer...", + "shareKeysWithDescription": "Hvilke enheter bør man stole på, slik at de kan lese meldingene dine i krypterte chatter?", + "crossVerifiedDevicesIfEnabled": "Kryssbekreftede enheter hvis dette er aktivert", + "crossVerifiedDevices": "Kryssverifiserte enheter", + "verifiedDevicesOnly": "Bare verifiserte enheter", + "recordAVideo": "Ta opp en video", + "optionalMessage": "(Valgfritt) melding...", + "notSupportedOnThisDevice": "Ikke støttet på denne enheten", + "enterNewChat": "Bli med i ny chat", + "pleaseWaitUntilInvited": "Vennligst vent nå, til noen fra rommet inviterer deg.", + "notificationRuleSuppressNoticesDescription": "Demper varsler fra automatiserte klienter som roboter.", + "notificationRuleInviteForMe": "Inviter for meg", + "notificationRuleInviteForMeDescription": "Varsler bruker når en blir invitert til et rom.", + "newChatRequest": "📩 Ny chatforespørsel", + "appWantsToUseForLogin": "Bruk '{server}' for å logge inn", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Du gir herved tillatelse til at appen og nettstedet deler informasjon om deg.", + "exportEmotePack": "Eksporter smilefjes som .zip-fil", + "noUsersFoundWithQuery": "Dessverre ble ingen bruker funnet med \"{query}\". Sjekk om du har skrevet feil.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "Chatten kan oppdages via søket på {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "La stå tomt for å slette statusen din.", + "searchForUsers": "Søk etter @brukere...", + "pleaseEnterYourCurrentPassword": "Skriv inn ditt nåværende passord", + "databaseMigrationBody": "Vent litt. Dette kan ta et øyeblikk.", + "wrongRecoveryKey": "Beklager ... dette ser ikke ut til å være riktig gjenopprettingsnøkkel.", + "declineInvitation": "Avslå invitasjon", + "restoreSessionBody": "Appen prøver nå å gjenopprette økten din fra sikkerhetskopien. Rapporter denne feilen til utviklerne på {url}. Feilmeldingen er: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "noMessagesYet": "Ingen meldinger enda", + "notificationRuleMasterDescription": "Overstyrer alle andre regler og deaktiverer alle varsler.", + "notificationRuleSuppressNotices": "Undertrykk automatiserte meldinger", + "startedKeyVerification": "{sender} startet nøkkelverifisering", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Stickers", + "commandHint_ignore": "Ignorer den oppgitte matrix IDen", + "commandHint_unignore": "Opphev ignorering av den gitte matrix IDen", + "unreadChatsInApp": "{appname}: {unread} uleste chatter", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "changeTheVisibilityOfChatHistory": "Endre synligheten til chatloggen", + "changeTheCanonicalRoomAlias": "Endre hovedadressen til den offentlige chatten", + "sendRoomNotifications": "Send en @room varsling", + "formattedMessagesDescription": "Vis rikt meldingsinnhold som fet skrift ved hjelp av markdown.", + "verifyOtherUser": "🔐 Verifiser annen bruker", + "verifyOtherDevice": "🔐 Verifiser annen enhet", + "sendTypingNotificationsDescription": "Andre deltakere i en chat kan se når du skriver en ny melding.", + "sendReadReceiptsDescription": "Andre deltakere i en chat kan se når du har lest en melding.", + "commandHint_logout": "Logg av din nåværende enhet", + "commandHint_logoutall": "Logg ut alle aktive enheter", + "resume": "Gjenoppta", + "unknownPushRule": "Ukjent push-regel '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} – Talemelding fra {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Hvis du sletter denne varslingsinnstillingen, kan du ikke angre dette.", + "shareKeysWith": "Del nøkler med...", + "canceledKeyVerification": "{sender} avbrøt nøkkelverifisering", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} fullførte nøkkelverifisering", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} er klar for nøkkelverifisering", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} har bedt om nøkkelverifisering", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "notificationRuleEncryptedRoomOneToOne": "Kryptert rom én-til-én", + "notificationRuleEncryptedRoomOneToOneDescription": "Varsler brukeren om meldinger i krypterte en-til-en-rom.", + "notificationRuleRoomOneToOne": "Rom én-til-én", + "customEmojisAndStickersBody": "Legg til eller del tilpassede emojier eller klistremerker som kan brukes i hvilken som helst chat.", + "errorObtainingLocation": "Feil ved henting av posisjon: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "chatDescription": "Chat beskrivelse", + "hideRedactedMessages": "Skjul redigerte meldinger", + "hideRedactedMessagesBody": "Hvis noen redigerer en melding, vil ikke denne meldingen lenger være synlig i chatten.", + "blockListDescription": "Du kan blokkere brukere som forstyrrer deg. Du vil ikke kunne motta meldinger eller rominvitasjoner fra brukerne på din personlige blokkeringsliste.", + "blockUsername": "Ignorer brukernavn", + "noChatDescriptionYet": "Ingen chatbeskrivelse er opprettet ennå.", + "redactMessageDescription": "Meldingen vil bli redigert for alle deltakerne i denne samtalen. Dette kan ikke angres.", + "optionalRedactReason": "(Valgfritt) Årsak til redigering av denne meldingen...", + "locationDisabledNotice": "Lokasjonstjenester er deaktivert. Vennligst aktiver dem for at du skal kunne dele posisjonen din.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Lokasjonstillatelse nektet. Gi dem tillatelse til å dele din lokasjon.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Eksporter økten og slett enheten", + "dehydrateWarning": "Denne handlingen kan ikke angres. Sørg for at du lagrer sikkerhetskopifilen på en trygg måte.", + "noEncryptionForPublicRooms": "Du kan bare aktivere kryptering på rom som ikke er offentlig tilgjengelig.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} er ingen matrix-server, bruk {server2} i stedet?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "roomNotificationSettings": "Innstillinger for romvarsler", + "userSpecificNotificationSettings": "Brukerspesifikke varslingsinnstillinger", + "otherNotificationSettings": "Andre varslingsinnstillinger", + "contentNotificationSettings": "Innstillinger for innholdsvarslinger", + "generalNotificationSettings": "Generelle varslingsinnstillinger", + "notificationRuleContainsUserNameDescription": "Varsler bruker når en melding inneholder ens brukernavn.", + "removeFromSpace": "Fjern fra området", + "reactedWith": "{sender} reagerte med {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Fest til rommet", + "emojis": "Emojier", + "placeCall": "Ringe opp", + "unsupportedAndroidVersionLong": "Denne funksjonen krever en nyere Android-versjon. Se etter oppdateringer eller støtte for Lineage OS.", + "videoCallsBetaWarning": "Vær oppmerksom på at videosamtaler for øyeblikket er i betaversjon. Det fungerer kanskje ikke som forventet eller i det hele tatt.", + "experimentalVideoCalls": "Eksperimentelle videoanrop", + "notificationRuleRoomnotifDescription": "Varsler brukeren når en melding inneholder ‘@room’.", + "notificationRuleTombstoneDescription": "Varsler brukeren om meldinger om deaktivering av rom.", + "notificationRuleReactionDescription": "Demper varsler for reaksjoner.", + "notificationRuleSuppressEdits": "Demp redigeringer", + "clearArchive": "Tøm arkivet", + "commandHint_markasgroup": "Merk som gruppe", + "commandHint_ban": "Utesteng den gitte brukeren fra dette rommet", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Tøm cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "doesNotSeemToBeAValidHomeserver": "Ser ikke ut til å være en kompatibel hjemmeserver. Feil URL?", + "notificationRuleIsUserMentionDescription": "Varsler brukeren når de er direkte nevnt i en melding.", + "notificationRuleContainsDisplayName": "Inneholder visningsnavn", + "notificationRuleContainsDisplayNameDescription": "Varsler brukeren når en melding inneholder ens visningsnavnet.", + "notificationRuleIsUserMention": "Brukeromtale", + "notificationRuleIsRoomMention": "Romomtale", + "commandHint_me": "Beskriv deg selv", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Angi bilde for dette rommet (med mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Angi visningsnavnet ditt for dette rommet", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_plain": "Send uformatert tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Send svar som en reaksjon", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Send tekst", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Opphev utestengelsen til den gitte brukeren fra dette rommet", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Ugyldig kommando", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} er ikke en kommando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "checkList": "Sjekkliste", + "createNewSpace": "Nytt område", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Nylig brukte emotes vil vises her ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "unableToJoinChat": "Kan ikke bli med i chatten. Kanskje den andre parten allerede har lukket samtalen.", + "otherPartyNotLoggedIn": "Den andre parten er ikke logget inn og kan derfor ikke motta meldinger!", + "notificationRuleIsRoomMentionDescription": "Varsler brukeren når det er en romomtale.", + "notificationRuleRoomnotif": "Romvarsel", + "notificationRuleCall": "Anrop", + "notificationRuleCallDescription": "Varsler brukeren om anrop.", + "waitingPartnerAcceptRequest": "Venter på at partneren skal godta forespørselen…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Venter på at partneren skal godta emojien…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "noOneCanJoin": "Ingen kan bli med", + "commandHint_html": "Send HTML-formatert tekst", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_kick": "Fjern den gitte brukeren fra dette rommet", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Forlat dette rommet", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_discardsession": "Forkast økten", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Start en direkte chat\nBruk --no-encryption for å deaktivere kryptering", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Opprett en tom gruppechat\nBruk --no-encryption for å deaktivere kryptering", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "redactedBy": "Redigert av {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Direkte chat", + "redactedByBecause": "Redigert av {username} fordi: «{reason}»", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessage": "Rediger melding", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Rom versjon", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "newSpace": "Nytt område", + "wasDirectChatDisplayName": "Tom chat (var {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "removeFromSpaceDescription": "Chatten blir fjernet fra området, men vises fortsatt i chatlisten din.", + "countChats": "{chats} chats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "banUserDescription": "Brukeren vil bli utestengt fra chatten og vil ikke kunne delta i chatten igjen før utestengelsen er opphevet.", + "unbanUserDescription": "Brukeren vil kunne gå inn i chatten igjen hvis vedkommende prøver.", + "kickUserDescription": "Brukeren blir kastet ut av chatten, men ikke utestengt. I offentlige chatter kan brukeren bli med på nytt når som helst.", + "sendTypingNotifications": "Send varsler ved skriving", + "swipeRightToLeftToReply": "Sveip fra høyre mot venstre for å svare", + "storeInAndroidKeystore": "Lagre i Android KeyStore", + "storeInAppleKeyChain": "Lagre i Apple nøkkelring", + "storeSecurlyOnThisDevice": "Lagre sikkert på denne enheten", + "acceptedKeyVerification": "{sender} godtok nøkkelverifisering", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "notificationRuleMessageDescription": "Varsler brukeren om generelle meldinger.", + "notificationRuleSuppressEditsDescription": "Demper varsler for redigerte meldinger.", + "notificationRuleEncryptedDescription": "Varsler brukeren om meldinger i krypterte rom.", + "notificationRuleRoomServerAcl": "Romserverens tilgangskontrolliste", + "notificationRuleRoomOneToOneDescription": "Varsler brukeren om meldinger i én-til-én-rom.", + "notificationRuleJitsiDescription": "Varsler brukeren om hendelser i Jitsi-widgeten.", + "customReaction": "Egendefinert reaksjon", + "pause": "Pause", + "foregroundServiceRunning": "Denne varslingen vises når forgrunnstjenesten kjører.", + "longPressToRecordVoiceMessage": "Langt trykk for å spille inn talemelding.", + "startPoll": "Start avstemning", + "endPoll": "Avslutt avstemning", + "answersVisible": "Svar synlige", + "addAnswerOption": "Legg til svaralternativ", + "answerOption": "Svaralternativ", + "allowMultipleAnswers": "Tillat flere svar", + "pollHasBeenEnded": "Avstemningen er avsluttet", + "roomUpgradeDescription": "Chatten vil deretter bli gjenskapt med den nye romversjonen. Alle deltakere vil bli varslet om at de må bytte til den nye chatten. Du kan finne ut mer om romversjoner på https://spec.matrix.org/latest/rooms/", + "groupCanBeFoundViaSearch": "Gruppen kan finnes via søk", + "commandHint_sendraw": "Send raw json", + "replyInThread": "Svar i tråden", + "sessionLostBody": "Sesjonen din er tapt. Vennligst rapporter denne feilen til utviklerne på {url}. Feilmeldingen er: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "noticeChatBackupDeviceVerification": "Merk: Når du kobler alle enhetene dine til chat-sikkerhetskopien, blir de automatisk bekreftet.", + "notificationRuleTombstone": "Gravstein", + "answersWillBeVisibleWhenPollHasEnded": "Svarene vil være synlige når avstemningen er avsluttet", + "thread": "Tråd", + "backToMainChat": "Tilbake til hovedchatten", + "saveChanges": "Lagre endringer", + "skipChatBackup": "Hopp over sikkerhetskopiering av chat", + "commandHint_googly": "Send noen googly-eyes", + "commandHint_cuddle": "Send en kos", + "googlyEyesContent": "{senderName} sender deg googly-eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "noChatsFoundHere": "Ingen chatter her. Bruk knappen under for å starte en ny samtale. ⤵️", + "changedTheChatDescription": "{username} endret beskrivelsen av chatten", + "changedTheChatName": "{username} endret navnet på chatten", + "commandHint_markasdm": "Marker som rom for direktemeldinger for den angitte Matrix-IDen", + "setAsCanonicalAlias": "Angi som hovedalias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Området er offentlig", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Navn på område", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "useAsEmoji": "Bruk som emoji", + "stickerPackNameAlreadyExists": "Klistremerkepakken finnes allerede", + "newStickerPack": "Ny klistremerkepakke", + "stickerPackName": "Navn på klistremerkepakke", + "addToBundle": "Legg til i pakke", + "removeFromBundle": "Fjern fra denne pakken", + "bundleName": "Navn på pakke", + "noBackupWarning": "Advarsel! Hvis du ikke aktiverer sikkerhetskopiering av chatten, vil du miste tilgangen til dine krypterte meldinger. Det anbefales sterkt å aktivere sikkerhetskopiering før du logger ut.", + "commandHint_op": "Angi makt-nivå for valgt bruker (standard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "editBundlesForAccount": "Rediger pakker for denne kontoen", + "makeAdminDescription": "Når du gjør denne brukeren til administrator, kan du kanskje ikke omgjøre det senere. Brukeren vil da få de samme rettighetene som deg.", + "joinSpace": "Bli med i området", + "publicSpaces": "Offentlige områder", + "verifyOtherUserDescription": "Hvis du verifiserer en annen bruker, kan du være trygg på at du vet hvem du faktisk skriver med. 💪\n\nNår du starter en verifisering, vil både du og den andre brukeren se et popup-vindu i appen. Der vil dere se en serie emojier eller tall som dere må sammenligne med hverandre.\n\nDen beste måten å gjøre dette på er å møtes ansikt til ansikt eller starte en videosamtale. 👭", + "verifyOtherDeviceDescription": "Når du verifiserer en annen enhet, kan disse enhetene utveksle nøkler, noe som øker den generelle sikkerheten din. 💪 Når du starter en verifisering, vil det dukke opp et popup-vindu i appen på begge enhetene. Der vil du se en serie emojier eller tall som du må sammenligne med hverandre. Det er best å ha begge enhetene forhånden før du starter verifiseringen. 🤳", + "clientWellKnownInformation": "Velkjent informasjon om klienten:", + "baseUrl": "Base URL", + "identityServer": "Identitetsserver:", + "versionWithNumber": "Versjon: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logger", + "advancedConfigs": "Avanserte innstillinger", + "advancedConfigurations": "Avanserte innstillinger", + "createSticker": "Lag sticker eller emoji", + "useAsSticker": "Bruk som sticker", + "pollQuestion": "Spørsmål til avstemning", + "hasKnocked": "🚪{user} har banket på", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Brukere må banke på", + "knock": "Bank på", + "notificationRuleRoomServerAclDescription": "Skjuler varsler for tilgangskontrollister (ACL) for romservere.", + "displayNavigationRail": "Vis navigasjonsfelt på mobil", + "attribution": "Kreditering", + "skipChatBackupWarning": "Er du sikker? Uten sikkerhetskopi av chattene kan du miste meldingene dine hvis du bytter enhet.", + "noMoreResultsFound": "Ingen flere treff", + "federationBaseUrl": "Federation Base URL", + "notificationRuleServerAclDescription": "Skjuler varslinger for Server ACL-hendelser.", + "notificationRuleServerAcl": "Skjul Server ACL-hendelser", + "notificationRuleMemberEventDescription": "Skjuler varslinger for medlemsskapshendelser.", + "youHaveKnocked": "Du har banket på", + "moreEvents": "Flere hendelser", + "contactServerSecurity": "Kontakt sikkerhetsansvarlig for serveren", + "notificationRuleMemberEvent": "Medlemshendelse", + "spaceMemberOfCanKnock": "Et medlem av området {spaces} kan banke på", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "countVotes": "{count, plural, =1{En stemme} other{{count} stemmer}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countReplies": "{count, plural, =1{Et svar} other{{count} svar}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chatSearchedUntil": "Søkte i chatten frem til {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "spaceMemberOf": "Områdemedlem av {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Er du sikker på at du vil løsne hendelsen permanent?", + "newSpaceDescription": "Områder lar deg samle chattene dine og bygge private eller offentlige fellesskap.", + "chatPermissionsDescription": "Definer hvilket tilgangsnivå som kreves for bestemte handlinger i denne chatten. Nivåene 0, 50 og 100 representerer vanligvis brukere, moderatorer og administratorer, men alle mellomtrinn er mulige.", + "knocking": "Banker på", + "noKeyForThisMessage": "Dette kan skje hvis meldingen ble sendt før du logget inn på kontoen din på denne enheten.\n\nDet er også mulig at senderen har blokkert enheten din, eller at noe gikk galt med internettforbindelsen.\n\nEr du i stand til å lese meldingen i en annen sesjon? Da kan du overføre meldingen fra den! Gå til Innstillinger > Enheter og sørg for at enhetene dine har verifisert hverandre. Neste gang du åpner rommet og begge sesjonene er i forgrunnen, vil nøklene bli overført automatisk.\n\nVil du unngå å miste nøklene når du logger ut eller bytter enhet? Sørg for at du har aktivert sikkerhetskopiering av chat i innstillingene.", + "report": "rapportere", + "addChatOrSubSpace": "Legg til chat eller underområde", + "signIn": "Logg på", + "createNewAccount": "Opprett ny konto", + "signUpGreeting": "FluffyChat er desentralisert! Velg en server der du vil opprette kontoen din, så kjører vi på!", + "signInGreeting": "Har du allerede en Matrix-konto? Velkommen tilbake! Velg hjemmeserveren din og logg inn.", + "theProcessWasCanceled": "Prosessen ble avbrutt.", + "join": "Bli med", + "searchOrEnterHomeserverAddress": "Søk eller angi adresse til hjemmeserver", + "matrixId": "Matrix ID", + "setPowerLevel": "Angi styrkenivå", + "makeModerator": "Gjør til moderator", + "makeAdmin": "Gjør til admin", + "removeModeratorRights": "Fjern moderator-rettigheter", + "removeAdminRights": "Fjern admin-rettigheter", + "powerLevel": "Styrkenivå", + "setPowerLevelDescription": "Styrkenivåer definerer hva et medlem har lov til å gjøre i dette rommet, og varierer vanligvis mellom 0 og 100.", + "owner": "Eier", + "mute": "Demp", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Opprett ny chat", + "reset": "Nullstill", + "supportFluffyChat": "Støtt FluffyChat", + "support": "Støtte", + "setLowPriority": "Sett lav prioritet", + "unsetLowPriority": "Fjern lav prioritet", + "playSoundOnNotification": "Spill av lyd ved varsling", + "addTag": "Legg til emneknagg", + "removeTag": "Fjern emneknagg", + "tagName": "Navn på emneknagg", + "createNewTag": "Opprett ny emneknagg" +} \ No newline at end of file diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb new file mode 100644 index 0000000000..52995d9590 --- /dev/null +++ b/lib/l10n/intl_nl.arb @@ -0,0 +1,2726 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.955292", + "about": "Over ons", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accepteren", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} heeft de uitnodiging geaccepteerd", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} heeft eind-tot-eindversleuteling geactiveerd", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Email toevoegen", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Aan space toevoegen", + "admin": "Beheerder", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alle", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} heeft de oproep beantwoord", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Iedereen kan toetreden", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App-vergrendeling", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Archief", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Mogen gasten deelnemen?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Weet je het zeker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Weet je zeker dat je wilt uitloggen?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Voer je beveiligde opslag wachtwoordzin of herstelsleutel in om de andere persoon te kunnen ondertekenen.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accepteer je dit verificatieverzoek van {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automatisch geanimeerde stickers en emoticons afspelen", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "De homeserver ondersteunt de login types:\n{serverVersions}\nMaar deze app ondersteunt alleen:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Van chat verbannen", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Verbannen", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} verbant {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Apparaat blokkeren", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Geblokkeerd", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Annuleren", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan de URI {uri} niet openen", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Apparaatnaam wijzigen", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} heeft de chatavatar gewijzigd", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} heeft de chatrechten gewijzigd", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username}'s naam is nu '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} heeft de toegangsregels voor gasten gewijzigd", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} heeft de gastenregels gewijzigd in: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} heeft de zichtbaarheid van de geschiedenis gewijzigd", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} heeft de zichtbaarheid van de geschiedenis gewijzigd in: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} heeft de toetredingsregels gewijzigd", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} heeft de toetredingsregels gewijzigd in: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username}'s avatar is gewijzigd", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} heeft de chat aliassen gewijzigd", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} heeft de uitnodigingslink gewijzigd", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Wachtwoord wijzigen", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Homeserver wijzigen", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Je stijl veranderen", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Groepsnaam wijzigen", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Jouw avatar veranderen", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "De versleuteling is beschadigd", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Chatback-up", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatdetails", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Kies een sterk wachtwoord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Archief wissen", + "close": "Sluiten", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Persoon uit deze chat verbannen", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Tekst met HTML-opmaak versturen", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Persoon in deze chat uitnodigen", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Toetreden tot de vermelde chat", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Persoon uit deze chat verwijderen", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Deze chat verlaten", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Beschrijf jezelf", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Jouw avatar voor deze chat instellen (met mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Jouw naam voor deze chat instellen", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Rechtenniveau van de persoon instellen (standaard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Niet-opgemaakte tekst versturen", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Antwoord als reactie versturen", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Tekst versturen", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Persoon weer in deze chat toestaan", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Opdracht ongeldig", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is geen opdracht.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Vergelijk de emoji's", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vergelijk de cijfers", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Chat configureren", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Contact is voor de groep uitgenodigd", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "De inhoud is gerapporteerd aan de serverbeheerders", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Gekopieerd naar klembord", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Bericht kopiëren", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopieer naar klembord", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kan het bericht niet ontsleutelen: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} personen", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Aanmaken", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} heeft de chat gemaakt", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Maak nieuwe space aan", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Momenteel actief", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Donker", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Hierdoor wordt je account gedeactiveerd. Dit kan niet ongedaan gemaakt worden! Weet je het zeker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standaard rechten-niveau voor nieuwe personen", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Verwijderen", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Account verwijderen", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Bericht verwijderen", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Apparaten", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Directe chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "De naam is gewijzigd", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Bestand downloaden", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Wijzig", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Geblokkeerde servers wijzigen", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Naam wijzigen", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Chat aliassen wijzigen", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Chat avatar wijzigen", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoticon bestaat al!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ongeldige emoticon korte code!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emoticon-instellingen", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Emoticon korte code", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Lege chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Emoticonpakket overal inschakelen", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Versleuteling inschakelen", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Je kunt de versleuteling hierna niet meer uitschakelen. Weet je het zeker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Versleuteld", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Versleuteling", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Versleuteling is niet ingeschakeld", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} heeft het gesprek beëindigd", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Voer een emailadres in", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Locatie ophalen fout: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Lettergrootte", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Stuur door", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Vanaf toetreden", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Vanaf uitnodiging", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Groep", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Groep is publiek", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groepen", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Groep met {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gasten zijn verboden", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gasten kunnen deelnemen", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} heeft de uitnodiging voor {targetName} ingetrokken", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Help", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Onbekende gebeurtenissen verbergen", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Negeer", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Genegeerde personen", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ik heb op de link geklikt", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Onjuiste wachtwoordzin of herstelsleutel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Contact uitnodigen", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Contact voor {groupName} uitnodigen", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Uitgenodigd", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} heeft {targetName} uitgenodigd", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Alleen uitgenodigde personen", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} heeft je uitgenodigd voor FluffyChat.\n1. Bezoek https://fluffychat.im en installeer de app\n2. Registreer of log in\n3. Open deze uitnodigingslink:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "is aan het typen…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} is toegetreden tot de chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Toetreden tot de chat", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} heeft {targetName} verwijderd", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} heeft {targetName} verwijderd en verbannen", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Uit chat verwijderen", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Laatst actief: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Chat verlaten", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Verliet de chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Licht", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Laad nog {count} personen", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Bezig met laden… Even geduld.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Meer laden…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Locatievoorzieningen is uitgeschakeld. Zet dit eerst aan om je locatie te delen.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Locatie toegang is geweigerd. Geef toegang om de locatie delen-functie te gebruiken.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Inloggen", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Inloggen bij {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Uitloggen", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Vermeld", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Berichten", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Chat dempen", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nieuwe chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nieuw bericht in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nieuw verificatieverzoek!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Volgende", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nee", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Geen verbinding met de server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Geen emoticons gevonden. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Je kunt de versleuteling pas activeren zodra de chat niet meer publiek toegankelijk is.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging lijkt niet beschikbaar op je apparaat. Om pushmeldingen te krijgen, adviseren we om ntfy te installeren. Met ntfy of een andere Unified Push-provider kun je pushmeldingen ontvangen op een veilige manier. Je kunt ntfy downloaden in de PlayStore of F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} is geen Matrix-server, wil je {server2} gebruiken?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Je hebt nog geen manier toegevoegd om je wachtwoord te herstellen.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Geen toestemming", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Geen chats gevonden …", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Meldingen", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} personen typen…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Locatie ophalen…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online sleutelback-up is ingeschakeld", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oeps! Helaas is er een fout opgetreden bij het instellen van de pushmeldingen.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oeps, er ging iets mis…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Open app om de berichten te lezen", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Camera openen", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "In kaarten openen", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Of", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Personen", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "wachtwoordzin of herstelsleutel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Wachtwoord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Wachtwoord vergeten", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Wachtwoord gewijzigd", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Wachtwoordherstel", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Kies een toegangscode", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klik op de link in de email en ga dan verder.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Voer jouw wachtwoord in", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Voer je pincode in", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Voer je inlognaam in", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Volg de instructies op de website en tik op volgende.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publieke chats", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Reden", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} heeft een event verwijderd", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Aangepast bericht", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Afwijzen", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} heeft de uitnodiging afgewezen", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Verwijder", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Verwijder alle andere apparaten", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Verbanning opheffen", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Jouw avatar verwijderen", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Kamerversie upgraden", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Antwoord", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Bericht rapporteren", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Chat is geüpgrade", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Kamerversie", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Bestand opslaan", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Zoeken", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Beveiliging", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Verstuur", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Stuur een bericht", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Als tekst versturen", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Audio versturen", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Bestand versturen", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Afbeelding versturen", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Berichten versturen", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Video versturen", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} heeft een bestand verzonden", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} heeft een audio verzonden", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} heeft een afbeelding verzonden", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} heeft een sticker verzonden", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} heeft een video verzonden", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} heeft oproepgegevens verzonden", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Als hoofdalias instellen", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Status instellen", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Instellingen", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Delen", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} heeft deze locatie gedeeld", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Locatie delen", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Overslaan", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Broncode", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space is publiek", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Spacenaam", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} heeft een gesprek gestart", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hoe gaat het met jouw vandaag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Indienen", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchroniseren... Even geduld.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Systeem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ze komen niet overeen", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Ze komen overeen", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Te veel verzoeken. Probeer het later nog eens!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Probeer nogmaals te verzenden", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} heeft verbanning {targetName} ongedaan gemaakt", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Deblokkeer apparaat", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Onbekend apparaat", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Onbekend versleutelingsalgoritme", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Onbekend evenement '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Dempen uitschakelen", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Pin losmaken", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} en {count} anderen zijn aan het typen …", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} en {username2} zijn aan het typen …", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} is aan het typen …", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} is vertrokken uit de chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} heeft een {type} -gebeurtenis gestuurd", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Geverifieerd", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Verificatie starten", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Je bent succesvol geverifieerd!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Ander account verifiëren", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videogesprek", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Chatgeschiedenis zichtbaarheid", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Zichtbaar voor alle personen", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Zichtbaar voor iedereen", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Spraakbericht versturen", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Wachten tot partner het verzoek accepteert …", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Wachten tot je partner de emoji accepteert…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Wachten tot partner de nummers accepteert …", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Waarschuwing!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "We hebben je een email gestuurd", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Wie kan welke actie uitvoeren", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Wie mag deelnemen aan deze groep", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Waarom wil je dit rapporteren?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Met deze adressen kun je je wachtwoord herstellen.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Schrijf een bericht…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Jij", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Je neemt niet langer deel aan deze chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Je bent verbannen uit deze chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Je publieke sleutel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR-code scannen", + "sendOnEnter": "Verstuur met enter", + "oneClientLoggedOut": "Één van jouw apparaten is uitgelogd", + "bundleName": "Bundelnaam", + "removeFromBundle": "Van bundel verwijderen", + "addToBundle": "Aan bundel toevoegen", + "editBundlesForAccount": "Bundels voor dit account wijzigen", + "addAccount": "Account toevoegen", + "link": "Link", + "unverified": "Niet geverifieerd", + "repeatPassword": "Wachtwoord herhalen", + "messageInfo": "Berichtinfo", + "time": "Tijd", + "sender": "Afzender", + "openGallery": "Galerij openen", + "removeFromSpace": "Uit de space verwijderen", + "commandHint_clearcache": "Cache wissen", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Maak een lege groepschat\nGebruik --no-encryption om de versleuteling uit te schakelen", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Start een directe chat\nGebruik --no-encryption om de versleuteling uit te schakelen", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_discardsession": "Sessie weggooien", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "markAsRead": "Markeer als gelezen", + "reportUser": "Persoon rapporteren", + "reactedWith": "{sender} reageerde met {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Maak vast aan chat", + "emojis": "Emoji's", + "placeCall": "Bellen", + "unsupportedAndroidVersion": "Niet-ondersteunde Android-versie", + "unsupportedAndroidVersionLong": "Voor deze functie is een nieuwe Android-versie verplicht. Controleer je updates of Lineage OS-ondersteuning.", + "videoCallsBetaWarning": "Houd er rekening mee dat videogesprekken momenteel in bèta zijn. Ze werken misschien niet zoals je verwacht of werken niet op alle platformen.", + "voiceCall": "Spraakgesprek", + "confirmEventUnpin": "Weet je zeker dat je de gebeurtenis definitief wilt losmaken?", + "experimentalVideoCalls": "Videogesprekken (experimenteel)", + "youAcceptedTheInvitation": "👍 Je hebt de uitnodiging geaccepteerd", + "youRejectedTheInvitation": "Je hebt de uitnodiging afgewezen", + "youJoinedTheChat": "Je bent toegetreden tot de chat", + "youBannedUser": "Je hebt {user} verbannen", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Je hebt de uitnodiging voor {user} ingetrokken", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Je bent uitgenodigd door {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Je hebt {user} uitgenodigd", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Je hebt {user} weggestuurd", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Je hebt weggestuurd en verbannen {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Je hebt de ban op {user} opgeheven", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Personen", + "storeInAndroidKeystore": "In Android KeyStore opslaan", + "storeInAppleKeyChain": "In Apple KeyChain opslaan", + "storeSecurlyOnThisDevice": "Veilig opslaan op dit apparaat", + "dehydrate": "Sessie exporteren en apparaat wissen", + "dehydrateWarning": "Deze actie kan niet ongedaan worden gemaakt. Zorg ervoor dat je het back-upbestand veilig opslaat.", + "hydrate": "Herstellen vanuit back-upbestand", + "countFiles": "{count} bestanden", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Persoon", + "custom": "Aangepast", + "confirmMatrixId": "Bevestig jouw Matrix-ID om je account te verwijderen.", + "supposedMxid": "Dit moet {mxid} zijn", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Markeer als privé-chat voor de Matrix-ID", + "commandHint_markasgroup": "Markeer als groep", + "whyIsThisMessageEncrypted": "Waarom is dit bericht onleesbaar?", + "noKeyForThisMessage": "Dit kan gebeuren als het bericht is verzonden voordat je bij je account op dit apparaat hebt aangemeld.\n\nHet is ook mogelijk dat de afzender je apparaat heeft geblokkeerd of dat er iets mis is gegaan met de internetverbinding.\n\nKan je het bericht wel lezen in een andere sessie? Dan kan je het bericht daarvandaan overzetten! Ga naar Instellingen > Apparaten en zorg ervoor dat je apparaten elkaar hebben geverifieerd. Wanneer je de chat de volgende keer opent en beide sessies op de voorgrond staan, zullen de sleutels automatisch worden verzonden.\n\nWil je de sleutels niet verliezen als je uitlogt of van apparaat wisselt? Zorg er dan voor dat je de chatback-up hebt aangezet in de instellingen.", + "foregroundServiceRunning": "Deze melding verschijnt wanneer de voorgronddienst draait.", + "screenSharingTitle": "scherm delen", + "screenSharingDetail": "Je deelt je scherm in FuffyChat", + "newSpace": "Space aanmaken", + "doNotShowAgain": "Niet meer tonen", + "googlyEyesContent": "{senderName} stuurt je wiebelogen", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Wiebel-ogen versturen", + "commandHint_cuddle": "Een knuffel versturen", + "commandHint_hug": "Een knuffel versturen", + "cuddleContent": "{senderName} knuffelt je", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} omhelst je", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Lege chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "Om veiligheidsredenen kun je versleuteling niet uitschakelen in een chat, waar deze eerder is ingeschakeld.", + "sorryThatsNotPossible": "Sorry, dat is niet mogelijk", + "reopenChat": "Chat heropenen", + "encryptThisChat": "Versleutel deze chat", + "newSpaceDescription": "Met spaces kun je je chats samenvoegen en privé- of publieke community's bouwen.", + "noOtherDevicesFound": "Geen andere apparaten gevonden", + "noBackupWarning": "Waarschuwing! Zonder de chatback-up in te schakelen, verlies je de toegang tot je versleutelde berichten. Het is sterk aanbevolen om eerst de chatback-up in te schakelen voordat je uitlogt.", + "fileIsTooBigForServer": "Kan niet verzenden! De server ondersteunt alleen bijlages tot {max}.", + "fileHasBeenSavedAt": "Het bestand is opgeslagen op {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Spring naar het laatst gelezen bericht", + "readUpToHere": "Lees tot hier", + "jump": "Spring", + "openLinkInBrowser": "Link in browser openen", + "notAnImage": "Geen afbeeldingsbestand.", + "importNow": "Nu importeren", + "importEmojis": "Emoji's importeren", + "importFromZipFile": "Uit zip-bestand importeren", + "exportEmotePack": "Emote-pakket als zip exporteren", + "replace": "Vervang", + "report": "Rapporteer", + "reportErrorDescription": "😭 Oh nee. Er is iets misgegaan. Probeer het later nog eens. Als je wilt, kun je de bug rapporteren aan de ontwikkelaars.", + "sendTypingNotifications": "Toon 'aan het typen'-meldingen", + "chatPermissions": "Chatrechten", + "chatDescription": "Onderwerp", + "chatDescriptionHasBeenChanged": "Onderwerp gewijzigd", + "noChatDescriptionYet": "Nog geen onderwerp gemaakt.", + "tryAgain": "Opnieuw proberen", + "redactMessageDescription": "Het bericht zal worden aangepast voor alle deelnemers in dit gesprek. Dit kan niet ongedaan gemaakt worden.", + "redactedByBecause": "Aangepast door {username}, reden: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "createGroup": "Groep aanmaken", + "optionalRedactReason": "(Optioneel) Reden voor aanpassing van dit bericht...", + "invalidServerName": "Foute servernaam", + "messagesStyle": "Berichten:", + "shareInviteLink": "Uitnodigingslink delen", + "redactedBy": "Aangepast door {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Directe chat", + "setChatDescription": "Onderwerp instellen", + "setColorTheme": "Kleurthema instellen:", + "invite": "Uitnodigen", + "inviteGroupChat": "📨 Groeps-chat uitnodiging", + "emoteKeyboardNoRecents": "Recent gebruikte emoticons zullen hier verschijnen...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Ongeldige invoer!", + "wrongPinEntered": "Verkeerde pin ingevoerd! Probeer het nog eens over {seconds} seconden...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "De persoon zal worden verbannen van de chat en kan niet meer toetreden totdat de verbanning is opgeheven.", + "removeDevicesDescription": "Je wordt op dit apparaat uitgelogd en zal niet langer in staat zijn om berichten te ontvangen.", + "unbanUserDescription": "De persoon zal weer in staat zijn om de chat te betreden als ze het proberen.", + "pushNotificationsNotAvailable": "Pushmeldingen zijn niet beschikbaar", + "makeAdminDescription": "Wanneer je deze persoon beheerder maakt kun je dit niet ongedaan maken als jullie dezelfde rechten hebben.", + "archiveRoomDescription": "De chat zal naar het archief worden verplaatst. Andere personen zullen in staat zijn te zien dat je de chat hebt verlaten.", + "hasKnocked": "🚪 {user} heeft geklopt", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Lees meer", + "roomUpgradeDescription": "De chat zal dan opnieuw gemaakt worden met de nieuwe kamerversie. Alle deelnemers worden geïnformeerd dat ze moeten overstappen naar de nieuwe chat. Je kan meer lezen over kamerversies op https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Vul een getal in groter dan 0", + "kickUserDescription": "De persoon is verwijderd uit de chat, maar is niet verbannen. In publieke chats kan de persoon op elk moment opnieuw deelnemen.", + "joinSpace": "Toetreden tot de space", + "block": "Blokkeren", + "blockedUsers": "Geblokkeerde personen", + "searchChatsRooms": "Zoek #chats, @personen...", + "swipeRightToLeftToReply": "Veeg van rechts naar links om te reageren", + "calls": "Gesprekken", + "customEmojisAndStickers": "Aangepaste emoji's en stickers", + "accessAndVisibilityDescription": "Wie mag toetreden tot deze chat en hoe de chat ontdekt kan worden.", + "customEmojisAndStickersBody": "Voeg toe of deel aangepaste emoji's en stickers die in elke chat gebruikt kunnen worden.", + "hideRedactedMessages": "Verwijderde berichten verbergen", + "hideRedactedMessagesBody": "Als iemand een bericht verwijdert is dit bericht niet meer zichtbaar in de chat.", + "hideInvalidOrUnknownMessageFormats": "Ongeldige of onbekende berichtformaten verbergen", + "passwordRecoverySettings": "Wachtwoordherstel-instellingen", + "knock": "Klop", + "noOneCanJoin": "Niemand kan deelnemen", + "yourGlobalUserIdIs": "Je Matrix-ID is: ", + "appLockDescription": "Vergendel de app wanneer het niet gebruikt wordt met een pincode", + "globalChatId": "Globale chat ID", + "accessAndVisibility": "Toegang en zichtbaarheid", + "publicSpaces": "Publieke spaces", + "blockUsername": "Negeer inlognaam", + "publicChatAddresses": "Publieke chat adressen", + "createNewAddress": "Creëer nieuw adres", + "noMoreChatsFound": "Geen chats gevonden...", + "knocking": "Kloppen", + "space": "Space", + "unread": "Ongelezen", + "groupName": "Groepsnaam", + "changeGeneralChatSettings": "Algemene chat instellingen wijzigen", + "searchForUsers": "Zoek @personen...", + "searchMore": "Zoek meer...", + "groupCanBeFoundViaSearch": "Groep kan gevonden worden via zoeken", + "searchIn": "Zoek in chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "files": "Bestanden", + "unreadChatsInApp": "{appname}: {unread} ongelezen chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Database versleuteling is niet ondersteund op dit platform", + "thereAreCountUsersBlocked": "Momenteel zijn er {count} personen geblokkeerd.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "markAsUnread": "Als ongelezen markeren", + "userLevel": "{level} - Persoon", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Beheerder", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "stickers": "Stickers", + "nothingFound": "Niets gevonden...", + "gallery": "Galerij", + "incomingMessages": "Inkomende berichten", + "discover": "Ontdek", + "commandHint_ignore": "Negeer de gegeven Matrix-ID", + "noChatsFoundHere": "Hier zijn nog geen chats. Begin een nieuwe chat met iemand door op de onderstaande knop te klikken. ⤵️", + "unableToJoinChat": "Kan niet toetreden tot de chat. Misschien heeft de andere partij het gesprek al afgesloten.", + "aboutHomeserver": "Over {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "boldText": "Vet gedrukte tekst", + "italicText": "Cursieve tekst", + "strikeThrough": "Doorhalen", + "pleaseFillOut": "Vul alsjeblieft in", + "invalidUrl": "Ongeldige url", + "addLink": "Koppeling toevoegen", + "compress": "Comprimeren", + "previous": "Vorige", + "otherPartyNotLoggedIn": "De andere partij is momenteel niet ingelogd en kan daarom geen berichten ontvangen!", + "blockListDescription": "Je kunt personen blokkeren die je lastig vallen. Je kan dan geen berichten meer ontvangen of chat uitnodigingen krijgen van de personen op je blokkeerlijst.", + "sendImages": "Stuur {count} afbeelding(en)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "website": "Website", + "usersMustKnock": "Personen moeten kloppen", + "noUsersFoundWithQuery": "Helaas kan er geen persoon gevonden worden met \"{query}\". Controleer of je een typfout hebt gemaakt.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "createGroupAndInviteUsers": "Maak groep en nodig personen uit", + "chatCanBeDiscoveredViaSearchOnServer": "Chat kan worden gevonden via een zoekopdracht op {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "wrongRecoveryKey": "Helaas... dit lijkt niet de correcte herstelsleutel.", + "synchronizingPleaseWaitCounter": " Synchroniseren… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Database is geoptimaliseerd", + "databaseMigrationBody": "Een ogenblik. Dit kan even duren.", + "commandHint_sendraw": "Stuur kale json", + "passwordIsWrong": "Je ingevoerde wachtwoord is fout", + "newPassword": "Nieuw wachtwoord", + "pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord", + "select": "Selecteer", + "leaveEmptyToClearStatus": "Laat leeg om jouw status te herstellen.", + "addChatOrSubSpace": "Voeg chat of subspace toe", + "pleaseEnterYourCurrentPassword": "Vul je huidige wachtwoord in", + "passwordsDoNotMatch": "Wachtwoorden komen niet overeen", + "thisDevice": "Dit apparaat:", + "contentNotificationSettings": "Contentmelding instellingen", + "roomNotificationSettings": "Kamermelding instellingen", + "userSpecificNotificationSettings": "Persoon specifieke melding instellingen", + "otherNotificationSettings": "Andere melding instellingen", + "notificationRuleContainsUserName": "Bevat naam van persoon", + "notificationRuleContainsUserNameDescription": "Stuur een melding als een bericht je inlognaam vermeld.", + "notificationRuleMaster": "Alle meldingen uitschakelen", + "notificationRuleMasterDescription": "Overschrijf alle andere regels en schakel alle meldingen uit.", + "notificationRuleMemberEventDescription": "Meldingen voor chat-gebeurtenissen uitschakelen.", + "notificationRuleIsUserMention": "Persoonvermelding", + "initAppError": "Er is een fout opgetreden bij het laden van de app", + "requestedKeyVerification": "{sender} vraagt een sleutelverificatie", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sessionLostBody": "Je sessie is verlopen. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link {url}. De foutmelding is: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Andere deelnemers in de chat kunnen zien wanneer je een bericht aan het typen bent.", + "sendCanceled": "Versturen geannuleerd", + "opacity": "Doorzichtigheid:", + "verifyOtherUserDescription": "Als je een persoon verifieert ben je er zeker van dat je echt met haar contact hebt. 💪\n\nWanneer je een verificatie start ziet de persoon een popup in de app. Hier staat een serie van emoji's of getallen die je met elkaar moet vergelijken.\n\nDe beste manier om dit te doen is in persoon of met een videogesprek. 👭", + "changeTheVisibilityOfChatHistory": "Zichtbaarheid van de chat-geschiedenis wijzigen", + "sendRoomNotifications": "@room-meldingen versturen", + "noticeChatBackupDeviceVerification": "Opmerking: Als al je apparaten zijn verbonden met de chat back-up worden ze automatisch geverifieerd.", + "notificationRuleMemberEvent": "Chat-gebeurtenis uitschakelen", + "notificationRuleSuppressNotices": "Automatische berichten uitschakelen", + "setWallpaper": "Achtergrond instellen", + "oneOfYourDevicesIsNotVerified": "Een van jouw apparaten is niet geverifieerd", + "contactServerAdmin": "Contact opnemen met serverbeheerder", + "manageAccount": "Account beheren", + "noContactInformationProvided": "Server geeft geen geldige contactinformatie", + "waitingForServer": "Wachten op server...", + "generalNotificationSettings": "Algemene melding instellingen", + "notificationRuleInviteForMeDescription": "Stuur een melding wanneer je wordt uitgenodigd voor een chat.", + "notificationRuleSuppressNoticesDescription": "Meldingen van automatische accounts zoals bots uitschakelen.", + "notificationRuleInviteForMe": "Persoonlijke uitnodiging", + "inviteOtherUsers": "Personen voor deze chat uitnodigen", + "changeTheChatPermissions": "Chatrechten wijzigen", + "changeTheCanonicalRoomAlias": "Standaard publiek chat-adres wijzigen", + "blur": "Vervaag:", + "isReadyForKeyVerification": "{sender} is klaar voor de sleutelverificatie", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} start een sleutelverificatie", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} accepteerde de sleutelverificatie", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} annuleerde de sleutelverificatie", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "goToSpace": "Ga naar space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "contactServerSecurity": "Contact opnemen met serverbeveiliger", + "newChatRequest": "📩 Nieuw chat verzoek", + "updateInstalled": "🎉 Update {version} geïnstalleerd!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Wijzigingengeschiedenis", + "loginWithMatrixId": "Inloggen met Matrix-ID", + "calculatingFileSize": "Bestandsgrootte berekenen...", + "sendingAttachment": "Bijlage versturen...", + "version": "Versie", + "supportPage": "Supportpagina", + "serverInformation": "Server-informatie:", + "name": "Naam", + "verifyOtherDeviceDescription": "Een geverifieerd ander apparaat zorgt ervoor dat de apparaten sleutels uitwisselen, wat je beveiliging versterkt. 💪 Als je de verificatie start verschijnt er een popup op beide apparaten. Hier staat een reeks emoji's of getallen die je met elkaar moet vergelijken. Het is handig om beide apparaten bij de hand te hebben voordat je de verificatie start. 🤳", + "commandHint_unignore": "Herstel de negeerde Matrix-ID", + "restoreSessionBody": "De app probeert nu je sessie te herstellen van een back-up. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link {url}. De foutmelding is: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Leesbevestigingen versturen", + "formattedMessages": "Opgemaakte berichten", + "chatPermissionsDescription": "Stel het gewenste rechten-niveau in voor bepaalde acties in deze chat. Het rechten-niveau 0, 50 en 100 zijn gebruikelijk voor deelnemer, moderator en beheerder, maar elke verdeling is mogelijk.", + "changeTheDescriptionOfTheGroup": "Onderwerp wijzigen", + "sendReadReceiptsDescription": "Andere deelnemers van de chat kunnen zien of je een bericht hebt gelezen.", + "formattedMessagesDescription": "Geef rijke berichtinhoud weer zoals vetgedrukte tekst met markdown.", + "verifyOtherUser": "🔐 Persoon verifiëren", + "verifyOtherDevice": "🔐 Ander apparaat verifiëren", + "doesNotSeemToBeAValidHomeserver": "Dit lijkt geen ondersteunde server. Verkeerde URL?", + "continueText": "Doorgaan", + "appWantsToUseForLogin": "Inloggen met '{server}'", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Hierbij sta je toe dat de app en website informatie over je delen.", + "open": "Open", + "completedKeyVerification": "{sender} ronde de sleutelverificatie af", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "notificationRuleContainsDisplayName": "Bevat de naam", + "notificationRuleIsUserMentionDescription": "Stuur een melding als je direct genoemd wordt in een bericht.", + "notificationRuleContainsDisplayNameDescription": "Stuur een melding als je genoemd wordt in een bericht.", + "notificationRuleIsRoomMention": "Kamervermelding", + "notificationRuleIsRoomMentionDescription": "Stuur een melding als er een kamervermelding is.", + "notificationRuleRoomnotif": "Kamermelding", + "notificationRuleRoomnotifDescription": "Stuur een melding als een bericht '@room' bevat.", + "notificationRuleTombstone": "Sluitingsbericht", + "notificationRuleReaction": "Reactie", + "notificationRuleRoomServerAcl": "Kamer Server ACL", + "notificationRuleTombstoneDescription": "Stuur een melding bij een chat-sluitingsbericht.", + "notificationRuleReactionDescription": "Meldingen voor reacties uitschakelen.", + "notificationRuleRoomServerAclDescription": "Meldingen voor kamer server toegangscontrolelijst (ACL) uitschakelen.", + "notificationRuleSuppressEdits": "Bewerkingen uitschakelen", + "notificationRuleCall": "Oproep", + "notificationRuleSuppressEditsDescription": "Meldingen voor bewerkte berichten uitschakelen.", + "notificationRuleEncryptedRoomOneToOneDescription": "Stuur een melding bij berichten in versleutelde een-op-een chats.", + "notificationRuleEncryptedRoomOneToOne": "Versleutelde een-op-een chat", + "notificationRuleRoomOneToOne": "Een-op-een chat", + "notificationRuleMessage": "Bericht", + "notificationRuleEncrypted": "Versleuteld", + "notificationRuleRoomOneToOneDescription": "Stuur een melding bij berichten in een-op-een chats.", + "notificationRuleMessageDescription": "Stuur een melding bij algemene berichten.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleEncryptedDescription": "Stuur een melding bij berichten in versleutelde chats.", + "notificationRuleJitsiDescription": "Stuur een melding bij Jitsi widget-gebeurtenissen.", + "unknownPushRule": "Onbekende notificatieregel '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleServerAcl": "Server ACL-gebeurtenissen uitschakelen", + "notificationRuleServerAclDescription": "Meldingen over server ACL-gebeurtenissen uitschakelen.", + "more": "Meer", + "enterNewChat": "Nieuwe chat openen", + "crossVerifiedDevices": "Kruislings geverifieerde apparaten", + "allDevices": "Alle apparaten", + "shareKeysWithDescription": "Welke apparaten moeten vertrouwd worden zodat ze je berichten kunnen lezen in versleutelde chats?", + "verifiedDevicesOnly": "Alleen geverifieerde apparaten", + "crossVerifiedDevicesIfEnabled": "Kruislings geverifieerde apparaten als ingeschakeld", + "shareKeysWith": "Deel sleutels met...", + "notificationRuleCallDescription": "Stuur een melding bij oproepen.", + "deletePushRuleCanNotBeUndone": "Als je deze melding-instelling verwijderd, kan dit niet ongedaan gemaakt worden.", + "takeAPhoto": "Foto maken", + "recordAVideo": "Video opnemen", + "optionalMessage": "(Optioneel) bericht...", + "notSupportedOnThisDevice": "Niet ondersteund op dit apparaat", + "commandHint_roomupgrade": "Upgradeer deze chat naar de aangegeven kamerversie", + "pleaseWaitUntilInvited": "Wacht even alsjeblieft tot iemand van de chat je uitnodigt.", + "approve": "Goedkeuren", + "youHaveKnocked": "Je hebt geklopt", + "sentVoiceMessage": "🎙️ {duration} - Spraakbericht van {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "countInvited": "{count} uitgenodigd", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "checkList": "Checklist", + "commandHint_logout": "Uw huidige apparaat uitloggen", + "commandHint_logoutall": "Alle actieve apparaten uitloggen", + "displayNavigationRail": "Navigatiebalk op mobiel tonen", + "moreEvents": "Meer gebeurtenissen", + "customReaction": "Aangepaste reactie", + "declineInvitation": "Uitnodiging afwijzen", + "noMessagesYet": "Nog geen berichten", + "longPressToRecordVoiceMessage": "Lang drukken om een spraakbericht op te nemen.", + "pause": "Pauzeer", + "resume": "Hervat", + "removeFromSpaceDescription": "De chat zal worden verwijderd uit de space, maar blijft in je chats.", + "countChats": "{chats} chats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces} personen in space", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} personen in space kunnen kloppen", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Peiling starten", + "endPoll": "Peiling beëindigen", + "answersVisible": "Zichtbaar invullen", + "pollQuestion": "Peiling vraag", + "answerOption": "Antwoord optie", + "addAnswerOption": "Antwoord optie toevoegen", + "allowMultipleAnswers": "Meerdere antwoorden toestaan", + "pollHasBeenEnded": "Peiling is geëindigd", + "countVotes": "{count, plural, =1{Één stem} other{{count} stemmen}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Antwoorden zullen zichtbaar zijn wanneer de peiling is geëindigd", + "replyInThread": "Antwoord in gesprek", + "countReplies": "{count, plural, =1{Één antwoord} other{{count} antwoorden}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Gesprek", + "backToMainChat": "Terug naar hoofdchat", + "saveChanges": "Wijzigingen opslaan", + "createSticker": "Sticker of emoji maken", + "useAsSticker": "Gebruik als sticker", + "useAsEmoji": "Gebruik als emoji", + "stickerPackNameAlreadyExists": "Stickerpakketnaam bestaat al", + "newStickerPack": "Nieuw stickerpakket", + "stickerPackName": "Stickerpakketnaam", + "attribution": "Toeschrijving", + "skipChatBackup": "Chatback-up overslaan", + "skipChatBackupWarning": "Weet je het zeker? Zonder chat back-up verlies je toegang tot je berichten als je van apparaat wisselt.", + "changedTheChatDescription": "{username} heeft het onderwerp gewijzigd", + "changedTheChatName": "{username} heeft de chatnaam gewijzigd", + "noMoreResultsFound": "Geen resultaten meer gevonden", + "chatSearchedUntil": "Chat doorzocht tot {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Federatie Basis URL", + "clientWellKnownInformation": "Client-Well-Known Informatie:", + "baseUrl": "Basis URL", + "identityServer": "Identiteit Server:", + "versionWithNumber": "Versie: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logs", + "advancedConfigs": "Geavanceerde configuratie", + "advancedConfigurations": "Geavanceerde configuraties", + "signIn": "Log in", + "createNewAccount": "Registreer nieuw account", + "signUpGreeting": "FluffyChat is decentraal! Kies een server waar je wil voor jouw account en laten we gaan!", + "signInGreeting": "Heb je al een Matrix account? Welkom terug! Kies jouw server en log in.", + "theProcessWasCanceled": "Het proces is geannuleerd.", + "join": "Deelnemen", + "searchOrEnterHomeserverAddress": "Zoek of voer serveradres in", + "matrixId": "Matrix-ID", + "setPowerLevel": "Rechtenniveau instellen", + "makeModerator": "Maak moderator", + "makeAdmin": "Maak beheerder", + "removeModeratorRights": "Verwijder moderator-rechten", + "removeAdminRights": "Verwijder beheerder-rechten", + "powerLevel": "Rechtenniveau", + "setPowerLevelDescription": "Rechtenniveau's definiëren wat een persoon mag doen in deze chat en variëren meestal tussen 0 en 100.", + "owner": "Eigenaar", + "mute": "Demp", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Creëer nieuw chat", + "reset": "Resetten", + "supportFluffyChat": "FluffyChat steunen", + "support": "Steunen", + "setLowPriority": "Lage prioriteit instellen", + "unsetLowPriority": "Lage prioriteit uitschakelen", + "playSoundOnNotification": "Meldingsgeluid afspelen", + "addTag": "Tag toevoegen", + "removeTag": "Tag verwijderen", + "tagName": "Tagnaam", + "createNewTag": "Nieuwe tag maken", + "discardEdits": "Je hebt wijzigingen die nog niet zijn opgeslagen. Wil je de wijzigingen ongedaan maken?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "hideRoomsInSpaces": "Kamers in een space verbergen", + "possibleByYou": "Deze versie was alleen mogelijk dankzij jullie steun. FluffyChat blijft gratis, open source en volledig door de community gedreven.", + "showThumbnailsInTimeline": "Miniatuurafbeeldingen van foto’s en video’s weergeven", + "appSubtitle": "Veilige [matrix]-communicatie", + "appDescription": "Communiceer op een eenvoudige en voor iedereen toegankelijke manier via het gedecentraliseerde [matrix]-netwerk.", + "interactiveVerification": "Interactieve verificatie", + "interactiveVerificationDescription": "Als jullie naast elkaar zitten of via een beveiligd kanaal communiceren, kun je alle apparaten in één keer verifiëren door een beveiligingscode of emoji’s te vergelijken.", + "countUnverifiedDevices": "{count} niet-geverifieerde apparaten in de chat.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Versleuteld bericht", + "unencryptedMessage": "Niet-versleuteld bericht", + "publicKey": "Publieke sleutel: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Apparaatidentificatiesleutel", + "showMore": "Toon meer", + "showLess": "Toon minder", + "messageCanOnlyBeReadByUser": "Je bericht is eind-tot-eind versleuteld en kan alleen gelezen worden door deze persoon:", + "messageCanOnlyBeReadByUsers": "Je bericht eind-tot-eind versleuteld en kan alleen gelezen worden door deze personen:", + "restoreBootstrapEmptyDevicesDescription": "Voer je wachtwoordzin of herstelsleutel in om dit apparaat te verifiëren en krijg toegang tot je berichten back-up.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Kies een van je andere apparaten om deze sessie te verifiëren:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Account resetten", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Crypto-identiteit herstellen", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Crypto-identiteit resetten", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Crypto-identiteit instellen", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Wachten op sleutels... Houd het andere apparaat alsjeblieft actief.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Er zijn geen sleutels verzonden. Probeer het opnieuw.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Ontgrendelen", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Bestand openen", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Als je je account reset, verlies je voor altijd de toegang tot je oude berichten. Alle huidige apparaten moeten ook opnieuw geverifieerd worden. Voer deze actie alleen uit als je geen andere apparaten meer hebt om je sessie mee te verifiëren én je je herstelsleutel en wachtwoordzin kwijt bent!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat gebruikt eind-tot-eind versleuteling. Om je berichten niet te verliezen, kies alsjeblieft een sterke wachtwoordzin. Hiermee beveilig je je crypto-identiteit en je versleutelde berichten back-up.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Nieuwe wachtwoordzin", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Herhaal wachtwoordzin", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Wachtwoordzinnen komen overeen", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Minstens 12 tekens lang.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Bevat hoofdletter en kleine letters.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Bevat speciale tekens.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Bevat een nummer.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Let op, bewaar je herstelsleutel zorgvuldig zodat je je versleutelde berichten en crypto-identiteit kan herstellen.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Bewaar als bestand", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Je bent klaar om te beginnen!", + "noUserKeyFound": "Geen persoonssleutel gevonden", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Bekend sinds: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Apparaat zonder verificatie", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Geverifieerd apparaat", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Geen curve25519-sleutel gevonden", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Bericht niet te ontsleutelen", + "today": "Vandaag", + "sending": "Verzenden", + "generatingThumbnail": "Miniatuur-afbeelding genereren", + "encrypting": "Versleutelen", + "uploading": "Uploaden", + "edited": "(bewerkt)", + "couldNotBeSent": "Kan niet worden gestuurd", + "yesterday": "Gisteren", + "resetRecoveryKey": "Herstelsleutel resetten", + "pleaseEnter6Digits": "Voer 6 getallen in om de app-vergrendeling in te schakelen.", + "disableAppLock": "App-vergrendeling uitschakelen", + "disableAppLockAreYouSure": "Weet je zeker dat je de app-vergrendeling wilt uitschakelen?", + "enableBiometrics": "Biometrische authenticatie inschakelen", + "disableBiometrics": "Biomedische authenticatie uitschakelen", + "biometricsDescription": "Met biometrische authenticatie kan je de app ontgrendelen met je gezicht of vingerafdruk. De mogelijkheden hangen af van je apparaat.", + "useAppLock": "App-vergrendeling gebruiken", + "unlockWithBiometrics": "Met biometrische authenticatie ontgrendelen", + "resetPin": "Pincode resetten", + "forwardCountMessages": "{count, plural, =1{Een bericht} other{{count} berichten}} doorsturen?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + } +} diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb new file mode 100644 index 0000000000..93dc870c36 --- /dev/null +++ b/lib/l10n/intl_pl.arb @@ -0,0 +1,2727 @@ +{ + "@@locale": "pl", + "@@last_modified": "2021-08-14 12:41:09.943634", + "about": "O", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Akceptuj", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} zaakceptował(a) zaproszenie", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktywował(a) szyfrowanie od końca do końca", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Dodaj adres email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} odebrał/-a połączenie", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Każdy może dołączyć", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archiwum", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Czy goście mogą dołączyć?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Czy na pewno?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Czy na pewno chcesz się wylogować?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Aby zalogować inną osobę, proszę wpisać hasło przechowywania lub klucz odzyskiwania.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Zaakceptować tą prośbę weryfikacji od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Serwer obsługuje typy logowania:\n{serverVersions}\nAle ta aplikacja obsługuje tylko:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Ban w czacie", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Zbanowany/-a", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} zbanował/-a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Zablokuj urządzenie", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Zablokowane", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Anuluj", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Zmień nazwę urządzenia", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} zmienił/-a zdjęcie profilowe", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} zmienił(a) uprawnienia w czacie", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} zmienił(a) swoją nazwę wyświetlaną na '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} zmienił(a) zasady dostępu dla gości", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} zmienił(a) zasady dostępu dla gości na {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} zmienił(a) widoczność historii", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} zmienił(a) widoczność historii na {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} zmienił(a) zasady wejścia", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} zmienił(a) zasady wejścia na {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} zmienił(a) zdjęcie profilowe", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} zmienił(a) alias pokoju", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} zmienił(a) link z zaproszeniem do pokoju", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Zmień hasło", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Zmień serwer domyślny", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Zmień swój styl", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Zmień nazwę grupy", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Szyfrowanie zostało uszkodzone", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Czat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Kopia zapasowa czatów", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Szczegóły czatu", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Czaty", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Wybierz silne hasło", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Wyczyść archiwum", + "close": "Zamknij", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Zbanuj użytkownika w tym pokoju", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Wyślij tekst sformatowany w HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Zaproś użytkownika do pokoju", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Dołącz do podanego pokoju", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Usuń tego użytkownika z tego pokoju", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Opuść ten pokój", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Opisz siebie", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Ustaw swoje zdjęcie w tym pokoju (przez mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Ustaw swoją nazwę wyświetlaną w tym pokoju", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Ustaw poziom uprawnień tego użytkownika (domyślnie: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Wyślij niesformatowany tekst", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Wyślij odpowiedź jako reakcję", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Wyślij tekst", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Odbanuj użytkownika w tym pokoju", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Nieprawidłowe polecenie", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} nie jest poleceniem.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Porównaj emoji", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Porównaj cyfry", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt został zaproszony do grupy", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Skopiowano do schowka", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiuj", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Skopiuj do schowka", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nie można odszyfrować wiadomości: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} uczestników", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Stwórz", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} utworzył/-a czat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Obecnie aktywny/-a", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Ciemny", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "To zdezaktywuje twoje konto. To jest nieodwracalne! Na pewno chcesz to zrobić?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Usuń", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Usuń konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Usuń wiadomość", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Urządzenia", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Czaty bezpośrednie", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Nazwa wyświetlana została zmieniona", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Pobierz plik", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edytuj", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edytuj nazwę wyświetlaną", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Zmień aliasy pokoju", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikon już istnieje!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Nieprawidłowy kod emotikonu!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Ustawienia emotikonów", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Skrócony kod emotikonu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Pusty czat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Włącz paczkę emotikonów globalnie", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Nie będziesz już mógł wyłączyć szyfrowania. Jesteś pewny?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Szyfrowane", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Szyfrowanie", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Szyfrowanie nie jest włączone", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} zakończył/-a połączenie", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Wpisz adres e-mail", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "forward": "Przekaż", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od dołączenia", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od zaproszenia", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupa", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupa jest publiczna", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupa z {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Goście są zakazani", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Goście mogą dołączyć", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} wycofał/-a zaproszenie dla {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoc", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ukryj nieznane wdarzenia", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorowani użytkownicy", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Nacisnąłem na link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Złe hasło bezpieczeństwa lub klucz odzyskiwania", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Zaproś kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Zaproś kontakty do {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Zaproszono", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} zaprosił/-a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Tylko zaproszeni użytkownicy", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} zaprosił/-a Cię do FluffyChat.\n1. Odwiedź fluffychat.im i zainstaluj aplikację\n2. Zarejestuj się lub zaloguj\n3. Otwórz link zaproszenia:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "pisze…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} dołączył/-a do czatu", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Dołącz do pokoju", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} wyrzucił/-a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} wyrzucił/-a i zbanował/-a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Wyrzuć z czatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ostatnio widziano {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Opuść", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Opuścił/-a czat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Jasny", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Załaduj jeszcze {count} uczestników", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Ładowanie… Proszę czekać.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Załaduj więcej…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Zaloguj się", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Zaloguj się do {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Wyloguj się", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Wzmianka", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Wycisz czat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nowa rozmowa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nowa wiadomość we FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nowa prośba o weryfikację!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Dalej", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nie", + "@no": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Możesz aktywować szyfrowanie dopiero kiedy pokój nie będzie publicznie dostępny.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Wygląda na to, że Twoje urządzenie nie obsługuje Firebase Cloud Messaging. Aby wciąż otrzymywać powiadomienia push, zalecamy istalację ntfy. Używając ntfy lub inengo zunifikowanego dostawcy powiadomień push, możesz bezpiecznie otrzymywać takowe powiadomienia. Ntfy można pobrać ze sklepu Google Play Store lub z F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Nie dodałeś/-aś jeszcze sposobu odzyskiwania swojego hasła.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Brak uprawnień", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nie znaleziono pokojów…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Powiadomienia", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ojej! Coś poszło nie tak…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Otwórz aplikację by odczytać wiadomości", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otwórz aparat", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "password": "Hasło", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Hasło zostało zmienione", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pin": "Przypnij", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Wprowadź swoje hasło", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Wpisz swoją nazwę użytkownika", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Wykonaj instrukcje na stronie internetowej i naciśnij „dalej”.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publiczne pokoje", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} usunął/-ęła zdarzenie", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejectedTheInvitation": "{username} odrzucił/-a zaproszenie", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Usuń", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Usuń wszystkie inne urządzenia", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Odbanuj w czacie", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Odpowiedz", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Wersja pokoju", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "send": "Wyślij", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Wyślij wiadomość", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Wyślij plik", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Wyślij obraz", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} wysłał/-a plik", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} wysłał/-a plik dżwiękowy", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} wysłał/-a zdjęcie", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} wysłał/-a naklejkę", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} wysłał/-a film", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Ustaw jako główny alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Ustaw status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ustawienia", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Udostępnij", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} udostępnił/-a swoją lokalizację", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sourceCode": "Kod żródłowy", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Jak się masz dziś?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizowanie… Proszę czekać.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Spróbuj wysłać ponownie", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} odbanował/-a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownDevice": "Nieznane urządzenie", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Nieznany algorytm szyfrowania", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Nieznane zdarzenie '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Wyłącz wyciszenie", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Odepnij", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} oraz {count} pozostałych pisze…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} piszą…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} pisze…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} opuścił/-a czat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} wysłał/-a zdarzenie {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Zweryfikowane", + "@verified": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Rozmowa wideo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Widoczność historii czatu", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Widoczny dla wszystkich użytkowników", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Widoczne dla każdego", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Wiadomość głosowa", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kto może dołączyć do tej grupy", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napisz wiadomość…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Tak", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ty", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Nie uczestniczysz już w tym czacie", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Zostałeś/-aś zbanowany/-a w tym czacie", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignoruj", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Brak połączenia z serwerem", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Uzyskiwanie lokalizacji…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Dodaj konto", + "or": "Lub", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Uczestnik", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Nie pamiętam hasła", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Proszę kliknij w odnośnik wysłany w wiadomości e-mail, aby kontynuować.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Usuń swoje zdjęcie", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Zamień pokój na nowszą wersję", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Zgłoś wiadomość", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Zapisz plik", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "security": "Bezpieczeństwo", + "@security": { + "type": "String", + "placeholders": {} + }, + "search": "Szukaj", + "@search": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Wyślij jako tekst", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Wyślij dźwięk", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Wyślij wiadomości", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Wyślij film", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} rozpoczął/-ęła rozmowę", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "yourPublicKey": "Twój klucz publiczny", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Odzyskiwanie hasła", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Otwórz w mapach", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Link", + "roomHasBeenUpgraded": "Pokój został zaktualizowany", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Powtórz hasło", + "all": "Wszystkie", + "@all": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blokada aplikacji", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Zgadzają się", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Wyślij enterem", + "autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotikony", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "cantOpenUri": "Nie można otworzyć linku {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "configureChat": "Konfiguruj czat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Jedno z twoich urządzeń zostało wylogowane", + "privacy": "Prywatność", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Nie zgadzają się", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Treść została zgłoszona administratorom serwera", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edytuj zdjęcie pokoju", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Rozmiar czcionki", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupy", + "@groups": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Brak uprawnień. Proszę zezwól aplikacji na dostęp do lokalizacji aby móc ją udostępnić.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "messages": "Wiadomości", + "@messages": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Podaj swój pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "reason": "Powód", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Usuń wiadomość", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Dzięki tym adresom możesz odzyskać swoje hasło.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Ustaw jako publiczną", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Udostępnij lokalizację", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Pomiń", + "@skip": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nazwa przestrzeni", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Skanuj kod QR", + "createNewSpace": "Nowa przestrzeń", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Dodaj do przestrzeni", + "changeYourAvatar": "Zmień swoje zdjęcie", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Wyczyść pamięć podręczną", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Stwórz pusty czat\nUżyj --no-encryption by wyłączyć szyfrowanie", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Rozpocznij czat bezpośredni\nUżyj --no-encryption by wyłączyć szyfrowanie", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "editBlockedServers": "Edytuj zablokowane serwery", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Włącz szyfowanie", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Domyślny poziom uprawnień dla nowych użytkowników", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ojej! Wystąpił błąd podczas ustawiania powiadomień push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "reject": "Odrzuć", + "@reject": { + "type": "String", + "placeholders": {} + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "commandHint_discardsession": "Odrzuć sesję", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "warning": "Uwaga!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Informacje o wiadomości", + "time": "Czas", + "waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Oczekiwanie na zaakceptowanie emoji przez drugą osobę…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Wybierz kod dostępu", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Odblokuj urządzenie", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Dlaczego chcesz to zgłosić?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "Usuń z przestrzeni", + "errorObtainingLocation": "Błąd w ustalaniu lokalizacji: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} wysłał/-a informacje o połączeniu", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "verifyStart": "Rozpocznij weryfikację", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Pomyślnie zweryfikowano!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Weryfikowanie innego konta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Oczekiwanie na zaakceptowanie numerów przez drugą osobę…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "sender": "Nadawca", + "openGallery": "Otwórz galerię", + "hydrate": "Przywracanie z pliku kopii zapasowej", + "noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "numUsersTyping": "{count} użytkowników pisze…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "onlineKeyBackupEnabled": "Kopia zapasowa kluczy online jest włączona", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "submit": "Odeślij", + "@submit": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Wysłaliśmy Ci wiadomość e-mail", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "unverified": "Niezweryfikowane", + "whoCanPerformWhichAction": "Kto może wykonywać jakie czynności", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Zgłoś użytkownika", + "markAsRead": "Oznacz jako przeczytane", + "passphraseOrKey": "fraza dostępu lub klucz odzyskiwania", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "To powinno być {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID", + "confirmMatrixId": "Potwierdź swój identyfikator Matrix w celu usunięcia konta.", + "commandHint_markasgroup": "Oznacz jako grupę", + "noEmotesFound": "Nie znaleziono żadnych emotikonów. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "Eksportuj sesję i wymaż urządzenie", + "dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.", + "unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android", + "pinMessage": "Przypnij do pokoju", + "confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?", + "youJoinedTheChat": "Dołączono do czatu", + "user": "Użytkownik", + "custom": "Własne", + "newSpace": "Nowa przestrzeń", + "fileIsTooBigForServer": "Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości {max}.", + "youBannedUser": "Zbanowałeś/-aś {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Użytkownicy", + "countFiles": "{count} plików", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noOtherDevicesFound": "Nie znaleziono innych urządzeń", + "encryptThisChat": "Zaszyfruj ten czat", + "disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.", + "screenSharingTitle": "udostępnianie ekranu", + "noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.", + "sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe", + "noBackupWarning": "Uwaga! Bez włączenia kopii zapasowej czatu, stracisz dostęp do swoich zaszyfrowanych wiadomości. Zaleca się włączenie kopii zapasowej czatu przed wylogowaniem.", + "commandHint_googly": "Wyślij kręcące się oczka", + "storeInAndroidKeystore": "Przechowaj w Android KeyStore", + "commandHint_cuddle": "Wyślij uścisk", + "googlyEyesContent": "{senderName} wysyła ci kręcące się oczka", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} cię uściska", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} przytula cię", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "Wyślij przytulasa", + "reactedWith": "{sender} zareagował/-a z {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emoji", + "placeCall": "Zadzwoń", + "voiceCall": "Połączenie głosowe", + "unsupportedAndroidVersionLong": "Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.", + "videoCallsBetaWarning": "Należy pamiętać, że połączenia wideo są obecnie w fazie beta. Mogą nie działać zgodnie z oczekiwaniami lub nie działać w ogóle na wszystkich platformach.", + "experimentalVideoCalls": "Eksperymentalne połączenia wideo", + "youRejectedTheInvitation": "Odrzucono zaproszenie", + "youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie", + "youHaveWithdrawnTheInvitationFor": "Wycofano zaproszenie dla {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Zostałeś/-aś zaproszony/-a przez {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Zaprosiłeś/-aś {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Wyrzuciłeś/-aś {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Wyrzuciłeś/-aś i zbanowałeś/-aś {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Odbanowałeś/-aś {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Przechowaj w pęku kluczy Apple", + "storeSecurlyOnThisDevice": "Przechowaj bezpiecznie na tym urządzeniu", + "foregroundServiceRunning": "To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.", + "screenSharingDetail": "Udostępniasz swój ekran w FluffyChat", + "whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?", + "doNotShowAgain": "Nie pokazuj ponownie", + "wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.", + "reopenChat": "Otwórz ponownie czat", + "fileHasBeenSavedAt": "Plik został zapisany w ścieżce {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "addToBundle": "Dodaj do pakietu", + "bundleName": "Nazwa pakietu", + "editBundlesForAccount": "Edytuj pakiety dla tego konta", + "jumpToLastReadMessage": "Przejdź do ostatnio przeczytanej wiadomości", + "readUpToHere": "Czytaj do tego miejsca", + "jump": "Przejdź", + "removeFromBundle": "Usuń z tego pakietu", + "openLinkInBrowser": "Otwórz link w przeglądarce", + "reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.", + "setColorTheme": "Ustal styl kolorów:", + "tryAgain": "Spróbuj ponownie", + "messagesStyle": "Wiadomości:", + "chatDescription": "Opis czatu", + "invalidServerName": "Nieprawidłowa nazwa serwera", + "chatPermissions": "Uprawnienia w czacie", + "setChatDescription": "Ustaw opis czatu", + "importFromZipFile": "Zaimportuj z pliku .zip", + "redactedBy": "Usunięte przez {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...", + "exportEmotePack": "Eksportuj paczkę emoji jako .zip", + "redactedByBecause": "Usunięte przez {username} z powodu „{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.", + "invalidInput": "Nieprawidłowe dane!", + "report": "zgłoś", + "directChat": "Czat bezpośredni", + "wrongPinEntered": "Wprowadzono nieprawidłowy kod pin! Spróbuj ponownie za {seconds} sekund...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Wysyłaj powiadomienie o pisaniu", + "inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej", + "importEmojis": "Zaimportuj emoji", + "noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.", + "notAnImage": "To nie jest plik obrazu.", + "chatDescriptionHasBeenChanged": "Zmieniono opis czatu", + "shareInviteLink": "Udostępnij link z zaproszeniem", + "emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "replace": "Zastąp", + "createGroup": "Utwórz grupę", + "importNow": "Zaimportuj teraz", + "invite": "Zaproszenie", + "block": "Zablokuj", + "blockedUsers": "Zablokowani użytkownicy", + "blockUsername": "Ignoruj użytkownika", + "select": "Zaznacz", + "calls": "Połączenia", + "learnMore": "Dowiedz się więcej", + "groupName": "Nazwa grupy", + "newPassword": "Nowe hasło", + "thisDevice": "To urządzenie:", + "gallery": "Galeria", + "files": "Pliki", + "discover": "Odkrywaj", + "nothingFound": "Nic nie odnaleziono...", + "stickers": "Naklejki", + "noChatsFoundHere": "Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️", + "hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.", + "passwordRecoverySettings": "Ustawienia odzyskiwania hasła", + "archiveRoomDescription": "Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.", + "yourGlobalUserIdIs": "Twój globalny identyfikator to: ", + "canceledKeyVerification": "{sender} anulował/-a weryfikację kluczy", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} jest gotowy/-a do weryfikacji kluczy", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_ignore": "Ignoruj podany identyfikator Matrix", + "commandHint_unignore": "Przestań ignorować podany identyfikator Matrix", + "changeTheChatPermissions": "Zmień uprawnienia w czacie", + "changelog": "Lista zmian", + "inviteOtherUsers": "Zaproś innych użytkowników do tego czatu", + "blockListDescription": "Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.", + "formattedMessages": "Sformatowane wiadomości", + "banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.", + "sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości", + "verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie", + "acceptedKeyVerification": "{sender} zaakceptował/-a weryfikację kluczy", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Baza danych jest zoptymalizowana", + "hasKnocked": "{user} zapukał-/a", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userLevel": "{level} - Użytkownik", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheVisibilityOfChatHistory": "Zmień widoczność historii czatu", + "sendImages": "Wyślij {count} obrazów", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "knock": "Zapukaj", + "restoreSessionBody": "Aplikacja spróbuje teraz odzyskać Twoją sesję z kopii zapasowej. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} rozpoczął/-ęła weryfikację kluczy", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.", + "sendReadReceiptsDescription": "Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.", + "noDatabaseEncryption": "Szyfrowanie bazy danych nie jest obsługiwane na tej platformie", + "thereAreCountUsersBlocked": "Obecnie jest {count} zablokowanych użytkowników.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Przejdź do przestrzeni {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Oznacz jako nieprzeczytane", + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Administrator", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendRoomNotifications": "Wysyłaj powiadomienia @room", + "chatPermissionsDescription": "Ustal jaki poziom uprawnień jest wymagany dla określonych czynności w czacie. Poziomy uprawnień 0, 50 i 100 zwykle dotyczą odpowiednio użytkowników, moderatorów i administratorów, ale możliwa jest dowolna gradacja.", + "changeTheCanonicalRoomAlias": "Zmień główny publiczny czatu", + "changeTheDescriptionOfTheGroup": "Zmień opis czatu", + "sendCanceled": "Anulowano wysyłanie", + "doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?", + "calculatingFileSize": "Obliczanie rozmiaru pliku...", + "sendingAttachment": "Wysyłanie załącznika...", + "blur": "Rozmazanie:", + "opacity": "Przezroczystość:", + "setWallpaper": "Ustaw tapetę", + "manageAccount": "Zarządzaj kontem", + "noContactInformationProvided": "Serwer nie dostarcza żadnych poprawnych danych kontaktowych", + "contactServerAdmin": "Skontaktuj się z administratorem serwera", + "compress": "Skompresuj", + "pleaseFillOut": "Proszę wypełnić", + "invalidUrl": "Niepoprawny adres URL", + "unableToJoinChat": "Nie udało się dołączyć do czatu. Rozmowa mogła zostać zakończona przez drugą stronę.", + "aboutHomeserver": "O {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "updateInstalled": "🎉 Zainstalowano aktualizację do wersji {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "continueText": "Kontynuuj", + "noticeChatBackupDeviceVerification": "Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.", + "oneOfYourDevicesIsNotVerified": "Jedno z Twoich urządzeń nie jest zweryfikowane", + "supportPage": "Strona obsługi użytkownika", + "serverInformation": "Informacje o serwerze:", + "name": "Nazwa", + "website": "Strona internetowa", + "contactServerSecurity": "Skontaktuj się z działem bezpieczeństwa serwera", + "version": "Wersja", + "accessAndVisibility": "Dostęp i widoczność", + "customEmojisAndStickers": "Własne emotikony i naklejki", + "globalChatId": "Globalny identyfikator czatu", + "accessAndVisibilityDescription": "Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.", + "customEmojisAndStickersBody": "Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.", + "hideRedactedMessages": "Nie pokazuj usuniętych wiadomości", + "hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości", + "pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne", + "noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "chatCanBeDiscoveredViaSearchOnServer": "Czat będzie można znaleźć, szukając na {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicSpaces": "Przestrzenie publiczne", + "searchMore": "Szukaj dalej...", + "formattedMessagesDescription": "Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.", + "verifyOtherUser": "🔐 Zweryfikuj innego użytkownika", + "appLockDescription": "Zablokuj aplikację pinem kiedy nie jest używana", + "knocking": "Pukanie", + "pleaseChooseAStrongPassword": "Proszę wybrać silne hasło", + "usersMustKnock": "Użytkownicy muszą zapukać", + "noOneCanJoin": "Nikt nie może dołączyć", + "swipeRightToLeftToReply": "Przeciągnij w lewo, by odpowiedzieć", + "pleaseEnterANumber": "Proszę podać liczbę większą od 0", + "commandHint_sendraw": "Wyślij zwykły json", + "databaseMigrationBody": "Proszę czekać. Może to potrwać chwilę.", + "leaveEmptyToClearStatus": "Pozostaw puste, aby wyczyścić swój status.", + "sessionLostBody": "Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "publicChatAddresses": "Adresy publicznych czatów", + "createNewAddress": "Utwórz nowy adres", + "completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "italicText": "Kursywa", + "boldText": "Pogrubienie", + "strikeThrough": "Przekreślenie", + "incomingMessages": "Wiadomości przychodzące", + "loginWithMatrixId": "Zaloguj się identyfikatorem Matrix", + "passwordsDoNotMatch": "Hasła się nie zgadzają", + "unbanUserDescription": "Użytkownik będzie w stanie dołączyć do czatu ponownie.", + "roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/", + "requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "changeGeneralChatSettings": "Zmień ogólne ustawienia czatu", + "verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭", + "verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳", + "unreadChatsInApp": "{appname}: {unread} nieprzeczytanych czatów", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "addLink": "Dodaj link", + "unread": "Nieprzeczytane", + "space": "Przestrzeń", + "noMoreChatsFound": "Nie znaleziono więcej czatów...", + "removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.", + "makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.", + "searchChatsRooms": "Szukaj #czatów, @użytkowników...", + "createGroupAndInviteUsers": "Utwórz grupę i zaproś użytkowników", + "groupCanBeFoundViaSearch": "Grupa może być znaleziona poprzez wyszukiwanie", + "wrongRecoveryKey": "Niestety to nie wygląda na poprawny klucz odzyskiwania.", + "searchForUsers": "Szukaj @użytkowników...", + "pleaseEnterYourCurrentPassword": "Proszę podać swoje obecne hasło", + "passwordIsWrong": "Podano niepoprawne hasło", + "joinSpace": "Dołącz do przestrzeni", + "addChatOrSubSpace": "Dodaj czat lub podprzestrzeń", + "initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji", + "searchIn": "Szukaj w czacie \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "kickUserDescription": "Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.", + "appWantsToUseForLogin": "Użyj serwera '{server}' do zalogowania się", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Niniejszym zezwalasz aplikacji i witrynie na udostępnianie informacji o sobie.", + "open": "Otwórz", + "contentNotificationSettings": "Ustawienia powiadomień o treści", + "generalNotificationSettings": "Ogólne ustawienia powiadomień", + "roomNotificationSettings": "Ustawienia powiadomień w pokoju", + "userSpecificNotificationSettings": "Ustawienia powiadomień dla użytkownika", + "otherNotificationSettings": "Inne ustawienia powiadomień", + "notificationRuleContainsUserName": "Włącz dla wiadomości z nazwą użytkownika", + "notificationRuleContainsUserNameDescription": "Włącza powiadomienia kiedy wiadomość zawiera Twoją nazwę użytkownika.", + "notificationRuleMaster": "Wyłącz wszystkie powiadomienia", + "notificationRuleMasterDescription": "Zastępuje inne reguły i wyłącza wszystkie powiadomienia.", + "notificationRuleSuppressNotices": "Wyłącz dla automatycznych wiadomości", + "notificationRuleSuppressNoticesDescription": "Wyłącza powiadomienia z automatycznych klientów, takich jak boty.", + "notificationRuleInviteForMe": "Włącz dla zaproszeń", + "notificationRuleInviteForMeDescription": "Włącza powiadomienia o zaproszeniach do pokoju.", + "notificationRuleMemberEvent": "Wyłącz dla zmian członkostwa", + "notificationRuleMemberEventDescription": "Wyłącza powiadomienia o zmianach członkostwa w pokoju.", + "notificationRuleIsUserMention": "Włącz dla wzmianek", + "notificationRuleIsUserMentionDescription": "Włącza powiadomienia o byciu wzmiankowanym w wiadomości.", + "notificationRuleContainsDisplayName": "Włącz dla wiadomości z nazwą wyświetlaną", + "notificationRuleContainsDisplayNameDescription": "Włącza powiadomienia o wiadomościach zawierających Twoją nazwę wyświetlaną.", + "notificationRuleIsRoomMention": "Włącz dla wzmianek pokoju", + "notificationRuleIsRoomMentionDescription": "Włącza powiadomienia o wzmiankowaniu całego pokoju.", + "notificationRuleRoomnotif": "Włącz dla powiadomień w pokoju", + "notificationRuleRoomnotifDescription": "Włącza powiadomienia o wiadomościach zawierających „@room”.", + "notificationRuleTombstone": "Włącz dla „nagrobków”", + "notificationRuleTombstoneDescription": "Włącza powiadomienia o komunikatach dezaktywacji pokojów.", + "notificationRuleReaction": "Wyłącz dla reakcji", + "notificationRuleReactionDescription": "Wyłącza powiadomienia o reakcjach.", + "notificationRuleSuppressEdits": "Wyłącz dla edycji", + "notificationRuleSuppressEditsDescription": "Wyłącza powiadomienia o edycjach wiadomości.", + "notificationRuleCall": "Włącz dla połączeń", + "notificationRuleRoomServerAclDescription": "Wyłącza powiadomienia dla list kontroli dostępu (ACL) serwera.", + "notificationRuleRoomServerAcl": "Wyłącz dla list kontroli dostępu serwera", + "notificationRuleEncryptedRoomOneToOne": "Włącz dla szyfrowanych pokojów „jeden na jeden”", + "notificationRuleCallDescription": "Włącza powiadomienia o przychodzących połączeniach.", + "notificationRuleRoomOneToOne": "Włącz dla pokojów „jeden na jeden”", + "notificationRuleRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w pokojach „jeden na jeden” (one-to-one).", + "notificationRuleMessage": "Włącz dla wiadomości", + "unknownPushRule": "Nieznana reguła: '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleEncryptedRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w szyfrowanych pokojach „jeden na jeden” (one-to-one).", + "notificationRuleEncrypted": "Włącz dla zaszyfrowanych pokojów", + "notificationRuleJitsi": "Włącz dla Jitsi", + "notificationRuleServerAcl": "Wyłącz dla komunikatów o listach kontroli dostępu serwera", + "notificationRuleJitsiDescription": "Włącza powiadomienia o komunikatach widżetów Jitsi.", + "notificationRuleMessageDescription": "Włącza powiadomienia o ogólnych wiadomościach.", + "notificationRuleEncryptedDescription": "Włącza powiadomienia o wiadomościach w zaszyfrowanych pokojach.", + "notificationRuleServerAclDescription": "Wyłącza powiadomienia o komunikatach o listach kontroli dostępu (ACL) serwera.", + "newChatRequest": "📩 Nowa prośba o czat", + "synchronizingPleaseWaitCounter": " Synchronizowanie… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "waitingForServer": "Oczekiwanie na serwer...", + "previous": "Poprzedni", + "otherPartyNotLoggedIn": "Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!", + "deletePushRuleCanNotBeUndone": "Jeśli skasujesz to ustawienie powiadomień, nie będzie się dało tego cofnąć.", + "more": "Więcej", + "shareKeysWith": "Udostępnij klucze...", + "crossVerifiedDevicesIfEnabled": "Urządzenia zweryfikowane krzyżowo, jeśli włączone", + "crossVerifiedDevices": "Urządzenia zweryfikowane krzyżowo", + "takeAPhoto": "Zrób zdjęcie", + "recordAVideo": "Nagraj film", + "optionalMessage": "(Opcjonalna) wiadomość...", + "verifiedDevicesOnly": "Tylko zweryfikowane urządzenia", + "shareKeysWithDescription": "Które urządzenia powinny być zaufane, aby mogły odczytywać Twoje wiadomości w zaszyfrowanych czatach?", + "allDevices": "Wszystkie urządzenia", + "notSupportedOnThisDevice": "Niewspierane na tym urządzeniu", + "commandHint_roomupgrade": "Zaktualizuj ten pokój do podanej wersji", + "enterNewChat": "Dołącz do nowego czatu", + "countInvited": "{count} zaproszonych", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Wiadomość głosowa od: {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "checkList": "Lista kontrolna", + "approve": "Zaakceptuj", + "youHaveKnocked": "Zapukałeś/-aś", + "pleaseWaitUntilInvited": "Proszę zaczekać na zaproszenie przez kogoś z pokoju.", + "commandHint_logout": "Wyloguj bieżące urządzenie", + "commandHint_logoutall": "Wyloguj wszystkie aktywne urządzenia", + "displayNavigationRail": "Pokazuj pasek nawigacyjny na urządzeniach mobilnych", + "customReaction": "Własna reakcja", + "moreEvents": "Więcej zdarzeń", + "declineInvitation": "Odrzuć zaproszenie", + "changedTheChatDescription": "{username} zmienił(a) opis czatu", + "changedTheChatName": "{username} zmienił(a) nazwę czatu", + "noMessagesYet": "Brak wiadomości", + "longPressToRecordVoiceMessage": "Naciśnij i przytrzymaj, aby nagrać wiadomość głosową.", + "pause": "Pauza", + "resume": "Wznów", + "removeFromSpaceDescription": "Czat zostanie usunięty z pokoju, ale nadal będzie widoczny na liście czatów.", + "countChats": "{chats} czaty", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "createNewTag": "Utwórz nową etykietę", + "spaceMemberOf": "Członek przestrzeni {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Członek przestrzeni {spaces} może kołatać", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "attribution": "Uznanie autorstwa", + "skipChatBackup": "Pomiń kopię zapasową czatów", + "skipChatBackupWarning": "Czy na pewno? Bez włączenia kopii zapasowej czatów możesz stracić dostęp do swoich wiadomości w przypadku zmiany urządzenia.", + "noMoreResultsFound": "Nie znaleziono więcej wyników", + "chatSearchedUntil": "Czat przeszukany do {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Podstawowy adres URL federacji", + "clientWellKnownInformation": "Informacje Client-Well-Known:", + "baseUrl": "Podstawowy adres URL", + "identityServer": "Serwer tożsamości:", + "versionWithNumber": "Wersja: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logi", + "advancedConfigs": "Konfiguracje zaawansowane", + "advancedConfigurations": "Zaawansowane konfiguracje", + "signIn": "Zaloguj się", + "createNewAccount": "Utwórz nowe konto", + "signUpGreeting": "FluffyChat jest zdecentralizowany! Wybierz serwer, na którym chcesz utworzyć konto i zaczynamy!", + "signInGreeting": "Masz już konto w sieci Matrix? Witaj z powrotem! Wybierz swój serwer macierzysty i zaloguj się.", + "theProcessWasCanceled": "Proces został anulowany.", + "join": "Dołącz", + "searchOrEnterHomeserverAddress": "Wyszukaj lub wprowadź adres serwera macierzystego", + "matrixId": "Identyfikator Matrix", + "setPowerLevel": "Ustaw poziom uprawnień", + "makeModerator": "Mianuj moderatorem", + "makeAdmin": "Mianuj administratorem", + "removeModeratorRights": "Odbierz uprawnienia moderatora", + "removeAdminRights": "Odbierz uprawnienia administratora", + "powerLevel": "Poziom uprawnień", + "setPowerLevelDescription": "Poziomy uprawnień określają, co członek może robić w tym pokoju i zazwyczaj mieszczą się w zakresie od 0 do 100.", + "owner": "Właściciel", + "mute": "Wycisz", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Utwórz nowy czat", + "reset": "Resetuj", + "supportFluffyChat": "Wesprzyj FluffyChat", + "support": "Wsparcie", + "setLowPriority": "Ustaw niski priorytet", + "unsetLowPriority": "Cofnij niski priorytet", + "playSoundOnNotification": "Odtwórz dźwięk powiadomienia", + "addTag": "Dodaj znacznik", + "removeTag": "Usuń znacznik", + "tagName": "Nazwa znacznika", + "startPoll": "Rozpocznij ankietę", + "endPoll": "Zakończ ankietę", + "answersVisible": "Widoczne odpowiedzi", + "pollQuestion": "Pytanie ankiety", + "answerOption": "Opcja odpowiedzi", + "addAnswerOption": "Dodaj opcję odpowiedzi", + "allowMultipleAnswers": "Zezwalaj na wiele odpowiedzi", + "pollHasBeenEnded": "Ankieta została zakończona", + "countVotes": "{count, plural, one {{count} głos} few {{count} głosy} many {{count} głosów} other {{count} głosu}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Wyniki będą widoczne po zakończeniu ankiety", + "replyInThread": "Odpowiedz w wątku", + "countReplies": "{count, plural, one {{count} odpowiedź} few {{count} odpowiedzi} many {{count} odpowiedzi} other {{count} odpowiedzi}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Wątek", + "backToMainChat": "Wróć do czatu głównego", + "saveChanges": "Zapisz zmiany", + "createSticker": "Utwórz naklejkę lub emoji", + "useAsSticker": "Użyj jako naklejki", + "useAsEmoji": "Użyj jako emoji", + "stickerPackNameAlreadyExists": "Paczka naklejek o tej nazwie już istnieje", + "newStickerPack": "Nowa paczka naklejek", + "stickerPackName": "Nazwa paczki naklejek", + "discardEdits": "Masz niezapisane zmiany. Porzucić je?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "showMore": "Pokaż wiecej", + "showLess": "Pokaż mniej", + "hideRoomsInSpaces": "Ukryj pokoje, które są w przestrzeni", + "possibleByYou": "To wydanie było tylko możliwe dzięki twojemu wsparciu. FluffyChat pozostaje darmowe, otwartoźródłowe i w całości oparty na inicjatywie społeczności.", + "showThumbnailsInTimeline": "Wyświetl miniatury zdjęć i filmów", + "appSubtitle": "Bezpieczna komunikacja [matrix]", + "appDescription": "Komunikuj się w sposób zaszyfrowany za pośrednictwem zdecentralizowanej sieci [matrix] – w łatwy i dostępny dla wszystkich sposób.", + "interactiveVerification": "Weryfikacja interaktywna", + "interactiveVerificationDescription": "Jeżeli jesteście obok siebie albo komunikujecie się przez bezpieczny kanał to możecie zweryfikować wszystkie urządzenia naraz przez porównywanie numeru bezpieczeństwa lub emoji.", + "countUnverifiedDevices": "{count} niezweryfikowanych urządzeń w czacie.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Szyfrowana wiadomość", + "unencryptedMessage": "Nieszyfrowana wiadomość", + "messageCanOnlyBeReadByUser": "Twoja wiadomość jest szyfrowana od początku do końca i może ją odczytać wyłącznie ten użytkownik:", + "messageCanOnlyBeReadByUsers": "Twoja wiadomość jest szyfrowana od początku do końca i mogą ją odczytać wyłącznie następujący użytkownicy:", + "publicKey": "Publiczny klucz: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Klucz identyfikacyjny urządzenia", + "restoreBootstrapEmptyDevicesDescription": "Wprowadź hasło lub klucz odzyskiwania, aby zweryfikować to urządzenie i uzyskać dostęp do zaszyfrowanej kopii zapasowej wiadomości.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "Wybierz jedno ze swoich innych urządzeń, aby zweryfikować tę sesję:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Zresetuj konto", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Przywróć tożsamość kryptograficzną", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Zresetuj tożsamość kryptograficzną", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Skonfiguruj tożsamość kryptograficzną", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "Oczekiwanie na klucze... Proszę pozostawić drugie urządzenie włączone.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Nie przesłano żadnych kluczy. Spróbuj ponownie.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "Odblokuj", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "Otwórz plik", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Po zresetowaniu konta utracisz na zawsze dostęp do starych wiadomości. Wszystkie Twoje obecne urządzenia będą wymagały ponownej weryfikacji. Wykonaj tę czynność tylko wtedy, gdy nie masz już żadnych innych urządzeń, na których można zweryfikować sesję, oraz utraciłeś klucz odzyskiwania i hasło!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat korzysta z szyfrowania od końca do końca. Aby nie utracić swoich wiadomości, wybierz silne hasło, które zabezpieczy Twoją tożsamość kryptograficzną oraz zaszyfrowaną kopię zapasową wiadomości.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Nowa fraza hasłowa", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Powtórz frazę hasłową", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "Zgodność fraz hasłowych", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Co najmniej 12 znaków.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Zawiera wielkie i małe litery.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Zawiera znaki specjalne.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "Zawiera jedną liczbę.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Zapisz swój klucz odzyskiwania, aby móc przywrócić zaszyfrowane wiadomości oraz swoją tożsamość kryptograficzną.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Zapisz jako plik", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Jesteś gotowy aby rozpocząć!", + "noUserKeyFound": "Nie znaleziono kluczy użytkownika", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "knownSince": "Znany od: {date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "unsignedDevice": "Niepodpisane urządzenie", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Podpisane urządzenie", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Nie znaleziono klucza curve25519", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Nie można odszyfrować wiadomości", + "today": "Dzisiaj", + "sending": "Wysyłanie", + "generatingThumbnail": "Tworzenie miniatury", + "encrypting": "Szyfrowanie", + "uploading": "Przesyłanie", + "edited": "(edytowano)", + "couldNotBeSent": "Nie udało się wysłać", + "yesterday": "Wczoraj", + "resetRecoveryKey": "Zresetuj klucz odzyskiwania", + "pleaseEnter6Digits": "Wpisz 6 cyfr aby włączyć blokadę aplikacji.", + "disableAppLock": "Wyłącz blokadę aplikacji", + "disableAppLockAreYouSure": "Czy na pewno chcesz wyłączyć blokadę aplikacji?", + "enableBiometrics": "Włącz uwierzytelnianie biometryczne", + "disableBiometrics": "Wyłącz uwierzytelnianie biometryczne", + "resetPin": "Resetuj pin", + "forwardCountMessages": "Przekazać {count, plural, =1{jedną wiadomość} other {{count} wiadomości}}?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "unlockWithBiometrics": "Odblokuj za pomocą uwierzytelniania biometrycznego", + "useAppLock": "Użyj blokady aplikacji", + "biometricsDescription": "Za pomocą biometrycznego uwierzytelniania możesz odblokować aplikację za pomocą swojej twarzy lub odsisku palca. Możliwości zależą od twojego urządzenia." +} diff --git a/lib/l10n/intl_pt.arb b/lib/l10n/intl_pt.arb new file mode 100644 index 0000000000..524a04f0e5 --- /dev/null +++ b/lib/l10n/intl_pt.arb @@ -0,0 +1,2001 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.940318", + "copiedToClipboard": "Copiada para a área de transferência", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "login": "Iniciar sessão", + "@login": { + "type": "String", + "placeholders": {} + }, + "about": "Sobre", + "@about": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tens a certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "String", + "placeholders": {} + }, + "reason": "Razão", + "@reason": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir câmara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "settings": "Configurações", + "@settings": { + "type": "String", + "placeholders": {} + }, + "logout": "Terminar sessão", + "@logout": { + "type": "String", + "placeholders": {} + }, + "search": "Pesquisar", + "@search": { + "type": "String", + "placeholders": {} + }, + "users": "Utilizadores", + "close": "Fechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Repita a senha", + "notAnImage": "Não é um arquivo de imagem.", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@none": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_pt_BR.arb b/lib/l10n/intl_pt_BR.arb new file mode 100644 index 0000000000..1569343f39 --- /dev/null +++ b/lib/l10n/intl_pt_BR.arb @@ -0,0 +1,2490 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.925971", + "about": "Sobre", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceitar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} aceitou o convite", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ativou a criptografia de ponta-a-ponta", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Adicionar e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "cognome", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tudo", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} atendeu à chamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualquer pessoa pode entrar", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueio do app", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arquivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Visitantes podem entrar", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tem certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Tem certeza que deseja se desconectar?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poder validar a outra pessoa, digite sua frase secreta ou chave de recuperação.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Aceitar esta solicitação de verificação de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Reproduzir automaticamente figurinhas animadas e emojis", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "O servidor suporta os tipos de entrada/login:\n{serverVersions}\nMas este app suporta apenas:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Banir da conversa", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banidos", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} baniu {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Não foi possível abrir a URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Alterar o nome do dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} alterou o avatar da conversa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} alterou as permissões na conversa", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} mudou o seu nome de exibição para: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} alterou as regras de acesso dos visitantes", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} alterou as regras de acesso dos visitantes para: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} alterou a visibilidade do histórico", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} alterou a visibilidade do histórico para: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} alterou as regras de entrada", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} alterou as regras de entrada para: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} alterou seu avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} alterou os apelidos da sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} alterou o link de convite", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Alterar a senha", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Alterar o servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Alterar o tema", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Alterar o nome do grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Alterar seu avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A criptografia foi corrompida", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversar", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Backup de conversas", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalhes da conversa", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Escolha uma senha forte", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Limpar arquivo", + "close": "Fechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Banir o usuário especificado desta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Enviar mensagem formatada em HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Convidar o usuário especificado para esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Entrar na sala especificada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remover o usuário especificado da sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Sair desta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Descrever você mesmo", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Configurar sua imagem para esta sala (via mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Configurar seu nome de exibição para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Determinar o nível de poderes do usuário especificado (padrão: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar mensagem sem formatação", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar uma resposta como reação", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Enviar mensagem", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Desbanir o usuário especificado desta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Comando inválido", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} não é um comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Compare os emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compare os números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar conversa", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "O contato foi convidado ao grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "O conteúdo foi denunciado para os administradores do servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado para a área de transferência", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar para a área de transferência", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Não foi possível descriptografar a mensagem: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Criar", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} criou a conversa", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novo espaço", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Ativo", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Escuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} às {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Isto desativará a sua conta. Isto é irreversível! Tem certeza?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nível de permissão padrão para usuários novos", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Apagar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Apagar conta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Apagar mensagem", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Conversas diretas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "O nome de exibição foi alterado", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Baixar arquivo", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueados", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nome de exibição", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar apelidos da sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar o avatar da sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emoji já existe!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Código emoji inválido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configuração dos Emoji", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Código Emoji", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Conversa vazia", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Habilitar globalmente o pacote de emoji", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ativar criptografia", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Você não poderá desativar a criptografia posteriormente. Tem certeza?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Criptografado", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Criptografia", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "A criptografia não está ativada", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} finalizou a chamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Digite um endereço de e-mail", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erro ao obter localização: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Tamanho da fonte", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Encaminhar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Desde que entrou", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Desde o convite", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "O grupo é público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo com {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Visitantes são proibidos", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Visitantes podem entrar", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} revogou o convite para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ocultar eventos desconhecidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuários ignorados", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Eu cliquei no link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase secreta ou chave de recuperação incorreta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convidar contato", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convidar contato para {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidado", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} convidou {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Apenas usuários convidados", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} convidou você para o FluffyChat.\n1. Visite fluffychat.im e instale o aplicativo\n2. Entre ou crie uma conta\n3. Abra o link do convite:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está digitando…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} entrou na conversa", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Entrar na sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} expulsou {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} expulsou e baniu {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsar da conversa", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Última vez ativo: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Sair", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Saiu da conversa", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carregar mais {count} participantes", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Carregando... Aguarde.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carregar mais…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Os serviços de localização estão desativados. Ative-os para compartilhar sua localização.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permissão de localização bloqueada. Conceda as permissões para poder compartilhar sua localização.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Conectar-se", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Conectar com {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Desconectar-se", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenciar conversa", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova conversa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nova mensagem no FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova solicitação de verificação!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Avançar", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Não", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sem conexão com o servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nenhum emoji encontrado. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Você só poderá ativar a criptografia quando a sala não for mais publicamente acessível.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "O Firebase Cloud Messaging não parece estar disponível no seu dispositivo. Para receber notificações push, recomendados que você instwl3 o ntfy. Com o ntfy outro provedor do UnifiedPush, você pode receber notificações push de um modo seguro em relação aos dados. Você pode baixar o ntfy da Play Store ou do F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} não é um servidor matrix, usar {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Você ainda não adicionou uma forma de recuperar sua senha.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sem permissão", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nenhuma sala encontrada…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuários estão digitando…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtendo localização…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "O backup de chaves on-line está ativado", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Opa! Infelizmente, um erro ocorreu ao configurar as notificações push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Opa, algo deu errado…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abra o app para ler as mensagens", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir câmera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Abrir no mapa", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "frase secreta ou chave de recuperação", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Senha", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Esqueci a senha", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Senha foi alterada", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperação de senha", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Escolha um código", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Clique no link do e-mail para prosseguir.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Digite sua senha", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Digite seu PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Digite seu nome de usuário", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Siga as instruções no site e toque em avançar.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Motivo", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} apagou um evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Apagar mensagem", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Recusar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} recusou o convite", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Remover todos os outros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Desbanir da conversa", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remover seu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Substituir sala por uma nova versão", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denunciar mensagem", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A sala foi atualizada", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versão da sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salvar arquivo", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Pesquisar", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Segurança", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Enviar uma mensagem", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Enviar áudio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar arquivo", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar imagem", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensagens", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} enviou um arquivo", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} enviou um áudio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} enviou uma imagem", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} enviou uma figurinha", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} enviou um vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} enviou informações de chamada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Configurar como apelido principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Alterar estado", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Configurações", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Compartilhar", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} compartilhou sua localização", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Compartilhar localização", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Pular", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Código-fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "O espaço é público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nome do espaço", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} iniciou uma chamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Estado", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Como vai você?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Enviar", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sincronizando… Aguarde.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Não correspondem", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Correspondem", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Demasiadas requisições. Por favor, tente novamente mais tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Tentar enviar novamente", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} desbaniu {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloquear dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositivo desconhecido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritmo de criptografia desconhecido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evento desconhecido '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Dessilenciar", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Desafixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} e mais {count} pessoas estão digitando…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} estão digitando…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está digitando…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} saiu da conversa", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} enviou um evento de {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Iniciar verificação", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Verificação efetivada!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificando outra conta", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Chamada de vídeo", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilidade do histórico da conversa", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visível para todos os participantes", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visível para qualquer pessoa", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mensagem de voz", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Esperando que a outra pessoa aceite a solicitação…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Esperando que a outra pessoa aceite os emojis…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Aguardando a outra pessoa aceitar os números…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Atenção!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Enviamos um e-mail para você", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Quem pode desempenhar quais ações", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Quem pode entrar no grupo", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Por que quer denunciar isto?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Você pode recuperar a sua senha com estes endereços.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Digite sua mensagem…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sim", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Você", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Você não está mais participando desta conversa", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Você foi banido desta conversa", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Sua chave pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Um dos seus clientes foi desconectado", + "addAccount": "Adicionar conta", + "unverified": "Não verificado", + "editBundlesForAccount": "Editar coleções para esta conta", + "messageInfo": "Informações da mensagem", + "sender": "Remetente", + "removeFromSpace": "Remover do espaço", + "link": "Link", + "repeatPassword": "Repita a senha", + "addToSpace": "Adicionar ao espaço", + "sendOnEnter": "Enviar ao pressionar enter", + "commandHint_clearcache": "Limpar dados temporários", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Criar uma conversa em grupo vazia.\nUse --no-encryption para desativar a criptografia", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descartar sessão", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Iniciar uma conversa direta\nUse --no-encryption para desativar a criptografia", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "scanQrCode": "Ler código QR", + "addToBundle": "Adicionar à coleção", + "removeFromBundle": "Remover desta coleção", + "bundleName": "Nome da coleção", + "time": "Horário", + "openGallery": "Abrir galeria", + "markAsRead": "Marcar como lido", + "reportUser": "Denunciar usuário", + "emojis": "Emojis", + "placeCall": "Chamar", + "reactedWith": "{sender} reagiu com {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Tem certeza que quer desafixar o evento permanentemente?", + "pinMessage": "Fixar na sala", + "voiceCall": "Chamada de voz", + "unsupportedAndroidVersion": "Versão Android sem suporte", + "unsupportedAndroidVersionLong": "Esta funcionalidade requer uma versão mais nova do Android. Verifique se há atualizações ou suporte ao LineageOS.", + "videoCallsBetaWarning": "Observe que chamadas de vídeo estão atualmente em teste. Podem não funcionar como esperado ou sequer funcionar em algumas plataformas.", + "experimentalVideoCalls": "Vídeo chamadas experimentais", + "youRejectedTheInvitation": "Você rejeitou o convite", + "youBannedUser": "Você baniu {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Você revogou o convite para {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Você foi convidado por {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Você convidou {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Você aceitou o convite", + "youJoinedTheChat": "Você entrou na conversa", + "youKicked": "👞 Você expulsou {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Você expulsou e baniu {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Você desbaniu {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} afagou você", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "users": "Usuários", + "confirmMatrixId": "Confirme seu ID Matrix para apagar sua conta.", + "supposedMxid": "Isto deveria ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Enviar um afago", + "commandHint_hug": "Enviar um abraço", + "commandHint_googly": "Enviar olhos arregalados", + "googlyEyesContent": "{senderName} enviou olhos arregalados", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} abraçou você", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Marcar como sala de mensagens diretas para o ID Matrix fornecido", + "commandHint_markasgroup": "Marcar como grupo", + "hydrate": "Restaurar a partir de um arquivo de backup", + "storeInAndroidKeystore": "Guardar no cofre do Android (KeyStore)", + "storeInAppleKeyChain": "Guardar no chaveiro da Apple", + "storeSecurlyOnThisDevice": "Guardar de modo seguro neste dispositivo", + "user": "Usuário", + "custom": "Personalizado", + "foregroundServiceRunning": "Esta notificação aparece quando o serviço de primeiro plano está sendo executado.", + "newSpace": "Novo espaço", + "countFiles": "{count} arquivos", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "doNotShowAgain": "Não mostrar novamente", + "dehydrate": "Exportar sessão e apagar dispositivo", + "dehydrateWarning": "Esta ação não pode ser desfeita. Certifique-se de que o arquivo de backup está guardado e seguro.", + "whyIsThisMessageEncrypted": "Por que não consigo ler esta mensagem?", + "screenSharingTitle": "compartilhamento de tela", + "screenSharingDetail": "Você está compartilhando sua tela no FluffyChat", + "noKeyForThisMessage": "Isto pode ocorrer caso a mensagem tenha sido enviada antes de você ter se conectado à sua conta com este dispositivo.\n\nTambém é possível que o remetente tenha bloqueado o seu dispositivo ou ocorreu algum problema com a conexão.\n\nVocê consegue ler as mensagens em outra sessão? Então, pode transferir as mensagens de lá! Vá em Configurações > Dispositivos e confira se os dispositivos verificaram um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estiverem abertas, as chaves serão transmitidas automaticamente.\n\nNão gostaria de perder suas chaves ao desconectar ou trocar de dispositivos? Certifique-se que o backup de conversas esteja ativado nas configurações.", + "notAnImage": "Não é um arquivo de imagem.", + "importNow": "Importar agora", + "importEmojis": "Importar emojis", + "importFromZipFile": "Importar de arquivo .zip", + "sendTypingNotifications": "Enviar indicadores de digitação", + "exportEmotePack": "Exportar pacote de emojis como .zip", + "replace": "Substituir", + "jumpToLastReadMessage": "Pular para a última mensagem lida", + "reportErrorDescription": "😭 Ah, não. Algo deu errado. Se quiser, pode relatar isto aos desenvolvedores.", + "setColorTheme": "Aplicar paleta de cor:", + "banUserDescription": "O usuário será banido da conversa e não poderá participar novamente até que sejam desbanidos.", + "removeDevicesDescription": "Você será desconectado deste dispositivo e não poderá mais receber mensagens.", + "tryAgain": "Tentar novamente", + "unbanUserDescription": "O usuário poderá entrar novamente na conversa, caso tente.", + "messagesStyle": "Mensagens:", + "newSpaceDescription": "Os espaços permitem que você consolide suas conversas e construa comunidades públicas ou privadas.", + "chatDescription": "Descrição da conversa", + "encryptThisChat": "Criptografar esta conversa", + "reopenChat": "Reabrir conversa", + "pushNotificationsNotAvailable": "Notificações push não estão disponíveis", + "invalidServerName": "Nome do servidor inválido", + "chatPermissions": "Permissões da conversa", + "makeAdminDescription": "Assim que promover este usuário a administrador, não poderá desfazer isto e ele terá as mesmas permissões que você.", + "setChatDescription": "Configurar descrição da conversa", + "noOtherDevicesFound": "Nenhum outro dispositivo encontrado", + "redactedBy": "Apagado por {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Não foi possível enviar! O servidor suporta anexos somente até {max}.", + "readUpToHere": "Lido até aqui", + "optionalRedactReason": "(Opcional) Motivo para apagar esta mensagem.", + "archiveRoomDescription": "A conversa será movida para o arquivo. Outros usuários verão que você deixou a conversa.", + "redactedByBecause": "Apagado por {username}, pois: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Arquivo salvo em {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "A mensagem será apagada para todos os participantes desta conversa. Isto não poderá ser desfeito.", + "invalidInput": "Entrada inválida!", + "report": "relatar", + "hasKnocked": "🚪 {user} bateu na porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Abrir link no navegador", + "disableEncryptionWarning": "Por razões de segurança, não é possível desativar a criptografada uma vez ativada.", + "directChat": "Conversa direta", + "wrongPinEntered": "PIN incorreto! Tente novamente em {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "inviteGroupChat": "📨 Convite para conversa em grupo", + "wasDirectChatDisplayName": "Conversa vazia (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Nenhuma descrição para a conversa foi criada ainda.", + "learnMore": "Saiba mais", + "chatDescriptionHasBeenChanged": "Descrição da conversa alterada", + "roomUpgradeDescription": "A conversa será recriada com a nova versão de sala. Todos participantes será notificados e terão que migrar para a nova sala. Você pode encontrar mais informações sobre versões de sala em https://spec.matrix.org/latest/room/", + "pleaseEnterANumber": "Digite um número maior que 0", + "jump": "Pular", + "sorryThatsNotPossible": "Desculpe... isto não é possível", + "shareInviteLink": "Compartilhar link de convite", + "emoteKeyboardNoRecents": "Emojis recentes aparecem aqui...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "createGroup": "Criar grupo", + "noBackupWarning": "Atenção! Se não ativar o backup de conversas, você perderá acesso a suas mensagens criptografadas. É altamente recomendável ativar o backup antes de sair.", + "kickUserDescription": "O usuário foi expulso da conversa, mas não banido. Em conversas públicas, o usuário pode entrar novamente a qualquer momento.", + "invite": "Convidar", + "blockListDescription": "Você pode bloquear usuários que estejam te perturbando. Você não receberá mensagens ou convites de usuários na sua lista pessoal de bloqueios.", + "createGroupAndInviteUsers": "Criar um grupo e convidar pessoas", + "thisDevice": "Este dispositivo:", + "publicSpaces": "Espaços públicos", + "blockedUsers": "Usuários bloqueados", + "passwordIsWrong": "A senha digitada está incorreta", + "pleaseEnterYourCurrentPassword": "Digite sua senha atual", + "groupCanBeFoundViaSearch": "Grupos podem ser encontrados por pesquisa", + "noUsersFoundWithQuery": "Infelizmente, não foi encontrado usuário com \"{query}\". Verifique se digitou corretamente.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Bloquear", + "nothingFound": "Nada foi encontrado...", + "yourGlobalUserIdIs": "Seu ID global de usuário é: ", + "newPassword": "Nova senha", + "passwordsDoNotMatch": "As senhas não correspondem", + "commandHint_sendraw": "Enviar JSON puro", + "wrongRecoveryKey": "Desculpe... esta não parece ser a chave de recuperação correta.", + "select": "Selecionar", + "pleaseChooseAStrongPassword": "Escolha uma senha forte", + "blockUsername": "Ignorar nome de usuário", + "addChatOrSubSpace": "Adicionar conversa ou subespaço", + "groupName": "Nome do grupo", + "leaveEmptyToClearStatus": "Deixe em branco para limpar seu estado.", + "joinSpace": "Entrar no espaço", + "searchForUsers": "Pesquisar por @usuários...", + "databaseMigrationTitle": "O banco de dados está otimizado", + "searchChatsRooms": "Pesquisar por #conversas, @usuários...", + "databaseMigrationBody": "Aguarde. Isto pode demorar um pouco.", + "formattedMessagesDescription": "Exibir conteúdo de mensagem rico, como texto em negrito usando markdown.", + "verifyOtherUser": "🔐 Verificar outro usuário", + "verifyOtherDevice": "🔐 Verificar outro dispositivo", + "acceptedKeyVerification": "{sender} aceitou a verificação de chaves", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} iniciou a verificação de chaves", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "initAppError": "Ocorreu um erro enquanto o app era iniciado", + "restoreSessionBody": "O app tentará agora restaurar sua sessão a partir do backup. Relate isto ao desenvolvedor em {url}. A mensagem de erro é: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Enviar recibos de leitura", + "sendTypingNotificationsDescription": "Outros participantes nesta conversa podem ver quando você está digitando uma nova mensagem.", + "formattedMessages": "Mensagens formatadas", + "commandHint_ignore": "Ignorar o ID Matrix especificado", + "commandHint_unignore": "Parar de ignorar o ID Matrix especificado", + "sessionLostBody": "Sua sessão foi desconectada. Relate este ao desenvolvedor em {url}. A mensagem de erro é: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Outros participantes nesta conversa podem ver quando você tiver lido uma mensagem.", + "verifyOtherUserDescription": "Se você verificar outro usuário, você terá certeza que você conhece com quem está conversando. 💪\n\nAo iniciar uma verificação, você e o outro usuário receberão um pop-up no app. Então vocês receberão uma série de emojis ou números para comparar um com o outro.\n\nA melhor maneira de fazer este procedimento é se encontrar pessoalmente ou através de uma chamada de vídeo. 👭", + "requestedKeyVerification": "{sender} solicitou uma verificação de chaves", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherDeviceDescription": "Ao verificar outro dispositivo, os dispositivos poderão trocar chaves, aumentando sua segurança. 💪 Ao iniciar a verificação, um pop-up aparecerá no app em ambos os aparelhos. Então você verá uma série de emojis ou números que você terá que comparar um com o outro. É melhor fazer esse procedimento com ambos os dispositivos em mãos antes de começar a verificação. 🤳", + "canceledKeyVerification": "{sender} cancelou a verificação de chaves", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} está pronto para a verificação de chaves", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} concluiu a verificação de chaves", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "Figurinhas", + "discover": "Explorar", + "incomingMessages": "Mensagens recebidas", + "unreadChatsInApp": "{appname}: {unread} conversas não lidas", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "appLockDescription": "Bloquear o app com um código PIN quando não estiver usando", + "accessAndVisibilityDescription": "Quem pode entrar nesta conversa e como a conversa pode ser descoberta.", + "calls": "Chamadas", + "customEmojisAndStickers": "Emojis e stickers customizados", + "customEmojisAndStickersBody": "Adicionar ou compartilhar emojis ou stickers customizados que podem ser usados em qualquer conversa.", + "hideRedactedMessages": "Ocultar mensagens apagadas", + "hideRedactedMessagesBody": "Se alguém apagar uma mensagem, esta mensagem não será mais visível na conversa.", + "hideInvalidOrUnknownMessageFormats": "Ocultar formatos de mensagem inválidos ou desconhecidos", + "usersMustKnock": "Usuários devem bater na porta", + "noOneCanJoin": "Ninguém pode entrar", + "knocking": "Batendo na porta", + "chatCanBeDiscoveredViaSearchOnServer": "A conversa pode ser descoberta por pesquisa em {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Endereços de conversas públicas", + "thereAreCountUsersBlocked": "Nesse momento, há {count} usuários bloqueados.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "globalChatId": "ID global de conversa", + "accessAndVisibility": "Acesso e visibilidade", + "passwordRecoverySettings": "Configurações de recuperação de senha", + "noDatabaseEncryption": "A criptografia do banco de dados não é suportada nesta plataforma", + "createNewAddress": "Criar um novo endereço", + "knock": "Bater na porta", + "searchIn": "Procurar na conversa {chat}...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Pesquisar mais...", + "gallery": "Galeria", + "files": "Arquivos", + "more": "Mais", + "deletePushRuleCanNotBeUndone": "Se você apagar esta configuração de notificação, isso não poderá ser desfeito.", + "shareKeysWith": "Compartilhar chaves com...", + "contentNotificationSettings": "Configurações de notificações de conteúdo", + "generalNotificationSettings": "Configurações de notificações gerais", + "notificationRuleContainsUserNameDescription": "Notifica o usuário quando a mensagem contém o seu nome de usuário.", + "notificationRuleMaster": "Silenciar todas as notificações", + "notificationRuleMasterDescription": "Sobrescreve todas as outras regras e desativa todas as notificações.", + "notificationRuleContainsDisplayName": "Contém o nome de exibição", + "notificationRuleRoomnotif": "Notificação de sala", + "notificationRuleIsRoomMentionDescription": "Notifica o usuário quando há uma menção de sala.", + "notificationRuleRoomnotifDescription": "Notifica o usuário quando uma mensagem contém '@room'.", + "notificationRuleTombstone": "Morte", + "notificationRuleReaction": "Reação", + "notificationRuleSuppressEditsDescription": "Omite notificações de mensagens editadas.", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica o usuário de mensagens em salas criptografas de 2 pessoas.", + "notificationRuleRoomOneToOne": "Sala de 2 pessoas", + "notificationRuleMessageDescription": "Notifica o usuário de mensagens gerais.", + "notificationRuleEncrypted": "Criptografado", + "unknownPushRule": "Regra de push desconhecida '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "notificationRuleServerAclDescription": "Omite notificações de eventos de ACL de servidor.", + "unread": "Não lido", + "changeTheCanonicalRoomAlias": "Alterar o endereço público principal da conversa", + "doesNotSeemToBeAValidHomeserver": "Não parece ser um servidor compatível. URL errada?", + "website": "Site", + "compress": "Comprimir", + "invalidUrl": "URL inválida", + "appWantsToUseForLoginDescription": "Aqui, você permite que o app e o site compartilhem informações sobre você.", + "notificationRuleMemberEvent": "Evento de membro", + "crossVerifiedDevicesIfEnabled": "Dispositivos verificados por ambos se ativado", + "countInvited": "{count} convidados", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "checkList": "Lista de tarefas", + "synchronizingPleaseWaitCounter": " Sincronizando… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "markAsUnread": "Marcar como não lido", + "updateInstalled": "🎉 Atualização da versão {version} instalada!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Registro de mudanças", + "sendCanceled": "Envio cancelado", + "unableToJoinChat": "Não foi possível entrar na conversa. Talvez a outra pessoa já fechou a conversa.", + "sendingAttachment": "Enviando o anexo...", + "noticeChatBackupDeviceVerification": "Observação: Quando você conecta todos os seus dispositivos ao backup de conversas, eles são verificados automaticamente.", + "continueText": "Continuar", + "blur": "Borrar:", + "opacity": "Opacidade:", + "setWallpaper": "Configurar plano de fundo", + "noContactInformationProvided": "O servidor não fornece nenhuma informação válida de contato", + "contactServerAdmin": "Contatar o administrador do servidor", + "contactServerSecurity": "Contatar a segurança do servidor", + "supportPage": "Página de ajuda", + "italicText": "Texto em itálico", + "strikeThrough": "Risco", + "appWantsToUseForLogin": "Usar '{server}' para conectar", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Abrir", + "roomNotificationSettings": "Configurações de notificações de sala", + "userSpecificNotificationSettings": "Configurações de notificações específicas ao usuário", + "otherNotificationSettings": "Configurações de outras notificações", + "notificationRuleContainsUserName": "Contém o nome de usuário", + "notificationRuleSuppressNotices": "Omitir mensagens automáticas", + "notificationRuleInviteForMe": "Convite para mim", + "notificationRuleMemberEventDescription": "Omite todas as notificações de eventos de membro.", + "notificationRuleIsUserMention": "Menção de usuário", + "notificationRuleContainsDisplayNameDescription": "Notifica o usuário quando uma mensagem contém seu nome de exibição.", + "notificationRuleCall": "Chamada", + "sentVoiceMessage": "🎙️ {duration} - Mensagem de voz de {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "crossVerifiedDevices": "Dispositivos verificados por ambos", + "takeAPhoto": "Tirar uma foto", + "youHaveKnocked": "Bateram na sua porta", + "changeGeneralChatSettings": "Alterar configurações gerais de conversa", + "inviteOtherUsers": "Convidar outros usuários para esta conversa", + "adminLevel": "{level} - Administrador", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheChatPermissions": "Alterar as permissões da conversa", + "changeTheVisibilityOfChatHistory": "Alterar a visibilidade do histórico de conversa", + "sendImages": "Enviar {count} imagens", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "goToSpace": "Ir ao espaço: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "loginWithMatrixId": "Conectar com ID Matrix", + "calculatingFileSize": "Calculando o tamanho do arquivo...", + "oneOfYourDevicesIsNotVerified": "Um dos seus dispositivos não está verificado", + "manageAccount": "Gerenciar conta", + "newChatRequest": "📩 Nova solicitação de conversa", + "userLevel": "{level} - Usuário", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "enterNewChat": "Abrir a conversa nova", + "notificationRuleSuppressNoticesDescription": "Omite notificações de clientes automatizados, como bots.", + "notificationRuleInviteForMeDescription": "Notifica o usuário quando for convidado para uma sala.", + "approve": "Aprovar", + "notificationRuleEncryptedRoomOneToOne": "Sala criptografada de 2 pessoas", + "pleaseWaitUntilInvited": "Aguarde até que alguém da sala te convide.", + "waitingForServer": "Aguardando o servidor...", + "notificationRuleEncryptedDescription": "Notifica o usuário de mensagens em salas criptografadas.", + "sendRoomNotifications": "Enviar notificações de @room", + "notificationRuleRoomServerAclDescription": "Omite notificações de listas de controle de acesso de servidor de uma sala (ACL).", + "notificationRuleIsUserMentionDescription": "Notifica o usuário quando é mencionado diretamente em uma mensagem.", + "notificationRuleSuppressEdits": "Omitir edições", + "shareKeysWithDescription": "Quais dispositivos devem ser confiados para que possam ler suas mensagens em conversas criptografas?", + "allDevices": "Todos os dispositivos", + "aboutHomeserver": "Sobre {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "Deslizar da direita pra esquerda para responder", + "verifiedDevicesOnly": "Somente dispositivos verificados", + "boldText": "Texto em negrito", + "recordAVideo": "Gravar um vídeo", + "optionalMessage": "(Opcional) mensagem...", + "notSupportedOnThisDevice": "Não há suporte neste dispositivo", + "commandHint_roomupgrade": "Atualizar esta sala para a versão de sala especificada", + "noMoreChatsFound": "Mais nenhuma conversa foi encontrada...", + "noChatsFoundHere": "Nenhuma conversa encontrada aqui ainda. Inicie uma nova conversa com alguém usando o botão abaixo. ⤵️", + "space": "Espaço", + "moderatorLevel": "{level} - Moderador", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeTheDescriptionOfTheGroup": "Alterar a descrição da conversa", + "chatPermissionsDescription": "Configurar qual o nível de poder é necessário para certas ações nesta conversa. Os níveis de poder 0, 50, e 100 são normalmente para representar usuários, moderadores, e administradores, mas qualquer configuração é possível.", + "serverInformation": "Informações do servidor:", + "name": "Nome", + "version": "Versão", + "pleaseFillOut": "Preencha", + "addLink": "Adicionar link", + "notificationRuleRoomServerAcl": "ACL de servidores de sala", + "notificationRuleCallDescription": "Notifica o usuário de chamadas.", + "notificationRuleRoomOneToOneDescription": "Notifica o usuário de mensagens em salas de duas pessoas.", + "notificationRuleMessage": "Mensagem", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Notifica o usuário de eventos de widget do Jitsi.", + "notificationRuleServerAcl": "Omitir eventos de ACL de servidor", + "notificationRuleIsRoomMention": "Menção de sala", + "notificationRuleTombstoneDescription": "Notifica o usuário de mensagens de desativação de salas.", + "notificationRuleReactionDescription": "Omite notificações de reações.", + "commandHint_logout": "Desconecte-se do seu dispositivo atual", + "commandHint_logoutall": "Desconecte-se de todos os dispositivos ativos", + "displayNavigationRail": "Mostrar trilha de navegação em dispositivo móvel", + "previous": "Anterior", + "otherPartyNotLoggedIn": "A outra pessoa não tem nenhum dispositivo conectado no momento e portanto não consegue receber mensagens!", + "customReaction": "Reação personalizada", + "moreEvents": "Mais eventos", + "declineInvitation": "Rejeitar convite", + "noMessagesYet": "Nenhuma mensagem ainda", + "longPressToRecordVoiceMessage": "Segure para gravar uma mensagem de voz.", + "pause": "Pausar", + "resume": "Retomar", + "removeFromSpaceDescription": "A conversa será removida do espaço mas ainda aparecerá na sua lista de conversas.", + "countChats": "{chats} conversas", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Membro do espaço de {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Membro do espaço de {spaces} pode bater na porta", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Abrir enquete", + "endPoll": "Fechar enquete", + "answersVisible": "Respostas visíveis", + "pollQuestion": "Questão da enquete", + "answerOption": "Opção de resposta", + "addAnswerOption": "Adicionar opção de resposta", + "allowMultipleAnswers": "Permitir várias respostas", + "pollHasBeenEnded": "A enquete terminou", + "countVotes": "{count, plural, =1{Um voto} other{{count} votos}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "As respostas ficarão visíveis quando a enquete terminar", + "replyInThread": "Responder no tópico", + "countReplies": "{count, plural, =1{Uma resposta} other{{count} respostas}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Tópico", + "backToMainChat": "Voltar à conversa principal", + "saveChanges": "Salvar alterações", + "createSticker": "Criar figurinha ou emoji", + "useAsSticker": "Usar como figurinha", + "useAsEmoji": "Usar como emoji", + "stickerPackNameAlreadyExists": "O nome do pacote de figurinhas já existe", + "newStickerPack": "Novo pacote de figurinhas", + "stickerPackName": "Nome do pacote de figurinhas", + "attribution": "Créditos", + "skipChatBackup": "Pular backup de conversas", + "skipChatBackupWarning": "Tem certeza? Se não ativar o backup de conversas, você pode perder o acesso às suas mensagens se trocar de dispositivo.", + "changedTheChatDescription": "{username} alterou a descrição da conversa", + "changedTheChatName": "{username} alterou o nome da conversa", + "versionWithNumber": "Versão: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_pt_PT.arb b/lib/l10n/intl_pt_PT.arb new file mode 100644 index 0000000000..b9bbfa8ad1 --- /dev/null +++ b/lib/l10n/intl_pt_PT.arb @@ -0,0 +1,2218 @@ +{ + "repeatPassword": "Repete a palavra-passe", + "about": "Acerca de", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Aceitar", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} aceitou o convite", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Conta", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} ativou encriptação ponta-a-ponta", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Adicionar correio eletrónico", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Adicionar ao espaço", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alcunha", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Todos(as)", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} atendeu a chamada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualquer pessoa pode entrar", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Arquivo", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Os utilizadores convidados têm permissão para se juntarem?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tens a certeza?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Tens a certeza que queres sair?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Para poderes assinar a outra pessoa, por favor, insere a tua senha de armazenamento seguro ou a chave de recuperação.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Aceitar este pedido de verificação de {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automaticamente reproduzir autocolantes e emotes animados", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Enviar com Enter", + "badServerLoginTypesException": "O servidor suporta os tipos de início de sessão:\n{serverVersions}\nMas esta aplicação apenas suporta:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Banir da conversa", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banido(a)", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} baniu {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloquear dispositivo", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloqueado", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancelar", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Não é possível abrir o URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Alterar nome do dispositivo", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatPermissions": "{username} alterou as permissões da conversa", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} alterou o seu nome para: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} alterou as regras de acesso de visitantes para: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} alterou as regras de entrada", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} alterou as regras de entrada para: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} alterou o seu avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} alterou as alcunhas da sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} alterou a ligação de convite", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Alterar palavra-passe", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Alterar o servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Alterar o teu estilo", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Alterar o nome do grupo", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Alterar o teu avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "A encriptação foi corrompida", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Conversa", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Cópia de segurança de conversas", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalhes de conversa", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Conversas", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Escolhe uma palavra-passe forte", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Limpar arquivo", + "close": "Fechar", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Banir o utilizador dado desta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Enviar texto formatado com HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Convidar o utilizador dado a esta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Entrar na sala dada", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remover o utilizador dado desta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Sair desta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Descreve-te", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Definir a tua imagem para esta sala (por mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Definir o teu nome para esta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Definir o nível de poder do utilizador dado (por omissão: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Enviar texto não formatado", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Enviar respostas como reações", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Enviar texto", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Perdoar o utilizador dado", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Comando inválido", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} não é um comando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Compara e certifica-te que os emojis que se seguem correspondem aos do outro dispositivo:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compara e certifica-te que os números que se seguem correspondem aos do outro dispositivo:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurar conversa", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "O contacto foi convidado para o grupo", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "O conteúdo foi denunciado aos admins do servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiado para a área de transferência", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copiar", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiar para a área de transferência", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Não foi possível desencriptar mensagem: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participantes", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Criar", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} criou a conversa", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Novo espaço", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Ativo(a) agora", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Escuro", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} às {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Isto irá desativar a tua conta. Não é reversível! Tens a certeza?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nível de permissão normal", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Eliminar", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Eliminar conta", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Eliminar mensagem", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositivos", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Conversas diretas", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Nome de exibição alterado", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descarregar ficheiro", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Editar", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editar servidores bloqueados", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Editar nome de exibição", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Editar alcunhas da sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Editar avatar da sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote já existente!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Código de emote inválido!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configurações de emotes", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Código do emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Conversa vazia", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Ativar pacote de emotes globalmente", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Ativar encriptação", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Nunca mais poderás desativar a encriptação. Tens a certeza?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encriptada", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Encriptação", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "A encriptação não está ativada", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} terminou a chamada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Insere um endereço de correio eletrónico", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Erro ao obter localização: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Tamanho da letra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Reencaminhar", + "@forward": { + "type": "String", + "placeholders": {} + }, + "group": "Grupo", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "O grupo é público", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupos", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grupo com {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "São proibidos visitantes", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Podem entrar visitantes", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} revogou o convite para {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Esconder eventos desconhecidos", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorar", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utilizadores ignorados", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Eu cliquei na ligação", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Senha ou chave de recuperação incorretos", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convidar contacto", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convidar contacto para {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidado(a)", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} convidou {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Utilizadores(as) convidados(as) apenas", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} convidou-te para o FluffyChat.\n1. Instala o FluffyChat: https://fluffychat.im\n2. Regista-te ou inicia sessão.\n3. Abre a ligação de convite: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "está a escrever…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} entrou na conversa", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Entrar na sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} expulsou {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} expulsou e baniu {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsar da conversa", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Ativo(a) pela última vez: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Sair", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Saiu da conversa", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Claro", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carregar mais {count} participantes", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "A carregar... Por favor aguarde.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carregar mais…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Os serviços de localização estão desativados. Por favor, ativa-os para poder partilhar a sua localização.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Permissão de localização recusada. Por favor, concede permissão para poderes partilhar a tua posição.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Entrar", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Entrar em {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Sair", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Mencionar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mensagens", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silenciar conversa", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Nova conversa", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nova mensagem no FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Novo pedido de verificação!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Próximo", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Não", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Nenhuma ligação ao servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nenhuns emotes encontrados. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Só podes ativar a encriptação quando a sala não for publicamente acessível.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Parece que não tens nenhuns serviços da Google no seu telemóvel. É uma boa decisão para a sua privacidade! Para receber notificações instantâneas no FluffyChat, recomendamos que uses https://microg.org/ ou https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} não é um servidor Matrix, usar {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} alterou o avatar da conversa", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} alterou a visibilidade do histórico para: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} alterou as regras de acesso de visitantes", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} alterou a visibilidade do histórico", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sendAMessage": "Enviar a mensagem", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Enviar áudio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Enviar como texto", + "@sendAsText": { + "type": "String" + }, + "send": "Enviar", + "@send": { + "type": "String", + "placeholders": {} + }, + "appLock": "Bloqueio da aplicação", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Ainda não adicionaste uma forma de recuperar a tua palavra-passe.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sem permissão", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Não foram encontradas nenhumas salas…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificações", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "Estão {count} utilizadores(as) a escrever…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "A obter localização…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "A cópia de segurança online de chaves está ativada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ups! Infelizmente, ocorreu um erro ao configurar as notificações instantâneas.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, algo correu mal…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Abrir aplicação para ler mensagens", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Abrir câmara", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Um dos teus clientes terminou sessão", + "addAccount": "Adicionar conta", + "editBundlesForAccount": "Editar pacotes para esta conta", + "addToBundle": "Adicionar ao pacote", + "removeFromBundle": "Remover deste pacote", + "bundleName": "Nome do pacote", + "openInMaps": "Abrir nos mapas", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Ligação", + "or": "Ou", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participante", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "senha ou chave de recuperação", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Palavra-passe", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Palavra-passe esquecida", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "A palavra-passe foi alterada", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperação de palavra-passe", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Afixar", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Por favor, escolhe um código-passe", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Por favor, clica na ligação no correio eletrónico e depois continua.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Por favor, insere a tua palavra-passe", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Por favor, insere o teu código", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Por favor, insere o teu nome de utilizador", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Por favor, segue as instruções no website e clica em \"Seguinte\".", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacidade", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Salas públicas", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Razão", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} eliminou um evento", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Eliminar mensagem", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Rejeitar", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rejeitou o convite", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Remover", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Remover todos os outros dispositivos", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Perdoar nesta conversa", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remover o teu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Substituir sala com versão mais recente", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Responder", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Reportar mensagem", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "A sala foi atualizada", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versão da sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Guardar ficheiro", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Procurar", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Segurança", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Enviar ficheiro", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Enviar imagem", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Enviar mensagens", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Enviar vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} enviar um ficheiro", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} enviar um áudio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} enviar uma imagem", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} enviou um autocolante", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} enviou um vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_clearcache": "Limpar cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Criar uma conversa de grupo vazia\nUsa --no-encryption para desativar a encriptação", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descartar sessão", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Iniciar uma conversa direta\nUsa --no-encryption para desativar a encriptação", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "dehydrate": "Exportar sessão e limpar dispositivo", + "dehydrateWarning": "Esta ação não pode ser revertida. Assegura-te que guardas bem a cópia de segurança.", + "hydrate": "Restaurar a partir de cópia de segurança", + "hugContent": "{senderName} abraçou-o", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "knock": "Bater à porta", + "theyMatch": "Correspondem", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "jumpToLastReadMessage": "Saltar para a última mensagem lida", + "commandHint_cuddle": "Mandar um carinho", + "unknownDevice": "Dispositivo desconhecido", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 Oh não. Ocorreu um problema. Se quiser, pode comunicar este erro aos desenvolvedores.", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "ID global do chat", + "synchronizingPleaseWaitCounter": " A sincronizar… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "setColorTheme": "Definir tema de cor:", + "@warning": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "Isto deve ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "user": "Utilizador", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "youAcceptedTheInvitation": "👍 Aceitou o convite", + "userAndOthersAreTyping": "{username} e {count} outros estão a escrever…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "youInvitedBy": "📩 Foi convidado por {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "userIsTyping": "{username} está a escrever…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Bloqueie a aplicação quando não a usa com um código pin", + "youKickedAndBanned": "🙅 Deu kick e baniu {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "userAndUserAreTyping": "{username} e {username2} estão a escrever…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "unread": "Não lido", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Rejeitou o convite", + "newSpaceDescription": "Espaços permitem-lhe consolidar os seus chats e construir comunidades privadas ou públicas.", + "encryptThisChat": "Encriptar este chat", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "reopenChat": "Reabrir chat", + "unpin": "Desfixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "O espaço é público", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "unblockDevice": "Desbloquear Dispositivo", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "countFiles": "{count} ficheiros", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Isto pode acontecer se a mensagem foi enviada antes de ter iniciado sessão na sua conta neste dispositivo.\n\nTambém é possível que quem enviou tenha o seu dispositivo bloqueado ou ocorreu algo de errado com a conexão de internet.\n\nConsegue ler a mensagem em outra sessão? Então pode transferir a mensagem a partir do mesmo! Vá a Definições > Dispositivos e certifique-se que os seus dispositivos verificaram-se um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estão em primeiro plano, as chaves serão transmitidas automaticamente.\n\nNão quer perder as chaves ao terminar sessão ou ao mudar dispositivos? Certifique-se que tem a cópia de segurança de chat ativa nas definições.", + "shareLocation": "Partilhar localização", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasgroup": "Marcar como grupo", + "storeInAppleKeyChain": "Armazenado na Apple KeyChain", + "chatPermissions": "Permissões de chat", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "storeInAndroidKeystore": "Armazenado em Android KeyStore", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "synchronizingPleaseWait": "A sincronizar… Por favor aguarde.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "usersMustKnock": "Utilizadores têm que bater à porta", + "whyIsThisMessageEncrypted": "Porque é que esta mensagem é ilegível?", + "setChatDescription": "Definir descrição do chat", + "userLeftTheChat": "🚪 {username} saiu do chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "spaceName": "Nome do espaço", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "Importar a partir de um ficheiro .zip", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "noOtherDevicesFound": "Nenhum outro dispositivo encontrado", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "submit": "Submeter", + "@submit": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "Por favor tenha em atenção que vídeo chamadas estão atualmente em beta. Podem não funcionar como esperado ou funcionar em todas as plataformas.", + "unmuteChat": "Ativar o som do chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Não foi possível enviar! O sevidor apenas suporta anexos até {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "verified": "Verificado", + "@verified": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Definir estado", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "readUpToHere": "Lido até aqui", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Tenter enviar novamente", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "Sobre o {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "archiveRoomDescription": "O chat será movido para o arquivo. Outros utilizadores poderão ver deixou o chat.", + "exportEmotePack": "Exportar pacote de Emotes como .zip", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "experimentalVideoCalls": "Chamadas de vídeo experimentais", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Retirou o convite para o {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "skip": "Ignorar", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} partilhou a sua localização", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unbannedUser": "{username} levantou o ban a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Convidou {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "O ficheiro foi guardado em {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "invalidInput": "Input inválido!", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Demasiados pedidos. Por favor tente novamente mais tarde!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "swipeRightToLeftToReply": "Deslize da direita para a esquerda para responder", + "doNotShowAgain": "Não mostrar novamente", + "report": "reportar", + "status": "Estado", + "@status": { + "type": "String", + "placeholders": {} + }, + "changedTheChatDescription": "{username} mudou a descrição do chat", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "unverified": "Não Verificado", + "screenSharingTitle": "partilha de ecrã", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} enviou-lhe olhos esbugalhados", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Baniu {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "theyDontMatch": "Não Correspondem", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "hasKnocked": "🚪 {user} bateu à porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Abrir o link no browser", + "disableEncryptionWarning": "Por razões de segurança não pode desativar encriptação em um chat, onde já foi ativado previamente.", + "checkList": "Verificar lista", + "noOneCanJoin": "Ninguém pode juntar-se", + "wrongPinEntered": "Pin introduzido incorreto! Tente novamente daqui a {seconds} segundos...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Enviar notificações de digitação", + "accessAndVisibility": "Acesso e visibilidade", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "foregroundServiceRunning": "Esta notificação aparece quando o serviço em primeiro plano está em execução.", + "unknownEncryptionAlgorithm": "Algoritmo de encriptação desconhecido", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "importEmojis": "Importar Emojis", + "wasDirectChatDisplayName": "Esvaziar chat (era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Por favor confirme o seu Matrix ID para eliminar a sua conta.", + "@you": { + "type": "String", + "placeholders": {} + }, + "notAnImage": "Não é um ficheiro de imagem.", + "users": "Utilizadores", + "space": "Espaço", + "sourceCode": "Código fonte", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} enviou um evento do tipo {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "Por favor introduza um número maior que 0", + "youKicked": "👞 Deu kick a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "jump": "Saltar", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Desculpe... isso não é possível", + "noMoreChatsFound": "Mais nenhum chat encontrado...", + "commandHint_markasdm": "Marcar como sala de mensagem direta para o Matrix ID dado", + "cuddleContent": "{senderName} fez-lhe carinho", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Emotes recentemente utilizados aparecerão aqui...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} começou uma chamada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "settings": "Definições", + "@settings": { + "type": "String", + "placeholders": {} + }, + "youJoinedTheChat": "Juntou-se ao chat", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "statusExampleMessage": "Como está hoje?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Atualizar esta sala para a versão dada da sala", + "commandHint_hug": "Enviar um abraço", + "replace": "Subsituir", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "youUnbannedUser": "Levantou o ban a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "newSpace": "Novo espaço", + "unknownEvent": "Evento de '{type}' desconhecido", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "share": "Partilhar", + "@share": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Enviar alguns olhos esbugalhados", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "createGroup": "Criar grupo", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "custom": "Personalizado", + "noBackupWarning": "Aviso! Sem ativar cópia de segurança de chat, perderá acesso às suas mensagens encriptadas. É altamente recomendado que ative a cópia de segurança de chat primeiro antes de terminar sessão.", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "importNow": "Importar agora", + "noChatsFoundHere": "Não foi encontrado nenhum chat aqui. Comece um chat novo com alguém ao usar o botão abaixo. ⤵️", + "changedTheChatName": "{username} mudou o nome do chat", + "invite": "Convidar", + "countInvited": "{count} convidados", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "unsupportedAndroidVersionLong": "Esta funcionalidade requer uma versão de Android mais nova. Por favor verifique se há atualização ou suporter do Lineage OS.", + "inviteGroupChat": "📨 Convite para chat em grupo", + "storeSecurlyOnThisDevice": "Armazenado de forma segura neste dispositivo", + "screenSharingDetail": "Está a partilhar o seu ecrã no FluffyChat", + "discardEdits": "Tem mudanças não guardadas. Descartar as suas edições?", + "@discardEdits": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb new file mode 100644 index 0000000000..acc37b1990 --- /dev/null +++ b/lib/l10n/intl_ro.arb @@ -0,0 +1,2211 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.918296", + "about": "Despre", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Accept", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} a aceptat invitați", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Cont", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} a activat criptarea end-to-end", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administrator", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "poreclă", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} a acceptat apelul", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Oricine se poate alătura", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhivă", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Vizitatorii \"guest\" se pot alătura", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ești sigur?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Pentru a putea conecta cealaltă persoană, te rog introdu parola sau cheia ta de recuperare.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accepți cererea de verificare de la {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Interzis din conversație", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Interzis", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} a interzis pe {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blochează dispozitiv", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Anulează", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Schimbă numele dispozitiv", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} a schimbat poza conversați", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_unban": "Dezinterziceți utilizatorul ales din această cameră", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "devices": "Dispozitive", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Chaturi directe", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} a terminat apelul", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "groupWith": "Grup cu {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "kickFromChat": "Dați afară din chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} a trimis informație de apel", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "no": "Nu", + "@no": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Trimiteți mesaje", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "submit": "Trimiteți", + "@submit": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "A reușit verificarea!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Mesaj vocal", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} a reacționat cu {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "changePassword": "Schimbați parola", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "next": "Următor", + "@next": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Fără conexiune la server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Nu ați adăugat încă nici un mod de recuperare pentru parola voastră.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificări", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Deschideți aplicația să citiți mesajele", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Deschideți camera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "share": "Partajați", + "@share": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Partajați locația", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Săriți peste", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codul surs", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Spațiul este public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Numele spațiului", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "Debloca dispozitiv", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispozitiv necunoscut", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "V-am trimis un email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Nu mai participați în acest chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Cheia voastră publică", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "placeCall": "Faceți apel", + "voiceCall": "Apel vocal", + "unsupportedAndroidVersion": "Versiune de Android nesuportat", + "userIsTyping": "{username} tastează…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "screenSharingTitle": "partajarea de ecran", + "changedTheRoomInvitationLink": "{username} a schimbat linkul de invitație", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chats": "Chaturi", + "@chats": { + "type": "String", + "placeholders": {} + }, + "invited": "Invitat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "login": "Conectați-vă", + "@login": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Backup de cheie online este activat", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "removeFromBundle": "Stergeți din acest pachet", + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Deschideți pe hartă", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Vă rugăm să introduceți pinul vostru", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "privacy": "Confidențialitate", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Redactați mesaj", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versiunea camerei", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "security": "Securitate", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Trimiteți fișier", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Stabiliți status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Configurări", + "@settings": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} a retras invitația pentru {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajutor", + "@help": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Algoritm de criptare necunoscut", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unmuteChat": "Dezamuțați chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Anulează fixarea", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} a ridicat interzicerea lui {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "youBannedUser": "Ați interzis pe {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "Serverul reportează că fișierul este prea mare să fie trimis.", + "sorryThatsNotPossible": "Scuze... acest nu este posibil", + "enableEncryptionWarning": "Activând criptare, nu mai puteți să o dezactivați în viitor. Sunteți sigur?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} nu este o comandă.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "you": "Voi", + "@you": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "Vă rugăm să luați notă că apeluri video sunt în beta. Se poate că nu funcționează normal sau de loc pe fie care platformă.", + "pinMessage": "Fixați în cameră", + "wasDirectChatDisplayName": "Chat gol (a fost {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "pleaseClickOnLink": "Vă rugăm să deschideți linkul din email și apoi să procedați.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "reportUser": "Reportați utilizator", + "encryptionNotEnabled": "Criptare nu e activată", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Camere Publice", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Adăugați în pachet", + "theyDontMatch": "Nu sunt asemănători", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Încărcând... Vă rugăm să așteptați.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Sunt asemănători", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Scanați cod QR", + "addAccount": "Adăugați cont", + "experimentalVideoCalls": "Apeluri video experimentale", + "confirmEventUnpin": "Sunteți sigur că doriți să anulați permanent fixarea evenimentului?", + "emojis": "Emoji-uri", + "users": "Utilizatori", + "foregroundServiceRunning": "Această notificare apare când serviciul de foreground rulează.", + "currentlyActive": "Activ acum", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "isTyping": "tastează…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Backup de chat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Repetați parola", + "changeTheme": "Schimbați tema aplicației", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Ștergeți arhiva", + "commandHint_markasdm": "Marcați ca cameră de mesaje directe", + "commandHint_markasgroup": "Marcați ca grup", + "commandHint_ban": "Interziceți acesul utilizatorului ales din această cameră", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Ștergeți cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Creați un grup de chat gol\nFolosiți --no-encryption să dezactivați criptare", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Renunțați sesiunea", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_kick": "Dați afară pe utilizatorul ales din această cameră", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Renunțați la această cameră", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomavatar": "Alegeți un avatar pentru această cameră (foloșește mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Alegeți un displayname pentru această cameră", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Stabiliți nivelul de putere a utilizatorul ales (implicit: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Trimiteți text simplu/neformatat", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Trimiteți răspuns ca reacție", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Trimiteți text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandInvalid": "Comandă nevalibilă", + "@commandInvalid": { + "type": "String" + }, + "compareEmojiMatch": "Vă rugăm să comparați emoji-urile", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vă rugăm să comparați numerele", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Dezcriptarea mesajului a eșuat: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "Creați", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬{username} a creat chatul", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Spațiu nou", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "forward": "Înainte", + "@forward": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupuri", + "@groups": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Ascunde evenimente necunoscute", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorați", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Utilizatori ignorați", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Am făcut click pe link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Parolă sau cheie de recuperare incorectă", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invitați contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Invitați contact la {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "inviteText": "{username} v-a invitat la FluffyChat.\n1. Instalați FluffyChat: https://fluffychat.im\n2. Înregistrați-vă sau conectați-vă\n3. Deschideți invitația: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinedTheChat": "👋{username} a intrat în chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "👞{username} a dat afară pe {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "Ultima dată activ: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Renunțați", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "A plecat din chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Luminat", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Încărcați încă mai {count} participanți", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Exportați sesiunea și ștergeți dispozitivul", + "hydrate": "Restaurați din fișier backup", + "loadMore": "Încarcă mai multe…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "logout": "Deconectați-vă", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Menționați", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mesaje", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nu s-a găsit nici un emote. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Criptare nu poate fi activată până când camera este accesibilă public.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Fără permisie", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nici o cameră nu s-a găsit…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Obținând locație…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ups, ceva a eșuat…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "reject": "Respingeți", + "@reject": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Revoca interzicerea din chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Camera a fost actualizată", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} a început un apel", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Ce faceți?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Prea multe cereri. Vă rugăm să încercați din nou mai tărziu!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Evenimet necunoscut '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Începeți verificare", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Apel video", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Vizibilitatea istoria chatului", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Vizibil pentru toți participanți", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Așteptând pe partenerul să accepte emoji-ul…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Așteptând pe partenerul să accepte numerele…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Avertizment!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Cine poate face care acțiune", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Cine se poate alătura la acest grup", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "De ce doriți să reportați acest conținut?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Cu acestea adrese puteți să vă recuperați parola.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Ați fost interzis din acest chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Info mesajului", + "time": "Timp", + "sender": "Trimițător", + "openGallery": "Deschideți galeria", + "removeFromSpace": "Eliminați din spațiu", + "unsupportedAndroidVersionLong": "Această funcție are nevoie de o versiune de Android mai nouă. Vă rugăm să verificați dacă sunt actualizări sau suport de la Lineage OS.", + "youRejectedTheInvitation": "Ați respins invitația", + "youJoinedTheChat": "Va-ți alăturat la chat", + "youAcceptedTheInvitation": "👍Ați acceptat invitația", + "youHaveWithdrawnTheInvitationFor": "Ați retras invitația pentru {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩Ați fost invitat de {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩Ați invitat pe {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞Ați dat afară pe {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Ați ridicat interzicerea lui {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Stoca în Android KeyStore", + "user": "Utilizator", + "custom": "Personalizat", + "screenSharingDetail": "Partajați ecranul în FluffyChat", + "storeSecurlyOnThisDevice": "Stoca sigur pe acest dispozitiv", + "whyIsThisMessageEncrypted": "De ce este acest mesaj ilizibil?", + "newSpace": "Spațiu nou", + "doNotShowAgain": "Nu se mai apară din nou", + "newSpaceDescription": "Spațiile vă permit să vă consolidați chaturile și să stabiliți comunități private sau publice.", + "encryptThisChat": "Criptați acest chat", + "disableEncryptionWarning": "Pentru motive de securitate, nu este posibil să dezactivați criptarea unui chat în care criptare este activată.", + "noBackupWarning": "Avertisment! Fără să activați backup de chat, veți pierde accesul la mesajele voastre criptate. E foarte recomandat să activați backup de chat înainte să vă deconectați.", + "noOtherDevicesFound": "Nu s-a găsit alte dispozitive", + "fileHasBeenSavedAt": "Fișierul a fost salvat la {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jump": "Săriți", + "report": "reportați", + "jumpToLastReadMessage": "Săriți la ultimul citit mesaj", + "guestsCanJoin": "Musafiri pot să se alăture", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Mărimea fontului", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "De la alăturare", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "De la invitația", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grupul este public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "Musafiri sunt interziși", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅{username} a dat afară și a interzis pe {targetName} din cameră", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "dehydrateWarning": "Această actiune nu poate fi anulată. Asigurați-vă că păstrați fișierul backup.", + "joinRoom": "Alăturați la cameră", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Conectați-vă la {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "locationDisabledNotice": "Servicile de locație sunt dezactivate. Vă rugăm să le activați să împărțiți locația voastră.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Se pare că nu aveți serviciile google pe dispozitivul vostru. Această decizie este bună pentru confidențialitatea voastră! Să primiți notificari push în FluffyChat vă recomandăm https://microg.org/ sau https://unifiedpush.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} nu este server matrix, înlocuiți cu {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "numUsersTyping": "{count} utilizatori tastează…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "or": "Sau", + "@or": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Așteptând pe partenerul să accepte cererea…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Întunecat", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} sa partajat locația", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "synchronizingPleaseWait": "Sincronizează... Vă rugăm să așteptați.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Încercați să trimiteți din nou", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} și {username2} tastează…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} a plecat din chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} și {count} alți tastează…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userSentUnknownEvent": "{username} a trimis un eveniment {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Neverificat", + "verifyTitle": "Verificând celălalt cont", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Vizibil pentru toți", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "readUpToHere": "Citit până aici", + "changedTheHistoryVisibility": "{username} a schimbat vizibilitatea istoriei chatului", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "copy": "Copiați", + "@copy": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displayname a fost schimbat", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "Numai utilizatori invitați", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configurați chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copiat în clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤{username} a trimis audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAFile": "📁{username} a trimis un fișier", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "locationPermissionDeniedNotice": "Permisiunea locației blocată. Vă rugăm să o dezblocați să împărțiți locația voastră.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "newChat": "Chat nou", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Mesaj nou în FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} a trimis o poză", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥{username} a trimis un video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} a trimis un sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "countFiles": "{count} fișiere", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hugContent": "{senderName} vă îmbrățișează", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Stoca în Apple KeyChain", + "addEmail": "Adăugați email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Vă rugăm să confirmați Matrix ID-ul vostru să ștergeți contul vostru.", + "cuddleContent": "{senderName} vă îmbrățișează", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "supposedMxid": "ID-ul ar trebuii să fie {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_html": "Trimiteți text format ca HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "addToSpace": "Adăugați la spațiu", + "commandHint_hug": "Trimiteți o îmbrățișare", + "badServerLoginTypesException": "Homeserver-ul suportă următoarele feluri de login:\n{serverVersions}\nDar această aplicație suportă numai:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} a schimbat regulile pentru acesul musafirilor la: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} a schimbat regulile de alăturare la: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "cantOpenUri": "Nu se poate deschide URI-ul {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} s-a schimbat displayname la: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} a schimbat regulile pentru acesul musafirilor", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Schimbați homeserver-ul", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Conținutul a fost reportat la administratori serverului", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalii de chat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_dm": "Porniți un chat direct\nFolosiți --no-encryption să dezactivați criptare", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_me": "Descrieți-vă", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "contactHasBeenInvitedToTheGroup": "Contactul a fost invitat la grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copiați în clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} participanți", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "delete": "Ștergeți", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Această acțiune va dezactiva contul vostru. Nu poate fi anulat! Sunteți sigur?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ștergeți contul", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Nivel de permisiuni implicită", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ștergeți mesajul", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Descărcați fișierul", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activați pachet de emote global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Editați servere blocate", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Shortcode de emote nevalibil!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "edit": "Editați", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Schimbați pseudonimele camerei", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Chat gol", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activați criptare", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Criptat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Schimbați displayname", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Schimbați avatarul din cameră", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote deja există!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Configurări Emote", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Shortcode de emote", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "encryption": "Criptare", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Introduceți o adresă email", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Obținerea locației a eșuat: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "youKickedAndBanned": "🙅Ați dat afară și interzis pe {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noKeyForThisMessage": "Această chestie poate să se întâmple când mesajul a fost trimis înainte să vă conectați contul cu acest dispozitiv.\n\nO altă explicație ar fi dacă trimițătorul a blocat dispozitivul vostru sau ceva s-a întâmplat cu conexiunea la internet\n\nPuteți să citiți mesajul în o altă seșiune? Atunci puteți să transferați mesajul de acolo! Mergeți la Configurări > Dispozitive și verificați că dispozitivele s-au verificat. Când deschideți camera în viitor și ambele seșiune sunt în foreground, cheile va fi transmise automat. \n\nDoriți să îți păstrați cheile când deconectați sau schimbați dispozitive? Fiți atenți să activați backup de chat în configurări.", + "sendAsText": "Trimiteți ca text", + "@sendAsText": { + "type": "String" + }, + "reportErrorDescription": "Ceva a eșuat. Vă rugăm să încercați din nou mai tărziu. Dacă doriți, puteți să reportați problema la dezvoltatori.", + "openLinkInBrowser": "Deschideți linkul în browser", + "send": "Trimiteți", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Trimiteți un mesaj", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Trimiteți audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Trimiteți video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Trimiteți imagine", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Stabiliți ca pseudonimul primar", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Scrieți un mesaj…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Da", + "@yes": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Marcați ca citit", + "oopsPushError": "Ups! Din păcate, o eroare s-a întâmplat cu stabilirea de notificări push.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Unul dintre clienților voștri a fost deconectat", + "editBundlesForAccount": "Editați pachetele pentru acest cont", + "bundleName": "Numele pachetului", + "link": "Link", + "passphraseOrKey": "frază de acces sau cheie de recuperare", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Parolă", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Parola uitată", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parola a fost schimbată", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperare parolei", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixați", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Vă rugăm să alegeți un passcode", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Vă rugăm să introduceți parola voastră", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Vă rugăm să introduceți username-ul vostru", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vă rugăm să urmați instrucțiunele pe website și apoi să apăsați pe următor.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reason": "Motiv", + "@reason": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} a respins invitația", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} a redactat un eveniment", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Eliminați toate celelalte dispozitive", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ștergeți avatarul", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Înlocuiți camera cu versiune mai nouă", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Răspundeți", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Raportați mesajul", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Salvați fișierul", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Căutați", + "@search": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Amuțați chatul", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Anima automatic stickere și emote animate", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "Trimite cu tasta enter", + "changedTheChatPermissions": "{username} a schimbat permisiunile chatului", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "invitedUser": "📩{username} a invitat {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "newVerificationRequest": "Cerere de verificare nouă!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "remove": "Eliminați", + "@remove": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Criptarea a fost corupată", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Alegeți o parolă robustă", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Trimiteți o îmbrățișare", + "googlyEyesContent": "{senderName} v-a trimis ochi googly", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Sunteți sigur că doriți să vă deconectați?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} a schimbat pseudonimele camerei", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeYourAvatar": "Schimbați avatarul vostru", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Alăturați-vă la camera alesă", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "Invitați utilizatorul ales la această cameră", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "changeTheNameOfTheGroup": "Schimbați numele grupului", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Trimiteți câțiva ochi googly", + "all": "Toate", + "@all": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changedTheJoinRules": "{username} a schimbat regulile de alăturare", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} s-a schimbat avatarul", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "appLock": "Lacăt aplicație", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} a schimbat vizibilitatea istoriei chatului la: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "close": "Închideți", + "@close": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "Deschide din nou chatul", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb new file mode 100644 index 0000000000..5a557e19d6 --- /dev/null +++ b/lib/l10n/intl_ru.arb @@ -0,0 +1,2709 @@ +{ + "@@locale": "ru", + "@@last_modified": "2021-08-14 12:41:09.903021", + "about": "О проекте", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Принять", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} принял(а) приглашение", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Учётная запись", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} активировал(а) сквозное шифрование", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Добавить электронную почту", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Администратор", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "псевдоним", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Все", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ответил(а) на звонок", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Каждый может присоединиться", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Блокировка приложения", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Архив", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Разрешено ли гостям присоединяться?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Вы уверены?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Вы действительно хотите выйти?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Для подписи ключа другого пользователя, пожалуйста, введите вашу парольную фразу или ключ восстановления.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Принять этот запрос подтверждения от {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Автоматически воспроизводить анимированные стикеры и эмодзи", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Домашний сервер поддерживает следующие типы входа в систему:\n{serverVersions}\nНо это приложение поддерживает только:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Заблокировать в чате", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Заблокирован(а)", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} заблокировал(а) {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Заблокировать устройство", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Заблокировано", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Отмена", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Не удается открыть URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Изменить имя устройства", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} изменил(а) аватар чата", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} изменил(а) права доступа к чату", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} изменил(а) отображаемое имя на '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} изменил(а) правила гостевого доступа", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} изменил(а) правила гостевого доступа на {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} изменил(а) видимость истории", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} изменил(а) видимость истории на {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} изменил(а) правила присоединения", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} изменил(а) правила присоединения на {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} изменил(а) аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} изменил(а) псевдонимы комнаты", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} изменил(а) ссылку для приглашения", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Изменить пароль", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Изменить домашний сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Персонализация", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Изменить название группы", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Изменить свой аватар", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шифрование было повреждено", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Чат", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Резервное копирование чата", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Детали чата", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Чаты", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Выберите надёжный пароль", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Очистить архив", + "close": "Закрыть", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Заблокировать данного пользователя в этой комнате", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Отправить текст формата HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Пригласить данного пользователя в эту комнату", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Присоединиться к данной комнате", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Удалить данного пользователя из этой комнаты", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Покинуть эту комнату", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Опишите себя", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Установите свою фотографию для этой комнаты (автор: mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Задайте отображаемое имя для этой комнаты", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Установить уровень прав данного пользователя (по умолчанию: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Отправить неотформатированный текст", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Отправить ответ как реакцию", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Отправить текст", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Разблокировать данного пользователя в этой комнате", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Недопустимая команда", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} не является командой.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Сравните эмодзи", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Сравните числа", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Настроить чат", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Контакт был приглашен в группу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "О контенте было сообщено администраторам сервера", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Скопировано в буфер обмена", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Копировать", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Скопировать в буфер обмена", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Не удалось расшифровать сообщение: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} участника(ов)", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Создать", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} создал(а) чат", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Новое пространство", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "В настоящее время активен(а)", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Тёмная", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Это деактивирует вашу учётную запись пользователя. Данное действие не может быть отменено! Вы уверены?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Уровень разрешений по умолчанию для новых пользователей", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Удалить", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Удалить аккаунт", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Удалить сообщение", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Устройства", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Личные чаты", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Отображаемое имя было изменено", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Скачать файл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Редактировать", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Редактировать заблокированные серверы", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Отображаемое имя", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Редактировать псевдонимы комнаты", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Изменить аватар комнаты", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Эмодзи уже существует!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Недопустимый код эмодзи!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Настройки эмодзи", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Код эмодзи", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Пустой чат", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Включить набор эмодзи глобально", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Включить шифрование", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Вы больше не сможете отключить шифрование. Вы уверены?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Зашифровано", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шифрование", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шифрование не включено", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} завершил(а) звонок", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Введите адрес электронной почты", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Ошибка получения местоположения: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Размер шрифта", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Переслать", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "С момента присоединения", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "С момента приглашения", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Группа", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Публичная группа", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Группы", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Группа с {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Гости не могут присоединиться", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Гости могут присоединиться", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} отозвал(а) приглашение для {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Помощь", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Скрыть неизвестные события", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Игнорировать", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Игнорируемые пользователи", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Я перешёл по ссылке", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Неверный пароль или ключ восстановления", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Пригласить контакт", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Пригласить контакт в {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Приглашён", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} пригласил(а) {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Только приглашённым пользователям", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} пригласил(а) вас в FluffyChat. \n1. Посетите https://fluffychat.im и установите приложение \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "печатает…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} присоединился(ась) к чату", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Присоединиться к комнате", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} выгнал(а) {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} выгнал(а) и заблокировал(а) {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Выгнать из чата", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Последнее посещение: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Покинуть", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Покинуть чат", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Светлая", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "Загрузка... Пожалуйста, подождите.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Загрузить больше…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Службы определения местоположения отключены. Включите их, чтобы иметь возможность обмениваться информацией о своем местоположении.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Разрешение на определение местоположения отклонено. Пожалуйста, предоставьте это разрешение, чтобы иметь возможность делиться своим местоположением.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Войти", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Войти в {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Выйти", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Упомянуть", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Сообщения", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Модератор", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Отключить уведомления", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Новый чат", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Новое сообщение во FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Новый запрос на подтверждение!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Далее", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Нет", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Нет соединения с сервером", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Эмодзи не найдены 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Вы можете активировать шифрование только тогда, когда комната перестает быть общедоступной.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Похоже, у вас нет служб Google на вашем телефоне. Это хорошее решение для вашей конфиденциальности! Для получения push-уведомлений во FluffyChat мы рекомендуем использовать ntfy. С ntfy или другим провайдером единых уведомлений вы можете получать push-уведомления безопасным способом передачи данных. Скачать ntfy можно из F-Droid или из Play Маркета.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} не является matrix-сервером, использовать {server2} вместо него?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Вы ещё не добавили способ восстановления пароля.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Нет прав доступа", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Комнаты не найдены…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Уведомления", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} пользователей печатают…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Получение местоположения…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Ок", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Резервное копирование ключей на сервере включено", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Ой! К сожалению, при настройке push-уведомлений произошла ошибка.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ой, что-то пошло не так…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Откройте приложение для чтения сообщений", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Открыть камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Открыть на картах", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Или", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Участник", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "пароль или ключ восстановления", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Пароль", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Забыли пароль", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Пароль был изменён", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Восстановление пароля", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Закрепить", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Пожалуйста, выберите код доступа", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Пожалуйста, нажмите на ссылку в электронной почте, для того чтобы продолжить.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Пожалуйста, введите ваш пароль", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Пожалуйста, введите свой пин-код", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Пожалуйста, введите имя пользователя", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Следуйте инструкциям на веб-сайте и нажмите «Далее».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Конфиденциальность", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Публичные комнаты", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Причина", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} отредактировал(а) событие", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Отредактировать сообщение", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Отказать", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} отклонил(а) приглашение", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Удалить", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Удалить все другие устройства", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Разблокировать в чате", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Удалить свой аватар", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Заменить комнату более новой версией", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Ответить", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Сообщить о сообщении", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Комната обновлена", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Версия комнаты", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Сохранить файл", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Поиск", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Безопасность", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Прислать", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Отправить сообщение", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Отправить как текст", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Отправить аудио", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Отправить файл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Отправить изображение", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Отправить сообщения", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Отправить видео", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} отправил(а) файл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} отправил(а) аудио", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} отправил(а) изображение", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} отправил(а) стикер", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} отправил(а) видео", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} отправил(а) информацию о звонке", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Установить как основной псевдоним", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Задать статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Настройки", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Поделиться", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} поделился(ась) местоположением", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Поделиться местоположением", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Пропустить", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Исходный код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Публичное пространство", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Название пространства", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} начал(а) звонок", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Статус", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Как у вас сегодня дела?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Отправить", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Синхронизация… Пожалуйста, подождите.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Системная", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Они не совпадают", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Они совпадают", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Слишком много запросов. Пожалуйста, повторите попытку позже!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Попробуйте отправить ещё раз", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} разблокировал(а) {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Разблокировать устройство", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Неизвестное устройство", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Неизвестный алгоритм шифрования", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Неизвестное событие '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Включить уведомления", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Открепить", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} и еще {count} печатают…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} и {username2} печатают…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} печатает…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} покинул(а) чат", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} отправил(а) событие типа \"{type}\"", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Проверено", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Начать проверку", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Вы успешно проверены!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Проверка другой учётной записи", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Видеозвонок", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Видимость истории чата", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Видима для всех участников", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Видна всем", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Отправить голосовое сообщение", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Жду, когда партнер примет запроc…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Жду, когда партнер примет эмодзи…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "В ожидании партнёра, чтобы принять числа…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Предупреждение!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Мы отправили вам электронное письмо", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Кто и какое действие может выполнять", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Кому разрешено вступать в эту группу", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Почему вы хотите сообщить об этом?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "По этим адресам вы можете восстановить свой пароль.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Напишите сообщение…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Да", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Вы", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Вы больше не участвуете в этом чате", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Вы были заблокированы в этом чате", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш открытый ключ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Добавить в пространство", + "scanQrCode": "Сканировать QR-код", + "sendOnEnter": "Отправлять по Enter", + "bundleName": "Название пакета", + "removeFromBundle": "Удалить из этого пакета", + "addToBundle": "Добавить в пакет", + "editBundlesForAccount": "Изменить пакеты для этой учетной записи", + "addAccount": "Добавить учетную запись", + "link": "Ссылка", + "oneClientLoggedOut": "Один из ваших клиентов вышел", + "unverified": "Не проверено", + "commandHint_clearcache": "Очистить кэш", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "Удалить сеанс", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Начните личный чат\nИспользуйте --no-encryption, чтобы отключить шифрование", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "messageInfo": "Информация о сообщении", + "openGallery": "Открыть галерею", + "removeFromSpace": "Удалить из пространства", + "commandHint_create": "Создайте пустой групповой чат\nИспользуйте --no-encryption, чтобы отключить шифрование", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "sender": "Отправитель", + "time": "Время", + "repeatPassword": "Повторите пароль", + "markAsRead": "Отметить как прочитанное", + "reportUser": "Сообщить о пользователе", + "reactedWith": "{sender} реагирует с {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Эмодзи", + "voiceCall": "Голосовой звонок", + "unsupportedAndroidVersion": "Неподдерживаемая версия Android", + "unsupportedAndroidVersionLong": "Для этой функции требуется более новая версия Android. Проверьте наличие обновлений или поддержку Lineage OS.", + "placeCall": "Совершить звонок", + "videoCallsBetaWarning": "Обратите внимание, что видеозвонки в настоящее время находятся в бета-версии. Они могут работать не так, как ожидалось, или вообще не работать на всех платформах.", + "experimentalVideoCalls": "Экспериментальные видеозвонки", + "pinMessage": "Прикрепить к комнате", + "confirmEventUnpin": "Вы уверены, что хотите навсегда открепить событие?", + "youRejectedTheInvitation": "Вы отклонили приглашение", + "youAcceptedTheInvitation": "👍 Вы приняли приглашение", + "youUnbannedUser": "Вы разблокировали {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Вы присоединились к чату", + "youKickedAndBanned": "🙅 Вы выгнали и заблокировали {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Вы пригласили {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Вы выгнали {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Вы отозвали приглашение для {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "Вы заблокировали {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Вы были приглашены {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "Пользователи", + "storeSecurlyOnThisDevice": "Сохранить на этом устройстве", + "storeInAndroidKeystore": "Сохранить в Android KeyStore", + "storeInAppleKeyChain": "Сохранить в Apple KeyChain", + "user": "Пользователь", + "confirmMatrixId": "Пожалуйста, подтвердите Matrix ID, чтобы удалить свою учётную запись.", + "supposedMxid": "Это должно быть {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "custom": "Пользовательское", + "hydrate": "Восстановить из файла резервной копии", + "dehydrate": "Экспорт сеанса и очистка устройства", + "dehydrateWarning": "Это действие не может быть отменено. Убедитесь, что вы безопасно сохранили файл резервной копии.", + "screenSharingDetail": "Вы делитесь своим экраном в FuffyChat", + "newSpace": "Новое пространство", + "commandHint_markasdm": "Пометить как комнату личных сообщений", + "foregroundServiceRunning": "Это уведомление появляется, когда запущена основная служба.", + "commandHint_markasgroup": "Пометить как группу", + "whyIsThisMessageEncrypted": "Почему это сообщение нечитаемо?", + "noKeyForThisMessage": "Это может произойти, если сообщение было отправлено до того, как вы вошли в свою учетную запись на данном устройстве.\n\nТакже возможно, что отправитель заблокировал ваше устройство или что-то пошло не так с интернет-соединением.\n\nВы можете прочитать сообщение на другой сессии? Тогда вы можете перенести сообщение с неё! Перейдите в Настройки > Устройства и убедитесь, что ваши устройства проверили друг друга. Когда вы откроете комнату в следующий раз и обе сессии будут открыты, ключи будут переданы автоматически.\n\nВы не хотите потерять ключи при выходе из системы или переключении устройств? Убедитесь, что вы включили резервное копирование чата в настройках.", + "screenSharingTitle": "общий доступ к экрану", + "fileIsTooBigForServer": "Отправка не удалась! Сервер поддерживает только вложения размером до {max}.", + "sorryThatsNotPossible": "Извините... это невозможно", + "openLinkInBrowser": "Открыть ссылку в браузере", + "fileHasBeenSavedAt": "Файл сохранён в {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Отправить объятия", + "readUpToHere": "Непрочитанное", + "commandHint_hug": "Отправить обнимашки", + "cuddleContent": "{senderName} нежно обнимает вас", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} обнимает Вас", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jump": "Перейти", + "doNotShowAgain": "Не показывать снова", + "newSpaceDescription": "Пространства позволяют объединять Ваши чаты и создавать частные или общедоступные сообщества.", + "disableEncryptionWarning": "В целях безопасности Вы не можете отключить шифрование в чате, где оно было включено.", + "noBackupWarning": "Внимание! Без резервного копиирования, Вы потеряете доступ к своим зашифрованным сообщениям. Крайне рекомендуется включить резервное копирование перед выходом.", + "noOtherDevicesFound": "Другие устройства не найдены", + "reportErrorDescription": "😭 О, нет. Что-то пошло не так. При желании вы можете сообщить об этой ошибке разработчикам.", + "report": "пожаловаться", + "jumpToLastReadMessage": "Последнее прочитанное сообщение", + "wasDirectChatDisplayName": "Пустой чат (был {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "encryptThisChat": "Зашифровать этот чат", + "reopenChat": "Открыть чат заново", + "commandHint_googly": "Отправить выпученные глаза", + "notAnImage": "Это не изображение.", + "importNow": "Импортировать сейчас", + "importEmojis": "Импортировать эмодзи", + "importFromZipFile": "Импортировать из .zip файла", + "exportEmotePack": "Экспортировать набор эмодзи как .zip", + "replace": "Заменить", + "googlyEyesContent": "{senderName} выпучил глаза", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Отправлять уведомления о наборе текста", + "createGroup": "Создать группу", + "tryAgain": "Повторите попытку", + "chatPermissions": "Права в чате", + "chatDescription": "Описание чата", + "chatDescriptionHasBeenChanged": "Описание чата изменено", + "noChatDescriptionYet": "Описание чата не создано.", + "invalidServerName": "Недопустимое имя сервера", + "optionalRedactReason": "(Необязательно) Причина редактирования...", + "redactMessageDescription": "Сообщение будет отредактировано для всех участников. Это необратимо.", + "messagesStyle": "Сообщения:", + "shareInviteLink": "Поделиться приглашением", + "redactedBy": "{username} отредактировал это событие", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Личный чат", + "redactedByBecause": "{username} отредактировал это событие. Причина: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Установить описание чата", + "setColorTheme": "Цветовая тема:", + "invite": "Пригласить", + "inviteGroupChat": "📨 Вас пригласили в групповой чат", + "invalidInput": "Недопустимый ввод!", + "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "emoteKeyboardNoRecents": "Недавно использованные эмодзи появятся здесь...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "banUserDescription": "Заблокированные в чате пользователи не смогут перезайти в чат, пока они не будут разблокированны.", + "removeDevicesDescription": "Вы выйдете с этого устройства и больше не будете получать сообщения.", + "unbanUserDescription": "Пользователь сможет при желании зайти в чат снова.", + "pushNotificationsNotAvailable": "Push-уведомления недоступны", + "makeAdminDescription": "Как только вы назначите этого пользователя администратором, вы не сможете этого отменить, так как их права доступа и ваши будут одинаковы.", + "archiveRoomDescription": "Чат переместится в архив. Другим пользователям будет видно, что вы вышли из чата.", + "hasKnocked": "🚪 {user} постучался", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Узнать больше", + "roomUpgradeDescription": "Затем чат будет воссоздан с новой версией комнаты. Все участники будут уведомлены о необходимости перейти в новый чат. Вы можете узнать больше о версиях комнат на https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Пожалуйста введите число больше 0", + "kickUserDescription": "Пользователь будет изгнан из чата, но не будет заблокирован. В публичных чатах пользователь может перезайти когда угодно.", + "blockListDescription": "Вы можете заглушить тревожащих вас пользователей. Вы не будете получать сообщения или приглашения в комнату от пользователей из вашего личного чёрного списка.", + "blockedUsers": "Заглушённые пользователи", + "block": "Заглушить", + "blockUsername": "Игнорировать имя пользователя", + "createGroupAndInviteUsers": "Создать и начать приглашать", + "groupCanBeFoundViaSearch": "Группа может быть найдена поиском", + "noUsersFoundWithQuery": "К сожалению пользователей с именем \"{query}\" не найдено. Убедитесь, что вы не совершили опечатку.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "Ваш глобальный идентификатор - ", + "commandHint_sendraw": "Отправить сырой json", + "wrongRecoveryKey": "Простите... судя по всему это неверный ключ восстановления.", + "groupName": "Название группы", + "databaseMigrationTitle": "База данных оптимизированна", + "searchChatsRooms": "Поиск #чатов, @людей...", + "databaseMigrationBody": "Пожалуйста, подождите. Это может занять некоторое время.", + "publicSpaces": "Публичные пространства", + "passwordIsWrong": "Вы ввели неверный пароль", + "pleaseEnterYourCurrentPassword": "Пожалуйста, введите свой текущий пароль", + "nothingFound": "Ничего не найдено...", + "newPassword": "Новый пароль", + "passwordsDoNotMatch": "Пароли не совпадают", + "select": "Выбрать", + "pleaseChooseAStrongPassword": "Пожалуйста, подберите сильный пароль", + "leaveEmptyToClearStatus": "Чтобы очистить статус, оставьте поле пустым.", + "joinSpace": "Присоединиться к пространству", + "searchForUsers": "Поиск @пользователей...", + "thisDevice": "Данное устройство:", + "initAppError": "Произошла ошибка при запуске приложения", + "sessionLostBody": "Ваш сеанс утерян. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Приложение пытается восстановить сеанс из резервной копии. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "addChatOrSubSpace": "Добавить чат или субпространство", + "sendReadReceipts": "Отправка квитанций о прочтении", + "verifyOtherUser": "🔐 Подтвердить другого пользователя", + "verifyOtherDevice": "🔐 Подтвердить другое устройство", + "sendReadReceiptsDescription": "Другие участники чата могут видеть, когда вы прочитали сообщение.", + "verifyOtherUserDescription": "Если вы подтвердите другого пользователя, то вы можете быть уверены зная, кому вы действительно пишете. 💪\n\nКогда вы начинаете подтверждение, вы и другой пользователь увидите всплывающее окно в приложении. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом.\n\nЛучший способ сделать это - встретиться в реальной жизни или по видео звонку. 👭", + "verifyOtherDeviceDescription": "При подтверждении другого устройства эти устройства могут обмениваться ключами, повышая общую безопасность. 💪 При запуске подтверждения в приложении на обоих устройствах появится всплывающее окно. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом. Лучше иметь оба устройства под рукой перед началом проверки. 🤳", + "formattedMessagesDescription": "Отображать содержимое расширенных сообщений, такой как жирный текст, с помощью Markdown.", + "acceptedKeyVerification": "{sender} принял(а) подтверждение ключей", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} отклонил(а) подтверждение ключей", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Другие участники чата могут видеть, когда вы набираете новое сообщение.", + "formattedMessages": "Форматированные сообщения", + "startedKeyVerification": "{sender} начал(а) подтверждение ключей", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} готов(а) к подтверждению ключей", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} запросил(а) подтверждение ключей", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} завершил(а) подтверждение ключей", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Входящие сообщения", + "stickers": "Стикеры", + "discover": "Исследовать", + "globalChatId": "ID глобального чата", + "customEmojisAndStickersBody": "Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.", + "knocking": "Стучаться", + "accessAndVisibility": "Доступность и видимость", + "publicChatAddresses": "Адресы публичного чата", + "accessAndVisibilityDescription": "Кому разрешено войти в этот чат и как этот чат может быть обнаружен.", + "noDatabaseEncryption": "Шифрование базы данных не поддерживается на этой платформе", + "appLockDescription": "Заблокировать приложение когда не используется пин код", + "calls": "Звонки", + "customEmojisAndStickers": "Пользовательские эмодзи и стикеры", + "hideRedactedMessages": "Скрыть редактированные сообщения", + "hideInvalidOrUnknownMessageFormats": "Скрыть неправильные или неизвестные форматы сообщения", + "hideRedactedMessagesBody": "Если кто-то редактирует сообщение, оно будет скрыто в чате.", + "passwordRecoverySettings": "Настройки восстановления пароля", + "knock": "Постучаться", + "usersMustKnock": "Пользователи должны постучаться", + "noOneCanJoin": "Никто не может присоединиться", + "chatCanBeDiscoveredViaSearchOnServer": "Чат может быть обнаружен через поиск в {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "createNewAddress": "Создать новый адрес", + "commandHint_ignore": "Игнорировать данный matrix ID", + "commandHint_unignore": "Не игнорировать данный matrix ID", + "searchIn": "Поиск в чате \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Найти еще...", + "gallery": "Галерея", + "files": "Файлы", + "swipeRightToLeftToReply": "Для ответа проведите справа налево", + "userLevel": "{level} - Пользователь", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Модератор", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Администратор", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Изменить общие настройки чата", + "changeTheChatPermissions": "Изменить права доступа к чату", + "changeTheDescriptionOfTheGroup": "Изменить описание чата", + "inviteOtherUsers": "Пригласить других пользователей в этот чат", + "changeTheVisibilityOfChatHistory": "Изменить видимость истории чата", + "unread": "Непрочитанные", + "space": "Пространство", + "markAsUnread": "Отметить как непрочитанное", + "goToSpace": "Перейти к пространству: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "sendCanceled": "Отправка отменена", + "noChatsFoundHere": "Не было найдено ни одного чата. Начать с кем-нибудь новый чат можно, нажав кнопку ниже. ⤵️", + "updateInstalled": "🎉 Обновление {version} успешно установлено!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Список изменений", + "doesNotSeemToBeAValidHomeserver": "Этот домашний сервер выглядит несовместимым. Нет ли в ссылке опечаток?", + "noMoreChatsFound": "Больше чатов не обнаружено...", + "oneOfYourDevicesIsNotVerified": "Одно из ваших устройств не подтверждено", + "chatPermissionsDescription": "Задайте уровень власти, необходимый для совершения определённых действий в этом чате. Уровни власти 0, 50 и 100 обычно означают пользователей, модераторов и администраторов соответственно, но любая градация также возможна.", + "sendRoomNotifications": "Упоминать @room", + "calculatingFileSize": "Вычисление размера файла...", + "sendingAttachment": "Отправка вложения...", + "noticeChatBackupDeviceVerification": "Примечание: Если вы подключите все свои устройства к резервному копированию чатов, то они автоматически станут подтверждёнными.", + "changeTheCanonicalRoomAlias": "Изменить основной общедоступный адрес чата", + "loginWithMatrixId": "Войти через Matrix ID", + "serverInformation": "Информация о сервере:", + "noContactInformationProvided": "Сервер не предоставляет никакой правдивой контактной информации", + "aboutHomeserver": "О сервере {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "boldText": "Жирный шрифт", + "strikeThrough": "Перечёркнутый", + "pleaseFillOut": "Пожалуйста, заполните", + "invalidUrl": "Неверный url-адрес", + "addLink": "Добавить ссылку", + "italicText": "Italic", + "unableToJoinChat": "Невозможно присоединиться к чату. Возможно, другая сторона уже закончила разговор.", + "continueText": "Продолжить", + "blur": "Размытие:", + "opacity": "Прозрачность:", + "setWallpaper": "Установить обои", + "manageAccount": "Управление аккаунтом", + "contactServerAdmin": "Админ сервера", + "contactServerSecurity": "Безопасность контактов сервера", + "supportPage": "Страница поддержки", + "name": "Имя", + "version": "Версия", + "website": "Сайт", + "sendImages": "Отправить {count} изображение", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Сжатие", + "notificationRuleMessage": "Сообщение", + "appWantsToUseForLoginDescription": "Вы позволяете приложению и веб-сайту делиться информацией о вас.", + "newChatRequest": "📩 Запрос нового чата", + "allDevices": "Все устройства", + "roomNotificationSettings": "Настройки уведомлений комнаты", + "notificationRuleContainsUserName": "Содержит имя пользователя", + "notificationRuleMaster": "Отключить все уведомления", + "notificationRuleSuppressNoticesDescription": "Отключить уведомления от автоматизированных клиентов, таких как боты.", + "notificationRuleInviteForMe": "Приглашение для меня", + "notificationRuleMemberEventDescription": "Отключить уведомления о событиях о членстве.", + "notificationRuleIsRoomMention": "Упоминание комнаты", + "notificationRuleReactionDescription": "Отключить уведомления о реакциях.", + "notificationRuleCall": "Звонок", + "notificationRuleSuppressEditsDescription": "Отключить уведомления о отредактированных сообщениях.", + "notificationRuleEncrypted": "Зашифровано", + "more": "Больше", + "synchronizingPleaseWaitCounter": " Синхронизация… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Использовать '{server}' для входа", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "contentNotificationSettings": "Настройки уведомлений по тексту", + "generalNotificationSettings": "Общие настройки уведомлений", + "userSpecificNotificationSettings": "Настроки уведомлений пользователя", + "otherNotificationSettings": "Другие настройки уведомлений", + "notificationRuleContainsUserNameDescription": "Уведомляет пользователя, когда сообщение содержит его имя пользователя.", + "notificationRuleMasterDescription": "Перекрывает все другие правила и отключает все уведомления.", + "notificationRuleSuppressNotices": "Отключить автоматические сообщения", + "notificationRuleIsUserMention": "Упоминание пользователя", + "notificationRuleContainsDisplayName": "Содержит отображаемое имя", + "notificationRuleReaction": "Реакция", + "takeAPhoto": "Снять фото", + "recordAVideo": "Записать видео", + "enterNewChat": "Введите новый чат", + "otherPartyNotLoggedIn": "Другая сторона в настоящее время не вошла в систему и поэтому не может получать сообщения!", + "open": "Открыть", + "waitingForServer": "Ожидание сервера...", + "previous": "Предыдущий", + "notificationRuleCallDescription": "Уведомляет пользователя про звонки.", + "notificationRuleEncryptedRoomOneToOne": "Шифрованная комната «Один на один»", + "notificationRuleEncryptedRoomOneToOneDescription": "Уведомляет пользователя про сообщение в зашифрованных комнатах «Один на один».", + "notificationRuleRoomOneToOne": "Комната «Один на один»", + "commandHint_roomupgrade": "Обновить комнату до указанной версии", + "notificationRuleInviteForMeDescription": "Уведомляет пользователя, когда его приглашают в комнату.", + "unknownPushRule": "Неизвестное правило оповещения '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "checkList": "Контрольный список", + "changedTheChatDescription": "{username} изменил описание чата", + "changedTheChatName": "{username} изменил(а) имя чата", + "notificationRuleMemberEvent": "Мероприятие участника", + "notificationRuleIsUserMentionDescription": "Уведомляет пользователя, когда он упоминается непосредственно в сообщении.", + "notificationRuleContainsDisplayNameDescription": "Уведомляет пользователя, когда сообщение содержит его имя отображения.", + "notificationRuleIsRoomMentionDescription": "Уведомляет пользователя о наличии упоминания о комнате.", + "notificationRuleRoomnotif": "Уведомление о комнате", + "notificationRuleRoomnotifDescription": "Уведомляет пользователя, когда сообщение содержит '@room'.", + "notificationRuleTombstone": "Надгробный камень", + "notificationRuleTombstoneDescription": "Уведомляет пользователя о сообщениях о деактивации комнаты.", + "notificationRuleRoomServerAcl": "ACL сервера комнаты", + "notificationRuleRoomServerAclDescription": "Удаляет уведомления о списках контроля доступа к серверу комнат (ACL).", + "notificationRuleSuppressEdits": "Подавление правки", + "notificationRuleRoomOneToOneDescription": "Уведомляет пользователя о сообщениях в разделах один на один.", + "notificationRuleMessageDescription": "Уведомляет пользователя об общих сообщениях.", + "notificationRuleEncryptedDescription": "Уведомляет пользователя о сообщениях в зашифрованных комнатах.", + "notificationRuleJitsi": "Джици", + "notificationRuleJitsiDescription": "Уведомляет пользователя о событиях виджета Jitsi.", + "notificationRuleServerAcl": "Запретить события ACL сервера", + "notificationRuleServerAclDescription": "Удаляет уведомления о событиях ACL сервера.", + "sentVoiceMessage": "️🎙️ {duration} - Голосовое сообщение от {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Если вы удалите эту настройку уведомлений, это невозможно отменить.", + "shareKeysWith": "Поделиться ключами с...", + "shareKeysWithDescription": "Каким устройствам следует доверять, чтобы они могли читать ваши сообщения в зашифрованных чатах?", + "crossVerifiedDevicesIfEnabled": "Кросс-верифицированные устройства, если они включены", + "crossVerifiedDevices": "Кросс-верифицированные устройства", + "verifiedDevicesOnly": "Только проверенные устройства", + "optionalMessage": "(Необязательно) сообщение...", + "notSupportedOnThisDevice": "Не поддерживается на этом устройстве", + "approve": "Утверждать", + "youHaveKnocked": "Вы постучали", + "pleaseWaitUntilInvited": "Пожалуйста, подождите, пока кто-нибудь из комнаты не пригласит вас.", + "commandHint_logout": "Выйти из текущего устройства", + "commandHint_logoutall": "Выйти из всех активных устройств", + "displayNavigationRail": "Показать навигационный рельс на мобильном устройстве", + "customReaction": "Пользовательская реакция", + "moreEvents": "Больше событий", + "declineInvitation": "Отказаться от приглашения", + "noMessagesYet": "Пока нет сообщений", + "longPressToRecordVoiceMessage": "Нажмите длиннее, чтобы записать голосовое сообщение.", + "pause": "Пауза", + "resume": "Продолжить", + "removeFromSpaceDescription": "Чат будет удален из пространства, но все равно появится в вашем списке чатов.", + "countChats": "{chats} чатов", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Участник пространства из {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Участник пространства из {spaces} может постучать", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Начать опрос", + "endPoll": "Завершить опрос", + "answersVisible": "Ответы видны", + "pollQuestion": "Вопрос по опросу", + "answerOption": "Вариант ответа", + "addAnswerOption": "Добавить вариант ответа", + "allowMultipleAnswers": "Разрешить несколько ответов", + "pollHasBeenEnded": "Опрос завершен", + "answersWillBeVisibleWhenPollHasEnded": "Ответы будут видны после завершения опроса", + "replyInThread": "Ответить в ветке", + "thread": "Ветка", + "backToMainChat": "Вернуться в основной чат", + "saveChanges": "Сохранить изменения", + "createSticker": "Создать стикер или эмоджи", + "useAsSticker": "Использовать как стикер", + "useAsEmoji": "Использовать в качестве эмоджи", + "stickerPackNameAlreadyExists": "Имя набора стикеров уже существует", + "newStickerPack": "Новая упаковка стикеров", + "stickerPackName": "Имя упаковки стикеров", + "attribution": "Атрибуция", + "skipChatBackup": "Пропустить резервную копию чата", + "skipChatBackupWarning": "Вы уверены? Без включения резервного копирования чата вы можете потерять доступ к своим сообщениям, если переключите устройство.", + "createNewAccount": "Создать новый аккаунт", + "theProcessWasCanceled": "Процесс был отменен.", + "noMoreResultsFound": "Ничего не найдено", + "countInvited": "{count} приглашенных", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadCountMoreParticipants": "Загрузить ещё {count} участников", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "versionWithNumber": "Версия: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Архивные записи", + "advancedConfigs": "Расширенные Настройки", + "advancedConfigurations": "Расширенные конфигурации", + "signUpGreeting": "FluffyChat децентрализорован! Выберите сервер, где вы хотите сделать свой аккаунт и заходите!", + "signInGreeting": "У вас есть уже аккаунт в Matrix? Добро пожаловать! Выберите свой сервер и войдите.", + "join": "Присоединиться", + "countFiles": "{count} файлов", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "unreadChatsInApp": "{appname}: {unread} непрочитанных чатов", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Сейчас {count} пользователей заблокировано.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "countVotes": "{count, plural, =1{Один голос} other{{count} голоса(-ов)}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countReplies": "{count, plural, =1{Один ответ} other{{count} ответа(-ов)}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chatSearchedUntil": "Чат индексируется до {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Основной URL федерации", + "clientWellKnownInformation": "Client-Well-Known Информация:", + "baseUrl": "URL ссылка базы", + "identityServer": "Сервер профилей:", + "signIn": "Войти", + "searchOrEnterHomeserverAddress": "Искать или ввести адрес сервера", + "matrixId": "Идентификатор Matrix", + "setPowerLevel": "Поставить уровень мощности", + "makeModerator": "Сделать модератором", + "makeAdmin": "Сделать админом", + "removeModeratorRights": "Убрать права у модератора", + "removeAdminRights": "Убрать права админа", + "powerLevel": "Уровень мощности", + "setPowerLevelDescription": "Уровни мощности определяют, что участник может делать в этой комнате и иногда варьируются в диапозоне 0 и 100.", + "owner": "Владелец", + "mute": "Заглушить", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Сделать новый чат", + "reset": "Сброс", + "supportFluffyChat": "Поддержать FluffyChat", + "support": "Поддержать", + "setLowPriority": "Установить маленький приоритет", + "unsetLowPriority": "Отменить низкий приоритет", + "playSoundOnNotification": "Проиграть звук, когда уведомления", + "addTag": "Добавить тег", + "removeTag": "Удалить тег", + "tagName": "Название тега", + "createNewTag": "Создать новый тег", + "appSubtitle": "Защитить коммуникацию [matrix]", + "passphrasesMatch": "Кодовые фразы соовпадают", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "discardEdits": "У вас есть не внесённые изменения. Отменить внесённые изменения?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "Ключи не переданы. Пожалуйста, попробуйте еще раз.", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "showMore": "Показать больше", + "showLess": "Показать меньше", + "possibleByYou": "Этот релиз был только возможен из-за вашей поддержки. FluffyChat остаётся бесплатным, с открытым исходным кодом, и полностью управляется сообществом.", + "hideRoomsInSpaces": "Спрятать комнаты которые в пространстве", + "interactiveVerification": "Интерактивная верификация", + "waitingForKeys": "Ожидание ключей... Пожалуйста оставьте другое устройство активным.", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "edited": "(изменено)", + "encryptedMessage": "Зашифрованное сообщение", + "unencryptedMessage": "Не зашифрованное сообщение", + "passphraseNumberRequirement": "Имеет одну цифру.", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "messageCanOnlyBeReadByUser": "Ваше сообщение зашифровано сквозным шифрованием и только этот пользователь может его прочитать:", + "noUserKeyFound": "Не нашлось ключа пользователя", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "publicKey": "Публичный ключ: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Ключ идентификации устройства", + "encrypting": "Шифруем", + "couldNotBeSent": "Не возможно отправить", + "restoreBootstrapDevicesDescription": "Пожалуйста выберите одно своё другое устройтво, чтобы верифицировать эту сессию:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "unlock": "Разблокировать", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "Сбросить аккаунт", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "openFile": "Открыть файл", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "Когда вы сбрасываете ваш аккаунт, то вы потеряете доступ к вашим старым сообщениям навсегда. Все ваши устройства нужны будут верифицированы опять. Пожалуйста, только делайте это действие, когда у вас нет устройств, чтобы верифицировать вашу сессию и вы потеряли свой ключ восстановления и кодовую фразу!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "Новая кодовая фраза", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "Повторите кодовую фразу", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "Хотя-бы 12 символов.", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "Имеет прописные и строчные буквы.", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "Имеет специальные символы.", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "Сохранить как файл", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "Вы готовы начать!", + "knownSince": "Известен с:{date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "today": "Сегодня", + "sending": "Отправляется", + "generatingThumbnail": "Генерируется миниатюра", + "uploading": "Загружаем", + "yesterday": "Вчера", + "showThumbnailsInTimeline": "Показать миниатюры картинок и видео", + "appDescription": "Общайтесь зашифрованным образом по децентрализованной сети [matrix] простым и доступным для всех способом.", + "interactiveVerificationDescription": "Если вы находитесь рядом с собеседником, либо общаетесь с помощью другого надёжного канала связи, вы можете подтвердить ваши устройства, сравнив ключи шифрования или эмодзи.", + "countUnverifiedDevices": "В этом чате {count} устройств не подтверждены.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "messageCanOnlyBeReadByUsers": "Ваши сообщения защищены сквозным шифрованием, и их могут прочесть только:", + "restoreBootstrapEmptyDevicesDescription": "Пожалуйста, введите код доступа или ключ восстановления, чтобы подтвердить устройство и получить доступ к зашифрованным сообщениям.", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "Восстановить крипто-идентичность", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "Сбросить крипто-идентичность", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "Настроить крипто-идентичность", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat защищает ваши сообщения сквозным шифрованием. Чтобы не потерять ваши сообщения, пожалуйста, придумайте сильную кодовую фразу, чтобы защитить вашу крипто-идентичность и легко восстанавливать зашифрованные сообщения.", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "Имейте в виду, что ваш ключ восстановления позволяет полностью восстановить ваши зашифрованные сообщения и крипто-идентичность.", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "unsignedDevice": "Неподтверждённое устройство", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "Подтверждённое устройство", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "Ключ Curve25519 не найден", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "Не удалось расшифровать сообщение" +} \ No newline at end of file diff --git a/lib/l10n/intl_sk.arb b/lib/l10n/intl_sk.arb new file mode 100644 index 0000000000..6b6b8a8328 --- /dev/null +++ b/lib/l10n/intl_sk.arb @@ -0,0 +1,2043 @@ +{ + "@@locale": "sk", + "@@last_modified": "2021-08-14 12:41:09.879987", + "about": "O aplikácii", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Prijať", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} prijali pozvánku", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Účet", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} aktivovali koncové šifrovanie", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administrátor", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "anyoneCanJoin": "Ktokoľvek sa môže pripojiť", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Archivovať", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Môžu sa pripojiť hostia", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ste si istí?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\".", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Akcepovať žiadosť o verifikáciu od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Zabanovať z chatu", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Zabanovaný", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} zabanoval {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Zakázať zariadenie", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Zrušiť", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} si zmenili svôj avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} zmenili nastavenie oprávnení chatu", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} si zmenili prezývku na: {displayname}", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} zmenili prístupové práva pre hosťov", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} zmenili prístupové práva pro hosťov na: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} zmenili nastavenie viditelnosti histórie chatu", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} zmenili nastavenie viditelnosti histórie chatu na: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} zmenili nastavenie pravidiel pripojenia", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} zmenili nastavenie pravidiel pripojenia na: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} si zmenili profilový obrázok", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} zmenili nastavenie aliasov chatu", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} zmenili odkaz k pozvánke do miestnosti", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Zmeniť použitý server", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Zmena štýlu", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Zmeniť názov skupiny", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Šifrovanie bolo poškodené", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Podrobnosti o chate", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Vyberte si silné heslo", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Zavrieť", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt bol pozvaný do skupiny", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Skopírované do schránky", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopírovať", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Nebolo možné dešifrovať správu: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} účastníkov", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Vytvoriť", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} založili chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Momentálne prítomní", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Tmavá", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "delete": "Odstrániť", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Odstrániť správu", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Zariadenia", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Prezývka bola zmenená", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Stiahnuť súbor", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Zmeniť prezývku", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotikon už existuje!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Nesprávné označenie emotikonu!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Nastavenie emotikonov", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Kód emotikonu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Prázdny chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Šifrovanie už nebude možné vypnúť. Ste si tým istí?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Šifrovanie", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Šifrovanie nie je aktívne", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "forward": "Preposlať", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Od pripojenia", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Od pozvania", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Skupina", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Skupina je verejná", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Skupina s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Hostia sú zakázaní", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Hostia sa môžu pripojiť", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} vzal späť pozvánku pre {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Pomoc", + "@help": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Nesprávna prístupová fráza alebo kľúč na obnovenie", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Pozvať kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Pozvať kontakt do {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Pozvanie", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} pozvali {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Len pozvaní používatelia", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: https://fluffychat.im\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "píše…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} sa pripojili do chatu", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "{username} vyhodili {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} vyhodili a zabanovali {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Vyhodiť z chatu", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Naposledy prítomní: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Opustiť", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Opustili chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Svetlá", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Načítať ďalších {count} účastníkov", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Načítava sa… Čakajte prosím.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Načítať viac…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Prihlásiť sa", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Prihlásenie k {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Odhlásiť sa", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderátor", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Stlmiť chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Nová správa v FluffyChate", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nová žiadosť o verifikáciu!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Nenašli sa žiadne emotikony. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Chýba povolenie", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Nenašli sa žiadne miestnosti…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online záloha kľúčov je zapnutá", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Och! Niečo sa pokazilo…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Na prečítanie správy otvorte aplikáciu", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Otvoriť fotoaparát", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "prístupová fráza alebo kľúč na obnovenie", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Heslo", + "@password": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Prosím zadajte svoje heslo", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Zadajte svoje používateľské meno", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Verejné miestnosti", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} odstránili udalosť", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Odmietnuť", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} odmietli pozvánku", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Odstrániť", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Odstráňiť všetky ostatné zariadenia", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Odblokovať", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Odpovedať", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Miestnosť bola upgradeovaná", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "send": "Odoslať", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Odoslať správu", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Odoslať súbor", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Odoslať obrázok", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} poslali súbor", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} poslali zvukovú nahrávku", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} poslali obrázok", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} poslali nálepku", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} poslali video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setStatus": "Nastaviť status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Nastavenia", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Zdieľať", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} zdieľa lokáciu", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Preskočiť", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Zdrojový kód", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Ako sa dnes máte?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Odoslať", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Systémová farba", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Sa nezhodujú", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Zhodujú sa", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Skúsiť znova odoslať", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} odbanovali {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Odblokovať zariadenie", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Neznáme zariadenie", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Neznámy šifrovací algoritmus", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Neznáma udalosť „{type}“", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Zrušiť stlmenie chatu", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} a {count} dalších píšu…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} a {username2} píšu…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} píše…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} opustili chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} poslali udalosť {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Spustiť verifikáciu", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Verifikácia bola úspešná!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifikujem protiľahlý účet", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videohovor", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Viditeľnosť histórie chatu", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Viditeľné pre všetkých účastníkov", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Viditeľné pre každého", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Hlasová správa", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Čaká sa, kým partner prijme požiadavku…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Čaká sa, kým partner prijme emotikon…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Čaká sa na to, kým partner prijme čísla…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Kto môže vstúpiť do tejto skupiny", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Napísať správu…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Áno", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vy", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Už sa nezúčastňujete tohto chatu", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Máte zablokovaný prístup k tomuto chatu", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "chats": "Čety", + "@chats": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Zmeniť heslo", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Zmeniť názov zariadenia", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} prevzal hovor", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendAudio": "Poslať zvuk", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Pridať email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "appLock": "Uzamknutie aplikácie", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "security": "Bezpečnosť", + "@security": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Nahlásiť správu", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Verzia miestnosti", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Poslať správy", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Pripojiť sa k miestnosti", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Server podporuje tieto typy prihlásenia:\n{serverVersions}\nAle táto aplikácia podporuje iba:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "chatBackup": "Záloha chatov", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Pridať do priestoru", + "cantOpenUri": "Nemožno otvoriť identifikátor prostriedku {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "Zopakujte heslo", + "all": "Všetky", + "@all": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ste si istí, že sa chcete odhlásiť?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Odoslať pri vstupe", + "ignoredUsers": "Ignorovaní užívatelia", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorovať", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "search": "Hľadať", + "@search": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Poslať ako text", + "@sendAsText": { + "type": "String" + }, + "sendVideo": "Poslať video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "importNow": "Importovať teraz", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_sl.arb b/lib/l10n/intl_sl.arb new file mode 100644 index 0000000000..c8469a392e --- /dev/null +++ b/lib/l10n/intl_sl.arb @@ -0,0 +1,1926 @@ +{ + "repeatPassword": "Ponovite geslo", + "about": "O aplikaciji", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Sprejmi", + "@accept": { + "type": "String", + "placeholders": {} + }, + "account": "Račun", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "Uporabnik {username} je aktiviral šifriranje od konca do konca", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Dodajte e-pošto", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Dodajte v prostor", + "alias": "vzdevek", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Vse", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "Oseba {senderName} je odgovorila na klic", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Pridruži se lahko vsak", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Zaklepanje aplikacije", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Če želite podpisati drugo osebo, vnesite geslo za varno trgovino ali obnovitveni ključ.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Ali želite sprejeti to zahtevo za preverjanje od {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Samodejno predvajajte animirane nalepke in čustva", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Domači strežnik podpira vrste prijave:\n{serverVersions}\nToda ta aplikacija podpira samo:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Pošlji ob vstopu", + "banFromChat": "Prepoved klepeta", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Prepovedano", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} je prepovedan v {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blokirana naprava", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blokirano", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Prekliči", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "URI-ja {uri} ni mogoče odpreti", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} je spremenil avatar za klepet", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} je spremenila dovoljenja za klepet", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} je spremenil svoje prikazno ime v: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} je spremenila pravila dostopa za goste", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} je spremenila pravila dostopa za goste v: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} je spremenil vidnost zgodovine v: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} je spremenil pravila za pridružitev", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} je spremenila pravila pridružitve v: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} je spremenil avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} je spremenil vzdevke sobe", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} je spremenil povezavo za povabilo", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Spremeni geslo", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Spremenite domači strežnik", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Spremenite svoj slog", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Spremenite ime skupine", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Spremenite svoj avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "chat": "Klepet", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Varnostno kopiranje klepeta", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Podrobnosti klepeta", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Klepeti", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Izberite močno geslo", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Počisti arhiv", + "close": "Zapri", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Izključi določenega uporabnika iz te sobe", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Pošljite besedilo v obliki HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Povabi danega uporabnika v to sobo", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Pridružite se dani sobi", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Odstranite danega uporabnika iz te sobe", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_me": "Opisi sebe", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Nastavite svojo sliko za to sobo", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "Nastavite raven moči danega uporabnika (privzeto: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "Pošljite odgovor kot reakcijo", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Pošlji besedilo", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Prekliči izključitev določenega uporabnika iz te sobe", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Ukaz ni veljaven", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is not a command.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Primerjajte in se prepričajte, da se naslednji emoji ujemajo s tistimi iz druge naprave:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Primerjajte in se prepričajte, da se naslednje številke ujemajo s številkami druge naprave:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurirajte klepet", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "archive": "Arhiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ali si prepričan?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} je sprejel povabilo", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Ali ste prepričani, da se želite odjaviti?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Ali se lahko gostujoči uporabniki pridružijo", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Spremenite ime naprave", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibility": "{username} je spremenila vidnost zgodovine", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "channelCorruptedDecryptError": "Šifriranje je poškodovano", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Vsebina je bila prijavljena skrbnikom strežnika", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomnick": "Nastavite prikazno ime za to sobo", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "contactHasBeenInvitedToTheGroup": "Kontakt je bil povabljen v skupino", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "commandHint_leave": "Zapusti to sobo", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_plain": "Pošlji neformatirano besedilo", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "copiedToClipboard": "Kopirano v odložišče", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiraj", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiraj v odložišče", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Sporočila ni bilo mogoče dešifrirati: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} udeležencev", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Ustvari", + "@create": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nov prostor", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Trenutno aktiven", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Temno", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Privzeta raven dovoljenja", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} je ustvaril klepet", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "S tem boste deaktivirali vaš uporabniški račun. Tega ni mogoče razveljaviti! Ali si prepričan?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_sq.arb b/lib/l10n/intl_sq.arb new file mode 100644 index 0000000000..db0c28ed2b --- /dev/null +++ b/lib/l10n/intl_sq.arb @@ -0,0 +1,1974 @@ +{ + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@remove": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@none": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@account": { + "type": "String", + "placeholders": {} + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_sr.arb b/lib/l10n/intl_sr.arb new file mode 100644 index 0000000000..73be33bd05 --- /dev/null +++ b/lib/l10n/intl_sr.arb @@ -0,0 +1,2117 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.857024", + "about": "О програму", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Прихвати", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} прихвата позивницу", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Налог", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} укључи шифровање с краја на крај", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Додај е-адресу", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "Админ", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "алијас", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Сви", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} одговори на позив", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "свако може да се придружи", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Закључавање апликације", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Архива", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Да ли је гостима дозвољен приступ", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Сигурни сте?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Заиста желите да се одјавите?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Да бисте могли да пријавите другу особу, унесите своју безбедносну фразу или кључ опоравка.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Прихватате ли захтев за верификацију од корисника {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "Домаћи сервер подржава начине пријаве:\n{serverVersions}\nали ова апликација подржава само:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Забрани у ћаскању", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Забрањен", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} забрани корисника {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Блокирај уређај", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Блокиран", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Откажи", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Промени назив уређаја", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} промени аватар ћаскања", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} измени дозволе ћаскања", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} промени приказно име на: „{displayname}“", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} измени правила за приступ гостију", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} измени правила за приступ гостију на: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} измени видљивост историје", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} измени видљивост историје на: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} измени правила приступања", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} измени правила приступања на: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} измени свој аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} измени алијас собе", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} измени везу позивнице", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Измени лозинку", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Промени домаћи сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Измените изглед", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Измени назив групе", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Измените свој аватар", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шифровање је покварено", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Ћаскање", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Копија ћаскања", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Детаљи ћаскања", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Ћаскања", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Изаберите јаку лозинку", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Очисти архиву", + "close": "Затвори", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Блокирај задатог корисника за ову собу", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "Шаљи ХТМЛ обликован текст", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Позови задатог корисника у собу", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Придружи се наведеној соби", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Уклони задатог корисника из собе", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Напусти ову собу", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Опишите себе", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomnick": "Поставља ваш надимак за ову собу", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Подеси ниво задатог корисника (подразумевано: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Шаљи неформатиран текст", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Шаљи одговор као реакцију", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Пошаљи текст", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Скини забрану задатом кориснику за ову собу", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "compareEmojiMatch": "Упоредите и проверите да су емоџији идентични као на другом уређају:", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Упоредите и проверите да су следећи бројеви идентични као на другом уређају:", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Подешавање ћаскања", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Особа је позвана у групу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Садржај је пријављен администраторима сервера", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Копирано у клипборд", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Копирај", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Копирај у клипборд", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Не могу да дешифрујем поруку: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "учесника: {count}", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Направи", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} направи ћаскање", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Тренутно активно", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "тамни", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ово ће деактивирати ваш кориснички налог. Не може се повратити! Сигурни сте?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Подразумевани ниво приступа", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Обриши", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Обриши налог", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Брисање поруке", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Уређаји", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Директна ћаскања", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Име за приказ је измењено", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Преузми фајл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Уреди", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Уреди блокиране сервере", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Уреди име за приказ", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Уреди алијасе собе", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Уређује аватар собе", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Емоти већ постоји!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Неисправна скраћеница за емоти!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Поставке емотија", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "скраћеница", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "празно ћаскање", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Глобално укључи пакет емотија", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Укључује шифровање", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Шифровање више нећете моћи да искључите. Сигурни сте?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Шифровано", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шифровање", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шифровање није укључено", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} заврши позив", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Унесите адресу е-поште", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Величина фонта", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Напред", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "од приступања", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "од позивања", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Група", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Група је јавна", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Групе", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Група са корисником {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "гости су забрањени", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "гости могу приступити", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} поништи позивницу за корисника {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Помоћ", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Сакриј непознате догађаје", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Игнориши", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Игнорисани корисници", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Кликнуо сам на везу", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Неисправна фраза или кључ опоравка", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Позивање особа", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Позови особу у групу {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Позван", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "{username} позва корисника {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "само позвани корисници", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} вас позива у FluffyChat. \n1. Инсталирајте FluffyChat: https://fluffychat.im \n2. Региструјте се или пријавите \n3. Отворите везу позивнице: {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "куца…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "{username} се придружи ћаскању", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Придружи се соби", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "{username} избаци корисника {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "{username} избаци и забрани корисника {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Избаци из ћаскања", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Последња активност: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Напусти", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Напусти ћаскање", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "светли", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Учитај још {count} учесника", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Учитавам… Сачекајте.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Учитај још…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Пријава", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Пријава на {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Одјава", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Спомени", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Поруке", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Модератор", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Ућуткај ћаскање", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ново ћаскање", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Нова порука — FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Нови захтев за верификацију!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Следеће", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Не", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Нема везе са сервером", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Нема емотија. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Шифровање се може активирати након што соба престане да буде јавно доступна.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Чини се да немате Гугл услуге на телефону. То је добра одлука за вашу приватност! Да би се протурале нотификације у FluffyChat, препоручујемо коришћење https://microg.org/ или https://unifiedpush.org/", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Још нисте одредили начин за опоравак лозинке.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Нема дозвола", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Нисам нашао собе…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Обавештења", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} корисника куца…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "у реду", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Резерва кључева на мрежи је укључена", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Нажалост, дошло је до грешке при подешавању дотурања обавештења.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Нешто је пошло наопако…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Отворите апликацију да прочитате поруке", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Отвори камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "или", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Учесник", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "фраза или кључ опоравка", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Лозинка", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Заборављена лозинка", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Лозинка је промењена", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Опоравак лозинке", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Закачи", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Изаберите код за пролаз", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Кликните на везу у примљеној е-пошти па наставите.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Унесите своју лозинку", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Унесите свој пин", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Унесите своје корисничко име", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Испратите упутства на веб сајту и тапните на „Следеће“.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Приватност", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Јавне собе", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Разлог", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} редигова догађај", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Редигуј поруку", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Одбиј", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} одби позивницу", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Уклони", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Уклони све остале уређаје", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Уклони изгнанство", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Уклоните свој аватар", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Замени собу новијом верзијом", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Одговори", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Пријави поруку", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Соба је надограђена", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Верзија собе", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "Претражи", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Безбедност", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Пошаљи", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Пошаљи поруку", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Пошаљи аудио", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Пошаљи фајл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Пошаљи слику", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Слање порука", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Пошаљи видео", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} посла фајл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "{username} посла аудио", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "{username} посла слику", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "{username} посла налепницу", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "{username} посла видео", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} посла податке о позиву", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Постави као главни алијас", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Постави статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Поставке", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Подели", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} подели локацију", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Прескочи", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Изворни код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} започе позив", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Стање", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Како сте данас?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Пошаљи", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "системски", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Не поклапају се", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Поклапају се", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Превише упита. Покушајте касније!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Покушај слање поново", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} одблокира корисника {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Одблокирај уређај", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Непознат уређај", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Непознат алгоритам шифровања", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Непознат догађај „{type}“", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Врати обавештења", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Откачи", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} и {count} корисника куцају…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} и {username2} куцају…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} куца…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} напусти ћаскање", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} посла {type} догађај", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Оверен", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Покрени верификацију", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Успешно сте верификовали!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Верификујем други налог", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Видео позив", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Одреди видљивост историје", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "видљиво свим учесницима", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "видљиво свима", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Гласовна порука", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Чекам да саговорник прихвати захтев…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Чекам да саговорник прихвати емоџије…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Чекам да саговорник прихвати бројеве…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Упозорење!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Послали смо вам е-пошту", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "ко може шта да ради", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Ко може да се придружи групи", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Зашто желите ово да пријавите?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Са овим адресама можете опоравити своју лозинку.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "напишите поруку…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Да", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ви", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Више не учествујете у овом ћаскању", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Забрањено вам је ово ћаскање", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш јавни кључ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Ponovite lozinku", + "commandHint_cuddle": "Pošalji zagrljaj", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_sv.arb b/lib/l10n/intl_sv.arb new file mode 100644 index 0000000000..4be831aa0f --- /dev/null +++ b/lib/l10n/intl_sv.arb @@ -0,0 +1,2428 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.835634", + "about": "Om", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Acceptera", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepterade inbjudan", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiverade ändpunktskryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alla", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} besvarade samtalet", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Vem som helst kan gå med", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App-lås", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arkiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Får gästanvändare gå med?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Är du säker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Acceptera denna verifikationsförfrågan från {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Bannlys från chatt", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannlyst", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} bannlös {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blockera Enhet", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Avbryt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Ändra enhetsnamn", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ändrade sin chatt-avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ändrade chatt-rättigheterna", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ändrade visningsnamnet till: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ändrade reglerna för gästaccess", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ändrade reglerna för gästaccess till: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ändrade historikens synlighet", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ändrade historikens synlighet till: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ändrade anslutningsreglerna", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ändrade anslutningsreglerna till {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ändrade sin avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ändrade rummets alias", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ändrade inbjudningslänken", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Ändra lösenord", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ändra hemserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ändra din stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ändra namn på gruppen", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Krypteringen har blivit korrupt", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chatt", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatt-detaljer", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Välj ett starkt lösenord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Stäng", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Vänligen jämför uttryckssymbolerna", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vänligen jämför siffrorna", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurera chatt", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Innehållet har rapporterats till server-admins", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopierat till urklipp", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiera", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kunde ej avkoda meddelande: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} deltagare", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Skapa", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} skapade chatten", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "För närvarande aktiv", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Mörkt", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standard behörighetsnivå", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Radera", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ta bort konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ta bort meddelande", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Enheter", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direkt chatt", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Visningsnamn har ändrats", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Ladda ner fil", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Ändra", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "redigera blockerade servrar", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Ändra visningsnamn", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "redigera rumsavatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Dekalen existerar redan!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ogiltig dekal-kod!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote inställningar", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Dekal kod", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tom chatt", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktivera dekal-paket globalt", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktivera kryptering", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du kommer inte ha fortsatt möjlighet till att inaktivera krypteringen. Är du säker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Krypterad", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Kryptering", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Kryptering är ej aktiverad", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} avslutade samtalet", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Ange en e-postaddress", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "forward": "Framåt", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Från att gå med", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Från inbjudan", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupp", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppen är publik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupper", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppen med {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gäster är förbjudna", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gäster kan ansluta", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} har tagit tillbaka inbjudan för {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hjälp", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Göm okända händelser", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorera", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorera användare", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Jag har klickat på länken", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Felaktig lösenordsfras eller åsterställningsnyckel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Bjud in kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Bjud in kontakt till {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Inbjuden", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} bjöd in {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Endast inbjudna användare", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "skriver…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} anslöt till chatten", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Anslut till rum", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} sparkade ut {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} sparkade och bannade {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Sparka från chatt", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Senast aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Lämna", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Lämnade chatten", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Ljust", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Ladda {count} mer deltagare", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laddar... Var god vänta.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Ladda mer…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Logga in", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logga in till {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logga ut", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Nämn", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Meddelanden", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Tysta chatt", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ny chatt", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nya meddelanden i FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Ny verifikationsbegäran!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Nästa", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nej", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ingen anslutning till servern", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Hittade inga dekaler. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få aviseringar i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du har inte lagt till något sätt för att återställa ditt lösenord än.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ingen behörighet", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Hittade inga rum…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Aviseringar", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} användare skriver…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online Nyckel-backup är aktiverad", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppsan, något gick fel…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Öppna app för att lästa meddelanden", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Öppna kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Deltagare", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "lösenord eller återställningsnyckel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Lösenord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Glömt lösenord", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Lösenordet har ändrats", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Återställ lösenord", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Nåla fast", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Ange ett lösenord", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klicka på länken i e-postmeddelandet för att sedan fortsätta.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Ange ditt lösenord", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Ange ditt användarnamn", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Följ instruktionerna på hemsidan och tryck på nästa.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Integritet", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publika Rum", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Anledning", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} redigerade en händelse", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redigera meddelande", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Avböj", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} avböjde inbjudan", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Ta bort", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Ta bort alla andra enheter", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Ta bort chatt-blockering", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Ersätt rum med nyare version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Svara", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Rapportera meddelande", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Rummet har blivit uppgraderat", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Sök", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Säkerhet", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Skicka", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Skicka ett meddelande", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Skicka ljud", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Skicka fil", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Skicka bild", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Skickade meddelanden", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Skicka video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} skickade en fil", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} skickade ett ljudklipp", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} skickade en bild", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} skickade ett klistermärke", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} skickade en video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} skickade samtalsinformation", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "Ställ in status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Inställningar", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Dela", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} delade sin position", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Hoppa över", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Källkod", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} startade ett samtal", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hur mår du i dag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Skicka in", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Dom Matchar Inte", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Dom Matchar", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "För många förfrågningar. Vänligen försök senare!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Försök att skicka igen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} avbannade {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Avblockera enhet", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Okänd enhet", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Okänd krypteringsalgoritm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Okänd händelse '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Slå på ljudet för chatten", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Avnåla", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} och {count} andra skriver…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} och {username2} skriver…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} skriver…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} lämnade chatten", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} skickade en {type} händelse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Starta verifiering", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Du har lyckats verifiera!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifiera andra konton", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videosamtal", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Chatt-historikens synlighet", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Synlig för alla deltagare", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Synlig för alla", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Röstmeddelande", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Väntar på att deltagaren accepterar begäran…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Väntar på att deltagaren accepterar emojien…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Väntar på att deltagaren accepterar nummer…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Varning!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Vi skickade dig ett e-postmeddelande", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Vem kan utföra vilken åtgärd", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Vilka som är tilllåtna att ansluta till denna grupp", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Varför vill du rapportera detta?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Med dessa addresser kan du återställa ditt lösenord.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skriv ett meddelande…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Du", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du deltar inte längre i denna chatt", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du har blivit bannad från denna chatt", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Din publika nyckel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Skicka HTML-formatted text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Bannlys användaren från detta rum", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "clearArchive": "Rensa arkiv", + "chats": "Chatter", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Chatt backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ändra din avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan inte öppna URL {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "blocked": "Blockerad", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Hemma servern stödjer följande inloggnings typer :\n {serverVersions}\nMen denna applikation stödjer enbart:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "Automatisk spela upp animerade klistermärken och emoji", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "addToSpace": "Lägg till i utrymme", + "addEmail": "Lägg till e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "Sätt din bild för detta rum (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_me": "Beskriv dig själv", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Lämna detta rum", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "Ta bort användare från detta rum", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Gå med i rum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "Bjud in användaren till detta rum", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "locationPermissionDeniedNotice": "Plats åtkomst nekad. Var god godkän detta för att kunna dela din plats.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Platstjänster är inaktiverade. Var god aktivera dom för att kunna dela din plats.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Textstorlek", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Fel vid erhållande av plats: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editRoomAliases": "Redigera rum alias", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nytt utrymme", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiera till urklipp", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} är inte ett kommando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "Felaktigt kommando", + "@commandInvalid": { + "type": "String" + }, + "commandHint_unban": "Tillåt användare i rummet", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "Skicka text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "Skicka svar som reaktion", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "Skicka oformaterad text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "Sätt användarens kraft nivå ( standard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Sätt ditt användarnamn för rummet", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "noEncryptionForPublicRooms": "Du kan endast aktivera kryptering när rummet inte längre är publikt tillgängligt.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} är inte en matrix server, använd {server2} istället?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "obtainingLocation": "Erhåller plats…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "or": "Eller", + "@or": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Öppna i karta", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oj! Tyvärr gick inte aviseringar att slå på.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synkroniserar… Var god vänta.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Utrymmes namn", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Utrymme är publikt", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Dela plats", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Sätt som primärt alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Skicka som text", + "@sendAsText": { + "type": "String" + }, + "saveFile": "Spara fil", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Rum version", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ta bort din avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Ange din pin-kod", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "verified": "Verifierad", + "@verified": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Kasta bort sessionen", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Starta en direkt-chatt\nAnvänd --no-encryption för att inaktivera kryptering", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "oneClientLoggedOut": "En av dina klienter har loggats ut", + "addAccount": "Lägg till konto", + "editBundlesForAccount": "Lägg till paket för detta konto", + "addToBundle": "Utöka paket", + "bundleName": "Paketnamn", + "unverified": "Ej verifierad", + "messageInfo": "Meddelandeinformation", + "time": "Tid", + "sender": "Avsändare", + "removeFromSpace": "Ta bort från utrymme", + "openGallery": "Öppna galleri", + "repeatPassword": "Upprepa lösenord", + "markAsRead": "Markera som läst", + "commandHint_clearcache": "Rensa cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "link": "Länk", + "reportUser": "Rapportera användare", + "sendOnEnter": "Skicka med Enter", + "scanQrCode": "Skanna QR-kod", + "removeFromBundle": "Ta bort från paket", + "emojis": "Uttryckssymboler", + "placeCall": "Ring", + "voiceCall": "Röstsamtal", + "unsupportedAndroidVersion": "Inget stöd för denna version av Android", + "videoCallsBetaWarning": "Videosamtal är för närvarande under testning. De kanske inte fungerar som det är tänkt eller på alla plattformar.", + "unsupportedAndroidVersionLong": "Denna funktion kräver en senare version av Android.", + "reactedWith": "{sender} reagerade med {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Fäst i rum", + "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", + "experimentalVideoCalls": "Experimentella videosamtal", + "storeSecurlyOnThisDevice": "Lagra säkert på denna enhet", + "youJoinedTheChat": "Du gick med i chatten", + "youAcceptedTheInvitation": "👍 Du accepterade inbjudan", + "youKicked": "👞 Du sparkade ut {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hugContent": "{senderName} kramar dig", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Märk som grupp", + "youHaveWithdrawnTheInvitationFor": "Du har återkallat inbjudan till {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Du återkallade förbudet för {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Nytt utrymme", + "googlyEyesContent": "{senderName} skickar dig googly ögon", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "dehydrate": "Exportera sessionen och rensa enheten", + "dehydrateWarning": "Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.", + "encryptThisChat": "Kryptera denna chatt", + "noBackupWarning": "Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.", + "noOtherDevicesFound": "Inga andra enheter hittades", + "disableEncryptionWarning": "Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.", + "sorryThatsNotPossible": "Det där är inte möjligt", + "confirmMatrixId": "Bekräfta ditt Matrix-ID för att radera ditt konto.", + "supposedMxid": "Detta bör vara {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasdm": "Märk som rum för direktmeddelanden för det givante Matrix ID", + "user": "Användare", + "storeInAppleKeyChain": "Lagra i Apples nyckelkedja (KeyChain)", + "foregroundServiceRunning": "Denna avisering visas när förgrundstjänsten körs.", + "custom": "Anpassad", + "countFiles": "{count} filer", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "screenSharingTitle": "skärmdelning", + "noKeyForThisMessage": "Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.", + "fileIsTooBigForServer": "Gick inte att skicka! Servern stödjer endast bilagor upp till {max}.", + "commandHint_googly": "Skicka några googly ögon", + "commandHint_cuddle": "Skicka en omfamning", + "commandHint_hug": "Skicka en kram", + "users": "Användare", + "cuddleContent": "{senderName} omfamnar dig", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hydrate": "Återställ från säkerhetskopia", + "screenSharingDetail": "Du delar din skärm i FluffyChat", + "youRejectedTheInvitation": "Du avvisade inbjudan", + "youBannedUser": "Du förbjöd {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Du har blivit inbjuden av {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Du bjöd in {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Du sparkade ut och förbjöd {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Lagra i Androids nyckellagring (KeyStore)", + "whyIsThisMessageEncrypted": "Varför kan inte detta meddelande läsas?", + "doNotShowAgain": "Visa inte igen", + "wasDirectChatDisplayName": "Tom chatt (var {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Utrymmen möjliggör konsolidering av chattar och att bygga privata eller offentliga gemenskaper.", + "reopenChat": "Återöppna chatt", + "jumpToLastReadMessage": "Hoppa till det senast lästa meddelandet", + "readUpToHere": "Läs upp till hit", + "fileHasBeenSavedAt": "Filen har sparats i {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.", + "setColorTheme": "Välj färgtema:", + "banUserDescription": "Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.", + "removeDevicesDescription": "Du kommer att bli utloggad från den här enheten och kommer inte längre kunna få meddelanden.", + "tryAgain": "Försök igen", + "unbanUserDescription": "Användaren kommer kunna gå med i chatten igen om den försöker.", + "messagesStyle": "Meddelanden:", + "chatDescription": "Chattbeskrivning", + "pushNotificationsNotAvailable": "Aviseringar är inte tillgängligt", + "invalidServerName": "Ogiltigt servernamn", + "chatPermissions": "Chatt-behörigheter", + "makeAdminDescription": "När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.", + "setChatDescription": "Ändra chattens beskrivning", + "importFromZipFile": "Importera från .zip-fil", + "redactedBy": "Borttaget av {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Frivilligt) Anledning till att ta bort det här meddelandet…", + "archiveRoomDescription": "Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.", + "exportEmotePack": "Exportera Emote-pack som .zip", + "redactedByBecause": "Borttaget av {username} på grund av: ”{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.", + "invalidInput": "Ogiltig input!", + "report": "rapportera", + "hasKnocked": "{user} har knackat", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Öppna länk i webbläsare", + "directChat": "Direktchatt", + "wrongPinEntered": "Fel pin-kod inslagen! Försök igen om {seconds} sekunder…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Skicka skrivnotifikationer", + "inviteGroupChat": "📨 Gruppchattsinbjudan", + "importEmojis": "Importera emojier", + "noChatDescriptionYet": "Ingen chatt-beskrivning än.", + "learnMore": "Lär dig mer", + "notAnImage": "Inte en bildfil.", + "chatDescriptionHasBeenChanged": "Chattbeskrivningen ändrades", + "roomUpgradeDescription": "Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Vänligen ange ett nummer större än 0", + "jump": "Hoppa", + "shareInviteLink": "Dela inbjudningslänk", + "emoteKeyboardNoRecents": "Nyligen använda emotes kommer dyka upp här…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "replace": "Ersätt", + "createGroup": "Skapa grupp", + "kickUserDescription": "Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.", + "importNow": "Importera nu", + "invite": "Bjud in", + "blockListDescription": "Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.", + "createGroupAndInviteUsers": "Skapa en grupp och bjud in användare", + "initAppError": "Ett problem skedde när appen initierades", + "thisDevice": "Denna enhet:", + "publicSpaces": "Offentliga utrymmen", + "blockedUsers": "Blockerade användare", + "passwordIsWrong": "Det angivna lösenordet är fel", + "pleaseEnterYourCurrentPassword": "Vänligen skriv ditt nuvarande lösenord", + "groupCanBeFoundViaSearch": "Gruppen kan hittas genom sökning", + "noUsersFoundWithQuery": "Tyvärr kunde ingen användare hittas med ”{query}”. Vänligen kontrollera om du gjort ett stavfel.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "blockera", + "nothingFound": "Inget hittades…", + "yourGlobalUserIdIs": "Ditt globala användar-ID är: ", + "newPassword": "Nytt lösenord", + "passwordsDoNotMatch": "Lösenorden passar inte", + "commandHint_sendraw": "Skicka rå json", + "wrongRecoveryKey": "Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.", + "select": "Ange val", + "sessionLostBody": "Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "pleaseChooseAStrongPassword": "Vänligen välj ett starkt lösenord", + "blockUsername": "Ignorera användarnamn", + "addChatOrSubSpace": "Lägg till chatt eller underutrymme", + "groupName": "Gruppnamn", + "leaveEmptyToClearStatus": "Lämna tom för att ta bort din status.", + "joinSpace": "Gå med i utrymme", + "searchForUsers": "Sök efter @användare…", + "restoreSessionBody": "Appen försöker nu få tillbaks din session från backupen. Vänligen rapportera detta problem till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Databasen är optimerad", + "searchChatsRooms": "Sök efter #chattar, @användare…", + "databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.", + "sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.", + "formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.", + "verifyOtherUser": "🔐 Verifiera användaren", + "formattedMessages": "Formaterade meddelanden", + "canceledKeyVerification": "{sender} avbröt nyckelverifieringen", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} fullbordade nyckelverifieringen", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} begärde nyckelverifiering", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} påbörjade nyckelverifiering", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceipts": "Skicka läskvitton", + "verifyOtherDevice": "🔐 Verifiera enhet", + "acceptedKeyVerification": "{sender} accepterade nyckelverifieringen", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Inkommande meddelanden", + "verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭", + "verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳", + "isReadyForKeyVerification": "{sender} är redo för nyckelverifiering", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Andra deltagare i en diskussion kan se när du läst ett meddelande.", + "stickers": "Klistermärken", + "discover": "Upptäck", + "aboutHomeserver": "Om {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Uppgradera detta rum till den givna rumsversionen", + "appLockDescription": "Lås appen när den inte används med en pin-kod", + "swipeRightToLeftToReply": "Svep från höger till vänster för att svara", + "noMoreChatsFound": "Inga fler chattar hittades...", + "noChatsFoundHere": "Inga chattar kunde hittas här ännu. Starta en ny chatt med någon genom att använda knappen nedan. ⤵️", + "unread": "Olästa", + "space": "Utrymme", + "changedTheChatDescription": "{username} ändrade chattens beskrivning", + "changedTheChatName": "{username} ändrade chattens namn", + "checkList": "Att-göra lista", + "countInvited": "{count} inbjudna", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "globalChatId": "Globalt chat-ID", + "accessAndVisibility": "Tillgänglighet och synlighet", + "accessAndVisibilityDescription": "Vem som är tillåten att gå med i chatten och hur chatten kan upptäckas.", + "calls": "Samtal", + "customEmojisAndStickers": "Egna emojis och klistermärken", + "customEmojisAndStickersBody": "Lägg till eller dela egna emojis eller klistermärken som kan användas i alla chattar.", + "hideRedactedMessages": "Dölj tillbakatagna meddelanden", + "hideRedactedMessagesBody": "Om någon tar tillbaka ett meddelande, kommer meddelandet inte längre vara synligt i chatten.", + "hideInvalidOrUnknownMessageFormats": "Dölj ogiltiga eller okända meddelande-format", + "passwordRecoverySettings": "Lösenordsåterställnings-inställningar", + "sendImages": "Skicka {count} bild", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " Synkroniserar… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "usersMustKnock": "Användare måste knacka", + "noOneCanJoin": "Ingen kan gå med", + "knock": "Knacka", + "knocking": "Knackar", + "chatCanBeDiscoveredViaSearchOnServer": "Chatten kan upptäckas via sökfunktionen på {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Offentlig chatt-adress", + "createNewAddress": "Skapa ny adress", + "searchIn": "Sök i chatten \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Sök mer...", + "gallery": "Galleri", + "files": "Filer", + "commandHint_ignore": "Ignorera det givna matrix-ID:et", + "commandHint_unignore": "Sluta ignorera det givna matrix-ID:et", + "unreadChatsInApp": "{appname}: {unread} olästa chattar", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Databaskryptering stöds inte på denna platform", + "thereAreCountUsersBlocked": "Just nu är {count} användare blockade.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Gå till utrymme:{space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Markera oläst", + "userLevel": "{level} - Användare", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Ändra allmäna chatt-inställningar", + "inviteOtherUsers": "Bjud in andra användare till chatten", + "changeTheChatPermissions": "Ändra chattbehörigheterna", + "changeTheVisibilityOfChatHistory": "Ändra synligheten på chatt-historiken", + "changeTheCanonicalRoomAlias": "Ändra den huvudsakliga offenliga chatt-adressen", + "sendRoomNotifications": "Skicka en @rum notis", + "changeTheDescriptionOfTheGroup": "Ändra beskrivningen på chatten", + "chatPermissionsDescription": "Definiera vilket tillståndsnivå som krävs för vissa handlingar i chatten. Tillståndsnivåerna 0, 50 och 100 representerar ofta användare, moderatorer och admins, men vilken gradering som helst fungerar.", + "updateInstalled": "🎉 Uppdatering {version} installerad!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Ändringslogg", + "sendCanceled": "Skickande avbröts", + "loginWithMatrixId": "Logga in med Matrix-ID", + "doesNotSeemToBeAValidHomeserver": "Verkar inte vara en kompatibel hemserver. Fel URL?", + "calculatingFileSize": "Beräknar filstorlek...", + "sendingAttachment": "Skickar bilaga...", + "oneOfYourDevicesIsNotVerified": "En av dina enheter är inte verifierade", + "noticeChatBackupDeviceVerification": "Notis: När du ansluter alla dina enheter till chatt-backupen, är de automatiskt verifierade.", + "continueText": "Fortsätt", + "blur": "Blurra:", + "opacity": "Opacitet:", + "setWallpaper": "Ställ in bakgrundsbild", + "manageAccount": "Hantera konto", + "noContactInformationProvided": "Servern bistår inte med någon giltig kontaktinformation", + "contactServerAdmin": "Kontakta server-admin", + "contactServerSecurity": "Kontakta server-säkerheten", + "supportPage": "Stödsida", + "serverInformation": "Serverinformation:", + "name": "Namn", + "version": "Version", + "website": "Hemsida", + "compress": "Komprimera", + "boldText": "Fetstilt", + "italicText": "Kursiv", + "strikeThrough": "Genomstryk", + "pleaseFillOut": "Fyll i", + "invalidUrl": "Ogiltig url", + "addLink": "Lägg till länk", + "unableToJoinChat": "Kunde inte gå med i chatten. Kanske har den andra parten redan stängt konversationen.", + "previous": "Föregående", + "otherPartyNotLoggedIn": "Den andra parten är för närvarande inte inloggad, och kan därför inte ta emot meddelanden!", + "appWantsToUseForLogin": "Använd '{server}' för att logga in", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Du tillåter härmed appen och hemsidan att dela information om dig.", + "open": "Öppna", + "waitingForServer": "Väntar på server...", + "newChatRequest": "📩 Ny chatt förfrågan", + "contentNotificationSettings": "Innehållsnotis-inställningar", + "generalNotificationSettings": "Allmänna notis-inställningar", + "roomNotificationSettings": "rumsnotis-inställningar", + "userSpecificNotificationSettings": "Användarspecifika notis-inställningar", + "otherNotificationSettings": "Andra notis-inställningar", + "notificationRuleContainsUserName": "Innehåller Användarnamn", + "notificationRuleContainsUserNameDescription": "Avisera användaren när ett meddelande innehåller deras användarnamn.", + "notificationRuleMaster": "Tysta alla notiser", + "notificationRuleMasterDescription": "Åsidosätter alla andra regler och tystar alla notiser.", + "notificationRuleMemberEvent": "Medlemshändelse", + "notificationRuleContainsDisplayName": "Innehåller visningsnamn", + "notificationRuleReaction": "Reaktion", + "notificationRuleCall": "Samtal", + "notificationRuleJitsi": "Jitsi", + "takeAPhoto": "Ta ett foto", + "recordAVideo": "Spela in en video", + "more": "Mer", + "allDevices": "Alla enheter", + "optionalMessage": "(Valfritt) meddelande ...", + "enterNewChat": "Gå med i ny chatt", + "approve": "Godkänn", + "customReaction": "Anpassad reaktion", + "moreEvents": "Fler händelser", + "noMessagesYet": "Inga meddelanden än", + "pause": "Pausa", + "resume": "Fortsätt", + "countChats": "{chats} chattar", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "answerOption": "Svarsalternativ", + "addAnswerOption": "Lägg till svarsalternativ", + "allowMultipleAnswers": "Tillåt flera svar", + "countVotes": "{count, plural, =1{En röst} other{{count} röster}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replyInThread": "Svara i tråd", + "thread": "Tråd", + "countReplies": "{count, plural, =1{Ett svar} other{{count} svar}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "saveChanges": "Spara ändringar", + "noMoreResultsFound": "Inga fler resultat hittades", + "versionWithNumber": "Version: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Loggar", + "signIn": "Logga in", + "createNewAccount": "Skapa nytt konto", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_ta.arb b/lib/l10n/intl_ta.arb new file mode 100644 index 0000000000..a584d03e1d --- /dev/null +++ b/lib/l10n/intl_ta.arb @@ -0,0 +1,2515 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.826673", + "acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "accept": "ஏற்றுக்கொள்", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "பற்றி", + "@about": { + "type": "String", + "placeholders": {} + }, + "sendCanceled": "அனுப்புதல் கைவிடப்பட்டது", + "chatDetails": "அரட்டை விவரங்கள்", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "உலகளாவிய அரட்டை ஐடி", + "accessAndVisibility": "அணுகல் மற்றும் தெரிவுநிலை", + "onlineKeyBackupEnabled": "நிகழ்நிலை விசை காப்புப்பிரதி இயக்கப்பட்டது", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "setStatus": "நிலையை அமைக்கவும்", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "சரிபார்ப்பைத் தொடங்கவும்", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "ஆதரிக்கப்படாத ஆண்ட்ராய்டு பதிப்பு", + "commandHint_sendraw": "மூல சாதொபொகு ஐ அனுப்புங்கள்", + "passwordIsWrong": "நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறு", + "completedKeyVerification": "{sender} நிறைவு செய்யப்பட்ட விசை சரிபார்ப்பு", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "உள்வரும் செய்திகள்", + "password": "கடவுச்சொல்", + "@password": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "வெற்று அரட்டை", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "encrypted": "குறியாக்கப்பட்டது", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "reject": "நிராகரிக்கவும்", + "@reject": { + "type": "String", + "placeholders": {} + }, + "importNow": "இப்போது இறக்குமதி", + "changedTheChatAvatar": "{username} அரட்டை அவதாரத்தை மாற்றியது", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "உங்களை விவரிக்கவும்", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_unban": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரைத் தடுக்கிறது", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "countParticipants": "{count} பங்கேற்பாளர்கள்", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editDisplayname": "காட்சி பெயர் திருத்து", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{targetName} க்கான அழைப்பை {username} திரும்பப் பெற்றுள்ளார்", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "user": "பயனர்", + "optionalRedactReason": "(விரும்பினால்) இந்த செய்தியை மாற்றியமைப்பதற்கான காரணம் ...", + "contactHasBeenInvitedToTheGroup": "குழுவிற்கு தொடர்பு அழைக்கப்பட்டுள்ளது", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "கடவுச்சொல் அல்லது மீட்பு விசை", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "select": "தேர்ந்தெடு", + "compareEmojiMatch": "தயவுசெய்து ஈமோசிகளை ஒப்பிடுக", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "அழைப்பிலிருந்து", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "help": "உதவி", + "@help": { + "type": "String", + "placeholders": {} + }, + "invited": "அழைக்கப்பட்டார்", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "பயனர்களை மட்டுமே அழைத்தது", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username} உதைத்து {targetName} ஐத் தடை செய்தார்", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "mention": "குறிப்பு", + "@mention": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "புதிய சரிபார்ப்பு கோரிக்கை!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "shareInviteLink": "இணைப்பைப் பகிரவும்", + "pin": "முள்", + "@pin": { + "type": "String", + "placeholders": {} + }, + "voiceCall": "குரல் அழைப்பு", + "youKickedAndBanned": "🙅 நீங்கள் உதைத்து தடைசெய்துள்ளீர்கள் {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user}ஐ உதைத்துள்ளீர்கள்", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "ஆப்பிள் கீச்சினில் சேமிக்கவும்", + "searchForUsers": "@Users ஐத் தேடுங்கள் ...", + "pleaseEnterYourCurrentPassword": "உங்கள் தற்போதைய கடவுச்சொல்லை உள்ளிடவும்", + "anyoneCanJoin": "யார் வேண்டுமானாலும் சேரலாம்", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "காப்பகம்", + "@archive": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "அரட்டையிலிருந்து தடை", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "cancel": "ரத்துசெய்", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "edit": "தொகு", + "@edit": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "நான் இணைப்பைக் சொடுக்கு செய்துள்ளேன்", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "மின்னஞ்சலில் உள்ள இணைப்பைக் சொடுக்கு செய்து தொடரவும்.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "உங்கள் பாணியை மாற்றவும்", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "fontSize": "எழுத்துரு அளவு", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "யூரி {uri} வேலை ஐ திறக்க முடியாது", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "கடவுச்சொல்லை மீண்டும் இடு", + "youRejectedTheInvitation": "நீங்கள் அழைப்பை நிராகரித்தீர்கள்", + "confirmMatrixId": "உங்கள் கணக்கை நீக்க உங்கள் மேட்ரிக்ச் ஐடியை உறுதிப்படுத்தவும்.", + "supposedMxid": "இது {mxid} be ஆக இருக்க வேண்டும்", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_googly": "சில கூகிள் கண்களை அனுப்பவும்", + "commandHint_cuddle": "ஒரு கசப்பு அனுப்பவும்", + "importEmojis": "ஈமோசிகளை இறக்குமதி", + "exportEmotePack": "எமோட் பேக் .zip என ஏற்றுமதி", + "replace": "மாற்று", + "tryAgain": "மீண்டும் முயற்சிக்கவும்", + "pushNotificationsNotAvailable": "புச் அறிவிப்புகள் கிடைக்கவில்லை", + "blockUsername": "பயனர்பெயரை புறக்கணிக்கவும்", + "chatBackup": "அரட்டை காப்புப்பிரதி", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "send": "அனுப்பு", + "@send": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "அவர்கள் பொருந்தவில்லை", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "செய்திகளை அனுப்பவும்", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "கோப்பைப் பதிவிறக்கவும்", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "புதிய இடம்", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "ஒத்திசைத்தல்… தயவுசெய்து காத்திருங்கள்.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "அறியப்படாத குறியாக்க வழிமுறை", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unverified": "சரிபார்க்கப்படாதது", + "unmuteChat": "மாறுதல் அரட்டை", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "பிற கணக்கை சரிபார்க்கிறது", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "வீடியோ அழைப்பு", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "பங்கேற்பாளர்கள் அனைவருக்கும் தெரியும்", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "குரல் செய்தி", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "அரட்டையை மீண்டும் திறக்கவும்", + "formattedMessages": "வடிவமைக்கப்பட்ட செய்திகள்", + "darkTheme": "இருண்ட", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "விருந்தினர்கள் தடைசெய்யப்பட்டுள்ளனர்", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "விருந்தினர்கள் சேரலாம்", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "commandHint_invite": "கொடுக்கப்பட்ட பயனரை இந்த அறைக்கு அழைக்கவும்", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_op": "கொடுக்கப்பட்ட பயனரின் ஆற்றல் மட்டத்தை அமைக்கவும் (இயல்புநிலை: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "வடிவமைக்கப்படாத உரையை அனுப்பவும்", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandMissing": "{command} என்பது கட்டளை அல்ல.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "moderator": "மதிப்பீட்டாளர்", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "இருப்பிடத்தைப் பகிரவும்", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "addEmail": "மின்னஞ்சல் சேர்க்கவும்", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "அனைத்தும்", + "@all": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "ஒளி", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Enter ஐ அனுப்பவும்", + "dehydrate": "ஏற்றுமதி அமர்வு மற்றும் சாதனத்தை துடைக்கவும்", + "ok": "சரி", + "@ok": { + "type": "String", + "placeholders": {} + }, + "configureChat": "அரட்டையை உள்ளமைக்கவும்", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "isTyping": "தட்டச்சு செய்கிறது…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} அரட்டையில் சேர்ந்தார்", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "சேவையகத்துடன் எந்த தொடர்பும் இல்லை", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "உணர்ச்சிகள் எதுவும் காணப்படவில்லை. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "அறிவிப்புகள்", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "அச்சச்சோ! துரதிர்ச்டவசமாக, புச் அறிவிப்புகளை அமைக்கும் போது பிழை ஏற்பட்டது.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "அச்சச்சோ, ஏதோ தவறு நடந்தது…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "bundleName": "மூட்டை பெயர்", + "remove": "அகற்று", + "@remove": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "ஒரு செய்தியை அனுப்பவும்", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "இடம் பொது", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "அனைவருக்கும் தெரியும்", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "நாங்கள் உங்களுக்கு ஒரு மின்னஞ்சல் அனுப்பினோம்", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "report": "அறிக்கை", + "verifyOtherDevice": "🔐 பிற சாதனத்தை சரிபார்", + "startedACall": "{senderName} அழைப்பைத் தொடங்கினார்", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} ஒரு {type} நிகழ்வை அனுப்பியது", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "சரிபார்க்கப்பட்டது", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "நீங்கள் வெற்றிகரமாக சரிபார்த்தீர்கள்!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "பங்குதாரர் எண்களை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "எச்சரிக்கை!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "pinMessage": "அறைக்கு முள்", + "acceptedKeyVerification": "{sender} ஏற்றுக்கொள்ளப்பட்ட விசை சரிபார்ப்பு", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "copyToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கவும்", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createGroup": "குழுவை உருவாக்கவும்", + "editBundlesForAccount": "இந்த கணக்கிற்கான மூட்டைகளைத் திருத்தவும்", + "unpin": "மூள்நீக்கு", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "emojis": "ஈமோசிகள்", + "jumpToLastReadMessage": "கடைசி வாசிப்பு செய்திக்கு செல்லவும்", + "commandHint_markasgroup": "குழுவாக குறி", + "commandHint_html": "உஉகுமொ வடிவமைக்கப்பட்ட உரையை அனுப்பவும்", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_kick": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரை அகற்றவும்", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "deleteMessage": "செய்தியை நீக்கு", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "செய்தி தகவல்", + "sentAFile": "📁 {username} கோப்பை அனுப்பியுள்ளார்", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "readUpToHere": "இங்கே படிக்கவும்", + "chatDescriptionHasBeenChanged": "அரட்டை விளக்கம் மாற்றப்பட்டது", + "reportMessage": "செய்தி அறிக்கை", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "அரட்டையிலிருந்து கிக்", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ஒரு நிகழ்வை மறுவடிவமைத்தது", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "opacity": "ஒளிபுகாநிலை:", + "blur": "மங்கலானது:", + "setWallpaper": "வால்பேப்பரை அமைக்கவும்", + "statusExampleMessage": "இன்று நீங்கள் எப்படி இருக்கிறீர்கள்?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "பல கோரிக்கைகள். தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "சாதனத்தைத் தடைசெய்க", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "தெரியாத சாதனம்", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "storeSecurlyOnThisDevice": "இந்த சாதனத்தில் பாதுகாப்பாக சேமிக்கவும்", + "screenSharingTitle": "திரை பகிர்வு", + "noOtherDevicesFound": "வேறு சாதனங்கள் எதுவும் கிடைக்கவில்லை", + "sendRoomNotifications": "ஒரு @room அறிவிப்புகளை அனுப்பவும்", + "reply": "பதில்", + "@reply": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "மற்ற நபரில் கையெழுத்திட, தயவுசெய்து உங்கள் பாதுகாப்பான கடை பாச்ஃபிரேச் அல்லது மீட்பு விசையை உள்ளிடவும்.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "விருந்தினர் பயனர்கள் சேர அனுமதிக்கப்படுகிறார்களா?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "நீங்கள் நிச்சயமாக வெளியேற விரும்புகிறீர்களா?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "{homeserver} பற்றி", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "பதிலளிக்க வலமிருந்து இடமாக ச்வைப் செய்யவும்", + "unread": "படிக்காதது", + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deleteAccount": "கணக்கை நீக்கு", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "noUsersFoundWithQuery": "துரதிர்ச்டவசமாக \"{query}\" உடன் எந்த பயனரையும் காண முடியவில்லை. நீங்கள் ஒரு எழுத்துப்பிழை செய்தீர்களா என்பதை சரிபார்க்கவும்.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "jump": "தாவு", + "yourGlobalUserIdIs": "உங்கள் உலகளாவிய பயனர் ஐடி: ", + "publicSpaces": "பொது இடங்கள்", + "discover": "கண்டுபிடி", + "commandHint_unignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை இணைக்கவும்", + "sendingAttachment": "இணைப்பை அனுப்புகிறது ...", + "continueText": "தொடரவும்", + "name": "பெயர்", + "whoCanPerformWhichAction": "எந்த செயலைச் செய்ய முடியும்", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "இந்த குழுவில் சேர யார் அனுமதிக்கப்படுகிறார்கள்", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "இந்த அரட்டையில் நீங்கள் இனி பங்கேற்கவில்லை", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "உங்கள் பொது விசை", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "time": "நேரம்", + "markAsRead": "படித்தபடி குறி", + "reportUser": "பயனர் புகாரளிக்கவும்", + "reactedWith": "{sender} {reaction} உடன் பதிலளித்தார்", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "placeCall": "அழைப்பு இடு", + "videoCallsBetaWarning": "வீடியோ அழைப்புகள் தற்போது பீட்டாவில் உள்ளன என்பதை நினைவில் கொள்க. அவர்கள் எதிர்பார்த்தபடி வேலை செய்யக்கூடாது அல்லது எல்லா தளங்களிலும் வேலை செய்யக்கூடாது.", + "experimentalVideoCalls": "சோதனை வீடியோ அழைப்புகள்", + "noOneCanJoin": "யாரும் சேர முடியாது", + "newSpace": "புதிய இடம்", + "wasDirectChatDisplayName": "வெற்று அரட்டை ({oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "openLinkInBrowser": "உலாவியில் திறந்த இணைப்பை திறக்கவும்", + "reportErrorDescription": "😭 ஓ இல்லை. ஏதோ தவறு நடந்தது. நீங்கள் விரும்பினால், இந்த பிழையை டெவலப்பர்களிடம் புகாரளிக்கலாம்.", + "invite": "அழைக்கவும்", + "wrongPinEntered": "தவறான முள் நுழைந்தது! {seconds} விநாடிகளில் மீண்டும் முயற்சிக்கவும் ...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "தயவுசெய்து 0 ஐ விட அதிகமான எண்ணை உள்ளிடவும்", + "kickUserDescription": "பயனர் அரட்டையிலிருந்து வெளியேற்றப்படுகிறார், ஆனால் தடை செய்யப்படவில்லை. பொது அரட்டைகளில், பயனர் எந்த நேரத்திலும் மீண்டும் சேரலாம்.", + "learnMore": "மேலும் அறிக", + "chatCanBeDiscoveredViaSearchOnServer": "{server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "bannedUser": "{username} தடைசெய்யப்பட்ட {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "தொகுதி சாதனம்", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "தடுக்கப்பட்டது", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "சாதனத்தின் பெயரை மாற்றவும்", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} அவற்றின் காட்சி பெயர்: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} அவர்களின் அவதாரத்தை மாற்றியது", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} அறை மாற்றுப்பெயர்களை மாற்றியது", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheNameOfTheGroup": "குழுவின் பெயரை மாற்றவும்", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "chats": "அரட்டைகள்", + "@chats": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "தெளிவான காப்பகம்", + "close": "மூடு", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "வெற்று குழு அரட்டையை உருவாக்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "compareNumbersMatch": "எண்களை ஒப்பிடுக", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "நகலெடு", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "செய்தியை மறைகுறியாக்க முடியவில்லை: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "உருவாக்கு", + "@create": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "அரட்டை அனுமதிகள்", + "editRoomAliases": "அறை மாற்றுப்பெயர்களைத் திருத்து", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "அறை அவதார் திருத்து", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "forward": "முன்னோக்கி", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "சேருவதிலிருந்து", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} உடன் குழு", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "hideRedactedMessages": "சரிசெய்யப்பட்ட செய்திகளை மறைக்கவும்", + "hideRedactedMessagesBody": "யாராவது ஒரு செய்தியை மாற்றியமைத்தால், இந்த செய்தி இனி அரட்டையில் காணப்படாது.", + "inviteContact": "தொடர்பை அழைக்கவும்", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} {targetName} ஐ உதைத்தார்", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "கடைசியாக செயலில்: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leftTheChat": "அரட்டையை விட்டு வெளியேறினார்", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "ஏற்றவும் {count} மேலும் பங்கேற்பாளர்கள்", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrateWarning": "இந்த செயலை செயல்தவிர்க்க முடியாது. காப்புப்பிரதி கோப்பை பாதுகாப்பாக சேமித்து வைக்கவும்.", + "loadMore": "மேலும் ஏற்றவும்…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "logout": "வெளியேற்றம்", + "@logout": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "செய்திகள்:", + "newMessageInFluffyChat": "Fuf பஞ்சுபோன்ற புதிய செய்தி", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "அறை இனி பகிரங்கமாக அணுக முடியாதவுடன் மட்டுமே நீங்கள் குறியாக்கத்தை செயல்படுத்த முடியும்.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} என்பது மேட்ரிக்ஸ் சர்வர் இல்லை, அதற்கு பதிலாக {server2} ஐ பயன்படுத்தவா?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPermission": "இசைவு இல்லை", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "அறைகள் எதுவும் கிடைக்கவில்லை…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} பயனர்கள் தட்டச்சு செய்கிறார்கள்…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "openCamera": "திறந்த கேமரா", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "addAccount": "கணக்கைச் சேர்க்கவும்", + "openInMaps": "வரைபடங்களில் திறந்திருக்கும்", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "இணைப்பு", + "passwordForgotten": "கடவுச்சொல் மறந்துவிட்டது", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "கடவுச்சொல் மாற்றப்பட்டுள்ளது", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "பாச் குறியீட்டைத் தேர்வுசெய்க", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "பொது அறைகள்", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "மற்ற எல்லா சாதனங்களையும் அகற்றவும்", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "அறை மேம்படுத்தப்பட்டுள்ளது", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "அறை பதிப்பு", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "கோப்பை சேமி", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤 {username} ஆடியோவை அனுப்பியுள்ளார்", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} படத்தை அனுப்பியுள்ளார்", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ஒரு வீடியோவை அனுப்பியுள்ளார்", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "settings": "அமைப்புகள்", + "@settings": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} அவற்றின் இருப்பிடத்தைப் பகிர்ந்து கொண்டது", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "submit": "சமர்ப்பிக்கவும்", + "@submit": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "மீண்டும் அனுப்ப முயற்சிக்கவும்", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "தட்டச்சு அறிவிப்புகளை அனுப்பவும்", + "enterAnEmailAddress": "மின்னஞ்சல் முகவரியை உள்ளிடவும்", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "blockListDescription": "உங்களை தொந்தரவு செய்யும் பயனர்களைத் தடுக்கலாம். உங்கள் தனிப்பட்ட தொகுதி பட்டியலில் பயனர்களிடமிருந்து எந்த செய்திகளையும் அல்லது அறை அழைப்புகளையும் நீங்கள் பெற முடியாது.", + "incorrectPassphraseOrKey": "தவறான கடவுச்சொல் அல்லது மீட்பு விசை", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "ஏற்றுகிறது… தயவுசெய்து காத்திருங்கள்.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "no": "இல்லை", + "@no": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "இந்த அரட்டையிலிருந்து உங்களுக்கு தடை விதிக்கப்பட்டுள்ளது", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "databaseMigrationTitle": "தரவுத்தளம் உகந்ததாக உள்ளது", + "usersMustKnock": "பயனர்கள் தட்ட வேண்டும்", + "importFromZipFile": ".சிப் கோப்பிலிருந்து இறக்குமதி", + "activatedEndToEndEncryption": "{username} இறுதி குறியாக்கத்திற்கு செயல்படுத்தப்பட்ட முடிவு", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addToSpace": "விண்வெளியில் சேர்க்கவும்", + "commandHint_hug": "கட்டிப்பிடிக்கவும்", + "cuddleContent": "{senderName} பெயர் you உங்களை கசக்குகிறது", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} உங்களை அணைத்துக்கொள்கிறது", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "பயன்பாட்டு பூட்டு", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "முள் குறியீட்டைக் கொண்டு பயன்படுத்தாதபோது பயன்பாட்டைப் பூட்டவும்", + "googlyEyesContent": "{senderName} உங்களுக்கு கூகிள் கண்களை அனுப்புகிறது", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSure": "நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}பயனர்பெயர் இருந்து இலிருந்து இந்த சரிபார்ப்பு கோரிக்கையை ஏற்றுக்கொள்ளவா?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "அனிமேசன் செய்யப்பட்ட ச்டிக்கர்கள் மற்றும் உணர்ச்சிகளை தானாக இயக்கவும்", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "உள்நாட்டு வகைகளை ஓம்சர்வர் ஆதரிக்கிறது:\n {serverVersions}\n ஆனால் இந்த பயன்பாடு மட்டுமே ஆதரிக்கிறது:\n {supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "noChatsFoundHere": "இங்கே அரட்டைகள் எதுவும் காணப்படவில்லை. கீழே உள்ள பொத்தானைப் பயன்படுத்தி ஒருவருடன் புதிய அரட்டையைத் தொடங்கவும். ⤵️", + "space": "இடைவெளி", + "banned": "தடைசெய்யப்பட்டது", + "@banned": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibilityTo": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} சேர விதிகளை மாற்றியது", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} சேர விதிகளை மாற்றியது: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} அழைப்பிதழ் இணைப்பை மாற்றியது", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "கடவுச்சொல்லை மாற்றவும்", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "ஓம்சர்வரை மாற்றவும்", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "உங்கள் அவதாரத்தை மாற்றவும்", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "குறியாக்கம் சிதைந்துள்ளது", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "அரட்டை", + "@chat": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "கொடுக்கப்பட்ட மேட்ரிக்சிற்கான நேரடி செய்தி அறையாக குறிக்கவும்", + "commandHint_ban": "கொடுக்கப்பட்ட பயனரை இந்த அறையிலிருந்து தடை செய்யுங்கள்", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "தெளிவான தற்காலிக சேமிப்பு", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "அமர்வை நிராகரிக்கவும்", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_myroomavatar": "இந்த அறைக்கு உங்கள் படத்தை அமைக்கவும் (mxc-uri எழுதியது)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "இந்த அறைக்கு உங்கள் காட்சி பெயரை அமைக்கவும்", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandInvalid": "கட்டளை தவறானது", + "@commandInvalid": { + "type": "String" + }, + "contentHasBeenReported": "உள்ளடக்கம் சேவையக நிர்வாகிகளுக்கு தெரிவிக்கப்பட்டுள்ளது", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} அரட்டையை உருவாக்கினார்", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "தற்போது செயலில் உள்ளது", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "இது உங்கள் பயனர் கணக்கை செயலிழக்கச் செய்யும். இதை செயல்தவிர்க்க முடியாது! நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "புதிய பயனர்களுக்கான இயல்புநிலை இசைவு நிலை", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "நீக்கு", + "@delete": { + "type": "String", + "placeholders": {} + }, + "devices": "சாதனங்கள்", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "நேரடி அரட்டைகள்", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "காட்சி பெயர் மாற்றப்பட்டுள்ளது", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "தடுக்கப்பட்ட சேவையகங்களைத் திருத்து", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "எமோட் ஏற்கனவே உள்ளது!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "தவறான எமோட் சார்ட்கோட்!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "அண்மைக் காலத்தில் பயன்படுத்தப்பட்ட உணர்ச்சிகள் இங்கே தோன்றும் ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "எமோட் அமைப்புகள்", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "accessAndVisibilityDescription": "இந்த அரட்டையில் யார் சேர அனுமதிக்கப்படுகிறார்கள், அரட்டையை எவ்வாறு கண்டுபிடிப்பது.", + "calls": "அழைப்புகள்", + "customEmojisAndStickers": "தனிப்பயன் ஈமோசிகள் மற்றும் ச்டிக்கர்கள்", + "customEmojisAndStickersBody": "எந்தவொரு அரட்டையிலும் பயன்படுத்தக்கூடிய தனிப்பயன் ஈமோசிகள் அல்லது ச்டிக்கர்களைச் சேர்க்கவும் அல்லது பகிரவும்.", + "emoteShortcode": "சார்ட்கோட் எமோட்", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "உலகளவில் எமோட் பேக்கை இயக்கவும்", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "குறியாக்கத்தை இயக்கவும்", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "நீங்கள் இனி குறியாக்கத்தை முடக்க முடியாது. நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "குறியாக்கம் இயக்கப்படவில்லை", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "encryption": "குறியாக்கம்", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} அழைப்பை முடித்தார்", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "errorObtainingLocation": "இருப்பிடத்தைப் பெறுவதில் பிழை: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "group": "குழு", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "அரட்டை விளக்கம்", + "groupIsPublic": "குழு பொது", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "hideInvalidOrUnknownMessageFormats": "தவறான அல்லது அறியப்படாத செய்தி வடிவங்களை மறைக்கவும்", + "block": "தொகுதி", + "inviteContactToGroup": "{groupName} க்கு தொடர்பை அழை", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "அரட்டை விளக்கம் இதுவரை உருவாக்கப்படவில்லை.", + "invalidServerName": "தவறான சேவையக பெயர்", + "redactMessageDescription": "இந்த உரையாடலில் பங்கேற்பாளர்கள் அனைவருக்கும் செய்தி திருத்தப்படும். இதை செயல்தவிர்க்க முடியாது.", + "invitedUser": "📩 {username} {targetName} அழைக்கப்பட்டார்", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteText": "{username} உங்களை பஞ்சுபோன்றதாக அழைத்தது.\n 1. FulufyChat.im ஐப் பார்வையிட்டு பயன்பாட்டை நிறுவவும்\n 2. பதிவு செய்யுங்கள் அல்லது உள்நுழைக\n 3. அழைப்பிதழ் இணைப்பைத் திறக்கவும்:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinRoom": "அறையில் சேரவும்", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "leave": "விடுப்பு", + "@leave": { + "type": "String", + "placeholders": {} + }, + "hydrate": "காப்பு கோப்பிலிருந்து மீட்டமைக்கவும்", + "locationDisabledNotice": "இருப்பிட சேவைகள் முடக்கப்பட்டுள்ளன. தயவுசெய்து உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள அவர்களுக்கு உதவவும்.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "இருப்பிட இசைவு மறுக்கப்பட்டது. உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள தயவுசெய்து அவர்களுக்கு வழங்குங்கள்.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "புகுபதிவு", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} இல் உள்நுழைக", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "messages": "செய்திகள்", + "@messages": { + "type": "String", + "placeholders": {} + }, + "muteChat": "முடக்கு அரட்டை", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "புதிய அரட்டை", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "next": "அடுத்தது", + "@next": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "உங்கள் கடவுச்சொல்லை மீட்டெடுப்பதற்கான வழியை நீங்கள் இன்னும் சேர்க்கவில்லை.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "செய்திகளைப் படிக்க பயன்பாட்டைத் திறக்கவும்", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "உங்கள் வாடிக்கையாளர்களில் ஒருவர் உள்நுழைந்துள்ளார்", + "addToBundle": "மூட்டையில் சேர்க்கவும்", + "or": "அல்லது", + "@or": { + "type": "String", + "placeholders": {} + }, + "passwordRecoverySettings": "கடவுச்சொல் மீட்பு அமைப்புகள்", + "passwordRecovery": "கடவுச்சொல் மீட்பு", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "உங்கள் கடவுச்சொல்லை உள்ளிடவும்", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "உங்கள் முள் உள்ளிடவும்", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "உங்கள் பயனர்பெயரை உள்ளிடவும்", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "வலைத்தளத்தின் வழிமுறைகளைப் பின்பற்றி அடுத்து தட்டவும்.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "தனியுரிமை", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "reason": "காரணம்", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "{username} ஆல் திருத்தப்பட்டது ஏனெனில்: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "rejectedTheInvitation": "{username} அழைப்பை நிராகரித்தது", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unbanFromChat": "அரட்டையிலிருந்து தடையின்றி", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "உங்கள் அவதாரத்தை அகற்று", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "புதிய பதிப்போடு அறையை மாற்றவும்", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "உரையாக அனுப்பவும்", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "ஆடியோ அனுப்பவும்", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendImage": "படத்தை அனுப்பு", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "{count} படத்தை அனுப்பு", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendVideo": "வீடியோ அனுப்பவும்", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentASticker": "😊 {username} ஒரு ச்டிக்கரை அனுப்பியது", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} அனுப்பப்பட்ட அழைப்பு செய்தி", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "முதன்மையான மாற்றுப்பெயராக அமைக்கவும்", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "அரட்டை விளக்கத்தை அமைக்கவும்", + "share": "பங்கு", + "@share": { + "type": "String", + "placeholders": {} + }, + "skip": "தவிர்", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "மூலக் குறியீடு", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceName": "விண்வெளி பெயர்", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "நிலை", + "@status": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "மண்டலம்", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "அவர்கள் பொருந்துகிறார்கள்", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} தடைசெய்யப்படாத {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEvent": "அறியப்படாத நிகழ்வு '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} மற்றும் {count} மற்றவர்கள் தட்டச்சு செய்கிறார்கள்…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userIsTyping": "{username} தட்டச்சு செய்கிறது…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "waitingPartnerAcceptRequest": "கூட்டாளர் கோரிக்கையை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "பங்குதாரர் ஈமோசியை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "sender": "அனுப்புநர்", + "openGallery": "திறந்த கேலரி", + "whyDoYouWantToReportThis": "இதை ஏன் புகாரளிக்க விரும்புகிறீர்கள்?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "இந்த முகவரிகள் மூலம் உங்கள் கடவுச்சொல்லை மீட்டெடுக்கலாம்.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "ஒரு செய்தியை எழுதுங்கள்…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "ஆம்", + "@yes": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "இடத்திலிருந்து அகற்று", + "confirmEventUnpin": "நிகழ்வை நிரந்தரமாக அவிழ்ப்பது உறுதி?", + "youJoinedTheChat": "நீங்கள் அரட்டையில் சேர்ந்தீர்கள்", + "youAcceptedTheInvitation": "👍 நீங்கள் அழைப்பை ஏற்றுக்கொண்டீர்கள்", + "youBannedUser": "நீங்கள் {user} தடை செய்தீர்கள்", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}க்கான அழைப்பை திரும்பப் பெற்றுவிட்டீர்கள்", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 நீங்கள் {user} ஆல் அழைக்கப்பட்டுள்ளீர்கள்", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} ஐ அழைத்தீர்கள்", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "நீங்கள் {user} தடைசெய்யவில்லை", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} தட்டியது", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "தட்டவும்", + "users": "பயனர்கள்", + "storeInAndroidKeystore": "ஆண்ட்ராய்டு கீச்டோரில் சேமிக்கவும்", + "countFiles": "{count} கோப்புகள்", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "custom": "தனிப்பயன்", + "foregroundServiceRunning": "முன்புற பணி இயங்கும்போது இந்த அறிவிப்பு தோன்றும்.", + "screenSharingDetail": "உங்கள் திரையை FuffyChat இல் பகிர்கிறீர்கள்", + "whyIsThisMessageEncrypted": "இந்த செய்தி ஏன் படிக்க முடியாதது?", + "noKeyForThisMessage": "இந்த சாதனத்தில் உங்கள் கணக்கில் கையொப்பமிடுவதற்கு முன்பு செய்தி அனுப்பப்பட்டால் இது நிகழலாம்.\n\n அனுப்புநர் உங்கள் சாதனத்தைத் தடுத்துள்ளார் அல்லது இணைய இணைப்பில் ஏதேனும் தவறு ஏற்பட்டுள்ளது.\n\n மற்றொரு அமர்வில் செய்தியைப் படிக்க முடியுமா? அதிலிருந்து செய்தியை மாற்றலாம்! அமைப்புகள்> சாதனங்களுக்குச் சென்று, உங்கள் சாதனங்கள் ஒருவருக்கொருவர் சரிபார்த்துள்ளன என்பதை உறுதிப்படுத்தவும். அடுத்த முறை நீங்கள் அறையைத் திறக்கும்போது, இரண்டு அமர்வுகளும் முன்னணியில் இருக்கும்போது, விசைகள் தானாகவே அனுப்பப்படும்.\n\n வெளியேறும்போது அல்லது சாதனங்களை மாற்றும்போது விசைகளை இழக்க நீங்கள் விரும்பவில்லையா? அமைப்புகளில் அரட்டை காப்புப்பிரதியை நீங்கள் இயக்கியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", + "doNotShowAgain": "மீண்டும் காட்ட வேண்டாம்", + "newSpaceDescription": "உங்கள் அரட்டைகளை ஒருங்கிணைத்து தனியார் அல்லது பொது சமூகங்களை உருவாக்க இடைவெளிகள் உங்களை அனுமதிக்கிறது.", + "disableEncryptionWarning": "பாதுகாப்பு காரணங்களுக்காக நீங்கள் ஒரு அரட்டையில் குறியாக்கத்தை முடக்க முடியாது, அது இதற்கு முன்பு இயக்கப்பட்டிருக்கிறது.", + "sorryThatsNotPossible": "மன்னிக்கவும் ... அது சாத்தியமில்லை", + "noBackupWarning": "எச்சரிக்கை! அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் மறைகுறியாக்கப்பட்ட செய்திகளுக்கான அணுகலை இழப்பீர்கள். வெளியேறுவதற்கு முன் முதலில் அரட்டை காப்புப்பிரதியை இயக்க மிகவும் பரிந்துரைக்கப்படுகிறது.", + "fileIsTooBigForServer": "அனுப்ப முடியவில்லை! சேவையகம் {max} வரை இணைப்புகளை மட்டுமே ஆதரிக்கிறது.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "கோப்பு {path} இல் சேமிக்கப்பட்டது", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 குழு அரட்டை அழைப்பு", + "invalidInput": "தவறான உள்ளீடு!", + "archiveRoomDescription": "அரட்டை காப்பகத்திற்கு நகர்த்தப்படும். மற்ற பயனர்கள் நீங்கள் அரட்டையை விட்டுவிட்டீர்கள் என்பதைக் காண முடியும்.", + "removeDevicesDescription": "நீங்கள் இந்த சாதனத்திலிருந்து வெளியேறுவீர்கள், இனி செய்திகளைப் பெற முடியாது.", + "banUserDescription": "பயனர் அரட்டையிலிருந்து தடைசெய்யப்படுவார், மேலும் அவை தடைசெய்யப்படாத வரை மீண்டும் அரட்டையில் நுழைய முடியாது.", + "makeAdminDescription": "இந்த பயனர் நிர்வாகியை நீங்கள் செய்தவுடன், இதை நீங்கள் செயல்தவிர்க்க முடியாமல் போகலாம், ஏனெனில் அவை உங்களைப் போன்ற அதே அனுமதிகளைக் கொண்டிருக்கும்.", + "knocking": "தட்டுதல்", + "searchChatsRooms": "#Chats, Us பயனர்களைத் தேடுங்கள் ...", + "nothingFound": "எதுவும் கிடைக்கவில்லை ...", + "groupName": "குழு பெயர்", + "createGroupAndInviteUsers": "ஒரு குழுவை உருவாக்கி பயனர்களை அழைக்கவும்", + "groupCanBeFoundViaSearch": "தேடல் வழியாக குழுவை காணலாம்", + "wrongRecoveryKey": "மன்னிக்கவும் ... இது சரியான மீட்பு விசையாகத் தெரியவில்லை.", + "databaseMigrationBody": "தயவுசெய்து காத்திருங்கள். இது ஒரு கணம் ஆகலாம்.", + "newPassword": "புதிய கடவுச்சொல்", + "pleaseChooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", + "passwordsDoNotMatch": "கடவுச்சொற்கள் பொருந்தவில்லை", + "joinSpace": "விண்வெளியில் சேரவும்", + "addChatOrSubSpace": "அரட்டை அல்லது துணை இடத்தைச் சேர்க்கவும்", + "initAppError": "பயன்பாட்டைத் தொடங்கும்போது பிழை ஏற்பட்டது", + "sessionLostBody": "உங்கள் அமர்வு தொலைந்துவிட்டது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு புதிய செய்தியைத் தட்டச்சு செய்யும் போது காணலாம்.", + "sendReadReceiptsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு செய்தியைப் படிக்கும்போது பார்க்கலாம்.", + "formattedMessagesDescription": "மார்க் டவுனைப் பயன்படுத்தி தைரியமான உரை போன்ற பணக்கார செய்தி உள்ளடக்கத்தைக் காண்பி.", + "verifyOtherUser": "🔐 மற்ற பயனரை சரிபார்", + "verifyOtherUserDescription": "நீங்கள் மற்றொரு பயனரைச் சரிபார்த்தால், நீங்கள் உண்மையில் யாருக்கு எழுதுகிறீர்கள் என்பது உங்களுக்குத் தெரியும் என்பதை நீங்கள் உறுதியாக நம்பலாம். 💪\n\nநீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, நீங்களும் மற்ற பயனரும் பயன்பாட்டில் ஒரு பாப்அப்பைக் காண்பீர்கள். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள்.\n\nஇதைச் செய்வதற்கான சிறந்த வழி வீடியோ அழைப்பைச் சந்திப்பது அல்லது தொடங்குவது. 👭", + "verifyOtherDeviceDescription": "நீங்கள் மற்றொரு சாதனத்தைச் சரிபார்க்கும்போது, அந்தச் சாதனங்கள் விசைகளைப் பரிமாறிக்கொள்ளலாம், உங்கள் ஒட்டுமொத்த பாதுகாப்பை அதிகரிக்கும். 💪 நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, இரண்டு சாதனங்களிலும் பயன்பாட்டில் ஒரு பாப்அப் தோன்றும். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள். நீங்கள் சரிபார்ப்பைத் தொடங்குவதற்கு முன்பு இரண்டு சாதனங்களையும் எளிதில் வைத்திருப்பது நல்லது. 🤳", + "canceledKeyVerification": "{sender} ரத்து செய்யப்பட்ட விசை சரிபார்ப்பு", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "விசை சரிபார்ப்பிற்கு {sender} தயாராக உள்ளார்", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} கோரப்பட்ட விசை சரிபார்ப்பு", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "stickers": "ச்டிக்கர்கள்", + "commandHint_ignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை புறக்கணிக்கவும்", + "unreadChatsInApp": "{appname}: {unread} படிக்காத அரட்டைகள்", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "இப்போது {count} பயனர்கள் தடுக்கப்பட்டுள்ளனர்.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "moderatorLevel": "{level} - மதிப்பீட்டாளர்", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - நிர்வாகி", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "பொது அரட்டை அமைப்புகளை மாற்றவும்", + "inviteOtherUsers": "இந்த அரட்டைக்கு மற்ற பயனர்களை அழைக்கவும்", + "changeTheChatPermissions": "அரட்டை அனுமதிகளை மாற்றவும்", + "changeTheVisibilityOfChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலையை மாற்றவும்", + "changeTheCanonicalRoomAlias": "முக்கிய பொது அரட்டை முகவரியை மாற்றவும்", + "changeTheDescriptionOfTheGroup": "அரட்டையின் விளக்கத்தை மாற்றவும்", + "chatPermissionsDescription": "இந்த அரட்டையில் சில செயல்களுக்கு எந்த ஆற்றல் நிலை தேவை என்பதை வரையறுக்கவும். 0, 50 மற்றும் 100 ஆற்றல் நிலைகள் பொதுவாக பயனர்கள், மதிப்பீட்டாளர்கள் மற்றும் நிர்வாகிகளைக் குறிக்கின்றன, ஆனால் எந்த தரமும் சாத்தியமாகும்.", + "updateInstalled": "🎉 புதுப்பிப்பு {version} நிறுவப்பட்டது!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "மாற்றபதிவு", + "calculatingFileSize": "கோப்பு அளவைக் கணக்கிடுகிறது ...", + "oneOfYourDevicesIsNotVerified": "உங்கள் சாதனங்களில் ஒன்று சரிபார்க்கப்படவில்லை", + "noticeChatBackupDeviceVerification": "குறிப்பு: உங்கள் எல்லா சாதனங்களையும் அரட்டை காப்புப்பிரதியுடன் இணைக்கும்போது, அவை தானாகவே சரிபார்க்கப்படும்.", + "manageAccount": "கணக்கை நிர்வகிக்கவும்", + "noContactInformationProvided": "சேவையகம் எந்த சரியான தொடர்பு தகவலையும் வழங்காது", + "contactServerAdmin": "சேவையக நிர்வாகி தொடர்பு", + "contactServerSecurity": "சேவையக பாதுகாப்பைத் தொடர்பு கொள்ளுங்கள்", + "supportPage": "உதவி பக்கம்", + "serverInformation": "சேவையக தகவல்:", + "version": "பதிப்பு", + "website": "வலைத்தளம்", + "compress": "சுருக்க", + "admin": "நிர்வாகி", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "மாற்றுப்பெயர்", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} அழைப்புக்கு பதிலளித்தார்", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_react": "ஒரு எதிர்வினையாக பதிலை அனுப்பவும்", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "உரையை அனுப்பவும்", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "removeFromBundle": "இந்த மூட்டையிலிருந்து அகற்றவும்", + "redactedBy": "{username} ஆல் திருத்தப்பட்டது", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "நேரடி அரட்டை", + "redactMessage": "திருத்தும் செய்தி", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} மற்றும் {username2} தட்டச்சு செய்கின்றன…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} அரட்டையை விட்டு வெளியேறினார்", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "visibilityOfTheChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலை", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "you": "நீங்கள்", + "@you": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersionLong": "இந்த அம்சத்திற்கு புதிய ஆண்ட்ராய்டு பதிப்பு தேவைப்படுகிறது. புதுப்பிப்புகள் அல்லது பரம்பரை OS ஆதரவை சரிபார்க்கவும்.", + "setColorTheme": "வண்ண கருப்பொருள் அமைக்கவும்:", + "roomUpgradeDescription": "அரட்டை பின்னர் புதிய அறை பதிப்பில் மீண்டும் உருவாக்கப்படும். பங்கேற்பாளர்கள் அனைவருக்கும் புதிய அரட்டைக்கு மாற வேண்டும் என்று அறிவிக்கப்படும். அறை பதிப்புகள் பற்றி மேலும் அறிய https://spec.matrix.org/latest/rooms/", + "account": "கணக்கு", + "@account": { + "type": "String", + "placeholders": {} + }, + "groups": "குழுக்கள்", + "@groups": { + "type": "String", + "placeholders": {} + }, + "blockedUsers": "தடுக்கப்பட்ட பயனர்கள்", + "leaveEmptyToClearStatus": "உங்கள் நிலையை அழிக்க காலியாக விடவும்.", + "thisDevice": "இந்த சாதனம்:", + "gallery": "கேலரி", + "files": "கோப்புகள்", + "noDatabaseEncryption": "இந்த மேடையில் தரவுத்தள குறியாக்கம் ஆதரிக்கப்படவில்லை", + "goToSpace": "இடைவெளிக்குச் செல்லுங்கள்: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "படிக்காத எனக் குறிக்கவும்", + "userLevel": "{level} - பயனர்", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "notAnImage": "படக் கோப்பு அல்ல.", + "encryptThisChat": "இந்த அரட்டையை குறியாக்கவும்", + "publicChatAddresses": "பொது அரட்டை முகவரிகள்", + "createNewAddress": "புதிய முகவரியை உருவாக்கவும்", + "boldText": "தைரியமான உரை", + "italicText": "சாய்வு உரை", + "strikeThrough": "ச்ட்ரைகெத்ரோ", + "pleaseFillOut": "தயவுசெய்து நிரப்பவும்", + "invalidUrl": "தவறான முகவரி", + "addLink": "இணைப்பைச் சேர்க்கவும்", + "searchIn": "அரட்டையில் தேடு \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "மேலும் தேடு...", + "startedKeyVerification": "{sender} விசை சரிபார்ப்பைத் தொடங்கினார்", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "loginWithMatrixId": "மேட்ரிக்ச்-ஐடியுடன் உள்நுழைக", + "doesNotSeemToBeAValidHomeserver": "இணக்கமான வீட்டுசேவையகம் என்று தெரியவில்லை. தவறான முகவரி?", + "noMoreChatsFound": "இனி அரட்டைகள் கிடைக்கவில்லை ...", + "changedTheChatPermissions": "{username} அரட்டை அனுமதிகளை மாற்றியுள்ளார்", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_join": "கொடுக்கப்பட்ட அறையில் சேரவும்", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_dm": "நேரடி அரட்டையைத் தொடங்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "இந்த அறையை விட்டு விடுங்கள்", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "unbanUserDescription": "அவர்கள் முயற்சித்தால் பயனர் மீண்டும் அரட்டையை உள்ளிட முடியும்.", + "restoreSessionBody": "ஆப்ஸ் இப்போது உங்கள் அமர்வை காப்புப்பிரதியிலிருந்து மீட்டெடுக்க முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "வாசிப்பு ரசீதுகளை அனுப்பவும்", + "unableToJoinChat": "அரட்டையில் சேர முடியவில்லை. ஒருவேளை மற்ற கட்சி ஏற்கனவே உரையாடலை மூடியிருக்கலாம்.", + "noGoogleServicesWarning": "ஃபயர்பேச் முகில் செய்தி உங்கள் சாதனத்தில் கிடைக்கவில்லை. இன்னும் புச் அறிவிப்புகளைப் பெற, ntfy ஐ நிறுவப் பரிந்துரைக்கிறோம். ntfy அல்லது மற்றொரு ஒருங்கிணைந்த புச் வழங்குநருடன் நீங்கள் தரவு பாதுகாப்பான வழியில் புச் அறிவிப்புகளைப் பெறலாம். நீங்கள் பிளேச்டோரிலிருந்து அல்லது எஃப்-டிராய்டிலிருந்து ntfy ஐ பதிவிறக்கம் செய்யலாம்.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR குறியீட்டை ச்கேன் செய்யுங்கள்", + "obtainingLocation": "இருப்பிடத்தைப் பெறுதல்…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "participant": "பங்கேற்பாளர்", + "@participant": { + "type": "String", + "placeholders": {} + }, + "search": "தேடல்", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "பாதுகாப்பு", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendFile": "கோப்பு அனுப்பவும்", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "கொடுக்கப்பட்ட அறை பதிப்பிற்கு இந்த அறையை மேம்படுத்தவும்", + "checkList": "சரிபார்ப்பு பட்டியல்", + "countInvited": "{count} அழைக்கப்பட்டது", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " ஒத்திசைத்தல்… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "previous": "முந்தைய", + "otherPartyNotLoggedIn": "மற்ற கட்சி தற்போது உள்நுழைந்திருக்கவில்லை, எனவே செய்திகளைப் பெற முடியாது!", + "appWantsToUseForLogin": "உள்நுழைய '{server}' ஐப் பயன்படுத்தவும்", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "உங்களைப் பற்றிய தகவல்களைப் பகிர பயன்பாடு மற்றும் வலைத்தளத்தை இதன்மூலம் அனுமதிக்கிறீர்கள்.", + "open": "திற", + "waitingForServer": "சேவையகத்திற்காக காத்திருக்கிறது ...", + "newChatRequest": "📩 புதிய அரட்டை கோரிக்கை", + "contentNotificationSettings": "உள்ளடக்க அறிவிப்பு அமைப்புகள்", + "generalNotificationSettings": "பொது அறிவிப்பு அமைப்புகள்", + "roomNotificationSettings": "அறை அறிவிப்பு அமைப்புகள்", + "userSpecificNotificationSettings": "பயனர் குறிப்பிட்ட அறிவிப்பு அமைப்புகள்", + "otherNotificationSettings": "பிற அறிவிப்பு அமைப்புகள்", + "notificationRuleContainsUserName": "பயனர் பெயரைக் கொண்டுள்ளது", + "notificationRuleContainsUserNameDescription": "ஒரு செய்தியில் அவற்றின் பயனர்பெயர் இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleMaster": "அனைத்து அறிவிப்புகளையும் முடக்குகிறது", + "notificationRuleMasterDescription": "மற்ற எல்லா விதிகளையும் மீறி அனைத்து அறிவிப்புகளையும் முடக்குகிறது.", + "notificationRuleSuppressNotices": "தானியங்கு செய்திகளை அடக்கவும்", + "notificationRuleSuppressNoticesDescription": "போட்ச் போன்ற தானியங்கி வாடிக்கையாளர்களிடமிருந்து அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleInviteForMe": "எனக்கு அழைக்கவும்", + "notificationRuleInviteForMeDescription": "ஒரு அறைக்கு அழைக்கப்படும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleMemberEvent": "உறுப்பினர் நிகழ்வு", + "notificationRuleMemberEventDescription": "உறுப்பினர் நிகழ்வுகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleIsUserMention": "பயனர் குறிப்பு", + "notificationRuleIsUserMentionDescription": "ஒரு செய்தியில் நேரடியாக குறிப்பிடப்படும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleContainsDisplayName": "காட்சி பெயரைக் கொண்டுள்ளது", + "notificationRuleContainsDisplayNameDescription": "ஒரு செய்தியில் அவற்றின் காட்சி பெயர் இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleIsRoomMention": "அறை குறிப்பு", + "notificationRuleIsRoomMentionDescription": "ஒரு அறை குறிப்பு இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleRoomnotif": "அறை அறிவிப்பு", + "notificationRuleRoomnotifDescription": "ஒரு செய்தியில் '@room' இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleTombstone": "கல்லறை", + "notificationRuleTombstoneDescription": "அறை செயலிழக்கச் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleReaction": "எதிர்வினை", + "notificationRuleReactionDescription": "எதிர்வினைகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleRoomServerAcl": "அறை சேவையகம் ACL", + "notificationRuleRoomServerAclDescription": "அறை சேவையக அணுகல் கட்டுப்பாட்டு பட்டியல்களுக்கான (ACL) அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleSuppressEdits": "திருத்தங்களை அடக்கவும்", + "notificationRuleSuppressEditsDescription": "திருத்தப்பட்ட செய்திகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleCall": "அழை", + "notificationRuleCallDescription": "அழைப்புகள் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleEncryptedRoomOneToOne": "மறைகுறியாக்கப்பட்ட அறை ஒன்றுக்கு ஒன்று", + "notificationRuleEncryptedRoomOneToOneDescription": "மறைகுறியாக்கப்பட்ட ஒன்றுக்கு ஒன்று அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleRoomOneToOne": "அறை ஒன்று", + "notificationRuleRoomOneToOneDescription": "ஒருவருக்கு ஒன்று அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleMessage": "செய்தி", + "notificationRuleMessageDescription": "பொதுவான செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleEncrypted": "குறியாக்கப்பட்டது", + "notificationRuleEncryptedDescription": "மறைகுறியாக்கப்பட்ட அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleJitsi": "சியோட்ச்", + "notificationRuleJitsiDescription": "சிட்சி விட்செட் நிகழ்வுகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleServerAcl": "சேவையக ACL நிகழ்வுகளை அடக்கவும்", + "notificationRuleServerAclDescription": "சேவையக ACL நிகழ்வுகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "unknownPushRule": "அறியப்படாத புச் விதி '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️{duration} - {sender} இலிருந்து குரல் செய்தி", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "இந்த அறிவிப்பு அமைப்பை நீங்கள் நீக்கினால், இதை செயல்தவிர்க்க முடியாது.", + "more": "மேலும்", + "shareKeysWith": "விசைகளைப் பகிரவும் ...", + "shareKeysWithDescription": "மறைகுறியாக்கப்பட்ட அரட்டைகளில் உங்கள் செய்திகளுடன் படிக்க எந்த சாதனங்களை நம்ப வேண்டும்?", + "allDevices": "அனைத்து சாதனங்களும்", + "crossVerifiedDevicesIfEnabled": "இயக்கப்பட்டால் சரிபார்க்கப்பட்ட சாதனங்களை குறுக்கு", + "crossVerifiedDevices": "குறுக்கு சரிபார்க்கப்பட்ட சாதனங்கள்", + "verifiedDevicesOnly": "சரிபார்க்கப்பட்ட சாதனங்கள் மட்டுமே", + "takeAPhoto": "புகைப்படம் எடுக்கவும்", + "recordAVideo": "வீடியோவைப் பதிவுசெய்க", + "optionalMessage": "(விரும்பினால்) செய்தி ...", + "notSupportedOnThisDevice": "இந்த சாதனத்தில் ஆதரிக்கப்படவில்லை", + "enterNewChat": "புதிய அரட்டையை உள்ளிடவும்", + "approve": "ஒப்புதல்", + "youHaveKnocked": "நீங்கள் தட்டிவிட்டீர்கள்", + "pleaseWaitUntilInvited": "அறையில் இருந்து யாராவது உங்களை அழைக்கும் வரை தயவுசெய்து இப்போது காத்திருங்கள்.", + "commandHint_logout": "உங்கள் தற்போதைய சாதனத்தை பதிவு செய்க", + "commandHint_logoutall": "அனைத்து செயலில் உள்ள சாதனங்களையும் அனுப்புகிறது", + "displayNavigationRail": "மொபைலில் வழிசெலுத்தல் ரெயிலைக் காட்டு", + "customReaction": "தனிப்பயன் எதிர்வினை", + "moreEvents": "மேலும் நிகழ்வுகள்", + "declineInvitation": "அழைப்பை நிராகரி", + "changedTheChatDescription": "{username} அரட்டை விளக்கத்தை மாற்றியுள்ளார்", + "changedTheChatName": "{username} அரட்டை பெயரை மாற்றியுள்ளார்", + "noMessagesYet": "இதுவரை செய்திகள் இல்லை", + "longPressToRecordVoiceMessage": "குரல் செய்தியை பதிவு செய்ய நீண்ட நேரம் அழுத்தவும்.", + "pause": "இடைநிறுத்தம்", + "resume": "தொடர்", + "removeFromSpaceDescription": "அரட்டை ச்பேசிலிருந்து அகற்றப்படும், ஆனால் உங்கள் அரட்டைப் பட்டியலில் தொடர்ந்து தோன்றும்.", + "countChats": "{chats} பூனைகள்", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces} இன் விண்வெளி உறுப்பினர்", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} இன் ச்பேச் உறுப்பினர் தட்டலாம்", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "வாக்கெடுப்பைத் தொடங்கவும்", + "endPoll": "முடிவு வாக்கெடுப்பு", + "answersVisible": "பதில்கள் தெரியும்", + "pollQuestion": "கருத்துக்கணிப்பு கேள்வி", + "answerOption": "பதில் விருப்பம்", + "addAnswerOption": "பதில் விருப்பத்தைச் சேர்க்கவும்", + "allowMultipleAnswers": "பல பதில்களை அனுமதிக்கவும்", + "pollHasBeenEnded": "கருத்துக்கணிப்பு முடிந்தது", + "countVotes": "{count, plural, =1{வாக்கு} other{{count} வாக்குகள்}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "வாக்கெடுப்பு முடிந்ததும் பதில்கள் தெரியும்", + "replyInThread": "இழையில் பதிலளிக்கவும்", + "countReplies": "{count, plural, =1{பதில்} other{{count} பதில்கள்}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "நூல்", + "backToMainChat": "முதன்மை அரட்டைக்குத் திரும்பு", + "saveChanges": "மாற்றங்களைச் சேமிக்கவும்", + "createSticker": "ச்டிக்கர் அல்லது ஈமோசியை உருவாக்கவும்", + "useAsSticker": "ச்டிக்கராக பயன்படுத்தவும்", + "useAsEmoji": "ஈமோசியாக பயன்படுத்தவும்", + "stickerPackNameAlreadyExists": "ச்டிக்கர் பேக் பெயர் ஏற்கனவே உள்ளது", + "newStickerPack": "புதிய ச்டிக்கர் பேக்", + "stickerPackName": "ச்டிக்கர் பேக் பெயர்", + "attribution": "பண்புக்கூறு", + "skipChatBackup": "அரட்டை காப்புப்பிரதியைத் தவிர்", + "skipChatBackupWarning": "நீங்கள் உறுதியாக இருக்கிறீர்களா? அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் சாதனத்தை மாற்றினால், உங்கள் செய்திகளுக்கான அணுகலை இழக்க நேரிடும்.", + "noMoreResultsFound": "மேலும் முடிவுகள் கிடைக்கவில்லை", + "chatSearchedUntil": "அரட்டை {time} வரை தேடப்பட்டது", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "கூட்டமைப்பு அடிப்படை முகவரி", + "clientWellKnownInformation": "வாடிக்கையாளர் நன்கு அறியப்பட்ட தகவல்:", + "baseUrl": "அடிப்படை முகவரி", + "identityServer": "அடையாள சேவையகம்:", + "versionWithNumber": "பதிப்பு: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "பதிவுகள்", + "advancedConfigs": "மேம்பட்ட கட்டமைப்புகள்", + "advancedConfigurations": "மேம்பட்ட கட்டமைப்புகள்", + "signIn": "விடுபதிகை", + "createNewAccount": "புதிய கணக்கை உருவாக்கவும்", + "signUpGreeting": "மத்தைஅரட்டை பரவலாக்கப்பட்டது! உங்கள் கணக்கை உருவாக்க விரும்பும் சேவையகத்தைத் தேர்ந்தெடுத்து, செல்லலாம்!", + "signInGreeting": "உங்களிடம் ஏற்கனவே அணி இல் கணக்கு உள்ளதா? மீண்டும் வருக! உங்கள் ஓம் சர்வரைத் தேர்ந்தெடுத்து உள்நுழையவும்.", + "theProcessWasCanceled": "செயல்முறை கைவிடப்பட்டது.", + "join": "சேர்", + "searchOrEnterHomeserverAddress": "வீட்டுசேவையக முகவரியைத் தேடவும் அல்லது உள்ளிடவும்", + "matrixId": "மேட்ரிக்ச் அடையாளம்", + "setPowerLevel": "ஆற்றல் அளவை அமை", + "makeModerator": "மதிப்பீட்டாளராக ஆக்குங்கள்", + "makeAdmin": "நிர்வாகியாக்கு", + "removeModeratorRights": "மதிப்பீட்டாளர் உரிமைகளை அகற்று", + "removeAdminRights": "நிர்வாகி உரிமைகளை அகற்று", + "powerLevel": "ஆற்றல் நிலை", + "setPowerLevelDescription": "இந்த அறையில் ஒரு உறுப்பினர் என்ன செய்ய அனுமதிக்கப்படுகிறார் என்பதை அதிகார நிலைகள் வரையறுக்கின்றன மற்றும் பொதுவாக 0 முதல் 100 வரை இருக்கும்.", + "owner": "உரிமையாளர்", + "mute": "முடக்கு", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "புதிய அரட்டையை உருவாக்கு", + "unlock": "திறக்கவும்", + "@unlock": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_te.arb b/lib/l10n/intl_te.arb new file mode 100644 index 0000000000..7a3e3304a2 --- /dev/null +++ b/lib/l10n/intl_te.arb @@ -0,0 +1,1977 @@ +{ + "notAnImage": "ఇమేజ్ ఫైల్ కాదు.", + "repeatPassword": "పాస్‌వర్డ్‌ను పునరావృతం చేయండి", + "remove": "తొలగించు", + "@remove": { + "type": "String", + "placeholders": {} + }, + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@admin": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@device": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@id": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@fileName": { + "type": "String", + "placeholders": {} + }, + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@alias": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@all": { + "type": "String", + "placeholders": {} + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "@online": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@none": { + "type": "String", + "placeholders": {} + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@username": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "@register": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@recording": { + "type": "String", + "placeholders": {} + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "@account": { + "type": "String", + "placeholders": {} + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@allChats": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@offline": { + "type": "String", + "placeholders": {} + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@appLock": { + "type": "String", + "placeholders": {} + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@archive": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@accept": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@verify": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_th.arb b/lib/l10n/intl_th.arb new file mode 100644 index 0000000000..4b3628ce90 --- /dev/null +++ b/lib/l10n/intl_th.arb @@ -0,0 +1,1875 @@ +{ + "hugContent": "{senderName} กอดคุณ", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "ส่งเคล้าเคลียให้", + "admin": "แอดมิน", + "@admin": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "อันนี้ควรเป็น {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "askSSSSSign": "เพื่อให้สามารถลงนามบุคคลอื่นได้ โปรดป้อนรหัสผ่านร้านค้าที่ปลอดภัยหรือรหัสกู้คืนของคุณ", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "remove": "ลบออก", + "@remove": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "ผู้ใช้ทั่วไปได้รับอนุญาตให้เข้าร่วมหรือไม่", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "ส่งเมื่อกด enter", + "answeredTheCall": "{senderName} รับสายแล้ว", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "alias": "นามแฝง", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "ทั้งหมด", + "@all": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "โฮมเซิร์ฟเวอร์รองรับประเภทการเข้าสู่ระบบ:\n{serverVersions}\nแต่แอปนี้รองรับเฉพาะ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "edit": "แก้ไข", + "@edit": { + "type": "String", + "placeholders": {} + }, + "copy": "คัดลอก", + "@copy": { + "type": "String", + "placeholders": {} + }, + "importFromZipFile": "นำเข้าจากไฟล์ .zip", + "autoplayImages": "เล่นสติ๊กเกอร์และอิโมจิแบบเคลื่อนไหวโดยอัตโนมัติ", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "help": "ช่วยเหลือ", + "@help": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "รายละเอียดแชท", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "ใส่รหัสผ่านอีกรอบ", + "delete": "ลบออก", + "@delete": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ได้รับการชวนแล้ว", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "ส่ง", + "@send": { + "type": "String", + "placeholders": {} + }, + "exportEmotePack": "ส่งอิโมจิแพ็คออกเป็นไฟล์ .zip", + "account": "บัญชี", + "@account": { + "type": "String", + "placeholders": {} + }, + "chat": "แชท", + "@chat": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "คุณแน่ใจไหม?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "เพิ่มไปที่ space", + "about": "เกี่ยวกับ", + "@about": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} เปิดใช้งาน end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "googlyEyesContent": "{senderName} ส่งตากวนๆให้คุณ", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "ล็อคแอป", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "ส่งการแจ้งเตือนการพิมพ์", + "importEmojis": "นำเข้าอ๊โมจิ", + "confirmMatrixId": "กรุณายืนยัน Matrix ID ของคุณเพื่อลบบัญชีของคุณ", + "notAnImage": "ไม่ใช่ไฟล์รูปภาพ", + "areYouSureYouWantToLogout": "คุณแน่ใจว่าคุณต้องการที่จะออกจากระบบ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} เคล้าเคลียคุณ", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askVerificationRequest": "ยอมรับคำขอยืนยันนี้จาก {username} หรือไม่", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "เพิ่มอีเมล", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_hug": "ส่งกอดให้", + "replace": "แทนที่", + "archive": "คลังเก็บ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "accept": "ยอมรับ", + "@accept": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "ส่งสายตากวนๆ มาให้หน่อย", + "pin": "ปักหมุด", + "@pin": { + "type": "String", + "placeholders": {} + }, + "importNow": "นำเข้าเลย", + "anyoneCanJoin": "ใครๆ ก็สามารถเข้าร่วมได้", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@blocked": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@banned": { + "type": "String", + "placeholders": {} + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@cancel": { + "type": "String", + "placeholders": {} + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb new file mode 100644 index 0000000000..104df1be06 --- /dev/null +++ b/lib/l10n/intl_tr.arb @@ -0,0 +1,2380 @@ +{ + "@@locale": "tr", + "@@last_modified": "2021-08-14 12:41:09.803728", + "about": "Hakkında", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Kabul et", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} katılma davetini kabul etti", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Hesap", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} uçtan uca şifrelemeyi etkinleştirdi", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "E-posta ekle", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Alana ekle", + "admin": "Yönetici", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "takma ad", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Tümü", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} aramayı yanıtladı", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Herkes katılabilir", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Uygulama kilidi", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arşiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Misafir kullanıcıların katılmasına izin veriliyor mu", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Emin misiniz?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Oturumu açmak istediğinizden emin misiniz?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Diğer kişiyi imzalayabilmek için lütfen güvenli depolama parolanızı veya kurtarma anahtarınızı girin.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username} kişisinden gelen bu doğrulama isteği kabul edilsin mi?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Canlandırmalı çıkartmaları ve ifadeleri otomatik olarak oynat", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "Ana sunucu aşağıdaki oturum açma türlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca aşağıdakileri destekliyor:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Sohbetten engelle", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Engellendi", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username}, {targetName} kişisini engelledi", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Aygıtı Engelle", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Engellendi", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "İptal", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "{uri} URI'si açılamıyor", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Aygıt adını değiştir", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} sohbet avatarını değiştirdi", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} sohbet izinlerini değiştirdi", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} görünen adını '{displayname}' olarak değiştirdi", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} misafir erişim kurallarını değiştirdi", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} misafir erişim kurallarını değiştirdi: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} geçmiş görünürlüğünü değiştirdi", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} geçmiş görünürlüğünü değiştirdi: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} katılım kurallarını değiştirdi", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} katılım kurallarını değiştirdi: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} avatarını değiştirdi", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} oda takma adlarını değiştirdi", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} davet bağlantısını değiştirdi", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Parolayı değiştir", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ana sunucuyu değiştir", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Tarzınızı değiştirin", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Grubun adını değiştir", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Avatarınızı değiştirin", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Şifreleme bozuldu", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Sohbet", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sohbet yedekleme", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Sohbet ayrıntıları", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Sohbetler", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Güçlü bir parola seçin", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Arşivi temizle", + "close": "Kapat", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "Verilen kullanıcıyı bu odadan yasaklayın", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "HTML biçimli metin gönderin", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Verilen kullanıcıyı bu odaya davet edin", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Verilen odaya katılın", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Verilen kullanıcıyı bu odadan kaldırın", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Bu odadan ayrılın", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Kendinizi tanımlayın", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Bu oda için resminizi ayarlayın (mxc-uri ile)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Bu oda için görünen adınızı ayarlayın", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Verilen kullanıcının güç seviyesini ayarlayın (öntanımlı: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Biçimlendirilmemiş metin gönderin", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Tepki olarak yanıt gönderin", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Metin gönderin", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Verilen kullanıcının bu odadaki yasağını kaldırın", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Komut geçersiz", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} bir komut değil.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Lütfen emojileri karşılaştırın", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Lütfen sayıları karşılaştırın", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Sohbeti yapılandır", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kişi gruba davet edildi", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "İçerik, sunucu yöneticilerine bildirildi", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Panoya kopyalandı", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopyala", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Panoya kopyala", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Mesajın şifresi çözülemedi: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} katılımcı", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Oluştur", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} sohbeti oluşturdu", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createNewSpace": "Yeni alan", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Şu anda etkin", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Koyu", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Bu, kullanıcı hesabınızı devre dışı bırakacak. Bu geri alınamaz! Emin misiniz?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Yeni kullanıcılar içi öntanımlı izin seviyesi", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Sil", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Hesabı sil", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Mesajı sil", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Aygıtlar", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Doğrudan Sohbetler", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Görünen ad değiştirildi", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Dosyayı indir", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Düzenle", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Engellenen sunucuları düzenle", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Görünen adı düzenle", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Oda takma adlarını düzenle", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Oda avatarını düzenle", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "İfade zaten var!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Geçersiz ifade kısa kodu!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "İfade Ayarları", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "İfade kısa kodu", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Boş sohbet", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "İfade paketini küresel olarak etkinleştir", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Şifrelemeyi etkinleştir", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Artık şifrelemeyi devre dışı bırakamayacaksınız. Emin misiniz?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Şifreli", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Şifreleme", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Şifreleme etkinleştirilmedi", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} aramayı sonlandırdı", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Bir e-posta adresi girin", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Konum alınırken hata oluştu: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "fontSize": "Yazı tipi boyutu", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "İlet", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Katılmadan", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Davetten", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Grup herkese açık", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Gruplar", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} ile grup", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Misafirlere izin verilmiyor", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Misafirler katılabilir", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username}, {targetName} için daveti geri çekti", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Yardım", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Bilinmeyen etkinlikleri gizle", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "Yok say", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Yok sayılan kullanıcılar", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Bağlantıya tıkladım", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Yanlış parola veya kurtarma anahtarı", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kişi davet et", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kişiyi {groupName} grubuna davet et", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Davet edildi", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username}, {targetName} kişisini davet etti", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Sadece davet edilen kullanıcılar", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} sizi FluffyChat'e davet etti.\n1. fluffychat.im adresini ziyaret edin ve uygulamayı kurun \n2. Kaydolun veya oturum açın \n3. Davet bağlantısını açın: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "yazıyor…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} sohbete katıldı", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Odaya katıl", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username}, {targetName} kişisini attı", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username}, {targetName} kişisini attı ve engelledi", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Sohbetten at", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Son görülen: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Ayrıl", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Sohbetten ayrıldı", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Açık", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "{count} katılımcı daha yükle", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Yükleniyor… Lütfen bekleyin.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Daha fazla yükle…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Konum hizmetleri devre dışı. Lütfen konumunuzu paylaşabilmek için etkinleştirin.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Konum izni reddedildi. Lütfen konumunuzu paylaşabilmek için izin verin.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Oturum aç", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} üzerinde oturum aç", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Oturumu kapat", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Bahset", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Mesajlar", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderatör", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Sohbeti sessize al", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Yeni sohbet", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat'te yeni mesaj", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Yeni doğrulama isteği!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "İleri", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Hayır", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sunucuyla bağlantı yok", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "İfade bulunamadı. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Şifrelemeyi yalnızca oda artık herkese açık olmadığında etkinleştirebilirsiniz.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Görünüşe göre cihazınızda Firebase Cloud Messaging yok. Buna rağmen bildirim almaya devam etmek için ntfy yüklemenizi öneriyoruz. ntfy veya başka bir Unified Push sağlayıcısı ile anlık bildirimlerinizi güvenli bir şekilde alabilirsiniz. ntfy'ı PlayStore veya F-Droid'den indirebilirsiniz.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} matrix sunucusu değil, onun yerine {server2} kullanılsın mı?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPasswordRecoveryDescription": "Henüz parolanızı kurtarmak için bir yol eklemediniz.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "İzin yok", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Oda bulunamadı…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Bildirimler", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} kullanıcı yazıyor…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Konum alınıyor…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Tamam", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Çevrim içi anahtar yedekleme etkinleştirildi", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Tüh! Maalesef anlık bildirimlerini ayarlarken bir hata oluştu.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Tüh, bir şeyler yanlış gitti…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Mesajları okumak için uygulamayı aç", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamerayı aç", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Haritalarda aç", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "Veya", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Katılımcı", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "parola veya kurtarma anahtarı", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Parola", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Parola unutuldu", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parola değiştirildi", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Parola kurtarma", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Sabitle", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Lütfen bir geçiş kodu seçin", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Lütfen e-postadaki bağlantıya tıklayın ve devam edin.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Lütfen parolanızı girin", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Lütfen PIN kodunuzu girin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Lütfen kullanıcı adınızı girin", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Lütfen web sitesindeki talimatları izleyin ve \"İleri\" düğmesine dokunun.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Gizlilik", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Herkese Açık Odalar", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Neden", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} bir etkinliği düzenledi", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Mesajı düzenle", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Reddet", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} daveti reddetti", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Kaldır", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Diğer tüm aygıtları kaldır", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Sohbet engelini kaldır", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Avatarınızı kaldırın", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Odayı yeni sürümle değiştir", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Yanıtla", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Mesajı bildir", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Oda yükseltildi", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Oda sürümü", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Dosyayı kaydet", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Ara", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Güvenlik", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Gönder", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Bir mesaj gönder", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Metin olarak gönder", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Ses gönder", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Dosya gönder", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Resim gönder", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Mesajları gönder", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Video gönder", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} bir dosya gönderdi", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} bir ses gönderdi", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} bir resim gönderdi", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} bir çıkartma gönderdi", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} bir video gönderdi", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} arama bilgilerini gönderdi", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Ana takma ad olarak ayarla", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Durumu ayarla", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Ayarlar", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Paylaş", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} konumunu paylaştı", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Konumu paylaş", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Atla", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Kaynak kodları", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Alan herkese açık", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Alan adı", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} bir arama başlattı", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Durum", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Bugün nasılsınız?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Gönder", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Eşzamanlanıyor… Lütfen bekleyin.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistem", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Eşleşmediler", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Eşleştiler", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Çok fazla istek. Lütfen daha sonra tekrar deneyin!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Tekrar göndermeyi deneyin", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username}, {targetName} kişisinin engelini kaldırdı", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Aygıtın Engellemesini Kaldır", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Bilinmeyen aygıt", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Bilinmeyen şifreleme algoritması", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Bilinmeyen etkinlik '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Sohbeti sessizden çıkar", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Sabitlemeyi kaldır", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} ve {count} diğer kişi yazıyor…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} ve {username2} yazıyor…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} yazıyor…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} sohbetten ayrıldı", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} bir {type} etkinliği gönderdi", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "Doğrulandı", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Doğrulamayı Başlat", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Başarıyla doğrulandı!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Diğer hesap doğrulanıyor", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Görüntülü arama", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Sohbet geçmişi görünürlüğü", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Tüm katılımcılar için görünür", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Herkes için görünür", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Sesli mesaj", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Ortağın isteği kabul etmesi bekleniyor…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Ortağın emojiyi kabul etmesi bekleniyor…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Ortağın numaraları kabul etmesi bekleniyor…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Uyarı!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Size bir e-posta gönderdik", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kim hangi eylemi gerçekleştirebilir", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Bu gruba kimler katılabilir", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Bunu neden bildirmek istiyorsunuz?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Bu adresler ile parolanızı kurtarabilirsiniz.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Bir mesaj yaz…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Evet", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Sen", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Artık bu sohbette katılımcı değilsiniz", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Bu sohbetten engellendiniz", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ortak anahtarınız", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR kodunu tarayın", + "sendOnEnter": "Enter tuşu ile gönder", + "bundleName": "Paket adı", + "removeFromBundle": "Bu paketten kaldır", + "addToBundle": "Pakete ekle", + "editBundlesForAccount": "Bu hesap için paketleri düzenle", + "addAccount": "Hesap ekle", + "oneClientLoggedOut": "İstemcilerinizden birinin oturumu kapatıldı", + "link": "Bağlantı", + "unverified": "Doğrulanmadı", + "repeatPassword": "Parolayı tekrarlayın", + "messageInfo": "Mesaj bilgileri", + "time": "Zaman", + "sender": "Gönderen", + "openGallery": "Galeriyi aç", + "removeFromSpace": "Alandan kaldır", + "commandHint_clearcache": "Önbelleği temizleyin", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_dm": "Doğrudan sohbet başlatın\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_create": "Boş bir grup sohbeti oluşturun\nŞifrelemeyi devre dışı bırakmak için --no-encryption kullanın", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Oturumu silin", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "markAsRead": "Okundu olarak işaretle", + "reportUser": "Kullanıcıyı bildir", + "reactedWith": "{sender}, {reaction} ile tepki verdi", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Emojiler", + "placeCall": "Arama yap", + "voiceCall": "Sesli arama", + "unsupportedAndroidVersion": "Desteklenmeyen Android sürümü", + "unsupportedAndroidVersionLong": "Bu özellik daha yeni bir Android sürümü gerektiriyor. Lütfen güncellemelere veya LineageOS desteğine bakın.", + "pinMessage": "Odaya sabitle", + "confirmEventUnpin": "Etkinliğin sabitlemesini kalıcı olarak kaldırmak istediğinizden emin misiniz?", + "videoCallsBetaWarning": "Görüntülü aramaların şu anda beta aşamasında olduğunu lütfen unutmayın. Tüm platformlarda beklendiği gibi veya hiç çalışmayabilirler.", + "experimentalVideoCalls": "Deneysel görüntülü aramalar", + "youJoinedTheChat": "Sohbete katıldınız", + "youAcceptedTheInvitation": "👍 Daveti kabul ettiniz", + "youKickedAndBanned": "🙅 {user} kullanıcısını attınız ve yasakladınız", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "{user} kullanıcısının yasağını kaldırdınız", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user} kullanıcısını attınız", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youRejectedTheInvitation": "Daveti reddettiniz", + "youHaveWithdrawnTheInvitationFor": "{user} için daveti geri çektiniz", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} tarafından davet edildiniz", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} kullanıcısını davet ettiniz", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "{user} kullanıcısını yasakladınız", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "Apple KeyChain'de sakla", + "users": "Kullanıcılar", + "storeInAndroidKeystore": "Android KeyStore'da sakla", + "storeSecurlyOnThisDevice": "Bu aygıtta güvenli bir şekilde sakla", + "countFiles": "{count} dosya", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Oturumu dışa aktar ve aygıtı sil", + "hydrate": "Yedekleme dosyasından geri yükle", + "dehydrateWarning": "Bu eylem geri alınamaz. Yedekleme dosyasını güvenli bir şekilde sakladığınızdan emin olun.", + "user": "Kullanıcı", + "custom": "Özel", + "confirmMatrixId": "Hesabınızı silmek için lütfen Matrix kimliğinizi doğrulayın.", + "supposedMxid": "Bu {mxid} olmalıdır", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Grup olarak işaretle", + "commandHint_markasdm": "Verilen Matrix kimliği için doğrudan mesaj odası olarak işaretle", + "whyIsThisMessageEncrypted": "Bu mesaj neden okunamıyor?", + "noKeyForThisMessage": "Bu durum, mesaj siz bu aygıtta hesabınızda oturum açmadan önce gönderildiyse meydana gelebilir.\n\nGönderenin aygıtınızı engellemiş olması veya internet bağlantısında bir sorun olması da mümkündür.\n\nMesajı başka bir oturumda okuyabiliyor musunuz? O zaman mesajı oradan aktarabilirsiniz! Ayarlar > Aygıtlar bölümüne gidin ve aygıtlarınızın birbirini doğruladığından emin olun. Odayı bir sonraki sefer açtığınızda ve her iki oturum da ön planda olduğunda, anahtarlar otomatik olarak iletilecektir.\n\nOturumu kapatırken veya aygıt değiştirirken anahtarları kaybetmek istemiyor musunuz? Ayarlarda sohbet yedeklemesini etkinleştirdiğinizden emin olun.", + "screenSharingTitle": "ekran paylaşımı", + "foregroundServiceRunning": "Bu bildirim, ön plan hizmeti çalışırken görünür.", + "newSpace": "Yeni alan", + "screenSharingDetail": "Ekranınızı FuffyChat'te paylaşıyorsunuz", + "doNotShowAgain": "Tekrar gösterme", + "googlyEyesContent": "{senderName} size şaşkın gözler gönderiyor", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "Kucaklama gönder", + "commandHint_googly": "Şaşkın gözler gönder", + "commandHint_hug": "Sarılma gönder", + "cuddleContent": "{senderName} sizi kucaklıyor", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} size sarılıyor", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Boş sohbet ({oldDisplayName} idi)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Alanlar, sohbetlerinizi birleştirmenize ve özel veya genel topluluklar oluşturmanıza olanak tanır.", + "encryptThisChat": "Bu sohbeti şifrele", + "disableEncryptionWarning": "Güvenlik nedeniyle, daha önce etkinleştirildiği bir sohbette şifrelemeyi devre dışı bırakamazsınız.", + "sorryThatsNotPossible": "Üzgünüm... bu mümkün değil", + "reopenChat": "Sohbeti yeniden aç", + "noBackupWarning": "Uyarı! Sohbet yedeklemesini etkinleştirmezseniz, şifrelenen mesajlarınıza erişiminizi kaybedersiniz. Oturumu kapatmadan önce sohbet yedeklemesini etkinleştirmeniz önemle tavsiye edilir.", + "noOtherDevicesFound": "Başka aygıt bulunamadı", + "fileIsTooBigForServer": "Gönderilemiyor! Sunucu yalnızca {max} değerine kadar olan ekleri destekliyor.", + "fileHasBeenSavedAt": "Dosya {path} konumuna kaydedildi", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Son okunan mesaja atla", + "readUpToHere": "Buraya kadar oku", + "jump": "Atla", + "openLinkInBrowser": "Bağlantıyı tarayıcıda aç", + "reportErrorDescription": "😭 Olamaz. Bir şeyler yanlış gitti. İsterseniz bu hatayı geliştiricilere bildirebilirsiniz.", + "report": "bildir", + "notAnImage": "Bir resim dosyası değil.", + "importNow": "Şimdi içe aktar", + "importEmojis": "İfadeleri İçe Aktar", + "importFromZipFile": ".zip dosyasından içe aktar", + "exportEmotePack": "İfade paketini .zip olarak dışa aktar", + "replace": "Değiştir", + "sendTypingNotifications": "Yazma bildirimleri gönder", + "messagesStyle": "Mesajlar:", + "createGroup": "Grup oluştur", + "shareInviteLink": "Davet bağlantısını paylaş", + "setColorTheme": "Renk temasını ayarla:", + "tryAgain": "Tekrar deneyin", + "redactMessageDescription": "Bu mesaj bu görüşmedeki herkes için düzenlenecek. Bu işlem geri alınamaz.", + "optionalRedactReason": "(İsteğe bağlı) Bu mesajı düzenleme nedeni…", + "invite": "Davet et", + "chatPermissions": "Sohbet izinleri", + "chatDescription": "Sohbet açıklaması", + "noChatDescriptionYet": "Daha sohbet açıklaması oluşturulmadı.", + "invalidServerName": "Geçersiz sunucu adı", + "redactedBy": "{username} tarafından düzenlendi", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactedByBecause": "{username} tarafından \"{reason}\" nedeniyle düzenlendi", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "setChatDescription": "Sohbet açıklamasını ayarla", + "chatDescriptionHasBeenChanged": "Sohbet açıklaması değişti", + "directChat": "Doğrudan sohbet", + "inviteGroupChat": "📨 Grup sohbetine davet et", + "emoteKeyboardNoRecents": "Son kullanılan ifadeler burada görünecek...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Geçersiz giriş!", + "wrongPinEntered": "Yanlış PIN girildi! {seconds} saniye sonra tekrar deneyin...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Kullanıcı sohbetten yasaklanacak ve yasağı kaldırılana kadar sohbete tekrar giremeyecek.", + "removeDevicesDescription": "Bu aygıttan çıkış yapacaksınız ve artık mesaj alamayacaksınız.", + "unbanUserDescription": "Kullanıcı denerse sohbete tekrar girebilecektir.", + "pushNotificationsNotAvailable": "Anlık bildirimler kullanılamıyor", + "makeAdminDescription": "Bu kullanıcıyı yönetici yaptıktan sonra, sizinle aynı izinlere sahip olacağı için bunu geri alamayabilirsiniz.", + "archiveRoomDescription": "Sohbet arşive taşınacak. Diğer kullanıcıları sohbeti terk ettiğinizi görebilecek.", + "hasKnocked": "🚪 {user} tıklattı", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Daha fazla bilgi", + "roomUpgradeDescription": "Sohbet daha sonra yeni oda sürümüyle yeniden oluşturulacaktır. Tüm katılımcılara yeni sohbete geçmeleri gerektiği bildirilecektir. Oda sürümleri hakkında daha fazla bilgiyi https://spec.matrix.org/latest/rooms/ adresinde bulabilirsiniz.", + "pleaseEnterANumber": "Lütfen 0'dan büyük bir sayı girin", + "kickUserDescription": "Kullanıcı sohbetten atılır ancak yasaklanmaz. Herkese açık sohbetlerde kullanıcı istediği zaman yeniden katılabilir.", + "createGroupAndInviteUsers": "Bir grup oluşturun ve kullanıcıları davet edin", + "groupCanBeFoundViaSearch": "Grup, arama ile bulunabilir", + "noUsersFoundWithQuery": "Ne yazık ki \"{query}\" ile kullanıcı bulunamadı. Lütfen bir yazım hatası yapıp yapmadığınızı kontrol edin.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "yourGlobalUserIdIs": "Genel kullanıcı kimliğiniz: ", + "groupName": "Grup ismi", + "searchChatsRooms": "#sohbetler, @kullanıcılar... için arama yapın", + "blockListDescription": "Sizi rahatsız eden kullanıcıları engelleyebilirsiniz. Kişisel engelleme listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamazsınız.", + "blockedUsers": "Engellenen kullanıcılar", + "block": "Engelle", + "commandHint_sendraw": "Ham JSON gönder", + "wrongRecoveryKey": "Üzgünüm... bu doğru kurtarma anahtarı gibi görünmüyor.", + "blockUsername": "Kullanıcı adını görmezden gel", + "databaseMigrationTitle": "Veri tabanı iyileştirildi", + "databaseMigrationBody": "Lütfen bekleyin. Bu biraz zaman alabilir.", + "pleaseEnterYourCurrentPassword": "Lütfen geçerli parolanızı girin", + "pleaseChooseAStrongPassword": "Lütfen güçlü bir parola seçin", + "addChatOrSubSpace": "Sohbet veya alt alan ekle", + "canceledKeyVerification": "{sender} anahtar doğrulamayı iptal etti", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "joinSpace": "Alana katıl", + "newPassword": "Yeni parola", + "sessionLostBody": "Oturumunuz kayboldu. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "thisDevice": "Bu aygıt:", + "formattedMessagesDescription": "Markdown kullanarak kalın metin gibi zengin mesaj içeriğini görüntüle.", + "verifyOtherDevice": "🔐 Diğer aygıtı doğrula", + "searchForUsers": "@kullanıcıları ara...", + "commandHint_ignore": "Verilen matrix kimliğini görmezden gel", + "commandHint_unignore": "Verilen matrix kimliğini görmezden gelmeyi iptal et", + "appLockDescription": "Kullanılmadığında PIN kodu ile uygulamayı kilitle", + "globalChatId": "Genel sohbet kimliği", + "accessAndVisibility": "Erişim ve görünürlük", + "accessAndVisibilityDescription": "Bu sohbete kimlerin katılmasına izin verilir ve sohbet nasıl keşfedilebilir.", + "calls": "Aramalar", + "customEmojisAndStickers": "Özel emojiler ve çıkartmalar", + "customEmojisAndStickersBody": "Herhangi bir sohbette kullanılabilecek özel emojiler veya çıkartmalar ekleyin veya paylaşın.", + "hideRedactedMessages": "Düzenlenen mesajları gizle", + "hideRedactedMessagesBody": "Birisi bir mesajı düzenlerse, bu mesaj artık sohbette görünmeyecektir.", + "passwordRecoverySettings": "Parola kurtarma ayarları", + "knock": "Tıklat", + "knocking": "Tıklat", + "usersMustKnock": "Kullanıcılar tıklatmalı", + "noOneCanJoin": "Kimse katılamaz", + "nothingFound": "Hiçbir şey bulunamadı...", + "sendReadReceiptsDescription": "Sohbetteki diğer katılımcılar bir mesajı okuduğunuzu görebilir.", + "verifyOtherDeviceDescription": "Başka bir aygıtı doğruladığınızda, bu aygıtlar anahtarları değiş tokuş ederek genel güvenliğinizi artırır. 💪 Bir doğrulama başlattığınızda, her iki aygıttaki uygulamada bir açılır pencere görünecektir. Orada birbirleriyle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz. Doğrulamaya başlamadan önce her iki aygıtın da elinizin altında olması en iyisidir. 🤳", + "noDatabaseEncryption": "Veri tabanı şifrelemesi bu platformda desteklenmiyor", + "thereAreCountUsersBlocked": "Şu anda {count} engellenen kullanıcı var.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "publicSpaces": "Herkese açık alanlar", + "initAppError": "Uygulama başlatılırken bir hata oluştu", + "hideInvalidOrUnknownMessageFormats": "Geçersiz veya bilinmeyen mesaj biçimlerini gizle", + "chatCanBeDiscoveredViaSearchOnServer": "Sohbet {server} üzerinde aranarak keşfedilebilir", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "Durumunuzu temizlemek için boş bırakın.", + "select": "Seç", + "passwordsDoNotMatch": "Parolalar eşleşmiyor", + "passwordIsWrong": "Girdiğiniz parola yanlış", + "publicChatAddresses": "Herkese açık sohbet adresleri", + "createNewAddress": "Yeni adres oluştur", + "acceptedKeyVerification": "{sender} anahtar doğrulamayı kabul etti", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "restoreSessionBody": "Uygulama şimdi oturumunuzu yedekten geri yüklemeye çalışıyor. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Okundu bilgisi gönder", + "completedKeyVerification": "{sender} anahtar doğrulamayı tamamladı", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Sohbetteki diğer katılımcılar yeni bir mesaj yazdığınızı görebilir.", + "isReadyForKeyVerification": "{sender} anahtar doğrulama için hazır", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "formattedMessages": "Biçimlendirilen mesajlar", + "requestedKeyVerification": "{sender} anahtar doğrulama istedi", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "verifyOtherUser": "🔐 Diğer kullanıcıyı doğrula", + "startedKeyVerification": "{sender} anahtar doğrulama başlattı", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "discover": "Keşfet", + "incomingMessages": "Gelen mesajlar", + "verifyOtherUserDescription": "Başka bir kullanıcıyı doğrularsanız, gerçekten kime yazdığınızı bildiğinizden emin olabilirsiniz. 💪\n\nBir doğrulama başlattığınızda, siz ve diğer kullanıcı uygulamada bir açılır pencere görecektir. Orada birbirinizle karşılaştırmanız gereken bir dizi emoji veya sayı göreceksiniz.\n\nBunu yapmanın en iyi yolu buluşmak veya bir görüntülü arama başlatmaktır. 👭", + "stickers": "Çıkartmalar", + "unreadChatsInApp": "{appname}: {unread} okunmayan sohbet", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "searchIn": "\"{chat}\" sohbeti içinde ara...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Daha fazla ara...", + "gallery": "Galeri", + "files": "Dosyalar", + "swipeRightToLeftToReply": "Yanıtlamak için sağdan sola kaydır", + "noMoreChatsFound": "Başka sohbet bulunamadı...", + "goToSpace": "Alana git: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "unread": "Okunmadı", + "markAsUnread": "Okunmadı olarak işaretle", + "space": "Alan", + "inviteOtherUsers": "Diğer kullanıcıları bu sohbete davet et", + "changeTheChatPermissions": "Sohbet izinlerini değiştir", + "changeTheCanonicalRoomAlias": "Ana herkese açık sohbet adresini değiştir", + "sendRoomNotifications": "@oda bildirimleri gönder", + "changeTheDescriptionOfTheGroup": "Sohbetin açıklamasını değiştir", + "userLevel": "{level} - Kullanıcı", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderatör", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Yönetici", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Genel sohbet ayarlarını değiştir", + "changeTheVisibilityOfChatHistory": "Sohbet geçmişinin görünürlüğünü değiştir", + "chatPermissionsDescription": "Bu sohbette belirli eylemler için hangi güç düzeyinin gerekli olduğunu tanımlayın. 0, 50 ve 100 güç düzeyleri genellikle kullanıcıları, moderatörleri ve yöneticileri temsil eder, ancak herhangi bir derecelendirme mümkündür.", + "changelog": "Değişiklik günlüğü", + "updateInstalled": "🎉 Güncelleme {version} kuruldu!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "Gönderme iptal edildi", + "noChatsFoundHere": "Burada henüz sohbet bulunamadı. Aşağıdaki düğmeyi kullanarak biriyle yeni bir sohbet başlatın. ⤵️", + "loginWithMatrixId": "Matrix kimliği ile oturum aç", + "doesNotSeemToBeAValidHomeserver": "Uyumlu bir ana sunucu gibi görünmüyor. Yanlış URL mi?", + "calculatingFileSize": "Dosya boyutu hesaplanıyor...", + "sendingAttachment": "Ek gönderiliyor...", + "oneOfYourDevicesIsNotVerified": "Aygıtlarınızdan biri doğrulanmadı", + "noticeChatBackupDeviceVerification": "Not: Tüm aygıtlarınızı sohbet yedeklemesine bağladığınızda, otomatik olarak doğrulanırlar.", + "blur": "Blur:", + "opacity": "Şeffaflık:", + "setWallpaper": "Duvar kağıdı seç", + "manageAccount": "Hesabı yönet", + "noContactInformationProvided": "Sunucu geçerli bir iletişim bilgisi sunmadı", + "contactServerAdmin": "Sunucu yöneticisiyle iletişime geçin", + "contactServerSecurity": "Sunucu güvenliğiyle iletişime geçin", + "supportPage": "Destek sayfası", + "name": "İsim", + "version": "Versiyon", + "serverInformation": "Sunucu bilgisi:", + "website": "Web sitesi", + "compress": "Sıkıştırma", + "boldText": "Kalın metin", + "italicText": "İtalik metin", + "strikeThrough": "Üstü çizili", + "pleaseFillOut": "Lütfen doldurun", + "aboutHomeserver": "{homeserver} Hakkında", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "invalidUrl": "Geçersiz url", + "addLink": "Link ekle", + "unableToJoinChat": "Sohbete girilemiyor. Belki başka birileri konuşmayı kapatmış olabilir.", + "continueText": "Devam et", + "sendImages": "{count} görsel gönder", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "commandHint_roomupgrade": "Bu odayı belirtilen oda sürümüne yükseltin", + "checkList": "Kontrol listesi", + "countInvited": "{count} davet edildi", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " Senkronize ediliyor… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/l10n/intl_uk.arb b/lib/l10n/intl_uk.arb new file mode 100644 index 0000000000..03186b5a40 --- /dev/null +++ b/lib/l10n/intl_uk.arb @@ -0,0 +1,2563 @@ +{ + "@@locale": "uk", + "@@last_modified": "2021-08-14 12:41:09.790615", + "about": "Про застосунок", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Прийняти", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} приймає запрошення", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Обліковий запис", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} активує наскрізне шифрування", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Адміністратор", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "псевдонім", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} відповідає на виклик", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Будь-хто може приєднатись", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Архів", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Чи дозволено гостям приєднуватись?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ви впевнені?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Для підпису ключа іншого користувача введіть свою парольну фразу або ключ відновлення.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Прийняти цей запит на підтвердження від {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Заблокувати в бесіді", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Заблоковано", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} блокує {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Заблокувати пристрій", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "cancel": "Скасувати", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} змінює аватар бесіди", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} змінює права доступу бесіди", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} змінює показуване ім'я на: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} змінює правила гостьового доступу", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} змінює правила гостьового доступу на: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} змінює видимість історії", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} змінює видимість історії на: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} змінює правила приєднання", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} змінює правила приєднання на: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} змінює аватар", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} змінює псевдоніми кімнати", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} змінює посилання для запрошення", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheHomeserver": "Змінити домашній сервер", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Змінити стиль", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Змінити назву групи", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Шифрування було пошкоджено", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Бесіда", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Подробиці бесіди", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Виберіть надійний пароль", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Закрити", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Порівняйте емодзі", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Порівняйте цифри", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Контакт був запрошений в групу", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Скопійовано в буфер обміну", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Копіювати", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Помилка розшифрування повідомлення: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "Учасників: {count}", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Створити", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} створює бесіду", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Зараз у мережі", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Темний", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "delete": "Видалити", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Видалити повідомлення", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Пристрої", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Показуване ім'я було змінено", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Завантажити файл", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Змінити показуване ім'я", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Емодзі вже існує!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Неприпустимий короткий код емодзі!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Налаштування емодзі", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Короткий код для емодзі", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Порожня бесіда", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ви більше не зможете вимкнути шифрування. Ви впевнені?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryption": "Шифрування", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Шифрування вимкнено", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} завершує виклик", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "forward": "Переслати", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "З моменту приєднання", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "З моменту запрошення", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Група", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Загальнодоступна група", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Група з {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Гості не можуть приєднуватись", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Гості можуть приєднуватись", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} відкликає запрошення для {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Довідка", + "@help": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Неправильна парольна фраза або ключ відновлення", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Запросити контакт", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Запросити контакт до {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Запрошено", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} запрошує {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Лише запрошені користувачі", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} запрошує вас у FluffyChat. \n1. Перейдіть на fluffychat.im й установіть застосунок \n2. Зареєструйтесь або ввійдіть \n3. Відкрийте запрошувальне посилання:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "пише…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} приєднується до бесіди", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kicked": "👞 {username} вилучає {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} вилучає та блокує {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Вилучити з бесіди", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Остання активність: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Вийти", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Виходить з бесіди", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Світлий", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Завантажити ще {count} учасників", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Завантаження… Будь ласка, зачекайте.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Завантажити ще…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Увійти", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Увійти до {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Вийти", + "@logout": { + "type": "String", + "placeholders": {} + }, + "moderator": "Модератор", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Вимкнути сповіщення", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Нове повідомлення у FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Новий запит перевірки!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Емодзі не знайдено. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Схоже, Firebase Cloud Messaging недоступна на вашому пристрої. Щоб отримувати push-сповіщення, радимо встановити ntfy. За допомогою ntfy або іншого постачальника Unified Push ви можете отримувати push-сповіщення у безпечний спосіб. Ви можете завантажити ntfy з PlayStore або з F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Немає прав доступу", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Кімнат не знайдено…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "ok": "Гаразд", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Резервне онлайн-копіювання ключів увімкнено", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Халепа, щось пішло не так…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Відкрийте застосунок читання повідомлень", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Відкрити камеру", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "парольна фраза або ключ відновлення", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Пароль", + "@password": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Введіть свій пароль", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Введіть своє ім'я користувача", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Загальнодоступні кімнати", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} змінює подію", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Відхилити", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} відхиляє запрошення", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "Вилучити", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Вилучити всі інші пристрої", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Розблокувати у бесіді", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Відповісти", + "@reply": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Кімнату було оновлено", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "send": "Надіслати", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Надіслати повідомлення", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Надіслати файл", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Надіслати зображення", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} надсилає файл", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} надсилає аудіо", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} надсилає зображення", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} надсилає наліпку", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} надсилає відео", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setStatus": "Указати статус", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Налаштування", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Поділитися", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} ділиться своїм місцеперебуванням", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Пропустити", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Джерельний код", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Як справи сьогодні?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Надіслати", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Системна", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Вони відрізняються", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Вони збігаються", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Спробуйте надіслати ще раз", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} розблоковує {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Розблокувати пристрій", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Невідомий пристрій", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Невідомий алгоритм шифрування", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Невідома подія '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Увімкнути сповіщення", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} та {count} інших пишуть…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} і {username2} пишуть…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} пише…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} виходить з бесіди", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} надсилає подію {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verifyStart": "Почати перевірку", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Ви успішно перевірені!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Перевірка іншого облікового запису", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Відеовиклик", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Видимість історії бесіди", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Видима для всіх учасників", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Видима для всіх", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Голосове повідомлення", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Очікування прийняття запиту партнером…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Очікування прийняття емодзі партнером…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Очікування прийняття чисел партнером…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Кому дозволено приєднуватися до цієї групи", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Написати повідомлення…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Так", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Ви", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ви більше не берете участь у цій бесіді", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Ви були заблоковані у цій бесіді", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "notifications": "Сповіщення", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "Введіть адресу е-пошти", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Зашифровано", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Увімкнути набір емодзі глобально", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "edit": "Редагувати", + "@edit": { + "type": "String", + "placeholders": {} + }, + "directChats": "Особисті бесіди", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Видалити обліковий запис", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Це деактивує ваш обліковий запис. Це неможливо скасувати! Ви впевнені?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Змінити пароль", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Змінити назву пристрою", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "or": "Або", + "@or": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Установити основним псевдонімом", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "verified": "Перевірений", + "@verified": { + "type": "String", + "placeholders": {} + }, + "blocked": "Заблоковано", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "no": "Ні", + "@no": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Надсилати натисканням Enter", + "commandHint_ban": "Заблокувати цього користувача кімнати", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_kick": "Вилучити цього користувача з цієї кімнати", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomavatar": "Встановіть зображення для цієї кімнати (від mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Укажіть показуване ім'я для цієї кімнати", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandMissing": "{command} не є командою.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "copyToClipboard": "Копіювати до буфера обміну", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Новий простір", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Увімкнути шифрування", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "Приєднатися до кімнати", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "mention": "Згадати", + "@mention": { + "type": "String", + "placeholders": {} + }, + "next": "Далі", + "@next": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Немає з'єднання з сервером", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Сканувати QR-код", + "noPasswordRecoveryDescription": "Ви ще не додали спосіб відновлення пароля.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} користувачів пишуть…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "oopsPushError": "Дідько! На жаль, сталася помилка під час налаштування push-сповіщень.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Забули пароль", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Редагувати повідомлення", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Поскаржитися на повідомлення", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Замінити кімнату новішою версією", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Надіслати аудіо", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Ми надіслали вам електронний лист", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Додати простір", + "roomVersion": "Версія кімнати", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Мною виконано перехід за посиланням", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} розпочинає виклик", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "Блокування застосунку", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "Неприпустима команда", + "@commandInvalid": { + "type": "String" + }, + "participant": "Учасник", + "@participant": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Додати е-пошту", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "ignore": "Нехтувати", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Розмір шрифту", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Ви впевнені, що хочете вийти?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Домашній сервер підтримує такі типи входу:\n{serverVersions}\nАле цей застосунок підтримує лише:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "all": "Усі", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_join": "Приєднатися до цієї кімнати", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "chats": "Бесіди", + "@chats": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Змінити аватар", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "link": "Посилання", + "security": "Безпека", + "@security": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Помилка під час отримання розташування: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "synchronizingPleaseWait": "Синхронізація… Будь ласка, зачекайте.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} не є сервером matrix, використовувати {server2} натомість?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "reason": "Причина", + "@reason": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Типовий рівень дозволів для нових користувачів", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Надіслати як текст", + "@sendAsText": { + "type": "String" + }, + "saveFile": "Зберегти файл", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Автоматично відтворювати анімовані наліпки та емодзі", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "pleaseChooseAPasscode": "Виберіть код доступу", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Натисніть на посилання в електронному листі, а потім продовжуйте.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Надсилати повідомлення", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Хто і яку дію може виконувати", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Чому ви хочете поскаржитися?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "messages": "Повідомлення", + "@messages": { + "type": "String", + "placeholders": {} + }, + "newChat": "Нова бесіда", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "groups": "Групи", + "@groups": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Активувати шифрування можна лише тоді, коли кімната більше не буде загальнодоступною.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Резервне копіювання бесіди", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Очистити архів", + "commandHint_html": "Надіслати текст у форматі HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Запросіть цього користувача до цієї кімнати", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_leave": "Вийти з цієї кімнати", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Опишіть себе", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "hideUnknownEvents": "Сховати невідомі події", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Нехтувані користувачі", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "Отримання розташування…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Додати обліковий запис", + "openInMaps": "Відкрити в картах", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Виконайте вказівки вебсайту та торкніться далі.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Надіслати відео", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Вилучити свій аватар", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unpin": "Відкріпити", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Поділитися місцеперебуванням", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Забагато запитів. Спробуйте пізніше!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "За допомогою цих адрес ви можете відновити свій пароль.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "privacy": "Приватність", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "search": "Пошук", + "@search": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} надсилає відомості про виклик", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cantOpenUri": "Не вдалося відкрити URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "contentHasBeenReported": "Скаргу на вміст надіслано адміністраторам сервера", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "commandHint_op": "Укажіть рівень повноважень цього користувача (типово: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Надіслати неформатований текст", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Надіслати відповідь як реакцію", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Надіслати текст", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Розблокувати цього користувача у цій кімнаті", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "configureChat": "Налаштувати бесіду", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Редагувати заблоковані сервери", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Змінити псевдоніми кімнати", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Змінити аватар кімнати", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Пароль змінено", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Відновлення пароля", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Закріпити", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Будь ласка, введіть свій PIN-код", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Назва простору", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "warning": "Попередження!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ваш відкритий ключ", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Простір загальнодоступний", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "status": "Статус", + "@status": { + "type": "String", + "placeholders": {} + }, + "unverified": "Неперевірений", + "locationDisabledNotice": "Служби визначення розташування вимкнені. Увімкніть їх, щоб мати змогу ділитися своїм розташуванням.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Дозвіл на розташування відхилено. Надайте можливість ділитися своїм розташуванням.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "На одному з ваших клієнтів виконано вихід із системи", + "bundleName": "Назва вузла", + "removeFromBundle": "Вилучити з цього вузла", + "editBundlesForAccount": "Змінити вузол для цього облікового запису", + "addToBundle": "Додати до вузлів", + "repeatPassword": "Повторіть пароль", + "messageInfo": "Відомості про повідомлення", + "time": "Час", + "openGallery": "Відкрити галерею", + "sender": "Відправник", + "removeFromSpace": "Вилучити з простору", + "commandHint_discardsession": "Відкинути сеанс", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_clearcache": "Очистити кеш", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Створіть порожню групову бесіду\nВикористовуйте --no-encryption, щоб вимкнути шифрування", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "Початок особистої бесіди\nВикористовуйте --no-encryption, що вимкнути шифрування", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "markAsRead": "Позначити прочитаним", + "reportUser": "Поскаржився на користувача", + "reactedWith": "{sender} реагує з {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "emojis": "Емодзі", + "pinMessage": "Прикріпити в кімнаті", + "confirmEventUnpin": "Ви впевнені, що бажаєте назавжди відкріпити подію?", + "placeCall": "Здійснити виклик", + "unsupportedAndroidVersion": "Непідтримувана версія Android", + "voiceCall": "Голосовий виклик", + "unsupportedAndroidVersionLong": "Для цієї функції потрібна новіша версія Android. Перевірте наявність оновлень або підтримку Lineage OS.", + "videoCallsBetaWarning": "Зауважте, що відеовиклики на ранньому етапі розробки. Вони можуть працювати не так, як очікувалося, або взагалі не працювати на всіх платформах.", + "experimentalVideoCalls": "Експериментальні відеовиклики", + "youInvitedBy": "📩 Ви були запрошені {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 Ви погодилися на запрошення", + "youRejectedTheInvitation": "Ви відхилили запрошення", + "youHaveWithdrawnTheInvitationFor": "Ви відкликали запрошення для {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youBannedUser": "Ви заблокували {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Ви вилучили й заблокували {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youJoinedTheChat": "Ви приєдналися до бесіди", + "youKicked": "👞 Ви вилучили {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Ви розблокували {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Ви запросили {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAndroidKeystore": "Зберегти в Android KeyStore", + "storeInAppleKeyChain": "Зберегти в Apple KeyChain", + "storeSecurlyOnThisDevice": "Зберегти безпечно на цей пристрій", + "users": "Користувачі", + "countFiles": "{count} файлів", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hydrate": "Відновлення з файлу резервної копії", + "dehydrate": "Експортувати сеанс та очистити пристрій", + "dehydrateWarning": "Цю дію не можна скасувати. Переконайтеся, що ви безпечно зберігаєте файл резервної копії.", + "user": "Користувач", + "custom": "Користувацький", + "supposedMxid": "Це має бути {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "confirmMatrixId": "Підтвердьте свій Matrix ID, щоб видалити свій обліковий запис.", + "commandHint_markasgroup": "Позначити групою", + "commandHint_markasdm": "Позначити кімнатою особистого спілкування для надання Matrix ID", + "whyIsThisMessageEncrypted": "Чому це повідомлення нечитабельне?", + "noKeyForThisMessage": "Це може статися, якщо повідомлення було надіслано до того, як ви ввійшли у свій обліковий запис на цьому пристрої.\n\nТакож можливо, що відправник заблокував ваш пристрій або щось пішло не так з під'єднанням до інтернету.\n\nЧи можете ви прочитати повідомлення на іншому сеансі? Тоді ви зможете перенести повідомлення з нього! Перейдіть до Налаштування > Пристрої та переконайтеся, що ваші пристрої перевірили один одного. Коли ви відкриєте кімнату наступного разу й обидва сеанси будуть на активні, ключі будуть передані автоматично.\n\nВи ж не хочете втрачати ключі після виходу або зміни пристроїв? Переконайтеся, що ви ввімкнули резервне копіювання бесід у налаштуваннях.", + "foregroundServiceRunning": "Це сповіщення з'являється під час роботи основної служби.", + "screenSharingTitle": "спільний доступ до екрана", + "newSpace": "Новий простір", + "screenSharingDetail": "Ви ділитеся своїм екраном FuffyChat", + "doNotShowAgain": "Не показувати знову", + "commandHint_cuddle": "Надіслати пригортайку", + "googlyEyesContent": "{senderName} надсилає вам гугл-очі", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "Надіслати кілька гугл-очей", + "commandHint_hug": "Надіслати обійми", + "cuddleContent": "{senderName} пригортається до вас", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} обіймає вас", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "Порожня бесіда (раніше {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Простори дозволяють об'єднувати ваші бесіди та створювати приватні або загальнодоступні спільноти.", + "encryptThisChat": "Зашифрувати цю бесіду", + "disableEncryptionWarning": "З міркувань безпеки ви не можете вимкнути шифрування в бесіді, ув якій воно було ввімкнене раніше.", + "sorryThatsNotPossible": "Вибачте... це неможливо", + "reopenChat": "Відновити бесіду", + "noOtherDevicesFound": "Інших пристроїв не знайдено", + "noBackupWarning": "Увага! Якщо ви не ввімкнете резервне копіювання бесіди, ви втратите доступ до своїх зашифрованих повідомлень. Наполегливо радимо ввімкнути резервне копіювання бесіди перед виходом.", + "fileIsTooBigForServer": "Не вдалося надіслати! Сервер підтримує вкладення розміром до {max}.", + "fileHasBeenSavedAt": "Файл збережено в {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Перейти до останнього прочитаного повідомлення", + "readUpToHere": "Читати тут", + "jump": "Перейти", + "openLinkInBrowser": "Відкрити посилання у браузері", + "reportErrorDescription": "О, ні. Щось пішло не так. Якщо хочете, можете повідомити про помилку розробникам.", + "report": "повідомити", + "notAnImage": "Не файл зображення.", + "importNow": "Імпортувати зараз", + "importEmojis": "Імпорт емодзі", + "importFromZipFile": "Імпорт з файлу .zip", + "replace": "Замінити", + "exportEmotePack": "Експортувати набір смайликів у форматі .zip", + "sendTypingNotifications": "Надсилати сповіщення про ввід тексту", + "createGroup": "Створити групу", + "messagesStyle": "Повідомлення:", + "shareInviteLink": "Надіслати запрошувальне посилання", + "tryAgain": "Повторіть спробу", + "setColorTheme": "Налаштувати колірну тему:", + "chatPermissions": "Дозволи бесіди", + "chatDescription": "Опис бесіди", + "chatDescriptionHasBeenChanged": "Опис бесіди змінено", + "noChatDescriptionYet": "Опис бесіди ще не створено.", + "invalidServerName": "Недійсна назва сервера", + "optionalRedactReason": "(Необов'язково) Причина редагування цього повідомлення...", + "redactedBy": "Відредаговано {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Особисте повідомлення", + "redactedByBecause": "Відредаговано {username}, тому що: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "invite": "Запросити", + "redactMessageDescription": "Повідомлення буде відредаговано для всіх учасників цієї розмови. Це не можна скасувати.", + "setChatDescription": "Налаштувати опис бесіди", + "inviteGroupChat": "📨 Запрошення до групової бесіди", + "emoteKeyboardNoRecents": "Тут з'являться нещодавно використані смайлики...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "Недійсний ввід!", + "wrongPinEntered": "Введено невірний PIN-код! Спробуйте знову через {seconds} секунд...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "banUserDescription": "Користувача буде заблоковано в бесіді, і він не зможе знову увійти в неї, поки його не буде розблоковано.", + "removeDevicesDescription": "Ви вийдете з цього пристрою і більше не зможете отримувати повідомлення.", + "unbanUserDescription": "Користувач зможе знову увійти в бесіду, якщо спробує.", + "pushNotificationsNotAvailable": "Push-сповіщення недоступні", + "makeAdminDescription": "Після того, як ви зробите цього користувача адміністратором, ви, можливо, не зможете це скасувати, оскільки він матиме ті самі права, що й ви.", + "archiveRoomDescription": "Бесіду буде переміщено до архіву. Інші користувачі зможуть побачити, що ви вийшли з неї.", + "hasKnocked": "🚪{user} стукає до вас", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "learnMore": "Докладніше", + "roomUpgradeDescription": "Після цього бесіду буде відтворено з новою версією кімнати. Усі учасники отримають сповіщення, що їм потрібно перейти до нової бесіди. Ви можете дізнатися більше про версії кімнат на https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Введіть число більше ніж 0", + "kickUserDescription": "Користувача вигнали з бесіди, але не заблокували. До загальнодоступних бесід користувач може приєднатися будь-коли.", + "blockListDescription": "Ви можете заблокувати користувачів, які вас турбують. Ви не зможете отримувати жодних повідомлень або запрошень до кімнати від користувачів з вашого персонального списку блокування.", + "createGroupAndInviteUsers": "Створити групу та запросити користувачів", + "blockedUsers": "Заблоковані користувачі", + "groupCanBeFoundViaSearch": "Групу можна знайти через пошук", + "noUsersFoundWithQuery": "На жаль, не знайдено жодного користувача з запитом \"{query}\".Перевірте, чи не було допущено помилки.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "Заблокувати", + "yourGlobalUserIdIs": "Ваш глобальний ID користувача: ", + "commandHint_sendraw": "Надіслати необроблений json", + "wrongRecoveryKey": "Вибачте... схоже, це неправильний ключ відновлення.", + "blockUsername": "Ігнорувати ім'я користувача", + "groupName": "Назва групи", + "databaseMigrationTitle": "Базу даних оптимізовано", + "searchChatsRooms": "Пошук для #chats, @users...", + "databaseMigrationBody": "Зачекайте, будь ласка. Це може тривати деякий час.", + "thisDevice": "Цей пристрій:", + "publicSpaces": "Загальнодоступний простір", + "passwordIsWrong": "Введений пароль неправильний", + "pleaseEnterYourCurrentPassword": "Введіть поточний пароль", + "nothingFound": "Нічого не знайдено...", + "newPassword": "Новий пароль", + "passwordsDoNotMatch": "Паролі відрізняються", + "select": "Вибрати", + "pleaseChooseAStrongPassword": "Виберіть надійний пароль", + "addChatOrSubSpace": "Додати бесіду або підпростір", + "leaveEmptyToClearStatus": "Лишіть порожнім, щоб оновити статус.", + "joinSpace": "Приєднатися до простору", + "searchForUsers": "Пошук @користувачів...", + "sessionLostBody": "Ваш сеанс втрачено. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "Виникла помилка під час запуску застосунку", + "restoreSessionBody": "Наразі застосунок намагається відновити ваш сеанс з резервної копії. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "acceptedKeyVerification": "{sender} погоджується звірити ключі", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} скасовує звірення ключів", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} просить звірити ключі", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Інші учасники бесіди бачитимуть, що ви прочитали повідомлення.", + "formattedMessages": "Форматовані повідомлення", + "sendReadReceipts": "Надіслати підтвердження прочитання", + "sendTypingNotificationsDescription": "Інші учасники бесіди бачитимуть, коли ви набираєте нове повідомлення.", + "formattedMessagesDescription": "Показувати розширений вміст повідомлень, наприклад, жирний текст, використовуючи markdown.", + "verifyOtherUser": "🔐 Звірити іншого користувача", + "verifyOtherUserDescription": "Якщо ви звіряєте іншого користувача, ви можете бути впевнені, що знаєте, кому ви насправді пишете. 💪\n\nКоли ви почнете звірення, ви та інший користувач побачите спливне вікно в застосунку. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою.\n\nНайкращий спосіб зробити це — зустрітися або розпочати відеовиклик. 👭", + "verifyOtherDeviceDescription": "Коли ви звіряєте інший пристрій, ці пристрої можуть обмінюватися ключами, підвищуючи вашу загальну безпеку. 💪 Коли ви розпочнете звірення, в застосунку на обох пристроях з'явиться спливне вікно. Там ви побачите набір смайликів або чисел, які вам потрібно буде порівняти між собою. Найкраще мати обидва пристрої під рукою перед початком звірення. 🤳", + "verifyOtherDevice": "🔐 Звірити інший пристрій", + "completedKeyVerification": "{sender} завершує звірення ключів", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} готовий до звірення ключів", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} розпочинає звірення ключів", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Вхідні повідомлення", + "discover": "Огляд", + "stickers": "Наліпки", + "searchIn": "Пошук у бесіді \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "commandHint_ignore": "Ігнорувати цей Matrix ID", + "swipeRightToLeftToReply": "Посунути праворуч або ліворуч, щоб відповісти", + "globalChatId": "Глобальний ID бесіди", + "accessAndVisibility": "Доступ і видимість", + "accessAndVisibilityDescription": "Хто може приєднатися до цієї бесіди і як її можна знайти.", + "calls": "Виклики", + "customEmojisAndStickers": "Власні емодзі та наліпки", + "customEmojisAndStickersBody": "Додавайте або діліться власними емодзі або наліпками, які можна використовувати в будь-якій бесіді.", + "createNewAddress": "Створити нову адресу", + "commandHint_unignore": "Не ігнорувати цей Matrix ID", + "appLockDescription": "Блокувати додаток, коли не використовується PIN-код", + "hideRedactedMessages": "Сховати змінені повідомлення", + "hideRedactedMessagesBody": "Якщо хтось змінить повідомлення, його більше не буде видно в бесіді.", + "hideInvalidOrUnknownMessageFormats": "Сховати недійсні або невідомі формати повідомлень", + "passwordRecoverySettings": "Налаштування відновлення пароля", + "knock": "Постукатись", + "knocking": "Стукаються", + "noDatabaseEncryption": "Шифрування бази даних не підтримується на цій платформі", + "usersMustKnock": "Користувачі повинні постукатись", + "noOneCanJoin": "Ніхто не може приєднатись", + "chatCanBeDiscoveredViaSearchOnServer": "Бесіду можна знайти за допомогою пошуку на {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Адреси загальнодоступної бесіди", + "searchMore": "Шукати ще...", + "gallery": "Галерея", + "files": "Файли", + "unreadChatsInApp": "{appname}: {unread} непрочитаних бесід", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Наразі заблоковано {count} користувачів.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "moderatorLevel": "{level} - Модератор", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Адміністратор", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "userLevel": "{level} - Користувач", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Змінити загальні налаштування чату", + "inviteOtherUsers": "Запросити інших користувачів до цього чату", + "changeTheChatPermissions": "Змінити права доступу до чату", + "changeTheVisibilityOfChatHistory": "Змінити видимість історії чату", + "changeTheCanonicalRoomAlias": "Змінити основну адресу загальнодоступного чату", + "sendRoomNotifications": "Надсилати сповіщення @room", + "space": "Простір", + "goToSpace": "Перейти до простору: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Позначити непрочитаним", + "changeTheDescriptionOfTheGroup": "Змінити опис чату", + "updateInstalled": "🎉 Оновлення {version} встановлено!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Зміни", + "chatPermissionsDescription": "Визначте, який рівень повноважень необхідний для певних дій у цьому чаті. Рівні повноважень 0, 50 і 100 зазвичай представляють користувачів, модераторів та адміністраторів, але можливі будь-які градації.", + "noMoreChatsFound": "Більше чатів не знайдено...", + "unread": "Непрочитані", + "sendCanceled": "Надсилання скасовано", + "noChatsFoundHere": "Бесід ще немає. Розпочніть спілкування натиснувши кнопку нижче. ⤵️", + "loginWithMatrixId": "Увійти за допомогою Matrix-ID", + "doesNotSeemToBeAValidHomeserver": "Здається, це несумісний домашній сервер. Неправильна URL-адреса?", + "calculatingFileSize": "Обчислення розміру файлу...", + "sendingAttachment": "Надсилання вкладення...", + "oneOfYourDevicesIsNotVerified": "Один із ваших пристроїв не верифікований", + "noticeChatBackupDeviceVerification": "Примітка: Коли ви під'єднуєте всі свої пристрої до резервної копії бесіди, вони автоматично верифікуються.", + "continueText": "Продовжити", + "manageAccount": "Керувати обліковим записом", + "blur": "Розмиття:", + "opacity": "Прозорість:", + "setWallpaper": "Встановити шпалери", + "aboutHomeserver": "Про {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "noContactInformationProvided": "Сервер не надає жодної дійсної контактної інформації", + "contactServerSecurity": "Зв’язатися з відділом безпеки сервера", + "supportPage": "Сторінка підтримки", + "serverInformation": "Інформація про сервер:", + "contactServerAdmin": "Зв’язатися з адміністратором сервера", + "name": "Ім'я", + "version": "Версія", + "website": "Вебсайт", + "boldText": "Жирний текст", + "italicText": "Курсивний текст", + "strikeThrough": "Перекреслений текст", + "pleaseFillOut": "Будь ласка, заповніть", + "invalidUrl": "Недійсна URL-адреса", + "addLink": "Додати посилання", + "unableToJoinChat": "Неможливо приєднатися до бесіди. Можливо, інша сторона вже закрила розмову.", + "sendImages": "Надіслати {count} зображення", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "Стиснути", + "otherPartyNotLoggedIn": "Інша сторона наразі не увійшла в систему, тому не може отримувати повідомлення!", + "previous": "Попередній", + "synchronizingPleaseWaitCounter": " Синхронізація… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "newChatRequest": "📩 Новий запит на спілкування", + "allDevices": "Усім пристроям", + "crossVerifiedDevicesIfEnabled": "З перехресною верифікацією пристроїв, якщо ввімкнено", + "crossVerifiedDevices": "З перехресною верифікацією пристроїв", + "appWantsToUseForLogin": "Використати '{server}', щоб увійти", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Цим ви дозволяєте застосунку та вебсайту ділитися інформацією про вас.", + "open": "Відкрити", + "waitingForServer": "Очікування сервера...", + "shareKeysWithDescription": "Яким пристроям довіряти, щоб вони могли читати ваші повідомлення в зашифрованих бесідах?", + "verifiedDevicesOnly": "Лише верифіковані пристрої", + "contentNotificationSettings": "Налаштування сповіщень про вміст", + "generalNotificationSettings": "Загальні налаштування сповіщень", + "roomNotificationSettings": "Налаштування сповіщень кімнати", + "userSpecificNotificationSettings": "Налаштування сповіщень для користувача", + "otherNotificationSettings": "Інші налаштування сповіщень", + "notificationRuleContainsUserName": "Містить ім'я користувача", + "notificationRuleContainsUserNameDescription": "Сповіщає користувача, коли повідомлення містить його ім'я користувача.", + "notificationRuleMaster": "Вимкнути всі сповіщення", + "notificationRuleMasterDescription": "Перевизначає всі інші правила і вимикає всі сповіщення.", + "notificationRuleSuppressNotices": "Заборонити автоматичні повідомлення", + "notificationRuleInviteForMe": "Запрошення мене", + "notificationRuleInviteForMeDescription": "Сповіщає користувача, коли його запрошують до кімнати.", + "notificationRuleMemberEvent": "Події участі", + "notificationRuleMemberEventDescription": "Забороняє сповіщення про події учасників.", + "notificationRuleSuppressNoticesDescription": "Забороняє сповіщення від автоматизованих клієнтів, як-от боти.", + "notificationRuleIsUserMention": "Згадки користувачів", + "commandHint_roomupgrade": "Оновити цю кімнату до версії даної кімнати", + "notificationRuleIsUserMentionDescription": "Сповіщає користувачів, коли безпосередньо їх згадують у повідомленні.", + "notificationRuleContainsDisplayName": "Містить показуване ім’я", + "notificationRuleIsRoomMentionDescription": "Сповіщає користувача, коли є згадка всієї кімнати.", + "notificationRuleRoomnotif": "Сповіщення кімнати", + "notificationRuleRoomnotifDescription": "Сповіщає користувача, коли повідомлення містить '@room'.", + "notificationRuleContainsDisplayNameDescription": "Сповіщає користувача, коли повідомлення містить показуване ім'я.", + "notificationRuleIsRoomMention": "Згадки кімнати", + "notificationRuleTombstone": "Могильний камінь", + "notificationRuleTombstoneDescription": "Повідомляє користувача про повідомлення деактивації кімнати.", + "notificationRuleReactionDescription": "Приховує сповіщення про реакції.", + "notificationRuleRoomOneToOneDescription": "Повідомляє користувача про повідомлення в кімнатах \"Один на один\".", + "notificationRuleSuppressEdits": "Приховує редагування", + "notificationRuleSuppressEditsDescription": "Приховує сповіщення про відредаговані повідомлення.", + "notificationRuleCall": "Виклик", + "notificationRuleRoomServerAcl": "ACL сервера кімнати", + "notificationRuleMessageDescription": "Повідомляє користувача про загальні повідомлення.", + "notificationRuleEncrypted": "Зашифровано", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Повідомляє користувача про події віджетів Jitsi.", + "notificationRuleServerAcl": "Приховує події сервера ACL", + "notificationRuleServerAclDescription": "Приховує сповіщення про події Server ACL.", + "more": "Більше", + "takeAPhoto": "Зробити фото", + "recordAVideo": "Записати відео", + "optionalMessage": "(Необов'язково) повідомлення...", + "enterNewChat": "Створити новий чат", + "shareKeysWith": "Поділитися ключами з...", + "notSupportedOnThisDevice": "Не підтримується на цьому пристрої", + "notificationRuleMessage": "Повідомлення", + "unknownPushRule": "Невідоме правило сповіщення '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "pleaseWaitUntilInvited": "Будь ласка, зачекайте, поки хтось з кімнати запросить вас.", + "notificationRuleEncryptedRoomOneToOne": "Зашифрована кімната \"Один на один\"", + "deletePushRuleCanNotBeUndone": "Якщо ви видалите це налаштування сповіщень, відновити його буде неможливо.", + "notificationRuleEncryptedDescription": "Повідомляє користувача про повідомлення в зашифрованих кімнатах.", + "notificationRuleRoomServerAclDescription": "Приховує сповіщення про списки контролю доступу (ACL) сервера кімнати.", + "notificationRuleReaction": "Реакція", + "notificationRuleCallDescription": "Повідомляє користувача про виклики.", + "notificationRuleEncryptedRoomOneToOneDescription": "Повідомляє користувача про повідомлення в зашифрованих кімнатах \"Один на один\".", + "notificationRuleRoomOneToOne": "Кімната \"Один на один\"", + "approve": "Схвалити", + "youHaveKnocked": "Ви постукали", + "sentVoiceMessage": "🎙️Голосове повідомлення від {sender} ({duration})", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "countInvited": "Запрошено {count}", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "checkList": "Контрольний список", + "commandHint_logout": "Вийти на цьому пристрої", + "commandHint_logoutall": "Вийти на всіх активних пристроях", + "displayNavigationRail": "Показати навігаційну карту на мобільному", + "customReaction": "Власні реакції", + "moreEvents": "Інші події", + "declineInvitation": "Відхилити запрошення", + "noMessagesYet": "Поки немає повідомлень", + "longPressToRecordVoiceMessage": "Затисніть, щоб записати голосове повідомлення.", + "pause": "Призупинити", + "resume": "Продовжити", + "removeFromSpaceDescription": "Бесіду буде видалено з простору, та вона залишиться у вашому списку бесід.", + "countChats": "{chats} бесід", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Учасник {spaces} просторів", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Учасник просторів {spaces} може постукати", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "Розпочати опитування", + "endPoll": "Завершити опитування", + "answersVisible": "Відповіді видимі", + "pollQuestion": "Питання опитування", + "answerOption": "Варіант відповіді", + "addAnswerOption": "Додати варіант відповіді", + "allowMultipleAnswers": "Дозволити декілька варіантів відповіді", + "pollHasBeenEnded": "Опитування завершилось", + "skipChatBackupWarning": "Ви впевнені? Без резервного копіювання бесід ви можете втратити доступ до повідомлень, якщо ви зміните пристрій.", + "replyInThread": "Відповісти у вітці", + "saveChanges": "Зберегти зміни", + "createSticker": "Створити наліпку чи емодзі", + "useAsSticker": "Використати як наліпку", + "useAsEmoji": "Використати як емодзі", + "stickerPackNameAlreadyExists": "Набір наліпок з такою назвою вже є", + "newStickerPack": "Новий набір наліпок", + "stickerPackName": "Назва набору наліпок", + "attribution": "Атрибуція", + "skipChatBackup": "Пропустити резервне копіювання бесід", + "thread": "Вітка", + "backToMainChat": "Повернутись до основної бесіди", + "answersWillBeVisibleWhenPollHasEnded": "Відповіді стануть публічними після завершення опитування", + "countVotes": "{count, plural, =1{Один голос} other{{count} голосів}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countReplies": "{count, plural, =1{Одна відповідь} other{{count} відповідей}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "changedTheChatDescription": "{username} змінює опис бесіди", + "changedTheChatName": "{username} змінює назву бесіди", + "noMoreResultsFound": "Нічого не знайдено", + "chatSearchedUntil": "Пошук в бесіді по {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "versionWithNumber": "Версія: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Журнали", + "advancedConfigs": "Розширені налаштування", + "advancedConfigurations": "Розширені налаштування", + "identityServer": "Сервер профілів:", + "clientWellKnownInformation": "Дані клієнту із .well-known:", + "federationBaseUrl": "Основний URL федерації", + "baseUrl": "Основний URL", + "signIn": "Увійти", + "createNewAccount": "Створити новий обліковий запис", + "signUpGreeting": "FluffyChat децентралізований! Виберіть сервер, на якому ви хочете створити свій обліковий запис, і почнімо!", + "signInGreeting": "Ви вже маєте обліковий запис у Matrix? Ласкаво просимо! Виберіть свій домашній сервер і ввійдіть.", + "theProcessWasCanceled": "Процес скасовано.", + "join": "Приєднатись", + "searchOrEnterHomeserverAddress": "Знайдіть або введіть адресу домашнього сервера", + "matrixId": "Matrix-ідентифікатор", + "setPowerLevel": "Встановити рівень можливостей", + "makeModerator": "Зробити модератором", + "makeAdmin": "Зробити адміністратором", + "removeModeratorRights": "Позбавити прав модератора", + "removeAdminRights": "Позбавити прав адміністратора", + "powerLevel": "Рівень можливостей", + "setPowerLevelDescription": "Рівні можливостей визначають, що користувач може робити в цій кімнаті та, зазвичай, мають діапазон від 0 до 100.", + "owner": "Власник", + "mute": "Мут", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Створити новий чат", + "reset": "Скинути", + "supportFluffyChat": "Підтримати FluffyChat", + "support": "Підтримка", + "setLowPriority": "Встановити низький пріоритет", + "unsetLowPriority": "Скинути низький пріоритет", + "playSoundOnNotification": "Відтворити звук при сповіщенні", + "addTag": "Додати тег", + "removeTag": "Видалити тег", + "tagName": "Назва тегу", + "createNewTag": "Створити новий тег", + "discardEdits": "У вас є незбережені зміни. Відхилити?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "hideRoomsInSpaces": "Приховати чати, що належать просторам", + "possibleByYou": "Цей реліз став можливим лише завдяки вашій підтримці. FluffyChat залишається безкоштовним, з відкритим джерельним кодом й цілком підтримуваний спільнотою.", + "showThumbnailsInTimeline": "Показувати мініатюри зображень та відео", + "appSubtitle": "Безпечні чати [matrix]", + "appDescription": "Спілкуйтеся зашифровано через децентралізовану мережу [matrix] простим та доступним кожному способом.", + "interactiveVerification": "Інтерактивна перевірка", + "interactiveVerificationDescription": "Якщо ви перебуваєте поруч або спілкуєтеся через захищений канал, ви можете перевірити всі пристрої одночасно, порівнявши секретний номер або емодзі.", + "countUnverifiedDevices": "{count} неперевірених пристроїв в чаті.", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "Зашифроване повідомлення", + "unencryptedMessage": "Незашифроване повідомлення", + "publicKey": "Публічний ключ: {key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "Ключ пристрою", + "showMore": "Показати ще", + "showLess": "Показати менше" +} \ No newline at end of file diff --git a/lib/l10n/intl_uz.arb b/lib/l10n/intl_uz.arb new file mode 100644 index 0000000000..60a4b650fd --- /dev/null +++ b/lib/l10n/intl_uz.arb @@ -0,0 +1,2487 @@ +{ + "repeatPassword": "Parolni takrorlang", + "notAnImage": "Rasm fayli emas.", + "remove": "O‘chirish", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Hozir import qilish", + "importEmojis": "Emojilarni import qilish", + "importFromZipFile": ".zip faylidan import qilish", + "exportEmotePack": "Emotsiyalar to‘plamini .zip fayl ko‘rinishida eksport qilish", + "replace": "Almashtirmoq", + "about": "Biz haqimizda", + "aboutHomeserver": "{homeserver} haqida", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Qabul qilmoq", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} taklifni qabul qildi", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Hisob", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} shifrlashni yakunlash uchun faollashtirdi", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Email qo‘shish", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Hisobingizni o‘chirish uchun Matrix ID hisobingizni tasdiqlang.", + "supposedMxid": "Bu {mxid} bo‘lishi kerak", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "Maydonga qo‘shish", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "taxallus", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Hammasi", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Bu guruhni berilgan guruh versiyasiga yangilang", + "commandHint_googly": "G‘ilay ko‘zlarini yuboring", + "commandHint_cuddle": "Erkalash yuborish", + "commandHint_hug": "Quchoqlash yuborish", + "googlyEyesContent": "{senderName} sizga gʻilay ko‘zlarini yubormoqda", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} sizni erkalamoqda", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} sizni quchoqlamoqda", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} chaqiruvga javob berdi", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Har kim qo‘shilishi mumkin", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Ilova qulfi", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "PIN kod ishlatilmayotganida ilovani qulflash", + "archive": "Arxiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Mehmon foydalanuvchilarga qo‘shilishga ruxsat berilganmi", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Ishonchingiz komilmi?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Haqiqatan ham hisobingizdan chiqamoqchimisiz?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Narigi foydalanuvchini imzolash uchun xavfsiz do‘kon parol iborasi yoki tiklash kalitini kiriting.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}dan ushbu tasdiqlash so‘rovi qabul qilinsinmi?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Animatsiyali stikerlar va emojilarni avtomatik ijro etish", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendTypingNotifications": "Yozish bildirishnomalarini yuborish", + "swipeRightToLeftToReply": "Javob berish uchun o‘ngdan chapga suring", + "badServerLoginTypesException": "Homeserver quyidagi kirish turlarini qo'llab-quvvatlaydi:\n{serverVersions}\nLekin bu ilova faqat quyidagi turlarni qo'llab-quvvatlaydi:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendOnEnter": "Enterda yuborish", + "noMoreChatsFound": "Boshqa chatlar topilmadi...", + "noChatsFoundHere": "Bu yerda hali chat topilmadi. Quyidagi tugmadan foydalanib, kimdir bilan yangi suhbat boshlang. ⤵️", + "unread": "Oʻqilmagan", + "space": "Boʻshliq", + "banFromChat": "Suhbatdan taqiqlash", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Taqiqlangan", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} taqiqladi {targetName}(ni)", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Qurilmani bloklash", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Bloklandi", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "Bekor qilish", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "{uri} URIni ochib boʻlmadi", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Qurilma nomini oʻzgartirish", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} suhbat avatarini oʻzgartirdi", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} suhbat ruxsatnomalarini oʻzgartirdi", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} oʻzining nomini '{displayname}'ga oʻzgartirdi", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} mehmon kirish qoidalarini oʻzgartirdi", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} mehmon kirish qoidalarini: {rules}ga oʻzgartirdi", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} tarix koʻrinishini oʻzgartirdi", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} tarix koʻrinishini: {rules}ga oʻzgartirdi", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} qoʻshilish qoidalarini oʻzgartirdi", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} qoʻshilish qoidalarini: {joinRules}ga oʻzgartirdi", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} avatarini oʻzgartirdi", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} taklif havolasini oʻzgartirdi", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Parolni o‘zgartirish", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Homeserverni almashtirish", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Uslubingizni o‘zgartiring", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Guruh nomini o‘zgartirish", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Avataringizni almashtiring", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Shifrlash buzilgan", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Suhbat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Suhbat zaxirasi", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Suhbat tafsilotlari", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} xona taxalluslarini oʻzgartirdi", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chooseAStrongPassword": "Kuchli parol tanlang", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Arxivni tozalash", + "close": "Yopish", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Matrix identifikatorini berish uchun shaxsiy xabar guruhi sifatida belgilang", + "commandHint_markasgroup": "Guruh sifatida belgilash", + "commandHint_ban": "Bu guruhdan berilgan foydalanuvchini bloklash", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Kesh tozalash", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Boʻsh guruh suhbati yarating\nShifrlashni oʻchirish uchun --no-encryption dan foydalaning", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Seansni bekor qilish", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Jonli suhbatni boshlash\nShifrlashni o‘chirish uchun --no-encryption dan foydalaning", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "HTML formatidagi matnni yuborish", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Berilgan foydalanuvchini ushbu guruhga taklif qiling", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Berilgan guruhga qoʻshilish", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Berilgan foydalanuvchini guruhdan oʻchirish", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Guruhni tark etish", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Oʻzingizni tariflang", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Bu guruh uchun rasmingizni sozlang (mxc-uri tomonidan)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Bu guruh uchun displey nomini sozlang", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Berilgan foydalanuvchi quvvat darajasini oʻrnating (standart: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Formatlanmagan matnni yuboring", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Javobni reaksiya sifatida yuboring", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Matn yuborish", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Berilgan foydalanuvchini bu guruhdan blokdan chiqazish", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Buyruq yaroqsiz", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} komanda emas.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Iltimos emojilarni taqqoslang", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Iltimos raqamlarni taqqoslang", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Suhbatni sozlash", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakt guruhga taklif qilindi", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Kontent server administratorlariga xabar qilindi", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "chats": "Suhbatlar", + "@chats": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Buferga nusxalandi", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Nusxalash", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Buferga nusxalash", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Xabarni shifrlab boʻlmadi: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "checkList": "Tekshirish roʻyxati", + "countParticipants": "{count} qatnashuvchilar", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countInvited": "{count} taklif qilindi", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Yaratish", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} suhbat yaratdi", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Guruh yaratish", + "createNewSpace": "Yangi maydon", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Hozirda faol", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Qorongʻi", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Bu sizning foydalanuvchi hisobingizni oʻchirib qoʻyadi. Buni qaytarib boʻlmaydi! Ishonchingiz komilmi?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Yangi foydalanuvchilar uchun standart ruxsat darajasi", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Oʻchirish", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Hisobni oʻchirish", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Xabarni oʻchirish", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "Qurilmalar", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Shaxsiy suhbatlar", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote Sozlamalari", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Ommaviy suhbat IDʼsi", + "accessAndVisibility": "Kirish va koʻrinish", + "accessAndVisibilityDescription": "Bu suhbatga kim qoʻshilishi mumkin va suhbatni qanday topish mumkin.", + "calls": "Qoʻngʻiroqlar", + "customEmojisAndStickers": "Maxsus emojilar va stikerlar", + "customEmojisAndStickersBody": "Istalgan suhbatda ishlatilishi mumkin boʻlgan maxsus emojilar yoki stikerlarni qoʻshing yoki ulashing.", + "emoteShortcode": "Emote qisqa kodi", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Boʻsh suhbat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Emote paketini global miqyosda yoqish", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Shifrlashni yoqish", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Siz endi shifrlashni oʻchira olmaysiz. Ishonchingiz komilmi?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Shifrlangan", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Shifrlash", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Shrift oʻlchami", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Yuborvorish", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Qoʻshilishdan", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Taklifnomadan", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Guruh", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Suhbat tavsifi", + "chatDescriptionHasBeenChanged": "Suhbat tavsifi oʻzgartirildi", + "groupIsPublic": "Guruh ommaviy", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Guruhlar", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} bilan guruh", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Mehmonlarga kirish taqiqlangan", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Mehmonlar qoʻshila oladi", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} {targetName} uchun taklifnomani qaytarib oldi", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Yordam", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedMessages": "Oʻchirilgan xabarlarni yashirish", + "hideRedactedMessagesBody": "Agar kimdir xabarni oʻchirsa, bu xabar endi suhbatda koʻrinmaydi.", + "hideInvalidOrUnknownMessageFormats": "Notoʻgʻri yoki nomaʼlum xabar formatlarini yashirish", + "block": "Bloklash", + "blockedUsers": "Bloklangan foydalanuvchilar", + "blockListDescription": "Sizni bezovta qilayotgan foydalanuvchilarni bloklashingiz mumkin. Shaxsiy bloklash roʻyxatingizdagi foydalanuvchilardan hech qanday xabar yoki guruhga taklifnomalarni qabul qila olmaysiz.", + "blockUsername": "Foydalanuvchi nomini eʻtiborsiz qoldirish", + "iHaveClickedOnLink": "Men havolani bosdim", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Notoʻgʻri parol yoki tiklash kaliti", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Kontaktni taklif qilish", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Kontaktni {groupName} ga taklif qiling", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Hali suhbat tavsifi yaratilmagan.", + "tryAgain": "Qayta urinib koʻrish", + "invalidServerName": "Server nomi notoʻgʻri", + "invited": "Taklif qilindi", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "Xabar ushbu suhbatdagi barcha ishtirokchilar uchun oʻchiriladi. Buni bekor qilib boʻlmaydi.", + "optionalRedactReason": "(Ixtiyoriy) Ushbu xabarni oʻchirish sababi...", + "invitedUser": "📩 {username} {targetName}ni taklif qildi", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Faqat taklif qilingan foydalanuvchilar", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} sizni FluffyChat’ga taklif qildi.\n1. fluffychat.im saytiga tashrif buyuring va ilovani oʻrnating.\n2. Roʻyxatdan oʻting yoki tizimga kiring.\n3. Taklif havolasini oching:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "yozmoqda…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displey nomi o‘zgartirildi", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Faylni yuklab olish", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Tahrirlash", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Bloklangan serverlarni tahrirlash", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Suhbat ruxsatlari", + "editDisplayname": "Displey nomini tahrirlash", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Xona taxalluslarini tahrirlash", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Xona avatarini tahrirlash", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emotsiya allaqachon mavjud!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Noto‘g‘ri emotsiya kodi!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Yaqinda ishlatilgan emotsiyalar shu yerda chiqadi...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Shifrlash yoqilmagan", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} chaqiruvni tugatdi", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Email manzilini kiriting", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Joylashuv axboroti olinmadi: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "joinedTheChat": "👋 {username} suhbatga qoʻshildi", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Guruhga qoʻshilish", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} {targetName}ni tepdi", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} {targetName}ni tepdi va blokladi", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Suhbatdan tepish", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Oxirgi faol: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Chiqish", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Suhbatni tark etdi", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Yorugʻlik", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Yana {count} ishtirokchini yuklang", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Sessiyani eksport qilish va qurilmani oʻchirish", + "dehydrateWarning": "Bu amalni bekor qilib boʻlmaydi. Zaxira faylini xavfsiz saqlang.", + "hydrate": "Zaxira faylidan tiklash", + "loadingPleaseWait": "Yuklanmoqda… Iltimos, kuting.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Koʻproq yuklash…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Joylashuv xizmatlari oʻchirib qoʻyilgan. Joylashuvingizni ulashish uchun ularni yoqing.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Joylashuvga ruxsat berilmadi. Iltimos, ularga joylashuvingizni ulashishga ruxsat bering.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Kirish", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} ga kirish", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Chiqish", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "Qayd etmoq", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Xabarlar", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Xabarlar:", + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Suhbatni ovozsizlantirish", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "Yangi suhbat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat yangi xabarlar", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Yangi tasdiqlash so'rovi!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Keyingi", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Yoʻq", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Serverga ulanish yoʻq", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Hech qanday emoteʼlar topilmadi 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Shifrlashni faqat guruh endi hamma uchun ochiq bo'lmay qolgandan keyingina faollashtirishingiz mumkin.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging qurilmangizda mavjud emasga o'xshaydi. Push-bildirishnomalarni olishda davom etish uchun ntfy-ni o'rnatishingizni tavsiya qilamiz. NTFY yoki boshqa Unified Push provayderi yordamida siz ma'lumotlar xavfsizligini ta'minlash orqali push-bildirishnomalarni olishingiz mumkin. Siz ntfy-ni PlayStore yoki F-Droid-dan yuklab olishingiz mumkin.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} matrix serveri emas, buning o'rniga {server2} dan foydalanilsinmi?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Taklifnoma havolasini ulashish", + "scanQrCode": "QR kodini skanerlang", + "noPasswordRecoveryDescription": "Siz hali parolingizni tiklash usulini qoʻshmadingiz.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ruxsat yoʻq", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Hech qanday guruhlar topilmadi…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Bildirishnomalar", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} foydalanuvchilar yozmoqda…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Joylashuv aniqlanmoqda…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "ok": "Hop", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Onlayn kalit zaxira nusxasi yoqilgan", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Afsuski, push-bildirishnomalarni sozlashda xatolik yuz berdi.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Voy, nimadir notoʻgʻri ketdi…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Xabarlarni oʻqish uchun ilovani oching", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Kamerani ochish", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "Mijozlaringizdan biri tizimdan chiqdi", + "addAccount": "Hisob qoʻshish", + "editBundlesForAccount": "Bu hisob uchun toʻplamlarni tahrirlash", + "addToBundle": "Toʻplamga qoʻshish", + "removeFromBundle": "Bu toʻplamdan oʻchirish", + "bundleName": "Toʻplam nomi", + "openInMaps": "Xaritalarda ochish", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Havola", + "or": "Yoki", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Qatnashuvchi", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "parol yoki tiklash kaliti", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Parol", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Parol unitilgan", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Parol oʻzgartirildi", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecoverySettings": "Parolni qayta tiklash sozlamalari", + "passwordRecovery": "Parolni qayta tiklash", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "Toʻgʻnash", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Iltimos, kirish kodini tanlang", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Iltimos, elektron pochtadagi havolani bosing va keyin davom eting.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Iltimos parolingizni kiriting", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Iltimos PIN kodingizni kiriting", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Iltimos foydalanuvchi nomini kiriting", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Iltimos, veb-saytdagi koʻrsatmalarga amal qiling va keyingisini bosing.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Maxfiylik", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Ommaviy guruhlar", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "Sabab", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "{username} tomonidan tahrirlangan", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Shaxsiy suhbat", + "redactedByBecause": "{username} tomonidan tahrirlandi, sababi: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} tadbirni oʻchirib tashladi", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Xabarni tahrirlash", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Rad qilish", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} taklifni rad qildi", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeAllOtherDevices": "Qolgan barcha qurilmalarni oʻchirish", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Suhbat blokidan chiqazish", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Avatarni oʻchirish", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Guruhni yangiroq versiya bilan almashtirish", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Javob yozish", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Xabar berish", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Xona takomillashtirildi", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Guruh versiyasi", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Fayl saqlash", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Qidiruv", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Xavfsizlik", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "Yuborish", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Xabar yuborish", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Matn sifatida yuborish", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Audio yuborish", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Faylni yuborish", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Rasm yuborish", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "{count} ta rasm yuborish", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Xabarlar yuborish", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Video yuborish", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} fayl yubordi", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} audio yubordi", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "️ 🖼️ {username} rasm yubordi", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} stiker yubordi", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} video yubordi", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} chaqiruv axborotini yubordi", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Asosiy taxallus sifatida belgilash", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Suhbat tavsifini sozlash", + "setStatus": "Holatni sozlash", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Sozlamalar", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Bo‘lishmoq", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} joylashuvini ulashdi", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Joylashuvni ulashish", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "skip": "Tashlab ketish", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Manba kodi", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Guruh ochiq", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Guruh nomi", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} chaqiruv boshladi", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Holati", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Bugun ahvolingiz qalay?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Yuborish", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Sinxronlanmoqda... Iltimos, kuting.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Sinxronlanmoqda... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "Tizim", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Mos emas", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Mos keladi", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Talablar soni oshib ketdi. Keyinroq qayta urining!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Qayta yuborishga urining", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} {targetName}ni blokdan chiqardi", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Qurilmani blokdan chiqarish", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Notanish qurilma", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Noma’lum shifrlash algoritmi", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Noma’lum hodisa {type}", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Suhbatni ovozli qilish", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Olib tashlash", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} va yana {count} kishi yozmoqda…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} va {username2} yozmoqda…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} yozmoqda…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} suhbatni tark etdi", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} {type} tadbirini yubordi", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Tasdiqlanmagan", + "verified": "Tasdiqlangan", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Tasdiqlashni boshlash", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Siz tasdiqladingiz!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Boshqa hisob tasdiqlanmoqda", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video chaqiruv", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Suhbat tarixining ko‘rinishi", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Barcha ishtirokchilarga ko‘rinadi", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Hammaga ko‘rinadigan", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Ovozli xabar", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Hamkor so‘rovni qabul qilishi kutilmoqda…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Hamkor emoji qabul qilishini kutmoqda…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Hamkor raqamlarni qabul qilishi kutilmoqda…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "Ogohlantirish!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Sizga xat yubordik", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Kim qaysi amalni bajarishi mumkin", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Bu guruhga kim qo‘shilishi mumkin", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Nima uchun bu haqda xabar bermoqchisiz?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Ushbu manzillar yordamida parolingizni tiklashingiz mumkin.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Xabar yozish…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ha", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Siz", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Siz ortiq bu suhbatda qatnashmayapsiz", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Bu suhbatdan bloklandingiz", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Ochiq kalitingiz", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Xabar axboroti", + "time": "Vaqt", + "sender": "Yuboruvchi", + "openGallery": "Galereyani ochish", + "removeFromSpace": "Guruhdan olib tashlash", + "usersMustKnock": "Foydalanuvchilar taqillatishi kerak", + "noOneCanJoin": "Hech kim qoʻshila olmaydi", + "knock": "Taqillating", + "users": "Foydalanuvchilar", + "storeInAndroidKeystore": "Android KeyStoreʼda saqlang", + "storeInAppleKeyChain": "Apple KeyChainʼda saqlang", + "storeSecurlyOnThisDevice": "Ushbu qurilmada xavfsiz saqlang", + "countFiles": "{count} fayllar", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Foydalanuvchi", + "custom": "Maxsus", + "foregroundServiceRunning": "Bu bildirishnoma old plan xizmati ishlab turgan paytda paydo bo‘ladi.", + "screenSharingTitle": "Ekranni ulashish", + "screenSharingDetail": "Siz ekraningizni FuffyChat’da ulashmoqdasiz", + "whyIsThisMessageEncrypted": "Nima uchun bu xabarni oʻqib boʻlmaydi?", + "noKeyForThisMessage": "Bu xabar siz ushbu qurilmada hisobingizga kirishdan oldin yuborilgan boʻlsa sodir boʻlishi mumkin.\n\nShuningdek, joʻnatuvchi qurilmangizni bloklagan yoki internet ulanishida biron bir muammo yuzaga kelgan boʻlishi mumkin.\n\nXabarni boshqa sessiyada oʻqiy olasizmi? Keyin xabarni undan uzatishingiz mumkin! Sozlamalar > Qurilmalar boʻlimiga oʻting va qurilmalaringiz bir-birini tasdiqlaganligiga ishonch hosil qiling. Keyingi safar xonani ochganingizda va ikkala sessiya ham oldinda boʻlganda, kalitlar avtomatik ravishda uzatiladi.\n\nTizimdan chiqishda yoki qurilmalarni almashtirishda kalitlarni yoʻqotishni xohlamaysizmi? Sozlamalarda suhbatning zaxira nusxasini yoqganingizga ishonch hosil qiling.", + "newSpace": "Yangi maydon", + "doNotShowAgain": "Qaytib koʻrsatilmasin", + "wasDirectChatDisplayName": "Boʻsh suhbat ({oldDisplayName} edi)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Maydonlar sizga suhbatlaringizni birlashtirish va shaxsiy yoki ommaviy hamjamiyatlarni yaratish imkonini beradi.", + "youJoinedTheChat": "Siz suhbatga qoʻshildingiz", + "encryptThisChat": "Bu suhbatni shifrlash", + "disableEncryptionWarning": "Xavfsizlik nuqtai nazaridan, agar u ilgari yoqilgan boʻlsa, suhbatda shifrlashni oʻchirib qoʻyolmaysiz.", + "reopenChat": "Suhbatni qayta ochish", + "noBackupWarning": "Diqqat! Suhbatni zaxiralashni yoqmasangiz, shifrlangan xabarlaringizga kirish huquqini yoʻqotasiz. Tizimdan chiqishdan oldin chatni zaxiralashni yoqishingiz tavsiya etiladi.", + "inviteGroupChat": "📨 Guruh suhbatiga taklif", + "archiveRoomDescription": "Suhbat arxivga koʻchiriladi. Boshqa foydalanuvchilar sizning suhbatdan chiqqaningizni koʻra oladilar.", + "roomUpgradeDescription": "Keyin suhbat yangi guruh versiyasi bilan qayta yaratiladi. Barcha ishtirokchilarga yangi suhbatga oʻtishlari kerakligi haqida xabar beriladi. Guruh versiyalari haqida koʻproq maʼlumotni https://spec.matrix.org/latest/rooms/ manzilida topishingiz mumkin", + "banUserDescription": "Foydalanuvchi suhbatdan bloklanadi va blokdan chiqarilmaguncha suhbatga qayta kira olmaydi.", + "unbanUserDescription": "Foydalanuvchi qayta suhbatga kira oladi agar ular urinib koʻrishsa.", + "kickUserDescription": "Foydalanuvchi suhbatdan chiqarib yuboriladi, ammo taqiqlanmaydi. Ommaviy chatlarda foydalanuvchi istalgan vaqtda qayta qoʻshilishi mumkin.", + "chatCanBeDiscoveredViaSearchOnServer": "Suhbatni {server} saytidagi qidiruv orqali topish mumkin", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Qidiruv #chats, @users...", + "publicChatAddresses": "Ommaviy suhbat manzillari", + "addChatOrSubSpace": "Suhbat yoki sub-maydon qoʻshing", + "searchIn": "Suhbat \"{chat}\"da qidiring...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Suhbatdagi boshqa ishtirokchilar siz yangi xabar yozayotganingizni koʻrishlari mumkin.", + "sendReadReceiptsDescription": "Suhbatdagi boshqa ishtirokchilar sizning xabarni qachon oʻqiganingizni koʻrishlari mumkin.", + "unreadChatsInApp": "{appname}: {unread} ta oʻqilmagan suhbatlar", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "changeGeneralChatSettings": "Umumiy suhbat sozlamalarini oʻzgartirish", + "inviteOtherUsers": "Boshqa foydalanuvchilarni bu suhbatga taklif qilish", + "changeTheChatPermissions": "Suhbat ruxsatnomalarini oʻzgartirish", + "changeTheVisibilityOfChatHistory": "Suhbat tarix koʻrinishini oʻzgartirish", + "changeTheCanonicalRoomAlias": "Asosiy umumiy suhbat manzilini oʻzgartirish", + "changeTheDescriptionOfTheGroup": "Suhbat tavsifini oʻzgartirish", + "chatPermissionsDescription": "Ushbu suhbatda muayyan harakatlar uchun qaysi quvvat darajasi zarurligini aniqlang. 0, 50 va 100 quvvat darajalari odatda foydalanuvchilar, moderatorlar va administratorlarni ifodalaydi, ammo har qanday gradatsiya mumkin.", + "noticeChatBackupDeviceVerification": "Eslatma: Barcha qurilmalaringizni suhbat zaxira nusxasiga ulaganingizda, ular avtomatik ravishda tasdiqlanadi.", + "unableToJoinChat": "Chatga qoʻshilib boʻlmadi. Ehtimol, boshqa tomon suhbatni allaqachon yopib qoʻygan.", + "newChatRequest": "📩 Yangi suhbat uchun soʻrov", + "shareKeysWithDescription": "Shifrlangan suhbatlarda xabarlaringizni oʻqishlari uchun qaysi qurilmalarga ishonish kerak?", + "enterNewChat": "Yangi suhbatga kirish", + "removeFromSpaceDescription": "Suhbat maydondan olib tashlanadi, lekin hali ham suhbatlarlar ro‘yxatida chiqadi.", + "countChats": "{chats} suhbatlar", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "backToMainChat": "Asosiy suhbatga qaytish", + "markAsRead": "Oʻqilgan sifatida belgilash", + "reportUser": "Foydalanuvchi haqida xabar berish", + "reactedWith": "{sender} {reaction} bilan reaksiya bildirdi", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Xonaga mahkamlash", + "confirmEventUnpin": "Tadbirni butunlay olib tashlashga ishonchingiz komilmi?", + "placeCall": "Qoʻngʻiroq qilish", + "voiceCall": "Ovozli qoʻngʻiroq", + "unsupportedAndroidVersion": "Qoʻllab-quvvatlanmaydigan Android versiyasi", + "unsupportedAndroidVersionLong": "Bu funksiya Androidning yangi versiyasini talab qiladi. Iltimos, yangilanishlar yoki Lineage OS qoʻllab-quvvatlashini tekshiring.", + "videoCallsBetaWarning": "Iltimos, video qoʻngʻiroqlar hozirda beta-versiyada ekanligini unutmang. Ular kutilganidek ishlamasligi yoki barcha platformalarda umuman ishlamasligi mumkin.", + "experimentalVideoCalls": "Tajriba video qoʻngʻiroqlar", + "sorryThatsNotPossible": "Kechirasiz... bu mumkin emas", + "noOtherDevicesFound": "Boshqa qurilma topilmadi", + "fileIsTooBigForServer": "Yuborish imkonsiz! Server faqat {max} hajmgacha bo‘lgan ilovalarni qo‘llab-quvvatlaydi.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Fayl {path}da saqlandi", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Oxirgi o‘qilgan xabarga o‘tish", + "readUpToHere": "Bu yerga qadar o‘qish", + "jump": "Sakrash", + "openLinkInBrowser": "Havolani brauzerda ochish", + "reportErrorDescription": "😭 Voy yo‘q. Nimadir xato ketdi. Agar xohlasangiz, bu xato haqida dasturchilarga xabar berishingiz mumkin.", + "report": "hisobot", + "setColorTheme": "Rang mavzusini sozlash:", + "invite": "Taklif qilish", + "invalidInput": "Xato kiritildi!", + "wrongPinEntered": "PIN noto‘g‘ri kiritildi! {seconds} soniyadan keyin qayta urining...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "0 dan katta son kiriting", + "removeDevicesDescription": "Bu qurilmadan chiqarilasiz va ortiq xabarlarni qabul qila olmaysiz.", + "noUsersFoundWithQuery": "Afsuski, \"{query}\" soʻrovi bilan foydalanuvchi topilmadi. Iltimos, xato qilganingizni tekshiring.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Taqillatmoqda", + "nothingFound": "Hech nima topilmadi...", + "groupName": "Guruh nomi", + "createGroupAndInviteUsers": "Guruh yaratish va foydalanuvchilarni taklif qilish", + "groupCanBeFoundViaSearch": "Guruh qidiruv orqali topilishi mumkin", + "wrongRecoveryKey": "Kechirasiz... bu toʻgʻri tiklash kaliti emasga oʻxshaydi.", + "commandHint_sendraw": "Xom jsonni yuborish", + "databaseMigrationTitle": "Maʼlumotlar bazasi optimallashtirilgan", + "databaseMigrationBody": "Iltimos, kuting. Bu biroz vaqt olishi mumkin.", + "leaveEmptyToClearStatus": "Holatingizni tozalash uchun boʻsh qoldiring.", + "select": "Tanlash", + "searchForUsers": "@users ni qidiring...", + "pleaseEnterYourCurrentPassword": "Iltimos, joriy maxfiy soʻzingizni kiriting", + "newPassword": "Yangi maxfiy soʻz", + "pleaseChooseAStrongPassword": "Iltimos kuchli maxfiy soʻz tanlang", + "passwordsDoNotMatch": "Maxfiy soʻzlar mos kelmadi", + "passwordIsWrong": "Siz kiritgan maxfiy soʻz xato", + "createNewAddress": "Yangi manzil yarating", + "joinSpace": "Maydonga qoʻshiling", + "publicSpaces": "Ommaviy maydonlar", + "thisDevice": "Ushbu qurilma:", + "initAppError": "Ilovani ishga tushirishda xatolik yuz berdi", + "searchMore": "Koʻproq qidirish...", + "gallery": "Galereya", + "files": "Fayllar", + "sessionLostBody": "Seansingiz yoʻqoldi. Iltimos, ushbu xato haqida {url} manzilidagi dasturchilarga xabar bering. Xato xabari: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Ilova endi seansingizni zaxira nusxasidan tiklashga harakat qiladi. Iltimos, ushbu xato haqida {url} manzilidagi dasturchilarga xabar bering. Xato xabari: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "Oʻqilganlik haqida xabarnomalarni yuborish", + "formattedMessages": "Formatlangan xabarlar", + "formattedMessagesDescription": "Markdown yordamida qalin matn kabi boy xabar mazmunini koʻrsating.", + "verifyOtherUser": "🔐 Boshqa foydalanuvchini tasdiqlang", + "verifyOtherUserDescription": "Agar siz boshqa foydalanuvchini tasdiqlasangiz, aslida kimga yozayotganingizni bilishingizga amin boʻlishingiz mumkin. 💪\n\nTekshiruvni boshlaganingizda, siz va boshqa foydalanuvchi ilovada qalqib chiquvchi oynani koʻrasiz. Keyin u yerda siz bir-biringiz bilan taqqoslashingiz kerak boʻlgan bir qator emojilar yoki raqamlarni koʻrasiz.\n\nBuning eng yaxshi usuli - uchrashish yoki video qoʻngʻiroqni boshlash. 👭", + "verifyOtherDevice": "🔐 Boshqa qurilmani tasdiqlang", + "verifyOtherDeviceDescription": "Boshqa qurilmani tasdiqlaganingizda, bu qurilmalar kalitlarni almashishi mumkin, bu umumiy xavfsizligingizni oshiradi. 💪 Tasdiqlashni boshlaganingizda, ikkala qurilmada ham ilovada qalqib chiquvchi oyna paydo bo‘ladi. U yerda siz bir-biri bilan taqqoslashingiz kerak bo‘lgan emojilar yoki raqamlar qatorini ko‘rasiz. Tasdiqlashni boshlashdan oldin ikkala qurilma ham yoningizda bo‘lgani ma’qul. ✓", + "acceptedKeyVerification": "{sender} kalit tekshiruvini qabul qildi", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "contentNotificationSettings": "Kontent bildirishnomasi sozlamalari", + "generalNotificationSettings": "Umumiy bildirishnoma sozlamalari", + "roomNotificationSettings": "Xona bildirishnomasi sozlamalari", + "userSpecificNotificationSettings": "Foydalanuvchiga xos bildirishnoma sozlamalari", + "otherNotificationSettings": "Boshqa bildirishnoma sozlamalari", + "notificationRuleContainsUserName": "Foydalanuvchi nomini ichiga oladi", + "notificationRuleContainsUserNameDescription": "Xabarda foydalanuvchi nomi mavjud bo‘lsa, foydalanuvchiga xabar beradi.", + "notificationRuleMaster": "Barcha bildirishnomalarni ovozsiz qilish", + "notificationRuleMasterDescription": "Boshqa barcha qoidalarni bekor qiladi va barcha bildirishnomalarni faolsizlantiradi.", + "notificationRuleSuppressNotices": "Avtomatlashtirilgan xabarlarni o‘chirish", + "notificationRuleInviteForMe": "Men uchun taklif qilish", + "notificationRuleInviteForMeDescription": "Foydalanuvchi xonaga taklif qilinganda unga xabar beradi.", + "notificationRuleMemberEvent": "A’zo tadbirlari", + "notificationRuleMemberEventDescription": "Obuna tadbirlari uchun bildirishnomalarni o‘chiradi.", + "notificationRuleIsUserMention": "Foydalanuvchi zikri", + "notificationRuleIsUserMentionDescription": "Foydalanuvchi xabarida to‘g‘ridan-to‘g‘ri tilga olinganida unga xabar beradi.", + "notificationRuleContainsDisplayName": "Tarkibida displey nomi bor", + "notificationRuleContainsDisplayNameDescription": "Xabarda foydalanuvchining displey nomi mavjudligi haqida foydalanuvchiga xabar beradi.", + "notificationRuleSuppressNoticesDescription": "Botlar kabi avtomatlashtirilgan mijozlardan kelgan bildirishnomalarni to‘xtatadi.", + "notificationRuleIsRoomMention": "Xonaga eslatma", + "notificationRuleIsRoomMentionDescription": "Xona zikri mavjudligida foydalanuvchiga xabar beradi.", + "notificationRuleRoomnotif": "Xona bildirishnomasi", + "notificationRuleRoomnotifDescription": "Xabar tarkibida @room bo‘lsa, foydalanuvchiga xabar beradi.", + "notificationRuleReaction": "Reaksiya", + "notificationRuleReactionDescription": "Munosabat bildirishnomalarini o‘chiradi.", + "canceledKeyVerification": "{sender} kalit tekshiruvini bekor qildi", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} kalitni tasdiqlashni yakunladi", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} kalitni tasdiqlash uchun tayyor", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} kalitni tasdiqlash talabini yubordi", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} kalit tekshiruvini so‘radi", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Kiruvchi xabarlar", + "stickers": "Stikerlar", + "discover": "Kashf etish", + "commandHint_ignore": "Berilgan matriks ID e’tiborga olinmasin", + "commandHint_unignore": "Berilgan matriks IDni e’tiborsiz qoldirish", + "noDatabaseEncryption": "Bu platformada ma’lumotlar bazasini shifrlash ishlamaydi", + "thereAreCountUsersBlocked": "Hozirda {count} ta foydalanuvchi bloklangan.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "goToSpace": "Maydonga o‘tish: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Ochilmagan deb belgilash", + "userLevel": "{level} - Foydalanuvchi", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "sendRoomNotifications": "@room bildirishnomalarini yuborish", + "updateInstalled": "🎉 {version} versiyasiga yangilandi!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "O‘zgarishlar jurnali", + "sendCanceled": "Yuborish bekor qilindi", + "loginWithMatrixId": "Matriks-ID bilan kirish", + "doesNotSeemToBeAValidHomeserver": "Uy serveri mos emasga o‘xshaydi. URL xato kiritilganmi?", + "calculatingFileSize": "Fayl hajmi hisoblanmoqda...", + "sendingAttachment": "Biriktirish yuborilmoqda...", + "oneOfYourDevicesIsNotVerified": "Qurilmalaringizdan biri tasdiqlanmagan", + "continueText": "Davom etish", + "blur": "Xiralashtirish:", + "opacity": "Noaniqlik:", + "setWallpaper": "Fon rasmini sozlash", + "manageAccount": "Hisobni boshqarish", + "noContactInformationProvided": "Server hech qanday yaroqli kontakt axborotini taqdim etmaydi", + "contactServerAdmin": "Server administratori bilan bog‘lanish", + "contactServerSecurity": "Aloqa serveri xavfsizligi", + "supportPage": "Yordam sahifasi", + "serverInformation": "Server haqida ma’lumot:", + "name": "Nomi", + "version": "Versiya", + "website": "Sayt", + "compress": "Siqmoq", + "boldText": "Qalin matn", + "italicText": "Qiya matn", + "strikeThrough": "O‘tish joyi", + "pleaseFillOut": "Iltimos, to‘ldiring", + "invalidUrl": "Yaroqsiz url", + "addLink": "Havola kiritish", + "previous": "Avvalgi", + "otherPartyNotLoggedIn": "Narigi tomon hozirda hisobingizga kirmagan va shuning uchun xabarlarni qabul qila olmaydi!", + "appWantsToUseForLogin": "Hisobga kirish '{server}' ishlating", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Siz bu bilan ilova va veb-saytga siz haqingizdagi axborotni ulashishga ruxsat berasiz.", + "open": "Ochish", + "waitingForServer": "Server kutilmoqda...", + "notificationRuleRoomServerAcl": "Guruh serveri ACL", + "notificationRuleRoomServerAclDescription": "Guruh serveriga kirishni boshqarish ro‘yxatlari (ACL) uchun bildirishnomalarni bostiradi.", + "notificationRuleSuppressEdits": "Tahrirlarni bostirish", + "notificationRuleSuppressEditsDescription": "Tahrirlangan xabarlar uchun bildirishnomalarni o‘chiradi.", + "notificationRuleCall": "Chaqiruv", + "notificationRuleCallDescription": "Chaqiruvlar haqida foydalanuvchiga xabar beradi.", + "notificationRuleEncryptedRoomOneToOne": "Shifrlangan birga-bir guruh", + "notificationRuleEncryptedRoomOneToOneDescription": "Shifrlangan birga-bir guruhlardagi xabarlar haqida foydalanuvchiga xabar beradi.", + "notificationRuleTombstoneDescription": "Xonani faolsizlantirish xabarlari haqida foydalanuvchiga xabar beradi.", + "notificationRuleRoomOneToOne": "Birga-bir guruh", + "notificationRuleRoomOneToOneDescription": "Birga-bir guruhlardagidagi xabarlar haqida foydalanuvchiga xabar beradi.", + "notificationRuleMessage": "Xabar", + "notificationRuleMessageDescription": "Foydalanuvchiga umumiy xabarlar haqida xabar beradi.", + "notificationRuleEncrypted": "Shifrlangan", + "notificationRuleEncryptedDescription": "Shifrlangan guruhlardagi xabarlar haqida foydalanuvchiga xabar beradi.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Jitsi vidjet hodisalari haqida foydalanuvchiga xabar beradi.", + "notificationRuleServerAcl": "Server ACL hodisalarini bostirish", + "notificationRuleServerAclDescription": "Server ACL hodisalari uchun bildirishnomalarni o‘chiradi.", + "unknownPushRule": "Noma’lum push qoidasi '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "️ 🎙️{duration} - {sender}dan ovozli xabar", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Agar ushbu bildirishnoma sozlamasini o‘chirib tashlasangiz, buni bekor qilib bo‘lmaydi.", + "more": "Yana", + "shareKeysWith": "Kalitlarni ulashish...", + "allDevices": "Barcha qurilmalar", + "crossVerifiedDevicesIfEnabled": "Agar yoqilgan bo‘lsa, tasdiqlangan qurilmalarni kesib o‘tish", + "crossVerifiedDevices": "O‘zaro tekshirilgan qurilmalar", + "verifiedDevicesOnly": "Faqat tasdiqlangan qurilmalar", + "takeAPhoto": "Suratga olish", + "recordAVideo": "Video yozib olish", + "optionalMessage": "(Ixtiyoriy) xabar...", + "notSupportedOnThisDevice": "Bu qurilmada ishlamaydi", + "approve": "Tasdiqlash", + "youHaveKnocked": "Siz taqillatdingiz", + "pleaseWaitUntilInvited": "Iltimos, hozir kutib turing, xonadan kimdir sizni taklif qilguncha.", + "commandHint_logout": "Joriy qurilmadan chiqish", + "commandHint_logoutall": "Barcha faol qurilmalardan chiqish", + "displayNavigationRail": "Mobilda navigatsiya temir yo‘lini ko‘rsatish", + "customReaction": "Maxsus reaksiya", + "moreEvents": "Boshqa hodisalar", + "declineInvitation": "Taklifni rad etish", + "noMessagesYet": "Hozircha xabarlar yo‘q", + "longPressToRecordVoiceMessage": "Ovozli xabarni yozib olish uchun uzoq bosing.", + "pause": "Pauza", + "resume": "Davom etish", + "spaceMemberOf": "{spaces} maydoni a’zosi", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} maydoni a’zosi eshikni taqillatishi mumkin", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "So‘rovni boshlash", + "endPoll": "So‘rovnomani yakunlash", + "answersVisible": "Javoblar ko‘rinadi", + "pollQuestion": "So‘rovnoma savoli", + "answerOption": "Javob varianti", + "addAnswerOption": "Javob variantini kiritish", + "allowMultipleAnswers": "Bir nechta javobga ruxsat berish", + "pollHasBeenEnded": "So‘rovnoma yakunlandi", + "countVotes": "{count, plural, =1{Bir ovoz} other{{count} ta ovoz}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "So‘rovnoma tugaganida javoblar chiqadi", + "replyInThread": "Sahifada javob berish", + "countReplies": "{count, plural, =1{Bitta javob} other{{count} ta javob}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Sahifa", + "youRejectedTheInvitation": "Taklifni rad etdingiz", + "youAcceptedTheInvitation": "👍 Taklifni qabul qildingiz", + "youBannedUser": "Siz {user}ni blokladingiz", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Siz {user} uchun taklifnomani bekor qildingiz", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Sizni {user} taklif qildi", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Siz {user}ni taklif qildingiz", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Siz {user}ni chiqarib yubordingiz", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Siz {user}ni chiqardingiz va blokladingiz", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "{user}ni blokdan chiqardingiz", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} taqillatdi", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "makeAdminDescription": "Bu foydalanuvchini admini qilsangiz, uni bekor qila olmasligingiz mumkin, chunki u siz bilan bir xil ruxsatlarga ega bo‘ladi.", + "pushNotificationsNotAvailable": "Push-bildirishnomalar mavjud emas", + "learnMore": "Batafsil", + "yourGlobalUserIdIs": "Global foydalanuvchi ID raqamingiz: ", + "notificationRuleTombstone": "Qabrtosh", + "emojis": "Emojilar", + "changedTheChatDescription": "{username} chat tavsifini o‘zgartirdi", + "changedTheChatName": "{username} chat nomini o‘zgartirdi", + "saveChanges": "O‘zgarishlarni saqlash", + "createSticker": "Stiker yoki emoji yaratish", + "useAsSticker": "Stiker sifatida ishlatish", + "useAsEmoji": "Emoji sifatida ishlatish", + "stickerPackNameAlreadyExists": "Stiker paketi nomi allaqachon mavjud", + "newStickerPack": "Yangi stikerlar paketi", + "stickerPackName": "Stiker paketi nomi", + "attribution": "Atributsiya", + "skipChatBackup": "Chat zaxirasini tashlab ketish", + "skipChatBackupWarning": "Ishonchingiz komilmi? Chat zaxirasini yoqmasdan qurilmangizni almashtirsangiz, xabarlaringizga kira olmay qolishingiz mumkin.", + "noMoreResultsFound": "Boshqa natijalar topilmadi", + "chatSearchedUntil": "Chat {time} gacha qidirildi", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Federatsiya bazasi URL manzili", + "clientWellKnownInformation": "Mijozlarga yaxshi tanish ma’lumotlar:", + "baseUrl": "Asosiy URL", + "identityServer": "Identifikatsiya serveri:", + "versionWithNumber": "Versiya: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Jurnallar", + "advancedConfigs": "Kengaytirilgan konfiguratsiyalar", + "advancedConfigurations": "Kengaytirilgan sozlamalar", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + } +} \ No newline at end of file diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb new file mode 100644 index 0000000000..da3c2d79af --- /dev/null +++ b/lib/l10n/intl_vi.arb @@ -0,0 +1,1963 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.781172", + "about": "Giới thiệu", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "Đồng ý", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "{username} đã đồng ý lời mời", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Tài khoản", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "{username} đã kích hoạt mã hóa đầu cuối 2 chiều", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Quản trị viên", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "bí danh", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} đã trả lời cuộc gọi", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Mọi người đều có thể gia nhập", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "Lưu trữ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Khách vãng lai có được tham gia không", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Bạn chắc chứ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Thiết bị bị chặn", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "verified": "Đã xác thực", + "@verified": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Vui lòng làm theo hướng dẫn trên trang web và bấm tiếp", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Bạn chỉ có thể kích hoạt mã hoá khi phòng này không mở", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "next": "Tiếp", + "@next": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Cài đặt biểu tượng cảm xúc", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Sửa tên hiển thị", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Tải ảnh xuống", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Tên hiển thị đã được thay đổi", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "devices": "Các thiết bị", + "@devices": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Xoá tin nhắn", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Xoá tài khoản", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "delete": "Xoá", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "Việc này sẽ vô hiệu hoá tài khoản của bạn. Điều này không thể đảo ngược được! Bạn chắc là vẫn muốn tiếp tục chứ?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "currentlyActive": "Đang hoạt động", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "{username} đã tạo cuộc trò chuyện", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "create": "Tạo", + "@create": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} thành viên", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "couldNotDecryptMessage": "Không thể giải mã tin nhắn: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "copy": "Sao chép", + "@copy": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Liên hệ đã được mời vào nhóm", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "So sánh và đảm bảo các số sau đây giống trên máy còn lại", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "So sánh và đảm bảo các biểu tượng cảm xúc sau đây giống với các biểu tượng trên máy còn lại", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "close": "Đóng", + "@close": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Chọn một mật khẩu mạnh", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chi tiết cuộc trò chuyện", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "Sao lưu cuộc trò chuyện", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Thay đổi tên nhóm", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Thay đổi máy chủ nhà", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changePassword": "Thay đổi mật khẩu", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomInvitationLink": "{username} đã thay đổi đường dẫn mời", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} đã đổi địa chỉ phòng chat", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} đã thay đổi ảnh đại diện của mình", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} đã thay đổi quy tắc truy cập đối với khách thành: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} đã thay đổi quy tắc truy cập đối với khách", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} đã thay đổi quyền trong phòng chat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} đã thay đổi ảnh phòng chat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeDeviceName": "Thay đổi tên thiết bị", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "cancel": "Hủy", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "blocked": "Đã chặn", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} đã cấm {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "banned": "Đã bị cấm", + "@banned": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "Cấm khỏi cuộc trò chuyện", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Máy chủ nhà hỗ trợ kiểu đăng nhập:\n{serverVersions}\nNhưng ứng dụng này chỉ hỗ trợ:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "askVerificationRequest": "Bạn có đồng ý yêu cầu chứng thực từ {username} không?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areYouSureYouWantToLogout": "Bạn có chắc bạn muốn đăng xuất không?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Thêm email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "notifications": "Thông báo", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterANumber": "Hãy nhập số lớn hơn 0", + "newSpaceDescription": "Không gian cho phép bạn hợp nhất các cuộc trò chuyện của mình và xây dựng cộng đồng riêng tư hoặc công khai.", + "disableEncryptionWarning": "Vì lý do bảo mật, bạn không thể tắt tính năng mã hóa trong cuộc trò chuyện đã được bật tính năng này trước đó.", + "makeAdminDescription": "Khi bạn đặt người dùng này làm quản trị viên, bạn không thể hoàn tác việc này vì khi đó họ sẽ có quyền ngang bạn.", + "setColorTheme": "Chọn màu giao diện:", + "openLinkInBrowser": "Mở đường dẫn trong trình duyệt", + "inviteGroupChat": "📨 Mời nhóm trò chuyện", + "addToSpace": "Thêm vào không gian", + "importEmojis": "Nhập Biểu cảm", + "importFromZipFile": "Nhập vào từ tệp .zip", + "exportEmotePack": "Xuất gói biểu cảm bằng tệp .zip", + "replace": "Thay thế", + "report": "báo cáo", + "remove": "Loại bỏ", + "@remove": { + "type": "String", + "placeholders": {} + }, + "newSpace": "Không gian mới", + "all": "Tất cả", + "@all": { + "type": "String", + "placeholders": {} + }, + "appLock": "Khoá ứng dụng", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "Nhập lại mật khẩu", + "confirmMatrixId": "Hãy xác nhận Matrix ID để xoá tài khoản.", + "supposedMxid": "Đây nên là {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "noBackupWarning": "Cẩn thận! Nếu không bật sao lưu trò chuyện, bạn sẽ mất quyền truy cập vào tin nhắn được mã hóa của mình. Chúng tôi khuyên bạn nên bật sao lưu trò chuyện trước khi đăng xuất.", + "doNotShowAgain": "Không hiện lại nữa", + "wasDirectChatDisplayName": "Hội thoại trống (từng là {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 Ôi. Có lỗi xảy ra. Bạn có thể báo cáo lỗi tới nhà phát triển nếu muốn.", + "banUserDescription": "Người dùng sẽ bị cấm khỏi cuộc trò chuyện và không thể tham gia lại cho tới khi được gỡ cấm.", + "learnMore": "Tìm hiểu thêm", + "incomingMessages": "Tin nhắn đến", + "encryptThisChat": "Mã hóa cuộc trò chuyện này", + "noOtherDevicesFound": "Không tìm thấy thiết bị khác", + "fileIsTooBigForServer": "Máy chủ báo cáo rằng tệp tin quá lớn để gửi.", + "notAnImage": "Không phải tệp ảnh.", + "importNow": "Nhập vào", + "jumpToLastReadMessage": "Đi tới tin nhắn đã đọc mới nhất", + "commandHint_ignore": "Phớt lờ matrix ID này", + "appLockDescription": "Khoá ứng dụng khi không dùng bằng mã pin", + "settings": "Cài đặt", + "@settings": { + "type": "String", + "placeholders": {} + }, + "fileHasBeenSavedAt": "Tệp đã được lưu tại {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "readUpToHere": "Đọc tới đây", + "jump": "Đi tới", + "sorryThatsNotPossible": "Xin lỗi... không khả dụng", + "reopenChat": "Mở lại cuộc trò chuyện", + "wrongPinEntered": "Nhập sai mã pin! Thử lại sau {seconds} giây...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "Cuộc trò chuyện sẽ được chuyển tới mục lưu trữ. Người dùng khác sẽ thấy được bạn đã rời khỏi cuộc trò chuyện.", + "kickUserDescription": "Người dùng bị đuổi khỏi cuộc trò chuyện nhưng không bị cấm. Trong các cuộc trò chuyện công khai, người dùng có thể vào lại bất cứ lúc nào.", + "unbanUserDescription": "Người dùng sẽ có thể vào lại cuộc trò chuyện nếu họ thử.", + "pushNotificationsNotAvailable": "Thông báo đẩy không khả dụng", + "invite": "Mời", + "invalidInput": "Dữ liệu nhập không hợp lệ!", + "removeDevicesDescription": "Bạn sẽ đăng xuất khỏi thiết bị này và không nhận được tin nhắn nữa.", + "noUsersFoundWithQuery": "Không tìm thấy người dùng nào với \"{query}\". Hãy kiểm tra xem bạn có nhập nhầm không.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "commandHint_unignore": "Bỏ phớt lờ matrix ID này", + "discover": "Khám phá", + "stickers": "Nhãn dán", + "roomUpgradeDescription": "Cuộc trò chuyện sẽ được tạo lại với phiên bản phòng mới. Tất cả những người tham gia sẽ được thông báo rằng họ cần chuyển sang cuộc trò chuyện mới. Bạn có thể tìm hiểu thêm về các phiên bản phòng tại https://spec.matrix.org/latest/rooms/", + "commandHint_hug": "Gửi một cái ôm", + "aboutHomeserver": "Về {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "hugContent": "{senderName} ôm bạn", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Nâng cấp phòng lên phiên bản mặc định", + "commandHint_cuddle": "Gửi cái ôm", + "googlyEyesContent": "{senderName} gửi nháy mắt", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} ôm nào", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "askSSSSSign": "Để có thể ký tên cho người khác, vui lòng nhập mật khẩu lưu trữ an toàn hoặc khóa khôi phục của bạn.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "Tự động chạy nhãn dán hình động và biểu tượng cảm xúc", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendTypingNotifications": "Gửi thông báo đang nhập", + "swipeRightToLeftToReply": "Gạt từ phải sang trái để trả lời", + "sendOnEnter": "Gửi bằng Enter", + "continueText": "Tiếp", + "markAsRead": "Đánh dấu đã đọc", + "reportUser": "Báo cáo người dùng", + "reactedWith": "{sender} bày tỏ {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Ghim phòng", + "confirmEventUnpin": "Bạn có muốn bỏ ghim sự kiện?", + "@ok": { + "type": "String", + "placeholders": {} + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_yue_Hant.arb b/lib/l10n/intl_yue_Hant.arb new file mode 100644 index 0000000000..f9713c1477 --- /dev/null +++ b/lib/l10n/intl_yue_Hant.arb @@ -0,0 +1,1889 @@ +{ + "@@locale": "yue", + "areYouSureYouWantToLogout": "係咪確定要 log out?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "畀唔畀陌生人 Join", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "要向其他人簽名,請輸入你 Keep 好咗嘅密碼或者恢復密鑰。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "呢個 Homeserver 支持嘅登錄類型有:\n{serverVersions}\n但係呢個 App 淨係支援:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "cantOpenUri": "打唔開嘅 URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "banFromChat": "喺傾偈入面 Ban 咗佢", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "noChatsFoundHere": "暫時未有偈傾。撳下面粒掣同人開始傾偈 ⤵️", + "bannedUser": "{username} Ban 咗 {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "addEmail": "加 Email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "importEmojis": "導入 Emoji", + "hugContent": "{senderName} 抱咗你", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "Send 個 Hug", + "anyoneCanJoin": "任何人都可以 Join", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "repeatPassword": "輸入多一次密碼", + "notAnImage": "唔係圖檔。", + "remove": "刪走", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "即刻導入", + "exportEmotePack": "將表情符號導出成 .zip 檔案", + "replace": "換走", + "about": "關於", + "aboutHomeserver": "關於{homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "同意", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} 同意咗邀请", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} 開咗點對點加密", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "supposedMxid": "呢度應該係 {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addToSpace": "加落去空間嗰度", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "花名", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "全部", + "@all": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "將呢間房升級到指定版本", + "commandHint_googly": "送啲古靈精怪表情過去", + "commandHint_cuddle": "Send 個攬攬", + "googlyEyesContent": "{senderName} Send 咗你一個咕嚕眼", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} 攬咗你", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} 聽咗你嘅電話", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "App 鎖", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "無人用嘅時候用密碼鎖住個App", + "archive": "存檔", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "咪住先?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "係咪要 Accept 來自 {username} 嘅驗證申請?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "自動播放動畫貼紙同表情", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendTypingNotifications": "通知人地打緊字", + "swipeRightToLeftToReply": "向左滑嚟回覆", + "sendOnEnter": "撳 Enter 即 Send", + "noMoreChatsFound": "搵唔到更多偈傾啦…", + "unread": "未讀", + "space": "空間", + "banned": "Block 咗", + "@banned": { + "type": "String", + "placeholders": {} + }, + "blockDevice": "Block 咗嘅裝置", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Block 咗", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "取消", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "改裝置名", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username}轉咗個大頭貼", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "confirmMatrixId": "Confirm 你嘅 Matrix ID ,我哋先至可以刪除你嘅 Account。", + "importFromZipFile": "喺 .zip 檔案導入", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "@chats": { + "type": "String", + "placeholders": {} + }, + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "@directChats": { + "type": "String", + "placeholders": {} + }, + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "@close": { + "type": "String", + "placeholders": {} + }, + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "@reply": { + "type": "String", + "placeholders": {} + }, + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "@encryption": { + "type": "String", + "placeholders": {} + }, + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@invited": { + "type": "String", + "placeholders": {} + }, + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "@warning": { + "type": "String", + "placeholders": {} + }, + "@password": { + "type": "String", + "placeholders": {} + }, + "@goToSpace": { + "type": "String", + "space": {} + }, + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "@next": { + "type": "String", + "placeholders": {} + }, + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "@create": { + "type": "String", + "placeholders": {} + }, + "@no": { + "type": "String", + "placeholders": {} + }, + "@unpin": { + "type": "String", + "placeholders": {} + }, + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "@reason": { + "type": "String", + "placeholders": {} + }, + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@edit": { + "type": "String", + "placeholders": {} + }, + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "@copy": { + "type": "String", + "placeholders": {} + }, + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@or": { + "type": "String", + "placeholders": {} + }, + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@submit": { + "type": "String", + "placeholders": {} + }, + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "@participant": { + "type": "String", + "placeholders": {} + }, + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "@yes": { + "type": "String", + "placeholders": {} + }, + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "@help": { + "type": "String", + "placeholders": {} + }, + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "@verified": { + "type": "String", + "placeholders": {} + }, + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@delete": { + "type": "String", + "placeholders": {} + }, + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@moderator": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "@ok": { + "type": "String", + "placeholders": {} + }, + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "@send": { + "type": "String", + "placeholders": {} + }, + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@sendAsText": { + "type": "String" + }, + "@commandInvalid": { + "type": "String" + }, + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@newChat": { + "type": "String", + "placeholders": {} + }, + "@notifications": { + "type": "String", + "placeholders": {} + }, + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "@mention": { + "type": "String", + "placeholders": {} + }, + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@chat": { + "type": "String", + "placeholders": {} + }, + "@group": { + "type": "String", + "placeholders": {} + }, + "@leave": { + "type": "String", + "placeholders": {} + }, + "@skip": { + "type": "String", + "placeholders": {} + }, + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "@forward": { + "type": "String", + "placeholders": {} + }, + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "@status": { + "type": "String", + "placeholders": {} + }, + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "@you": { + "type": "String", + "placeholders": {} + }, + "@search": { + "type": "String", + "placeholders": {} + }, + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "@logout": { + "type": "String", + "placeholders": {} + }, + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@groups": { + "type": "String", + "placeholders": {} + }, + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@messages": { + "type": "String", + "placeholders": {} + }, + "@login": { + "type": "String", + "placeholders": {} + }, + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "@settings": { + "type": "String", + "placeholders": {} + }, + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "@security": { + "type": "String", + "placeholders": {} + }, + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "@reject": { + "type": "String", + "placeholders": {} + }, + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "@devices": { + "type": "String", + "placeholders": {} + }, + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@share": { + "type": "String", + "placeholders": {} + }, + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "@privacy": { + "type": "String", + "placeholders": {} + }, + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "@pin": { + "type": "String", + "placeholders": {} + }, + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb new file mode 100644 index 0000000000..993733cae4 --- /dev/null +++ b/lib/l10n/intl_zh.arb @@ -0,0 +1,2727 @@ +{ + "@@locale": "zh", + "@@last_modified": "2021-08-14 12:41:09.767805", + "about": "关于", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "接受", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} 接受了邀请", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "账户", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} 激活了端到端加密", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "添加电子邮件", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "管理员", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "别名", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "全部", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} 接听了通话", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "任何人都可以加入", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "应用锁", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "存档", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "允许访客加入吗?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "你确定吗?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "你确定要退出登录吗?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "请输入你的安全存储的密码短语或恢复密钥,以向对方签名。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "是否接受来自 {username} 的验证请求?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "主服务器支持的登录方式:\n{serverVersions}\n但此应用仅支持:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "从聊天中封禁", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "已封禁", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} 封禁了 {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "屏蔽设备", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "已屏蔽", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "取消", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "更改设备名称", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} 更改了聊天头像", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} 更改了聊天权限", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} 将昵称更改为:'{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} 更改了访客访问规则", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} 更改了访客访问规则为:{rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} 更改了历史记录可见性", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} 更改了历史记录可见性为:{rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} 更改了加入的规则", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} 更改了加入的规则为:{joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} 更改了头像", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} 更改了聊天室别名", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} 更改了邀请链接", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "更改密码", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "更改主服务器", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "改变风格", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "更改群组名称", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "更改你的头像", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "加密已被破坏", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "聊天", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "聊天记录备份", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "聊天详情", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "聊天", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "输入一个强密码", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "清除存档", + "close": "关闭", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "在此聊天室封禁指定用户", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_html": "发送 HTML 格式化文本", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "邀请指定用户加入此聊天室", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "加入指定聊天室", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "在此聊天室移除指定用户", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "退出此聊天室", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "介绍自己", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "设置你在此聊天室的头像(通过 mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "设置你在此聊天室的昵称", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "设置指定用户的权限等级(默认:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "发送纯文本", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "将回复作为回应发送", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "发送文本", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "在此聊天室解封指定用户", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "指令无效", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} 不是指令。", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "请比较表情符号", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "请比较以下数字", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "配置聊天", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "联系人已被邀请至群组", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "此内容已被报告至服务器管理员处", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "已复制到剪贴板", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "复制", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "复制到剪贴板", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "不能解密消息: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} 名参与者", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "创建", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} 创建了聊天", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "目前活跃", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "深色", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "这将停用你的用户账户。这不能被撤销!你确定吗?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "新用户默认权限级别", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "删除", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "删除账户", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "删除消息", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "设备", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "私聊", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "昵称已更改", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "下载文件", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "编辑", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "编辑被屏蔽的服务器", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "编辑昵称", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "编辑聊天室别名", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "编辑聊天室头像", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "表情已存在!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "无效的表情快捷码!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "表情设置", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "表情快捷码", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "空聊天", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "在全局启用表情包", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "启用加密", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "你之后将无法停用加密,确定吗?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "已加密", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "加密", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "加密未启用", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} 结束了通话", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "输入一个电子邮件地址", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "字体大小", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "转发", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "自加入起", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "自邀请起", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "群组", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "群组是公开的", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "群组", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "名称为 {displayname} 的群组", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "访客禁止加入", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "访客可以加入", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} 撤回了对 {targetName} 的邀请", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "帮助", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "隐藏未知的事件", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "忽略", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "已忽略的用户", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "我已经点击了链接", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "不正确的密码短语或恢复密钥", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "邀请联系人", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "邀请联系人到 {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "已邀请", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} 邀请了 {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "仅被邀请用户", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} 邀请你使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开邀请链接:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "正在输入…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} 加入了聊天", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "加入聊天室", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} 踢出了 {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} 踢出并封禁了 {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "从聊天室踢出", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "上次活跃: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "离开", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "离开了聊天", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "浅色", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "加载 {count} 个更多的参与者", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "加载中…请等待。", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "加载更多…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "登录", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "登录 {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "退出登录", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "提及", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "消息", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "协管员", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "静音聊天", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "新的聊天", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 FluffyChat 新消息", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "新的验证请求!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "下一步", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "否", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "无法连接服务器", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "未找到表情。😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "你只能在聊天室不可被公众访问时才能启用加密。", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "看起来你手机上没有 Firebase Cloud Messaging。如果仍希望接收 FluffyChat 的推送通知,推荐安装 ntfy。借助 ntfy 或另一个 Unified Push 程序,你可以以一种数据安全的方式接收推送通知。你可以从 PlayStore 或 F-Droid 商店下载 ntfy。", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "你尚未添加恢复密码的方法。", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "没有权限", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "未找到聊天室…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "通知", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} 人正在输入…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "确认", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "在线密钥备份已启用", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "哎呀!十分不幸,配置推送通知时发生了错误。", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "哎呀,出了点差错…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "打开应用以查看消息", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "打开相机", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "或", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "参与者", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "密码短语或恢复密钥", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "密码", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "忘记密码", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "密码已被更改", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "密码恢复", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "置顶", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "请选择一个密码", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "请点击电子邮件中的链接,然后继续。", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "请输入你的密码", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "请输入你的 PIN", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "请输入你的用户名", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "请按照网站上的提示,点击下一步。", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "隐私", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "公开聊天室", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "原因", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} 删除了一个事件", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "删除消息", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "拒绝", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} 拒绝了邀请", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "移除", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "移除所有其它设备", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "从聊天中解封", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "移除你的头像", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "更新聊天室至新版本", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "回复", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "举报信息", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "聊天室已升级", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "聊天室版本", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "保存文件", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "搜索", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "安全", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "发送", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "发送一条消息", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "以文本发送", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "发送音频", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "发送文件", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "发送图像", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "发送消息", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "发送视频", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁{username} 发送了文件", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤{username} 发送了音频", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} 发送了图片", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} 发送了贴纸", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} 发送了视频", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} 发送了通话信息", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "设为主要别名", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setStatus": "设置状态", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "设置", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "分享", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} 分享了位置", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "跳过", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "源代码", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} 开始了通话", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "状态", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "你今天怎么样?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "提交", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "同步中…请等待。", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "系统", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "它们不匹配", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "它们匹配", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "请求过多。请稍后再试!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "尝试重新发送", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} 解封了 {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "解除屏蔽设备", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "未知设备", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "未知加密算法", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "未知事件 '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "取消静音聊天", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "取消置顶", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} 和其他 {count} 人正在输入…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} 和 {username2} 正在输入…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} 正在输入…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} 离开了聊天", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} 发送了一个 {type} 事件", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "已验证", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "开始验证", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "你已成功验证!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "验证其它账户", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "视频通话", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "聊天记录的可见性", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "对所有参与者可见", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "对所有人可见", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "语音消息", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "等待对方接受请求…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "等待对方接受 emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "等待对方接受数字…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "警告!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "我们向你发送了一封电子邮件", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "谁可以执行哪些操作", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "谁可以加入此群组", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "你举报的理由是什么?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "通过这些地址,你可以恢复密码。", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "写一条消息…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "是", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "你", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "你已不再参与此聊天", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "你已被此聊天封禁", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "你的公钥", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "添加到空间", + "obtainingLocation": "获取位置中…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} 不是一个 Matrix 服务器,试试 {server2}?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "locationPermissionDeniedNotice": "位置权限被拒绝。请授予此权限以分享你的位置.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "位置服务已禁用。请启用此服务以分享你的位置.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "取得地址错误: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "createNewSpace": "创建新空间", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "无法打开 URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "autoplayImages": "自动播放动态贴纸和表情", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "spaceName": "空间名称", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "空间是公开的", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "分享位置", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "在地图中打开", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "按 Enter 键发送", + "scanQrCode": "扫描二维码", + "oneClientLoggedOut": "你的一个客户端已登出", + "removeFromBundle": "从此集合中移除", + "unverified": "未经验证", + "repeatPassword": "重复输入密码", + "addAccount": "添加账户", + "editBundlesForAccount": "编辑此账户的集合", + "addToBundle": "添加到集合", + "bundleName": "集合名称", + "link": "链接", + "sender": "发送者", + "openGallery": "打开图库", + "messageInfo": "消息信息", + "time": "时间", + "removeFromSpace": "从此空间中移除", + "commandHint_discardsession": "丢弃会话", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "创建私聊\n使用 --no-encryption 选项来禁用加密", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_clearcache": "清除缓存", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "创建空的群聊\n使用 --no-encryption 选项来禁用加密", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "markAsRead": "标为已读", + "reportUser": "举报用户", + "reactedWith": "{sender} 回应了 {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "你确定要永久性取消置顶此事件吗?", + "pinMessage": "置顶到聊天室", + "emojis": "表情符号", + "unsupportedAndroidVersionLong": "这个功能需要较新版本的 Android 系统。请检查更新或 Lineage OS 支持。", + "unsupportedAndroidVersion": "不受支持的 Android 版本", + "voiceCall": "语音通话", + "placeCall": "发起通话", + "videoCallsBetaWarning": "请注意,视频通话目前处于测试阶段。它们可能不能像预期的那样工作,或者在所有平台上都不能工作。", + "experimentalVideoCalls": "实验性的视频通话", + "youRejectedTheInvitation": "你拒绝了邀请", + "youJoinedTheChat": "你加入了聊天", + "youBannedUser": "你封禁了 {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 你受到了 {user} 的邀请", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 你邀请了 {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 你踢出了 {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "你解除了对 {user} 的封禁", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youAcceptedTheInvitation": "👍 你接受了邀请", + "youHaveWithdrawnTheInvitationFor": "你撤回了对 {user} 的邀请", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 你踢出并封禁了 {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "存储在 Apple KeyChain 中", + "storeInAndroidKeystore": "存储在 Android KeyStore 中", + "storeSecurlyOnThisDevice": "安全地存储在此设备上", + "users": "用户", + "countFiles": "{count} 个文件", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "hydrate": "从备份文件恢复", + "dehydrate": "导出会话并擦除设备", + "dehydrateWarning": "此操作无法撤消。 确保你安全地存储备份文件。", + "user": "用户", + "custom": "自定义", + "confirmMatrixId": "请确认你的 Matrix ID 以删除账户。", + "supposedMxid": "应为 {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "标记为群组", + "commandHint_markasdm": "将给定的 Matrix ID 标为私信聊天室", + "whyIsThisMessageEncrypted": "为什么此消息不可读?", + "noKeyForThisMessage": "如果消息是在你在此设备上登录账户前发送的,就可能发生这种情况。\n\n也有可能是发送者屏蔽了你的设备或网络连接出了问题。\n\n你能在另一个会话中读取消息吗?如果是的话,你可以从它那里传递信息!点击设置 > 设备,并确保你的设备已经相互验证。当你下次打开聊天室,且两个会话都在前台,密钥就会自动传输。\n\n你不想在退出登录或切换设备时丢失密钥?请确保在设置中启用了聊天备份。", + "newSpace": "新的空间", + "foregroundServiceRunning": "此通知在前台服务运行时出现。", + "screenSharingTitle": "屏幕共享", + "screenSharingDetail": "你正在 FluffyChat 中共享屏幕", + "doNotShowAgain": "不再显示", + "googlyEyesContent": "{senderName} 向你发送了“大眼”表情", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_googly": "发送“大眼”表情", + "commandHint_cuddle": "发送“搂抱”", + "commandHint_hug": "发送“拥抱”", + "cuddleContent": "{senderName} 搂抱了你", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} 拥抱了你", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "wasDirectChatDisplayName": "空聊天(曾是 {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "空间让你可以整合聊天并建立私人或公共社区。", + "encryptThisChat": "加密此聊天", + "disableEncryptionWarning": "出于安全考虑 ,你不能在之前已启用加密的聊天中禁用加密。", + "sorryThatsNotPossible": "非常抱歉……这是做不到的", + "report": "报错", + "fileIsTooBigForServer": "无法发送!服务器只支持最大 {max} 的文件。", + "noOtherDevicesFound": "未找到其它设备", + "jumpToLastReadMessage": "跳转到上次已读的消息", + "readUpToHere": "读到此处", + "jump": "跳转", + "openLinkInBrowser": "在浏览器中打开链接", + "fileHasBeenSavedAt": "文件已保存在 {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "reportErrorDescription": "😭 哦不。出了点差错。如果你愿意,可以向开发人员报告此错误。", + "noBackupWarning": "警告!如果不启用聊天备份,你将无法访问加密消息。强烈建议在退出登录前先启用聊天备份。", + "reopenChat": "重新打开聊天", + "importEmojis": "导入表情包", + "notAnImage": "不是图像文件。", + "importNow": "立即导入", + "importFromZipFile": "从 .zip 文件导入", + "replace": "替换", + "exportEmotePack": "以 .zip 格式导出表情包", + "sendTypingNotifications": "发送正在输入通知", + "createGroup": "创建群组", + "shareInviteLink": "分享邀请链接", + "tryAgain": "重试", + "chatPermissions": "聊天权限", + "chatDescription": "聊天描述", + "chatDescriptionHasBeenChanged": "聊天描述已被更改", + "noChatDescriptionYet": "尚未创建聊天描述。", + "invalidServerName": "服务器名称无效", + "redactMessageDescription": "消息将为此对话中所有参与者删除。此操作无法撤销。", + "optionalRedactReason": "(可选)删除此消息的原因...", + "setChatDescription": "设置聊天描述", + "setColorTheme": "设置主题颜色:", + "invite": "邀请", + "messagesStyle": "消息:", + "redactedBy": "已被 {username} 删除", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "私聊", + "redactedByBecause": "已被 {username} 删除,原因:\"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 群聊邀请", + "emoteKeyboardNoRecents": "最近使用过的表情会出现在这里...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "invalidInput": "无效的输入!", + "wrongPinEntered": "输入的 PIN 码不正确!请 {seconds} 秒后重试…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "hasKnocked": "{user} 请求了加入聊天室的邀请", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pleaseEnterANumber": "请输入大于 0 的数", + "banUserDescription": "该用户将被禁止进入聊天室,在解除封禁之前将不能再进入聊天室。", + "removeDevicesDescription": "你将从此设备登出,无法再接收消息。", + "unbanUserDescription": "如果用户尝试加入则可以再次进入聊天。", + "pushNotificationsNotAvailable": "通知推送不可用", + "makeAdminDescription": "一旦你将该用户设为管理员,你可能无法撤销,因为他们将拥有与你相同的权限。", + "archiveRoomDescription": "聊天将被移至存档。其他用户将能看到你已离开聊天。", + "learnMore": "了解更多", + "roomUpgradeDescription": "将使用新版聊天室来重新创建当前聊天室。所有参与者都会收到通知以切换到新的聊天室。有关聊天室版本的更多信息,请访问 https://spec.matrix.org/latest/rooms/", + "kickUserDescription": "该用户会被踢出聊天但没被封禁。在公开聊天中,该用户可以随时重新加入。", + "blockListDescription": "你可以屏蔽打扰你的用户。你将不会收到来自屏蔽列表中用户的任何消息或聊天室邀请。", + "createGroupAndInviteUsers": "创建群组并邀请用户", + "blockedUsers": "已屏蔽的用户", + "groupCanBeFoundViaSearch": "可通过搜索找到该群组", + "noUsersFoundWithQuery": "很遗憾,没有找到有关\"{query}\"的用户。请检查是否输入错误。", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "屏蔽", + "yourGlobalUserIdIs": "你的全局用户 ID 是: ", + "commandHint_sendraw": "发送原始 json", + "wrongRecoveryKey": "抱歉…这似乎不是正确的恢复密钥。", + "blockUsername": "忽略用户名", + "groupName": "群组名称", + "databaseMigrationTitle": "数据库已优化", + "searchChatsRooms": "搜索 #聊天,@用户…", + "databaseMigrationBody": "请稍候。可能需要稍等片刻。", + "thisDevice": "此设备:", + "publicSpaces": "公开空间", + "passwordIsWrong": "你输入的密码有误", + "pleaseEnterYourCurrentPassword": "请输入你当前的密码", + "nothingFound": "未找到任何内容…", + "newPassword": "新的密码", + "passwordsDoNotMatch": "密码不匹配", + "select": "选择", + "pleaseChooseAStrongPassword": "请选择一个强密码", + "addChatOrSubSpace": "添加聊天或子空间", + "leaveEmptyToClearStatus": "留空以清除你的状态。", + "joinSpace": "加入空间", + "searchForUsers": "搜索 @用户…", + "initAppError": "在初始化应用时发生错误", + "sessionLostBody": "你的会话已丢失。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "应用现在尝试从备份中恢复你的会话。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "聊天中的其他参与者可以看到你正在输入新消息。", + "formattedMessagesDescription": "使用 Markdown 显示富文本内容,例如加粗文本。", + "verifyOtherUserDescription": "如果你验证了其他用户,就可以确保你清楚自己正在与谁进行通信。💪\n\n当你开始验证时,你和其他用户将在应用中看到一个弹出窗口。然后你会看到一系列表情符号或数字,你和其他用户需要比较它们是否一致。\n\n最好的方式是线下会面或开始视频通话。👭", + "verifyOtherDeviceDescription": "当你验证另一个设备时,这些设备可以交换密钥,从而提高整体安全性。 💪 当你开始验证时,两个设备上的应用都将显示一个弹出窗口。然后你会看到一系列表情符号或数字,你需要比较两个设备上显示的内容。在开始验证之前,最好将两个设备都放在手边。🤳", + "canceledKeyVerification": "{sender} 取消了密钥验证", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceipts": "发送已读回执", + "formattedMessages": "格式化的消息", + "verifyOtherDevice": "🔐 验证其它设备", + "verifyOtherUser": "🔐 验证其他用户", + "sendReadReceiptsDescription": "聊天中的其他参与者可以看到你是否读过消息。", + "acceptedKeyVerification": "{sender} 接受了密钥验证", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} 已准备好进行密钥验证", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} 完成了密钥验证", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} 请求了密钥验证", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} 开始了密钥验证", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "传入消息", + "stickers": "贴纸", + "discover": "发现", + "commandHint_ignore": "忽略给定的 matrix ID", + "commandHint_unignore": "取消忽略给定的 matrix ID", + "unreadChatsInApp": "{appname}: {unread} 未读聊天", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "appLockDescription": "用 pin 码在不用 FluffyChat 时锁定它", + "globalChatId": "全局聊天 ID", + "accessAndVisibility": "访问和可见性", + "accessAndVisibilityDescription": "谁可以加入此聊天以及怎样发现该聊天。", + "calls": "通话", + "customEmojisAndStickers": "自定义表情符号和贴纸", + "hideRedactedMessages": "隐藏被涂黑的消息", + "passwordRecoverySettings": "密码发现设置", + "knock": "请求", + "noOneCanJoin": "无人可以加入", + "knocking": "正在请求", + "chatCanBeDiscoveredViaSearchOnServer": "可通过搜索 {server} 发现聊天", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "目前有 {count} 名用户被封禁。", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "hideRedactedMessagesBody": "如果某人涂黑了一条消息,那么在聊天中再也看不到这条消息。", + "hideInvalidOrUnknownMessageFormats": "隐藏无效或未知的消息格式", + "customEmojisAndStickersBody": "添加或分享可用于任何聊天的表情符号或贴纸。", + "usersMustKnock": "用户必须请求加入", + "noDatabaseEncryption": "数据库加密在此平台上不受支持", + "publicChatAddresses": "公开聊天的地址", + "createNewAddress": "新建地址", + "searchMore": "搜索更多…", + "gallery": "图库", + "files": "文件", + "searchIn": "在 “{chat}” 聊天中搜索…", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "从右向左滑动进行回复", + "noMoreChatsFound": "找不到更多聊天…", + "space": "空间", + "goToSpace": "转到空间:{space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "标为未读", + "unread": "未读", + "userLevel": "{level} - 用户", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - 主持人", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - 管理员", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "邀请其他用户到这个聊天", + "changeTheChatPermissions": "更改聊天权限", + "changeTheVisibilityOfChatHistory": "更改聊天历史的可见性", + "changeTheCanonicalRoomAlias": "更改主公共聊天地址", + "sendRoomNotifications": "发送通知聊天室所有人的通知", + "changeTheDescriptionOfTheGroup": "更改聊天描述", + "changeGeneralChatSettings": "更改常规聊天设置", + "chatPermissionsDescription": "定义此聊天中哪个权限等级对特定操作是必需的。权限等级 0、50 和 100 通常代表用户、主持人和管理员,但你可以自定义任何等级。", + "changelog": "更新记录", + "updateInstalled": "🎉 已安装更新 {version} !", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "sendCanceled": "发送被取消", + "noChatsFoundHere": "此处尚未找到聊天。使用下方按钮 ⤵️ 开始和某人的新聊天", + "loginWithMatrixId": "使用 Matrix-ID 登录", + "doesNotSeemToBeAValidHomeserver": "似乎不是兼容的主服务器。URL 不正确?", + "sendingAttachment": "发送附件中…", + "calculatingFileSize": "计算文件尺寸中…", + "oneOfYourDevicesIsNotVerified": "您设备中的一台未验证", + "noticeChatBackupDeviceVerification": "注意:当你连接所有设备到聊天备份时,这些设备将被自动验证。", + "continueText": "继续", + "blur": "模糊:", + "opacity": "不透明:", + "setWallpaper": "设置壁纸", + "manageAccount": "管理账户", + "aboutHomeserver": "关于 {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "version": "版本", + "noContactInformationProvided": "服务器未提供任何有效的联系信息", + "contactServerAdmin": "联系服务器管理员", + "name": "名称", + "contactServerSecurity": "联系服务器安全管理", + "supportPage": "支持页面", + "serverInformation": "服务器信息:", + "website": "网站", + "italicText": "文本倾斜", + "strikeThrough": "删除线", + "pleaseFillOut": "请填写", + "addLink": "添加链接", + "boldText": "文本加粗", + "invalidUrl": "无效 url", + "unableToJoinChat": "无法加入聊天。可能其他方面已经关闭了对话。", + "sendImages": "发送 {count} 张图片", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "compress": "压缩", + "previous": "前一个", + "otherPartyNotLoggedIn": "另一方当前未登录,因而无法接收消息!", + "appWantsToUseForLoginDescription": "您特此允许本应用和网站分享关于您的信息。", + "open": "打开", + "appWantsToUseForLogin": "使用 '{server}'服务器登录", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "waitingForServer": "正在等待服务器…", + "synchronizingPleaseWaitCounter": " 同步中… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "newChatRequest": "📩 新的聊天请求", + "generalNotificationSettings": "常规通知设置", + "userSpecificNotificationSettings": "使用特定通知设置", + "notificationRuleMaster": "静音所有通知", + "notificationRuleSuppressNotices": "隐藏自动消息", + "notificationRuleInviteForMe": "给我的邀请", + "notificationRuleInviteForMeDescription": "当用户被邀请加入聊天室时提醒用户。", + "notificationRuleMemberEvent": "成员事件", + "notificationRuleMemberEventDescription": "隐藏成员身份事件通知。", + "notificationRuleIsUserMention": "用户提及", + "notificationRuleIsUserMentionDescription": "当消息中直接提到用户名时通知使用该用户名的用户。", + "notificationRuleContainsDisplayName": "包含展示名称", + "notificationRuleIsRoomMention": "聊天室提及", + "notificationRuleRoomnotifDescription": "消息包含 「@room」 时提醒用户。", + "notificationRuleTombstone": "墓碑", + "notificationRuleRoomServerAcl": "聊天室服务器 ACL", + "notificationRuleSuppressEdits": "隐藏编辑", + "notificationRuleCall": "通话", + "notificationRuleRoomOneToOne": "一对一聊天室", + "notificationRuleRoomOneToOneDescription": "在一对一聊天室中提醒用户消息。", + "notificationRuleEncrypted": "已加密", + "notificationRuleEncryptedDescription": "在已加密聊天室中提醒用户消息。", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "提醒用户 Jitsi 小部件的事件。", + "notificationRuleServerAcl": "隐藏服务器 ACL 事件", + "notificationRuleServerAclDescription": "隐藏服务器 ACL 事件的通知。", + "deletePushRuleCanNotBeUndone": "删除这个通知设置的操作无法撤销。", + "more": "更多", + "notificationRuleReactionDescription": "隐藏回应通知。", + "notificationRuleMessageDescription": "提醒用户常规消息。", + "notificationRuleContainsUserName": "包含用户名", + "otherNotificationSettings": "其他通知设置", + "notificationRuleContainsUserNameDescription": "当消息包含用户名时通知使用该用户名的用户。", + "notificationRuleIsRoomMentionDescription": "有聊天室提及时通知用户。", + "contentNotificationSettings": "内容通知设置", + "notificationRuleMasterDescription": "覆盖所有其他规则并禁用所有通知。", + "notificationRuleSuppressNoticesDescription": "隐藏来自 bot 等自动客户端的通知。", + "roomNotificationSettings": "聊天室通知设置", + "notificationRuleRoomServerAclDescription": "隐藏聊天室服务器访问控制列表(ACL)通知。", + "notificationRuleContainsDisplayNameDescription": "当消息包含用户的展示名时提醒使用该展示名的用户。", + "notificationRuleRoomnotif": "聊天室通知", + "notificationRuleTombstoneDescription": "提醒用户聊天室解散的消息。", + "notificationRuleReaction": "回应", + "notificationRuleSuppressEditsDescription": "隐藏消息编辑通知。", + "notificationRuleCallDescription": "提醒用户通话的消息。", + "notificationRuleEncryptedRoomOneToOne": "已加密一对一聊天室", + "notificationRuleEncryptedRoomOneToOneDescription": "在已加密一对一聊天室中提醒用户消息。", + "notificationRuleMessage": "消息", + "unknownPushRule": "未知推送规则 '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "crossVerifiedDevices": "交叉验证设备", + "shareKeysWithDescription": "选择应当信任哪些设备允许它们读取你在加密聊天中的消息?", + "shareKeysWith": "与哪些设备分享密钥…", + "allDevices": "所有设备", + "crossVerifiedDevicesIfEnabled": "交叉验证设备(如启用)", + "verifiedDevicesOnly": "仅已验证设备", + "optionalMessage": "(可选)消息…", + "takeAPhoto": "拍照", + "recordAVideo": "录像", + "notSupportedOnThisDevice": "此设备上不受支持", + "enterNewChat": "进入新聊天", + "commandHint_roomupgrade": "将此聊天室升级到给定的聊天室版本", + "approve": "批准", + "youHaveKnocked": "你已请求加入", + "pleaseWaitUntilInvited": "在来自该聊天室的某人邀请你之前请等待。", + "countInvited": "邀请了 {count}", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "checkList": "清单", + "sentVoiceMessage": "🎙️ {duration} - 来自 {sender} 的语音消息", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "commandHint_logout": "注销当前设备", + "commandHint_logoutall": "注销所有活动设备", + "displayNavigationRail": "在移动设备上显示导航栏", + "customReaction": "自定义回应", + "moreEvents": "更多事件", + "declineInvitation": "拒绝邀请", + "noMessagesYet": "尚无消息", + "longPressToRecordVoiceMessage": "长按录制语音消息。", + "pause": "暂停", + "resume": "继续", + "removeFromSpaceDescription": "将从空间移除该聊天,但仍出现在聊天列表中。", + "countChats": "{chats} 个聊天", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces} 的空间成员", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} 的空间成员可以敲门", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startPoll": "启动投票", + "endPoll": "结束投票", + "answersVisible": "投票结果可见", + "pollQuestion": "投票主题", + "answerOption": "选项", + "addAnswerOption": "添加选项", + "allowMultipleAnswers": "允许多选投票选项", + "pollHasBeenEnded": "投票已结束", + "countVotes": "{count, plural, =1{票} other{{count} 票}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "投票结束后将显示结果", + "thread": "嘟文串", + "replyInThread": "在嘟文串中回复", + "countReplies": "{count, plural, =1{则回复} other{{count} 则回复}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backToMainChat": "返回主聊天", + "saveChanges": "保存更改", + "createSticker": "创建贴纸或表情图片", + "useAsSticker": "用作贴纸", + "useAsEmoji": "用作表情图片", + "stickerPackNameAlreadyExists": "贴纸包名已存在", + "newStickerPack": "新建贴纸包", + "stickerPackName": "贴纸包名", + "attribution": "作者", + "skipChatBackup": "跳过聊天备份", + "skipChatBackupWarning": "确定吗?不开启聊天备份,如果切换设备可能无法访问消息。", + "changedTheChatDescription": "{username} 更改了聊天描述", + "changedTheChatName": "{username} 更改了聊天名", + "noMoreResultsFound": "未找到更多结果", + "chatSearchedUntil": "搜索了截至 {time} 的聊天记录", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "联邦基础 URL", + "clientWellKnownInformation": "Client-Well-Known 信息:", + "baseUrl": "基础 URL", + "identityServer": "身份服务器:", + "versionWithNumber": "版本:{version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "日志", + "advancedConfigs": "高级配置", + "advancedConfigurations": "高级配置", + "signIn": "登录", + "createNewAccount": "创建新账户", + "signUpGreeting": "FluffyChat 是去中心化的!选择您希望创建账户的服务器!", + "signInGreeting": "已经有 Matrix 账户了?欢迎回来!选择 homeserver 登录。", + "theProcessWasCanceled": "过程被取消。", + "join": "加入", + "searchOrEnterHomeserverAddress": "搜索或输入 homeserver 地址", + "matrixId": "Matrix ID", + "setPowerLevel": "设置权限级别", + "makeModerator": "协管员", + "makeAdmin": "管理员", + "removeModeratorRights": "删除协管员权限", + "removeAdminRights": "删除管理员权限", + "powerLevel": "权限级别", + "setPowerLevelDescription": "权限级别定义群成员在这个聊天室中可以做什么,取值范围 0 到 100。", + "owner": "所有者", + "mute": "静音", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "新建聊天", + "reset": "重置", + "supportFluffyChat": "支持 FluffyChat", + "support": "支持", + "setLowPriority": "设置低优先级", + "unsetLowPriority": "取消设置低优先级", + "playSoundOnNotification": "播放通知声音", + "addTag": "添加标签", + "removeTag": "删除标签", + "tagName": "标签名", + "createNewTag": "创建新标签", + "discardEdits": "有未保存的更改。放弃编辑吗?", + "@discardEdits": { + "type": "String", + "placeholders": {} + }, + "hideRoomsInSpaces": "隐藏位于空间中的聊天室", + "possibleByYou": "没有您的支持不会有这个版本。FluffyChat 依旧免费、开源、完全由社区驱动。", + "showThumbnailsInTimeline": "显示图片和视频的缩略图", + "appSubtitle": "安全的 [matrix] 通信", + "appDescription": "以对所有人简单易得的方式通过去中心化 [matrix] 网络加密通信。", + "interactiveVerification": "互动式验证", + "interactiveVerificationDescription": "如果你和联系人就在一起或通过安全渠道通信,你们可以通过比较安全号码或绘文字同时验证所有设备。", + "countUnverifiedDevices": "该聊天中有 {count} 台未验证设备。", + "@countUnverifiedDevices": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "encryptedMessage": "加密的消息", + "unencryptedMessage": "未加密的消息", + "publicKey": "公钥:{key}", + "@publicKey": { + "type": "String", + "placeholders": { + "key": { + "type": "String" + } + } + }, + "deviceIdentityKey": "设备身份密钥", + "showMore": "显示更多", + "showLess": "显示较少", + "restoreBootstrapEmptyDevicesDescription": "请输入密码短语或恢复密钥来验证此设备并获得访问加密消息备份的权限。", + "@restoreBootstrapEmptyDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "restoreBootstrapDevicesDescription": "请选择其他设备中的一台来验证此会话:", + "@restoreBootstrapDevicesDescription": { + "type": "String", + "placeholders": {} + }, + "resetAccount": "重置账户", + "@resetAccount": { + "type": "String", + "placeholders": {} + }, + "restoreCryptoIdentity": "恢复加密身份", + "@restoreCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "resetCryptoIdentity": "重置加密身份", + "@resetCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "setUpCryptoIdentity": "设置加密身份", + "@setUpCryptoIdentity": { + "type": "String", + "placeholders": {} + }, + "waitingForKeys": "正在等待密钥… 请保持另一台设备活跃。", + "@waitingForKeys": { + "type": "String", + "placeholders": {} + }, + "noKeysTransmitted": "未传输密钥。请重试。", + "@noKeysTransmitted": { + "type": "String", + "placeholders": {} + }, + "unlock": "解锁", + "@unlock": { + "type": "String", + "placeholders": {} + }, + "openFile": "打开文件", + "@openFile": { + "type": "String", + "placeholders": {} + }, + "resetAccountWarning": "重置账户会造成永远无法访问旧消息。需要再次验证所有当前设备。请在没有其他设备来验证会话且丢失恢复密钥和密码短语时才执行此操作!", + "@resetAccountWarning": { + "type": "String", + "placeholders": {} + }, + "newPassphraseDescription": "FluffyChat 使用端到端加密。为了不丢失消息,请选择强密码短语来保护加密身份和加密的消息备份。", + "@newPassphraseDescription": { + "type": "String", + "placeholders": {} + }, + "newPassphrase": "新密码短语", + "@newPassphrase": { + "type": "String", + "placeholders": {} + }, + "repeatPassphrase": "重复密码短语", + "@repeatPassphrase": { + "type": "String", + "placeholders": {} + }, + "passphrasesMatch": "密码短语匹配", + "@passphrasesMatch": { + "type": "String", + "placeholders": {} + }, + "passphraseLengthRequirement": "长度至少 12 个字符。", + "@passphraseLengthRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseUpperAndLowerCaseRequirement": "包含大小写字符。", + "@passphraseUpperAndLowerCaseRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseSpecialCharactersRequirement": "包含特殊字符。", + "@passphraseSpecialCharactersRequirement": { + "type": "String", + "placeholders": {} + }, + "passphraseNumberRequirement": "包含一个数字。", + "@passphraseNumberRequirement": { + "type": "String", + "placeholders": {} + }, + "storeRecoveryKeyDescription": "请写下恢复密钥以便恢复加密消息和加密身份。", + "@storeRecoveryKeyDescription": { + "type": "String", + "placeholders": {} + }, + "saveAsFile": "保存为文件", + "@saveAsFile": { + "type": "String", + "placeholders": {} + }, + "youAreReadyToStart": "可以开始了!", + "noUserKeyFound": "未找到用户密钥", + "@noUserKeyFound": { + "type": "String", + "placeholders": {} + }, + "unsignedDevice": "未签名设备", + "@unsignedDevice": { + "type": "String", + "placeholders": {} + }, + "signedDevice": "已签名设备", + "@signedDevice": { + "type": "String", + "placeholders": {} + }, + "noCurve25519KeyFound": "未找到 curve25519 key", + "@noCurve25519KeyFound": { + "type": "String", + "placeholders": {} + }, + "messageNotDecryptable": "消息不可解密", + "knownSince": "初始知晓日期:{date}", + "@knownSince": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + } + } + }, + "messageCanOnlyBeReadByUser": "你的消息是端到端加密的,只能由该用户读取:", + "messageCanOnlyBeReadByUsers": "你的消息是端到端加密的,只能由这些用户读取:", + "today": "今日", + "sending": "发送中", + "generatingThumbnail": "正在生成缩略图", + "encrypting": "加密中", + "uploading": "上传中", + "edited": "(已编辑)", + "couldNotBeSent": "无法发送", + "yesterday": "昨天", + "resetRecoveryKey": "重置恢复密钥", + "pleaseEnter6Digits": "请输入 6 位数字来启用应用锁。", + "disableAppLock": "禁用应用锁", + "disableAppLockAreYouSure": "确定要禁用应用锁吗?", + "enableBiometrics": "启用生物识别身份认证", + "disableBiometrics": "禁用生物识别身份认证", + "biometricsDescription": "借助生物识别身份认证,你可以用脸或指纹解锁应用。该功能是否可用取决于你的设备。", + "useAppLock": "使用应用锁", + "unlockWithBiometrics": "用生物识别身份认证解锁", + "resetPin": "重置 pin 码", + "forwardCountMessages": "转发 {count, plural, =1{条消息} other{{count} 条消息}}?", + "@forwardCountMessages": { + "placeholders": { + "count": { + "type": "int" + } + } + } +} diff --git a/lib/l10n/intl_zh_Hant.arb b/lib/l10n/intl_zh_Hant.arb new file mode 100644 index 0000000000..aa51259e07 --- /dev/null +++ b/lib/l10n/intl_zh_Hant.arb @@ -0,0 +1,2447 @@ +{ + "@@last_modified": "2021-08-14 12:41:09.708353", + "about": "關於", + "@about": { + "type": "String", + "placeholders": {} + }, + "accept": "同意", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} 已接受邀請", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "帳號", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} 已啟用點對點加密", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "新增電子郵件", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "admin": "管理員", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "別稱", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "全部", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "已開始與 {senderName} 通話", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "任何人可以加入", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "密碼鎖定", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "封存", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "是否允許訪客加入", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "您確定嗎?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "您確定要登出嗎?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "請輸入您安全儲存的密碼短語或恢復金鑰,以向對方簽名。", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "是否接受來自 {username} 的驗證申請?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerLoginTypesException": "目前伺服器支援的登入類型:\n{serverVersions}\n但本應用程式僅支援:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "已從聊天室中封鎖", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "已被封鎖", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} 封鎖了 {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "封鎖裝置", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "已封鎖", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "cancel": "取消", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "變更裝置名稱", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} 變更了對話頭貼", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} 變更了對話權限", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} 變更了顯示名稱為:「{displayname}」", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} 變更了訪客訪問規則", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} 變更了訪客訪問規則為:{rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} 變更了歷史記錄觀察狀態", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} 變更了歷史紀錄觀察狀態到:{rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} 變更了加入的規則", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} 變更了加入的規則為:{joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} 變更了頭貼", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} 變更了聊天室名", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} 變更了邀請連結", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "變更密碼", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "變更主機位址", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "變更主題", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "變更了群組名稱", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "加密已被破壞", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "聊天室", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "備份聊天室", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "對話詳細", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "輸入一個較強的密碼", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "關閉", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "請對比這些表情", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "請對比這些數字", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "設定聊天室", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "聯絡人已被邀請至群組", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "此內容已被回報給伺服器管理員們", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "已複製到剪貼簿", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "複製", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "複製到剪貼簿", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "不能解密訊息:{error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} 個參與者", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "建立", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} 建立了聊天室", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "目前活躍", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "夜間模式", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date} , {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "這將停用您的帳號。這個決定是不能挽回的!您確定嗎?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "預設權限等級", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "刪除", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "刪除帳號", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "刪除訊息", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "devices": "裝置", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "直接傳訊", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "顯示名稱已被變更", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "下載文件", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "編輯", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "編輯被封鎖的伺服器", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "編輯顯示名稱", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "編輯聊天室頭貼", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "表情已存在!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "無效的表情快捷鍵!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "表情設定", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "表情快捷鍵", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "空的聊天室", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "在全域啟用表情符號", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "啟用加密", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "您將不能再停用加密,確定嗎?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "已加密的", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "加密", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "加密未啟用", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} 結束了通話", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "輸入一個電子郵件位址", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "fontSize": "字體大小", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "轉發", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "自加入起", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "自邀請起", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "群組", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "群組是公開的", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "群組", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "名稱為 {displayname} 的群組", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "訪客已被禁止", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "訪客可以加入", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} 收回了對 {targetName} 的邀請", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "幫助", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "隱藏未知事件", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "ignore": "無視", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "已無視的使用者", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "我已經點擊了網址", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "錯誤的密碼短語或恢復金鑰", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "邀請聯絡人", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "邀請聯絡人到 {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "已邀請", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} 邀請了 {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "只有被邀請的使用者", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} 邀請您使用 FluffyChat\n1. 安裝 FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "正在輸入...…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} 加入了聊天室", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "加入聊天室", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} 踢了 {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} 踢了 {targetName} 並將其封鎖", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "從聊天室踢出", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "最後活動時間:{localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "離開", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "離開了聊天室", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "日間模式", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "載入 {count} 個更多的參與者", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "載入中...... 請稍候。", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "載入更多...…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "登入", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "登入 {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "登出", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "提及", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "訊息", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "版主", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "將該聊天室靜音", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "新聊天", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 來自 FluffyChat 的新訊息", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "新的驗證請求!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "下一個", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "否", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "無法連接到伺服器", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "表情符號不存在。😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "您只能在這個聊天室不再被允許公開訪問後,才能啟用加密。", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "未能在你的裝置找到 Firebase Cloud Messaging(FCM). 如果想要收到通知消息的推送,我們建議安裝 ntfy。在有 ntfy 或其他 Unified Push 應用,便能在資料安全的情況下收到通知的推送。你可以在 Play store 或 F-Droid 下載並安裝 ntfy。", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "您尚未新增恢復密碼的方法。", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "沒有權限", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "找不到聊天室...…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "通知", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} 個人正在輸入...…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "線上金鑰備份已啟用", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "哎呀!出了一點差錯...…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "打開應用程式以讀取訊息", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "開啟相機", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "參與者", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "密碼短語或恢復金鑰", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "密碼", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "忘記密碼", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "密碼已被變更", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "恢復密碼", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "釘選", + "@pin": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "請選擇一個密碼", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "請點擊電子郵件中的網址,然後繼續。", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "請輸入您的密碼", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "請輸入您的使用者名稱", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "請按照網站上的說明進行操作,然後點擊下一步。", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "隱私", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "公開的聊天室", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "reason": "原因", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} 編輯了一個事件", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "重新編輯訊息", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "拒絕", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} 拒絕了邀請", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "移除", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "移除所有其他裝置", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "解封聊天室", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "用較新的版本取代聊天室", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "回覆", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "檢舉訊息", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "聊天室已更新", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "搜尋", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "安全", + "@security": { + "type": "String", + "placeholders": {} + }, + "send": "傳送", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "傳送訊息", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "傳送音訊", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "傳送文件", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "傳送圖片", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "傳送訊息", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "傳送影片", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "{username} 傳送了一個文件", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤{username} 傳送了一個音訊", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️{username} 傳送了一張圖片", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊{username} 傳送了貼圖", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥{username} 傳送了影片", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} 傳送了通話資訊", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setStatus": "設定狀態", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "設定", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "分享", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} 分享了位置", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "跳過", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "原始碼", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} 開始了通話", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "狀態", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "今天過得如何?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "送出", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "自動", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "它們不相符", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "它們相符", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "太多請求了。請稍候再試!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "再次嘗試傳送", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} 解除封鎖了 {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "解除鎖定裝置", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "未知裝置", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "未知的加密演算法", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "未知事件「{type}」", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "取消靜音聊天室", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "取消釘選", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndOthersAreTyping": "{username} 和其他 {count} 個人正在輸入...…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} 和 {username2} 正在輸入...…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} 正在輸入...…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "{username} 離開了聊天室", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} 傳送了一個 {type} 事件", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "已驗證", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "開始驗證", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "您成功驗證了!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "正在驗證其他帳號", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "視訊通話", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "聊天室記錄的可見性", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "對所有參與者可見", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "對所有人可見", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "語音訊息", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "正在等待夥伴接受請求...…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "正在等待夥伴接受表情符號...…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "正在等待夥伴接受數字...…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "警告!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "我們向您傳送了一封電子郵件", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "誰可以執行這個動作", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "誰可以加入這個群組", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "您檢舉的原因是什麼?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "有了這些位址,您就可以恢復密碼。", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "輸入訊息...…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "是", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "您", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "您不再參與這個聊天室了", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "您已經被這個聊天室封鎖", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "您的公鑰", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "chats": "聊天室", + "@chats": { + "type": "String", + "placeholders": {} + }, + "commandHint_ban": "在此聊天室封鎖該使用者", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "清除快取", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "建立一個空的群聊\n使用 --no-encryption 選項來停用加密", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "丟棄工作階段", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "啟動一對一聊天室\n使用 --no-encryption 選項來停用加密", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_invite": "邀請該使用者加入此聊天室", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "加入此聊天室", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "將這個使用者移出此聊天室", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "退出此聊天室", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomnick": "設定您的聊天室暱稱", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "editRoomAliases": "編輯聊天室名", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "聊天室的版本", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "加入空間", + "cantOpenUri": "無法打開 URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "再次輸入密碼", + "commandHint_myroomavatar": "設定您的聊天室頭貼(通過 mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_unban": "在此聊天室解除封鎖該使用者", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "autoplayImages": "自動播放動態貼圖和表情", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "按 Enter 鍵傳送", + "changeYourAvatar": "更改您的大頭貼", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "清除存檔", + "hugContent": "{senderName} 擁抱您", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "傳送一個摟抱表情", + "supposedMxid": "此處應爲 {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "invalidServerName": "伺服器名稱錯誤", + "importFromZipFile": "從 .zip 檔案匯入", + "exportEmotePack": "將表情包匯出成 .zip 檔案", + "commandInvalid": "命令無效", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} 不是正確的命令。", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "googlyEyesContent": "{senderName} 向您傳送了瞪眼表情", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendTypingNotifications": "傳送「輸入中」通知", + "importEmojis": "匯入表情包", + "confirmMatrixId": "如需刪除你的帳戶,請確認你的 Matrix ID。", + "notAnImage": "不是圖片檔案。", + "cuddleContent": "{senderName} 摟抱您", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_hug": "傳送一個擁抱表情", + "replace": "取代", + "commandHint_googly": "傳送一些瞪眼表情", + "importNow": "立即匯入", + "blockListDescription": "你可以封鎖打擾你的使用者。你不會再收到任何從已封鎖使用者發來的訊息或聊天室邀請。", + "blockedUsers": "已封鎖的使用者", + "block": "封鎖", + "discover": "發現", + "sender": "傳送者", + "voiceCall": "語音通話", + "blockUsername": "無視使用者名稱", + "noBackupWarning": "警告!如果不啟用聊天室備份,您將失去對加密訊息的訪問。強烈建議在登出前先啟用聊天室備份。", + "addChatOrSubSpace": "新增聊天室或子空間", + "thisDevice": "這個裝置:", + "commandHint_markasdm": "將給定的 Matrix ID 標示為直接訊息房間", + "commandHint_html": "傳送 HTML 格式的文字", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_send": "傳送文字", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "emoteKeyboardNoRecents": "最近使用的表情將顯示在這裡...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "noChatDescriptionYet": "尚未建立聊天室描述。", + "optionalRedactReason": "(非必填)收回此訊息的原因...", + "dehydrateWarning": "此操作不能反悔。請確保安全地存儲備份文件。", + "hydrate": "從備份文件恢復", + "locationDisabledNotice": "位置服務被停用。請啟用它們以能夠分享您的位置。", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} 不是 Matrix 服務器,改用 {server2} 嗎?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "addToBundle": "新增到套組", + "bundleName": "套組名稱", + "pleaseEnterYourPin": "請輸入您的密碼", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "由 {username} 編輯,原因:「{reason}」", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "saveFile": "儲存檔案", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} 敲門了", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noOtherDevicesFound": "未找到其他裝置", + "noUsersFoundWithQuery": "很遺憾,找不到與「{query}」相符的使用者。請檢查是否有打錯字。", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "dehydrate": "匯出會話並清除裝置", + "reopenChat": "重新開啟聊天室", + "yourGlobalUserIdIs": "您的全域使用者ID是: ", + "experimentalVideoCalls": "實驗性視訊通話", + "youAcceptedTheInvitation": "👍 您接受了邀請", + "storeSecurlyOnThisDevice": "在此裝置上安全存儲", + "countFiles": "{count} 個文件", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "screenSharingDetail": "您正在 FuffyChat 中分享您的螢幕", + "wrongPinEntered": "輸入的密碼錯誤! {seconds} 秒後再試一次......", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "archiveRoomDescription": "聊天室將被移動到存檔中。其他使用者將能看到您已離開聊天室。", + "banUserDescription": "該使用者將被禁止進入聊天室,直到他們被解封之前都無法再次進入聊天室。", + "searchChatsRooms": "搜尋 #chats, @users...", + "sendReadReceipts": "傳送已讀回條", + "formattedMessagesDescription": "使用 markdown 顯示豐富的訊息內容,如粗體文字。", + "verifyOtherDevice": "🔐 驗證其他裝置", + "youInvitedUser": "📩 您邀請了 {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "pinMessage": "釘選到房間", + "youKicked": "👞 您踢出了 {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "使用者", + "youRejectedTheInvitation": "您拒絕了邀請", + "youKickedAndBanned": "🙅 您踢出並封鎖了 {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "user": "使用者", + "custom": "自訂", + "setColorTheme": "設定主題顏色:", + "makeAdminDescription": "一旦您讓這個使用者成為管理員,您可能無法撤銷此操作,因為他們將擁有與您相同的權限。", + "createGroupAndInviteUsers": "建立群組並邀請使用者", + "groupCanBeFoundViaSearch": "可以透過搜尋找到群組", + "pleaseEnterYourCurrentPassword": "請輸入您當前的密碼", + "createGroup": "建立群組", + "shareLocation": "分享位置", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "該訊息將對此對話中的所有參與者收回。這不能被反悔。", + "removeFromBundle": "從此套組中移除", + "jump": "跳轉", + "commandHint_unignore": "取消無視已提供的 Matrix ID", + "commandHint_markasgroup": "標示為群組", + "commandHint_me": "描述自己", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_plain": "傳送未格式化的文字", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "以反應的形式傳送回覆", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "createNewSpace": "新建空間", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "聊天室權限", + "customEmojisAndStickersBody": "新增或分享可在任何聊天室中使用的自訂表情符號或貼圖。", + "errorObtainingLocation": "取得位置錯誤:{error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "hideRedactedMessages": "隱藏被刪除的訊息", + "hideInvalidOrUnknownMessageFormats": "隱藏無效或未知的訊息格式", + "messagesStyle": "訊息樣式:", + "shareInviteLink": "分享邀請網址", + "scanQrCode": "掃描 QR 碼", + "oneClientLoggedOut": "您的一個客戶端已登出", + "addAccount": "新增帳號", + "editBundlesForAccount": "為此帳號編輯套組", + "openInMaps": "在地圖中打開", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "or": "或", + "@or": { + "type": "String", + "placeholders": {} + }, + "passwordRecoverySettings": "恢復密碼設定", + "redactedBy": "由 {username} 編輯", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "spaceName": "空間名稱", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "正在同步... 請稍候。", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "訊息資訊", + "removeFromSpace": "從空間中移除", + "emojis": "表情符號", + "placeCall": "發起通話", + "unsupportedAndroidVersion": "不支持的Android版本", + "videoCallsBetaWarning": "請注意,視訊通話目前處於測試階段。它們可能不會按預期工作,或者在所有平台上都不工作。", + "youJoinedTheChat": "您加入了聊天室", + "youBannedUser": "您封鎖了 {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "您已收回對 {user} 的邀請", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 您被 {user} 邀請", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "您解除封鎖了 {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "新空間", + "doNotShowAgain": "不再顯示", + "encryptThisChat": "加密此聊天室", + "sorryThatsNotPossible": "抱歉......這是不可能的", + "invite": "邀請", + "removeDevicesDescription": "您將從這個裝置登出,並將不再能夠接收消息。", + "unbanUserDescription": "如果該使用者嘗試,他們將能夠再次進入聊天室。", + "kickUserDescription": "該使用者被踢出聊天室,但未被禁止。在公開聊天室中,該使用者可以隨時重新加入。", + "pushNotificationsNotAvailable": "推送通知不可用", + "learnMore": "了解更多", + "nothingFound": "什麼都沒找到......", + "databaseMigrationBody": "請稍候。這可能需要一點時間。", + "pleaseChooseAStrongPassword": "請選擇一個強密碼", + "passwordIsWrong": "您輸入的密碼錯誤", + "publicChatAddresses": "公開聊天室地址", + "leaveEmptyToClearStatus": "留空以清除您的狀態。", + "select": "選擇", + "files": "文件", + "sendTypingNotificationsDescription": "聊天室中的其他參與者可以看到您正在輸入新訊息。", + "verifyOtherDeviceDescription": "當您驗證另一個裝置時,這些裝置可以交換密鑰,提升您的整體安全性。💪 當您開始驗證時,一個彈出視窗將在兩個裝置上的應用程式中出現。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。在開始驗證之前最好有兩個裝置在手邊。🤳", + "acceptedKeyVerification": "{sender} 接受了密鑰驗證", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} 完成了密鑰驗證", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} 已準備好進行密鑰驗證", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "目前有 {count} 名使用者被封鎖。", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "appLockDescription": "未使用時以密碼鎖定應用程式", + "globalChatId": "全球聊天室 ID", + "accessAndVisibility": "訪問權限和可見性", + "accessAndVisibilityDescription": "誰被允許加入此聊天室以及如何發現聊天室。", + "calls": "通話", + "chatDescription": "聊天室描述", + "chatDescriptionHasBeenChanged": "聊天室描述已變更", + "tryAgain": "再試一次", + "directChat": "私訊", + "setAsCanonicalAlias": "設為主要別名", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "設定聊天室描述", + "groupName": "群組名稱", + "searchForUsers": "搜尋 @users...", + "inviteGroupChat": "📨 邀請群組聊天室", + "knocking": "敲門", + "sessionLostBody": "您的會話已丟失。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "向右滑至左以回覆", + "hideRedactedMessagesBody": "如果有人收回一條訊息,該訊息將不再在聊天室中顯示。", + "link": "網址", + "obtainingLocation": "正在取得位置…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "哎呀!設定推送通知時不幸發生錯誤。", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "移除您的頭像", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "空間是公開的", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} 以 {reaction} 回應", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "confirmEventUnpin": "您確定要永久取消釘選該事件嗎?", + "noOneCanJoin": "沒有人可以加入", + "storeInAndroidKeystore": "存儲在 Android KeyStore", + "storeInAppleKeyChain": "存儲在 Apple KeyChain", + "foregroundServiceRunning": "當前景服務正在運行時會顯示此通知。", + "screenSharingTitle": "螢幕分享", + "wasDirectChatDisplayName": "空的聊天室(原名稱為 {oldDisplayName} )", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "出於安全原因,您不能在之前已加密的聊天室中停用加密。", + "fileIsTooBigForServer": "無法發送!該伺服器僅支援最大到 {max} 的附件。", + "fileHasBeenSavedAt": "文件已保存在 {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "跳至最後讀取的訊息", + "openLinkInBrowser": "在瀏覽器中開啟連結", + "reportErrorDescription": "😭 哦不。出了些問題。如果您願意,可以將此錯誤報告給開發者。", + "readUpToHere": "讀到這裡", + "report": "報告", + "pleaseEnterANumber": "請輸入大於 0 的數字", + "roomUpgradeDescription": "將使用新版本聊天室來重新建立聊天室。所有本聊天室的參與者都會收到通知,他們都需要換到新的聊天室裡。若您想知道有關新版本的更多資訊,請前往 https://spec.matrix.org/latest/rooms/", + "wrongRecoveryKey": "抱歉......這似乎不是正確的恢復密鑰。", + "passwordsDoNotMatch": "密碼不匹配", + "publicSpaces": "公共空間", + "initAppError": "初始化應用時發生錯誤", + "canceledKeyVerification": "{sender} 取消了密鑰驗證", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} 開始了密鑰驗證", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "收到的訊息", + "databaseMigrationTitle": "資料庫已最佳化", + "restoreSessionBody": "應用程式現在嘗試從備份中恢復您的會話。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "stickers": "貼圖", + "joinSpace": "加入空間", + "noMoreChatsFound": "沒有更多聊天室了...", + "commandHint_op": "設定給定使用者的權限等級(預設:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "customEmojisAndStickers": "自訂表情符號和貼圖", + "locationPermissionDeniedNotice": "位置權限被拒絕。請授予它們以能夠分享您的位置。", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "以文字傳送", + "@sendAsText": { + "type": "String" + }, + "unverified": "尚未驗證", + "time": "時間", + "chatCanBeDiscoveredViaSearchOnServer": "可以透過在 {server} 上的搜尋發現聊天室", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "commandHint_sendraw": "傳送原始 json", + "newPassword": "新密碼", + "createNewAddress": "建立新地址", + "searchIn": "在聊天室「{chat}」中搜尋......", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "搜尋更多......", + "gallery": "畫廊", + "sendReadReceiptsDescription": "聊天室中的其他參與者可以看到您已讀取一條訊息。", + "formattedMessages": "格式化訊息", + "goToSpace": "前往空間:{space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "標示為未讀", + "noDatabaseEncryption": "此平台不支援資料庫加密", + "openGallery": "開啟畫廊", + "markAsRead": "標示為已讀", + "reportUser": "舉報使用者", + "unsupportedAndroidVersionLong": "此功能需要較新的 Android 版本。請檢查更新或 Lineage OS 支持。", + "usersMustKnock": "使用者必須敲門", + "knock": "敲門", + "whyIsThisMessageEncrypted": "為什麼這條訊息無法讀取?", + "noKeyForThisMessage": "如果訊息是在您登入此裝置之前傳送的,就可能會發生這種情況。\n\n也有可能是傳送者已經封鎖了您的裝置,或者網絡連接出了問題。\n\n如果您能在另一個會話中讀取該訊息,那麼您可以從中轉移訊息!前往設定 > 裝置,並確保您的裝置已相互驗證。當您下次打開房間且兩個會話都在前景時,密鑰將自動傳輸。\n\n不想在登出或切換裝置時丟失密鑰?請確保您已在設定中啟用了聊天室備份。", + "newSpaceDescription": "空間允許您整合您的聊天室並建立私人或公開社群。", + "invalidInput": "無效的輸入!", + "verifyOtherUser": "🔐 驗證其他使用者", + "verifyOtherUserDescription": "如果您驗證了另一個使用者,您可以確定您真正與誰通信。💪\n\n當您開始驗證時,您和另一個使用者將在應用程式中看到一個彈出視窗。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。\n\n最好的方式是見面或開始視訊通話。👭", + "requestedKeyVerification": "{sender} 請求了密鑰驗證", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "commandHint_ignore": "無視已提供的 Matrix ID", + "unread": "未讀", + "space": "空間", + "unreadChatsInApp": "{appname}:{unread} 未讀聊天室", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "adminLevel": "{level} - 管理員", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "userLevel": "{level} - 用戶", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - 管理員", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "doesNotSeemToBeAValidHomeserver": "似乎不是能匹配的歸屬伺服器。伺服器域名打錯了嗎?", + "noticeChatBackupDeviceVerification": "注意:當您將所有裝置連線到聊天備份時,它們會自動驗證。", + "sendCanceled": "傳送取消", + "changelog": "變更日誌", + "changeTheCanonicalRoomAlias": "變更公開聊天室的主要地址", + "sendImages": "傳送{count}張圖片", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loginWithMatrixId": "以Matrix-ID登入", + "inviteOtherUsers": "邀請其他用戶進入本聊天", + "sendRoomNotifications": "傳送一條 @room 群提醒", + "updateInstalled": "🎉已成功安裝{version}版本!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "oneOfYourDevicesIsNotVerified": "你的其中一個裝置尚未驗證", + "chatPermissionsDescription": "定義此聊天中某些操作需要哪個權限等級。 權限等級0、50和100通常代表使用者、版主和管理員,但任何分級都是可能的。", + "changeGeneralChatSettings": "變更一般聊天設定", + "manageAccount": "帳號管理", + "changeTheChatPermissions": "變更聊天室權限", + "changeTheVisibilityOfChatHistory": "變更過往聊天記錄可見度", + "sendingAttachment": "附件傳送中…", + "opacity": "不透明度:", + "aboutHomeserver": "關於{homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "noChatsFoundHere": "還沒開始聊天嗎?點擊下方按鈕找個人聊聊吧⤵", + "changeTheDescriptionOfTheGroup": "變更聊天室說明", + "calculatingFileSize": "正在計算檔案大小…", + "setWallpaper": "設定背景樣式", + "noContactInformationProvided": "伺服器沒有提供任何有效的聯絡資訊", + "contactServerAdmin": "聯繫伺服器管理員", + "contactServerSecurity": "聯繫伺服器安管", + "continueText": "繼續", + "blur": "模糊:", + "synchronizingPleaseWaitCounter": " 同步中… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "contentNotificationSettings": "內容通知設定", + "generalNotificationSettings": "常規通知設定", + "roomNotificationSettings": "聊天室通知設定", + "userSpecificNotificationSettings": "用戶特定通知設定", + "otherNotificationSettings": "其他通知設定", + "notificationRuleContainsUserName": "包含用户名稱", + "notificationRuleContainsUserNameDescription": "當訊息帶有用户名稱時通知用戶。", + "notificationRuleMaster": "靜音所有通知", + "notificationRuleMasterDescription": "覆蓋所有其他規則並禁止所有通知。", + "notificationRuleInviteForMe": "邀請我", + "notificationRuleSuppressNoticesDescription": "隱藏來自bot等的自動化消息。", + "notificationRuleSuppressNotices": "隱藏自動化消息", + "notificationRuleMemberEvent": "成員事件", + "notificationRuleMemberEventDescription": "隱藏成員事件的通知。", + "notificationRuleIsUserMention": "用户提及", + "notificationRuleInviteForMeDescription": "當用户被邀請到聊天室時,通知他們。", + "commandHint_roomupgrade": "升級此聊天室至指定版本", + "serverInformation": "伺服器資訊 :", + "name": "名稱", + "website": "網站", + "compress": "壓縮", + "newChatRequest": "📩 新的聊天邀請", + "enterNewChat": "進入新聊天室", + "version": "版本", + "unableToJoinChat": "無法加入聊天室。對話可能以被其他方結束。", + "appWantsToUseForLogin": "使用「{server} 」伺服器登入", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "italicText": "斜體", + "boldText": "粗體", + "strikeThrough": "刪除線", + "pleaseFillOut": "請填充", + "invalidUrl": "無效 url", + "appWantsToUseForLoginDescription": "你特此允許該應用程式和網站分享關於你的信息。", + "open": "打開", + "waitingForServer": "等待伺服器中...", + "previous": "上一個", + "otherPartyNotLoggedIn": "對方現未登入,未能接收訊息 !", + "supportPage": "幫助頁面", + "addLink": "插入連結", + "notificationRuleContainsDisplayName": "包含顯示名稱", + "notificationRuleRoomnotif": "聊天室通知", + "notificationRuleIsRoomMentionDescription": "當有聊天室提及時通知用户。", + "notificationRuleRoomOneToOneDescription": "在一對一聊天室中通知用户收到訊息。", + "notificationRuleServerAcl": "隱藏伺服器 ACL 事件", + "notificationRuleContainsDisplayNameDescription": "當訊息包含用户的顯示名稱時通知用户。", + "notificationRuleIsRoomMention": "聊天室提及", + "notificationRuleRoomnotifDescription": "當訊息包含 \"@room\" 時通知用户。", + "notificationRuleTombstone": "墓碑", + "notificationRuleCallDescription": "通知用户有來電。", + "notificationRuleEncryptedRoomOneToOne": "一對一加密聊天室", + "notificationRuleEncryptedRoomOneToOneDescription": "通知用户一對一加密聊天室的訊息。", + "notificationRuleRoomOneToOne": "一對一聊天室", + "notificationRuleMessage": "訊息", + "notificationRuleServerAclDescription": "隱藏伺服器 ACL 事件的通知。", + "notificationRuleMessageDescription": "通知用户一般訊息。", + "notificationRuleEncrypted": "已加密", + "notificationRuleEncryptedDescription": "在已加密房間內通知用户訊息。", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "通知用户 Jitsi 小部件事件。", + "unknownPushRule": "未知推送規則 '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "more": "更多", + "deletePushRuleCanNotBeUndone": "刪除此通知設定的操作無法復原。", + "shareKeysWith": "與哪些設備共享金鑰…", + "shareKeysWithDescription": "選擇應該信任的裝置,並允許它們在加密聊天中讀取您的訊息?", + "allDevices": "所有裝置", + "crossVerifiedDevices": "經交叉驗證的裝置", + "crossVerifiedDevicesIfEnabled": "交叉驗證裝置(如啟用)", + "recordAVideo": "錄製影像", + "takeAPhoto": "拍攝照片", + "optionalMessage": "(可選)訊息...", + "notSupportedOnThisDevice": "此裝置不受支援", + "notificationRuleTombstoneDescription": "通知用户有關房間解散的訊息。", + "notificationRuleReaction": "心情回應", + "notificationRuleReactionDescription": "關閉心情回應通知。", + "notificationRuleRoomServerAcl": "聊天室伺服器 ACL", + "notificationRuleRoomServerAclDescription": "關閉聊天室伺服器存取控制清單 (ACL) 的通知。", + "notificationRuleSuppressEdits": "隱藏編輯", + "notificationRuleSuppressEditsDescription": "隱藏已編輯訊息通知。", + "notificationRuleCall": "來電", + "verifiedDevicesOnly": "僅限已驗證的裝置", + "approve": "核准", + "youHaveKnocked": "您已請求加入", + "pleaseWaitUntilInvited": "直到聊天室裡有人邀請您前,請等候。", + "notificationRuleIsUserMentionDescription": "被@時通知他們。", + "countInvited": "已邀請{count}位", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 7a0d60f994..10f0246209 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,170 +1,157 @@ -import 'dart:async'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:dynamic_color/dynamic_color.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:matrix/matrix.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:vrouter/vrouter.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/universal_html.dart' as web; -import 'package:fluffychat/config/routes.dart'; -import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; -import 'config/app_config.dart'; -import 'config/themes.dart'; +import 'config/setting_keys.dart'; import 'utils/background_push.dart'; -import 'utils/custom_scroll_behaviour.dart'; -import 'utils/localized_exception_extension.dart'; -import 'utils/platform_infos.dart'; -import 'widgets/lock_screen.dart'; -import 'widgets/matrix.dart'; +import 'widgets/fluffy_chat_app.dart'; + +ReceivePort? mainIsolateReceivePort; + +bool _vodozemacInitialized = false; + +bool isIntegrationTest = false; + +void main(List args) async { + isIntegrationTest = args.singleOrNull == 'integration_test'; + if (PlatformInfos.isAndroid) { + final port = mainIsolateReceivePort = ReceivePort(); + IsolateNameServer.removePortNameMapping(AppConfig.mainIsolatePortName); + IsolateNameServer.registerPortWithName( + port.sendPort, + AppConfig.mainIsolatePortName, + ); + await waitForPushIsolateDone(); + } + + // Sanitize hash for OIDC: + if (kIsWeb) { + final hash = web.window.location.hash; + if (hash.isNotEmpty && !hash.startsWith('/')) { + web.window.location.hash = hash.replaceFirst('#', '#?'); + } + } -void main() async { // Our background push shared isolate accesses flutter-internal things very early in the startup proccess // To make sure that the parts of flutter needed are started up already, we need to ensure that the // widget bindings are initialized already. WidgetsFlutterBinding.ensureInitialized(); - FlutterError.onError = - (FlutterErrorDetails details) => Zone.current.handleUncaughtError( - details.exception, - details.stack ?? StackTrace.current, - ); - final clients = await ClientManager.getClients(); - Logs().level = kReleaseMode ? Level.warning : Level.verbose; + final store = await AppSettings.init(); + Logs().i('Welcome to ${AppSettings.applicationName.value} <3'); - if (PlatformInfos.isMobile) { - BackgroundPush.clientOnly(clients.first); + if (!_vodozemacInitialized) { + await vod.init(wasmPath: './assets/assets/vodozemac/'); + _vodozemacInitialized = true; } - final queryParameters = {}; - if (kIsWeb) { - queryParameters - .addAll(Uri.parse(html.window.location.href).queryParameters); + Logs().nativeColors = !PlatformInfos.isIOS; + final clients = await ClientManager.getClients(store: store); + + // If the app starts in detached mode, we assume that it is in + // background fetch mode for processing push notifications. This is + // currently only supported on Android. + if (PlatformInfos.isAndroid && + AppLifecycleState.detached == WidgetsBinding.instance.lifecycleState) { + // Do not send online presences when app is in background fetch mode. + for (final client in clients) { + client.backgroundSync = false; + client.syncPresence = PresenceType.offline; + } + + // In the background fetch mode we do not want to waste ressources with + // starting the Flutter engine but process incoming push notifications. + BackgroundPush.clientOnly(clients); + // To start the flutter engine afterwards we add an custom observer. + WidgetsBinding.instance.addObserver(AppStarter(clients, store)); + Logs().i( + '${AppSettings.applicationName.value} started in background-fetch mode. No GUI will be created unless the app is no longer detached.', + ); + return; } - runZonedGuarded( - () => runApp(PlatformInfos.isMobile - ? AppLock( - builder: (args) => FluffyChatApp( - clients: clients, - queryParameters: queryParameters, - ), - lockScreen: const LockScreen(), - enabled: false, - ) - : FluffyChatApp(clients: clients, queryParameters: queryParameters)), - SentryController.captureException, + // Started in foreground mode. + Logs().i( + '${AppSettings.applicationName.value} started in foreground mode. Rendering GUI...', ); + await startGui(clients, store); } -class FluffyChatApp extends StatefulWidget { - final Widget? testWidget; - final List clients; - final Map? queryParameters; - - const FluffyChatApp({ - Key? key, - this.testWidget, - required this.clients, - this.queryParameters, - }) : super(key: key); +/// Fetch the pincode for the applock and start the flutter engine. +Future startGui(List clients, SharedPreferences store) async { + // Fetch the pin for the applock if existing for mobile applications. + String? pin; + var useBiometrics = false; + if (PlatformInfos.supportsAppLock) { + try { + pin = await const FlutterSecureStorage().read( + key: 'chat.fluffy.app_lock', + ); + useBiometrics = + (await const FlutterSecureStorage().read( + key: 'chat.fluffy.use_biometrics', + )) == + 'true'; + } catch (e, s) { + Logs().d('Unable to read PIN from Secure storage', e, s); + } + } - /// getInitialLink may rereturn the value multiple times if this view is - /// opened multiple times for example if the user logs out after they logged - /// in with qr code or magic link. - static bool gotInitialLink = false; + // Preload first client + final firstClient = clients.firstOrNull; + await firstClient?.roomsLoading; + await firstClient?.accountDataLoading; - @override - _FluffyChatAppState createState() => _FluffyChatAppState(); + runApp( + FluffyChatApp( + clients: clients, + appLockSettings: (pincode: pin, useBiometrics: useBiometrics), + store: store, + ), + ); } -class _FluffyChatAppState extends State { - GlobalKey? _router; - bool? columnMode; - String? _initialUrl; +/// Watches the lifecycle changes to start the application when it +/// is no longer detached. +class AppStarter with WidgetsBindingObserver { + final List clients; + final SharedPreferences store; + bool guiStarted = false; + + AppStarter(this.clients, this.store); @override - void initState() { - super.initState(); - _initialUrl = - widget.clients.any((client) => client.isLogged()) ? '/rooms' : '/home'; - } + void didChangeAppLifecycleState(AppLifecycleState state) { + if (guiStarted) return; + if (state == AppLifecycleState.detached) return; - @override - Widget build(BuildContext context) { - return DynamicColorBuilder( - builder: (lightColorScheme, darkColorScheme) => AdaptiveTheme( - light: FluffyThemes.light(lightColorScheme), - dark: FluffyThemes.dark(darkColorScheme), - initial: AdaptiveThemeMode.system, - builder: (theme, darkTheme) => LayoutBuilder( - builder: (context, constraints) { - const maxColumns = 3; - var newColumns = - (constraints.maxWidth / FluffyThemes.columnWidth).floor(); - if (newColumns > maxColumns) newColumns = maxColumns; - columnMode ??= newColumns > 1; - _router ??= GlobalKey(); - if (columnMode != newColumns > 1) { - Logs().v('Set Column Mode = $columnMode'); - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - _initialUrl = _router?.currentState?.url; - columnMode = newColumns > 1; - _router = GlobalKey(); - }); - }); - } - return VRouter( - key: _router, - title: AppConfig.applicationName, - theme: theme, - scrollBehavior: CustomScrollBehavior(), - logs: kReleaseMode ? VLogs.none : VLogs.info, - darkTheme: darkTheme, - localizationsDelegates: const [ - ...L10n.localizationsDelegates, - ], - supportedLocales: L10n.supportedLocales, - initialUrl: _initialUrl ?? '/', - routes: AppRoutes(columnMode ?? false).routes, - builder: (context, child) { - LoadingDialog.defaultTitle = - L10n.of(context)!.loadingPleaseWait; - LoadingDialog.defaultBackLabel = L10n.of(context)!.close; - LoadingDialog.defaultOnError = - (e) => (e as Object?)!.toLocalizedString(context); - WidgetsBinding.instance.addPostFrameCallback((_) { - SystemChrome.setSystemUIOverlayStyle( - SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - systemNavigationBarColor: - Theme.of(context).appBarTheme.backgroundColor, - systemNavigationBarIconBrightness: - Theme.of(context).brightness == Brightness.light - ? Brightness.dark - : Brightness.light, - ), - ); - }); - return Matrix( - context: context, - router: _router, - clients: widget.clients, - child: child, - ); - }, - ); - }, - ), - )); + Logs().i( + '${AppSettings.applicationName.value} switches from the detached background-fetch mode to ${state.name} mode. Rendering GUI...', + ); + // Switching to foreground mode needs to reenable send online sync presence. + for (final client in clients) { + client.backgroundSync = true; + client.syncPresence = PresenceType.online; + } + startGui(clients, store); + // We must make sure that the GUI is only started once. + guiStarted = true; } } diff --git a/lib/pages/add_story/add_story.dart b/lib/pages/add_story/add_story.dart deleted file mode 100644 index 5a875e53b6..0000000000 --- a/lib/pages/add_story/add_story.dart +++ /dev/null @@ -1,308 +0,0 @@ -import 'dart:io'; -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:video_player/video_player.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/add_story/add_story_view.dart'; -import 'package:fluffychat/pages/add_story/invite_story_page.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; -import 'package:fluffychat/utils/resize_image.dart'; -import 'package:fluffychat/utils/story_theme_data.dart'; -import 'package:fluffychat/utils/string_color.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; - -class AddStoryPage extends StatefulWidget { - const AddStoryPage({Key? key}) : super(key: key); - - @override - AddStoryController createState() => AddStoryController(); -} - -class AddStoryController extends State { - final TextEditingController controller = TextEditingController(); - final FocusNode focusNode = FocusNode(); - late Color backgroundColor; - late Color backgroundColorDark; - MatrixImageFile? image; - MatrixVideoFile? video; - - VideoPlayerController? videoPlayerController; - - bool get hasMedia => image != null || video != null; - - bool hasText = false; - - bool textFieldHasFocus = false; - - BoxFit fit = BoxFit.contain; - - int alignmentX = 0; - int alignmentY = 0; - - void toggleBoxFit() { - if (fit == BoxFit.contain) { - setState(() { - fit = BoxFit.cover; - }); - } else { - setState(() { - fit = BoxFit.contain; - }); - } - } - - void updateHasText(String text) { - if (hasText != text.isNotEmpty) { - setState(() { - hasText = text.isNotEmpty; - }); - } - } - - void importMedia() async { - final picked = await FilePickerCross.importFromStorage( - type: FileTypeCross.image, - ); - final fileName = picked.fileName; - if (fileName == null) return; - final matrixFile = MatrixImageFile( - bytes: picked.toUint8List(), - name: fileName, - ); - setState(() { - image = matrixFile; - }); - } - - void capturePhoto() async { - final picked = await ImagePicker().pickImage( - source: ImageSource.camera, - ); - if (picked == null) return; - final matrixFile = await showFutureLoadingDialog( - context: context, - future: () async { - final bytes = await picked.readAsBytes(); - return MatrixImageFile( - bytes: bytes, - name: picked.name, - ); - }); - - setState(() { - image = matrixFile.result; - }); - } - - void updateColor() { - final rand = Random().nextInt(1000).toString(); - setState(() { - backgroundColor = rand.color; - backgroundColorDark = rand.darkColor; - }); - } - - void captureVideo() async { - final picked = await ImagePicker().pickVideo( - source: ImageSource.camera, - ); - if (picked == null) return; - final bytes = await picked.readAsBytes(); - - setState(() { - video = MatrixVideoFile(bytes: bytes, name: picked.name); - videoPlayerController = VideoPlayerController.file(File(picked.path)) - ..setLooping(true); - }); - } - - void reset() => setState(() { - image = video = null; - alignmentX = alignmentY = 0; - controller.clear(); - }); - - void postStory() async { - if (video == null && image == null && controller.text.isEmpty) return; - final client = Matrix.of(context).client; - var storiesRoom = await client.getStoriesRoom(context); - - // Invite contacts if necessary - final undecided = await showFutureLoadingDialog( - context: context, - future: () => client.getUndecidedContactsForStories(storiesRoom), - ); - final result = undecided.result; - if (result == null) return; - if (result.isNotEmpty) { - final created = await showDialog( - context: context, - useRootNavigator: false, - builder: (context) => InviteStoryPage(storiesRoom: storiesRoom), - ); - if (created != true) return; - storiesRoom ??= await client.getStoriesRoom(context); - } - - // Post story - final postResult = await showFutureLoadingDialog( - context: context, - future: () async { - if (storiesRoom == null) throw ('Stories room is null'); - var video = this.video?.detectFileType; - if (video != null) { - video = await video.resizeVideo(); - final thumbnail = await video.getVideoThumbnail(); - await storiesRoom.sendFileEvent( - video, - extraContent: { - 'body': controller.text, - StoryThemeData.contentKey: StoryThemeData( - fit: fit, - alignmentX: alignmentX, - alignmentY: alignmentY, - ).toJson(), - }, - thumbnail: thumbnail, - ); - return; - } - final image = this.image; - if (image != null) { - await storiesRoom.sendFileEvent( - image, - extraContent: { - 'body': controller.text, - StoryThemeData.contentKey: StoryThemeData( - fit: fit, - alignmentX: alignmentX, - alignmentY: alignmentY, - ).toJson(), - }, - ); - return; - } - await storiesRoom.sendEvent({ - 'msgtype': MessageTypes.Text, - 'body': controller.text, - StoryThemeData.contentKey: StoryThemeData( - color1: backgroundColor, - color2: backgroundColorDark, - fit: fit, - alignmentX: alignmentX, - alignmentY: alignmentY, - ).toJson(), - }); - }, - ); - if (postResult.error == null) { - VRouter.of(context).pop(); - } - } - - void onVerticalDragUpdate(DragUpdateDetails details) { - final delta = details.primaryDelta; - if (delta == null) return; - if (delta > 0 && alignmentY < 100) { - setState(() { - alignmentY += 1; - }); - } else if (delta < 0 && alignmentY > -100) { - setState(() { - alignmentY -= 1; - }); - } - } - - void onHorizontalDragUpdate(DragUpdateDetails details) { - final delta = details.primaryDelta; - if (delta == null) return; - if (delta > 0 && alignmentX < 100) { - setState(() { - alignmentX += 1; - }); - } else if (delta < 0 && alignmentX > -100) { - setState(() { - alignmentX -= 1; - }); - } - } - - @override - void initState() { - super.initState(); - final rand = Random().nextInt(1000).toString(); - backgroundColor = rand.color; - backgroundColorDark = rand.darkColor; - focusNode.addListener(() { - if (textFieldHasFocus != focusNode.hasFocus) { - setState(() { - textFieldHasFocus = focusNode.hasFocus; - }); - } - }); - - final shareContent = Matrix.of(context).shareContent; - if (shareContent != null) { - controller.text = shareContent.tryGet('body') ?? ''; - final shareFile = shareContent.tryGet('file')?.detectFileType; - - if (shareFile is MatrixImageFile) { - setState(() { - image = shareFile; - }); - } else if (shareFile is MatrixVideoFile) { - setState(() { - video = shareFile; - }); - } - - final msgType = shareContent.tryGet('msgtype'); - if (msgType == MessageTypes.Image) { - Event( - content: shareContent, - type: EventTypes.Message, - room: Room(id: '!tmproom', client: Matrix.of(context).client), - eventId: 'tmpevent', - senderId: '@tmpsender:example', - originServerTs: DateTime.now(), - ).downloadAndDecryptAttachment().then((file) { - setState(() { - image = file.detectFileType as MatrixImageFile; - }); - }); - } else if (msgType == MessageTypes.Video) { - Event( - content: shareContent, - type: EventTypes.Message, - room: Room(id: '!tmproom', client: Matrix.of(context).client), - eventId: 'tmpevent', - senderId: '@tmpsender:example', - originServerTs: DateTime.now(), - ).downloadAndDecryptAttachment().then((file) { - setState(() { - video = file.detectFileType as MatrixVideoFile; - }); - }); - } - Matrix.of(context).shareContent = null; - } - } - - @override - void dispose() { - videoPlayerController?.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) => AddStoryView(this); -} diff --git a/lib/pages/add_story/add_story_view.dart b/lib/pages/add_story/add_story_view.dart deleted file mode 100644 index 8153c60dad..0000000000 --- a/lib/pages/add_story/add_story_view.dart +++ /dev/null @@ -1,196 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:video_player/video_player.dart'; - -import 'add_story.dart'; - -class AddStoryView extends StatelessWidget { - final AddStoryController controller; - const AddStoryView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final video = controller.videoPlayerController; - - return Scaffold( - backgroundColor: Colors.blueGrey.shade900, - appBar: AppBar( - systemOverlayStyle: SystemUiOverlayStyle.light, - backgroundColor: Colors.transparent, - elevation: 0, - iconTheme: const IconThemeData(color: Colors.white), - title: Text( - L10n.of(context)!.addToStory, - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(0, 0), - blurRadius: 5, - ), - ], - ), - ), - actions: [ - if (controller.hasMedia) - IconButton( - icon: const Icon(Icons.fullscreen_outlined), - onPressed: controller.toggleBoxFit, - ), - if (!controller.hasMedia) - IconButton( - icon: const Icon(Icons.color_lens_outlined), - onPressed: controller.updateColor, - ), - IconButton( - icon: const Icon(Icons.delete_outlined), - onPressed: controller.reset, - ), - ], - ), - extendBodyBehindAppBar: true, - body: GestureDetector( - onVerticalDragUpdate: controller.onVerticalDragUpdate, - onHorizontalDragUpdate: controller.onHorizontalDragUpdate, - child: Stack( - children: [ - if (video != null) - Padding( - padding: const EdgeInsets.symmetric(vertical: 80.0), - child: FutureBuilder( - future: video.initialize().then((_) => video.play()), - builder: (_, __) => Center(child: VideoPlayer(video)), - ), - ), - AnimatedContainer( - duration: const Duration(seconds: 1), - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 80.0, - ), - decoration: BoxDecoration( - image: controller.image == null - ? null - : DecorationImage( - image: MemoryImage(controller.image!.bytes), - fit: controller.fit, - opacity: 0.75, - ), - gradient: controller.hasMedia - ? null - : LinearGradient( - colors: [ - controller.backgroundColorDark, - controller.backgroundColor, - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ), - ), - child: Align( - alignment: Alignment( - controller.alignmentX / 100, - controller.alignmentY / 100, - ), - child: IntrinsicWidth( - child: TextField( - controller: controller.controller, - focusNode: controller.focusNode, - minLines: 1, - maxLines: 15, - autofocus: false, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - color: Colors.white, - shadows: controller.hasMedia - ? const [ - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - ] - : null, - ), - onChanged: controller.updateHasText, - decoration: InputDecoration( - border: InputBorder.none, - hintText: controller.hasMedia - ? L10n.of(context)!.addDescription - : L10n.of(context)!.whatIsGoingOn, - filled: false, - hintStyle: TextStyle( - color: Colors.white.withOpacity(0.5), - backgroundColor: Colors.transparent, - ), - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - ), - ), - ), - ), - ), - ], - ), - ), - floatingActionButton: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if (!controller.hasMedia) ...[ - FloatingActionButton( - onPressed: controller.importMedia, - backgroundColor: controller.backgroundColorDark, - foregroundColor: Colors.white, - heroTag: null, - child: const Icon(Icons.photo_outlined), - ), - const SizedBox(width: 16), - FloatingActionButton( - onPressed: controller.capturePhoto, - backgroundColor: controller.backgroundColorDark, - foregroundColor: Colors.white, - heroTag: null, - child: const Icon(Icons.camera_alt_outlined), - ), - const SizedBox(width: 16), - FloatingActionButton( - onPressed: controller.captureVideo, - backgroundColor: controller.backgroundColorDark, - foregroundColor: Colors.white, - heroTag: null, - child: const Icon(Icons.video_camera_front_outlined), - ), - ], - if (controller.hasMedia || controller.hasText) ...[ - const SizedBox(width: 16), - FloatingActionButton( - onPressed: controller.postStory, - backgroundColor: Theme.of(context).colorScheme.surface, - foregroundColor: Theme.of(context).colorScheme.onSurface, - child: const Icon(Icons.send_rounded), - ), - ], - ], - ), - ); - } -} diff --git a/lib/pages/add_story/invite_story_page.dart b/lib/pages/add_story/invite_story_page.dart deleted file mode 100644 index 76ad006b96..0000000000 --- a/lib/pages/add_story/invite_story_page.dart +++ /dev/null @@ -1,135 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class InviteStoryPage extends StatefulWidget { - final Room? storiesRoom; - const InviteStoryPage({ - required this.storiesRoom, - Key? key, - }) : super(key: key); - - @override - _InviteStoryPageState createState() => _InviteStoryPageState(); -} - -class _InviteStoryPageState extends State { - Set _undecided = {}; - final Set _invite = {}; - - void _inviteAction() async { - final confirmed = await showOkCancelAlertDialog( - context: context, - message: L10n.of(context)!.storyPrivacyWarning, - okLabel: L10n.of(context)!.iUnderstand, - cancelLabel: L10n.of(context)!.cancel, - ); - if (confirmed != OkCancelResult.ok) return; - final result = await showFutureLoadingDialog( - context: context, - future: () async { - final client = Matrix.of(context).client; - var room = await client.getStoriesRoom(context); - final inviteList = _invite.toList(); - if (room == null) { - room = await client.createStoriesRoom(inviteList.take(10).toList()); - if (inviteList.length > 10) { - inviteList.removeRange(0, 10); - } else { - inviteList.clear(); - } - } - for (final userId in inviteList) { - room.invite(userId); - } - - _undecided.removeAll(_invite); - _undecided.addAll(client.storiesBlockList); - await client.setStoriesBlockList(_undecided.toList()); - }, - ); - if (result.error != null) return; - Navigator.of(context).pop(true); - } - - Future>? loadContacts; - - @override - Widget build(BuildContext context) { - loadContacts ??= Matrix.of(context) - .client - .getUndecidedContactsForStories(widget.storiesRoom) - .then((contacts) { - return contacts; - }); - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(false), - ), - title: Text(L10n.of(context)!.whoCanSeeMyStories), - elevation: 0, - ), - body: Column( - children: [ - ListTile( - title: Text(L10n.of(context)!.whoCanSeeMyStoriesDesc), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), - ), - ), - const Divider(height: 1), - Expanded( - child: FutureBuilder>( - future: loadContacts, - builder: (context, snapshot) { - final contacts = snapshot.data; - if (contacts == null) { - final error = snapshot.error; - if (error != null) { - return Center( - child: Text(error.toLocalizedString(context))); - } - return const Center( - child: CircularProgressIndicator.adaptive()); - } - _undecided = contacts.map((u) => u.id).toSet(); - return ListView.builder( - itemCount: contacts.length, - itemBuilder: (context, i) => SwitchListTile.adaptive( - value: _invite.contains(contacts[i].id), - onChanged: (b) => setState(() => b - ? _invite.add(contacts[i].id) - : _invite.remove(contacts[i].id)), - secondary: Avatar( - mxContent: contacts[i].avatarUrl, - name: contacts[i].calcDisplayname(), - ), - title: Text(contacts[i].calcDisplayname()), - ), - ); - }), - ), - ], - ), - floatingActionButton: FloatingActionButton.extended( - onPressed: _inviteAction, - label: Text(L10n.of(context)!.publish), - backgroundColor: Theme.of(context).colorScheme.surface, - foregroundColor: Theme.of(context).colorScheme.onSurface, - icon: const Icon(Icons.send_rounded), - ), - ); - } -} diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index 4872c2946c..81c29070b7 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -1,55 +1,72 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/archive/archive_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class Archive extends StatefulWidget { - const Archive({Key? key}) : super(key: key); + const Archive({super.key}); @override ArchiveController createState() => ArchiveController(); } class ArchiveController extends State { - List? archive; + List archive = []; Future> getArchive(BuildContext context) async { - final archive = this.archive; - if (archive != null) return archive; - return await Matrix.of(context).client.loadArchive(); + if (archive.isNotEmpty) return archive; + return archive = await Matrix.of(context).client.loadArchive(); } - void forgetAction(int i) => setState(() => archive?.removeAt(i)); + Future forgetRoomAction(int i) async { + await showFutureLoadingDialog( + context: context, + future: () async { + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); + await archive[i].forget(); + archive.removeAt(i); + }, + ); + setState(() {}); + } - void forgetAllAction() async { + Future forgetAllAction() async { final archive = this.archive; - if (archive == null) return; + final client = Matrix.of(context).client; + if (archive.isEmpty) return; if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - message: L10n.of(context)!.clearArchive, + title: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + cancelLabel: L10n.of(context).cancel, + message: L10n.of(context).clearArchive, ) != OkCancelResult.ok) { return; } + if (!mounted) return; await showFutureLoadingDialog( context: context, - future: () async { + futureWithProgress: (onProgress) async { + final count = archive.length; while (archive.isNotEmpty) { - Logs().v('Forget room ${archive.last.displayname}'); + onProgress(1 - (archive.length / count)); + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); await archive.last.forget(); archive.removeLast(); } }, ); + client.clearArchivesFromCache(); setState(() {}); } diff --git a/lib/pages/archive/archive_view.dart b/lib/pages/archive/archive_view.dart index ea4295478c..445f736234 100644 --- a/lib/pages/archive/archive_view.dart +++ b/lib/pages/archive/archive_view.dart @@ -1,60 +1,76 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/archive/archive.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ArchiveView extends StatelessWidget { final ArchiveController controller; - const ArchiveView(this.controller, {Key? key}) : super(key: key); + const ArchiveView(this.controller, {super.key}); @override Widget build(BuildContext context) { - var archive = controller.archive; return FutureBuilder>( future: controller.getArchive(context), builder: (BuildContext context, snapshot) => Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.archive), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).archive), actions: [ - if (snapshot.hasData && archive != null && archive!.isNotEmpty) - TextButton( - onPressed: controller.forgetAllAction, - child: Text(L10n.of(context)!.clearArchive), - ) + if (snapshot.data?.isNotEmpty ?? false) + Padding( + padding: const EdgeInsets.all(8.0), + child: TextButton.icon( + onPressed: controller.forgetAllAction, + label: Text(L10n.of(context).clearArchive), + icon: const Icon(Icons.cleaning_services_outlined), + ), + ), ], ), - body: Builder( - builder: (BuildContext context) { - if (snapshot.hasError) { - return Center( + body: MaxWidthBody( + withScrolling: false, + child: Builder( + builder: (BuildContext context) { + if (snapshot.hasError) { + return Center( child: Text( - L10n.of(context)!.oopsSomethingWentWrong, - textAlign: TextAlign.center, - )); - } - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2)); - } else { - archive = snapshot.data; - if (archive == null || archive!.isEmpty) { + L10n.of(context).oopsSomethingWentWrong, + textAlign: TextAlign.center, + ), + ); + } + if (!snapshot.hasData) { return const Center( - child: Icon(Icons.archive_outlined, size: 80)); + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } else { + if (controller.archive.isEmpty) { + return const Center( + child: Icon(Icons.archive_outlined, size: 80), + ); + } + return ListView.builder( + itemCount: controller.archive.length, + itemBuilder: (BuildContext context, int i) => ChatListItem( + controller.archive[i], + onForget: () => controller.forgetRoomAction(i), + onTap: () => context.go( + '/rooms/archive/${controller.archive[i].id}', + ), + ), + ); } - return ListView.builder( - itemCount: archive!.length, - itemBuilder: (BuildContext context, int i) => ChatListItem( - archive![i], - onForget: controller.forgetAction, - ), - ); - } - }, + }, + ), ), ), ); diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart deleted file mode 100644 index 2c05ce427b..0000000000 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ /dev/null @@ -1,437 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/encryption.dart'; -import 'package:matrix/encryption/utils/bootstrap.dart'; -import 'package:matrix/matrix.dart'; -import 'package:share_plus/share_plus.dart'; - -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_flat_button.dart'; -import '../key_verification/key_verification_dialog.dart'; - -class BootstrapDialog extends StatefulWidget { - final bool wipe; - final Client client; - const BootstrapDialog({ - Key? key, - this.wipe = false, - required this.client, - }) : super(key: key); - - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ); - - @override - _BootstrapDialogState createState() => _BootstrapDialogState(); -} - -class _BootstrapDialogState extends State { - final TextEditingController _recoveryKeyTextEditingController = - TextEditingController(); - - late Bootstrap bootstrap; - - String? _recoveryKeyInputError; - - bool _recoveryKeyInputLoading = false; - - String? titleText; - - bool _recoveryKeyStored = false; - bool _recoveryKeyCopied = false; - - bool? _storeInSecureStorage = false; - - bool? _wipe; - - String get _secureStorageKey => - 'ssss_recovery_key_${bootstrap.client.userID}'; - - bool get _supportsSecureStorage => - PlatformInfos.isMobile || PlatformInfos.isDesktop; - - String _getSecureStorageLocalizedName() { - if (PlatformInfos.isAndroid) { - return L10n.of(context)!.storeInAndroidKeystore; - } - if (PlatformInfos.isIOS || PlatformInfos.isMacOS) { - return L10n.of(context)!.storeInAppleKeyChain; - } - return L10n.of(context)!.storeSecurlyOnThisDevice; - } - - static const secureStorage = FlutterSecureStorage( - aOptions: AndroidOptions( - encryptedSharedPreferences: true, - ), - ); - - @override - void initState() { - _createBootstrap(widget.wipe); - super.initState(); - } - - void _createBootstrap(bool wipe) { - _wipe = wipe; - titleText = null; - _recoveryKeyStored = false; - bootstrap = - widget.client.encryption!.bootstrap(onUpdate: () => setState(() {})); - secureStorage.read(key: _secureStorageKey).then((key) { - if (key == null) return; - _recoveryKeyTextEditingController.text = key; - }); - } - - @override - Widget build(BuildContext context) { - _wipe ??= widget.wipe; - final buttons = []; - Widget body = PlatformInfos.isCupertinoStyle - ? const CupertinoActivityIndicator() - : const LinearProgressIndicator(); - titleText = L10n.of(context)!.loadingPleaseWait; - - if (bootstrap.newSsssKey?.recoveryKey != null && - _recoveryKeyStored == false) { - final key = bootstrap.newSsssKey!.recoveryKey; - titleText = L10n.of(context)!.recoveryKey; - return Scaffold( - appBar: AppBar( - centerTitle: true, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context).pop, - ), - title: Text(L10n.of(context)!.recoveryKey), - ), - body: Center( - child: ConstrainedBox( - constraints: - const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5), - child: ListView( - padding: const EdgeInsets.all(16.0), - children: [ - ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - trailing: Icon( - Icons.info_outlined, - color: Theme.of(context).colorScheme.primary, - ), - subtitle: Text(L10n.of(context)!.chatBackupDescription), - ), - const Divider( - height: 32, - thickness: 1, - ), - TextField( - minLines: 4, - maxLines: 4, - readOnly: true, - controller: TextEditingController(text: key), - ), - const SizedBox(height: 16), - if (_supportsSecureStorage) - CheckboxListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - value: _storeInSecureStorage, - activeColor: Theme.of(context).colorScheme.primary, - onChanged: (b) { - setState(() { - _storeInSecureStorage = b; - }); - }, - title: Text(_getSecureStorageLocalizedName()), - subtitle: - Text(L10n.of(context)!.storeInSecureStorageDescription), - ), - const SizedBox(height: 16), - CheckboxListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - value: _recoveryKeyCopied, - activeColor: Theme.of(context).colorScheme.primary, - onChanged: (b) { - final box = context.findRenderObject() as RenderBox; - Share.share( - key!, - sharePositionOrigin: - box.localToGlobal(Offset.zero) & box.size, - ); - setState(() => _recoveryKeyCopied = true); - }, - title: Text(L10n.of(context)!.copyToClipboard), - subtitle: Text(L10n.of(context)!.saveKeyManuallyDescription), - ), - const SizedBox(height: 16), - ElevatedButton.icon( - icon: const Icon(Icons.check_outlined), - label: Text(L10n.of(context)!.next), - onPressed: - (_recoveryKeyCopied || _storeInSecureStorage == true) - ? () { - if (_storeInSecureStorage == true) { - secureStorage.write( - key: _secureStorageKey, - value: key, - ); - } - setState(() => _recoveryKeyStored = true); - } - : null, - ), - ], - ), - ), - ), - ); - } else { - switch (bootstrap.state) { - case BootstrapState.loading: - break; - case BootstrapState.askWipeSsss: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.wipeSsss(_wipe!), - ); - break; - case BootstrapState.askBadSsss: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.ignoreBadSecrets(true), - ); - break; - case BootstrapState.askUseExistingSsss: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.useExistingSsss(!_wipe!), - ); - break; - case BootstrapState.askUnlockSsss: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.unlockedSsss(), - ); - break; - case BootstrapState.askNewSsss: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.newSsss(), - ); - break; - case BootstrapState.openExistingSsss: - _recoveryKeyStored = true; - return Scaffold( - appBar: AppBar( - centerTitle: true, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context).pop, - ), - title: Text(L10n.of(context)!.unlockOldMessages), - ), - body: Center( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 1.5), - child: ListView( - padding: const EdgeInsets.all(16.0), - children: [ - ListTile( - contentPadding: - const EdgeInsets.symmetric(horizontal: 8.0), - trailing: Icon( - Icons.info_outlined, - color: Theme.of(context).colorScheme.primary, - ), - subtitle: Text( - L10n.of(context)!.pleaseEnterRecoveryKeyDescription), - ), - const Divider(height: 32), - TextField( - minLines: 1, - maxLines: 1, - autocorrect: false, - readOnly: _recoveryKeyInputLoading, - autofillHints: _recoveryKeyInputLoading - ? null - : [AutofillHints.password], - controller: _recoveryKeyTextEditingController, - decoration: InputDecoration( - hintText: 'Abc123 Def456', - labelText: L10n.of(context)!.recoveryKey, - errorText: _recoveryKeyInputError, - ), - ), - const SizedBox(height: 16), - ElevatedButton.icon( - icon: _recoveryKeyInputLoading - ? const CircularProgressIndicator.adaptive() - : const Icon(Icons.lock_open_outlined), - label: Text(L10n.of(context)!.unlockOldMessages), - onPressed: _recoveryKeyInputLoading - ? null - : () async { - setState(() { - _recoveryKeyInputError = null; - _recoveryKeyInputLoading = true; - }); - try { - final key = - _recoveryKeyTextEditingController.text; - await bootstrap.newSsssKey!.unlock( - keyOrPassphrase: key, - ); - Logs().d('SSSS unlocked'); - await bootstrap - .client.encryption!.crossSigning - .selfSign( - keyOrPassphrase: key, - ); - Logs().d('Successful elfsigned'); - await bootstrap.openExistingSsss(); - } catch (e, s) { - Logs().w('Unable to unlock SSSS', e, s); - setState(() => _recoveryKeyInputError = - L10n.of(context)!.oopsSomethingWentWrong); - } finally { - setState( - () => _recoveryKeyInputLoading = false); - } - }), - const SizedBox(height: 16), - Row(children: [ - const Expanded(child: Divider()), - Padding( - padding: const EdgeInsets.all(12.0), - child: Text(L10n.of(context)!.or), - ), - const Expanded(child: Divider()), - ]), - const SizedBox(height: 16), - ElevatedButton.icon( - icon: const Icon(Icons.cast_connected_outlined), - label: Text(L10n.of(context)!.transferFromAnotherDevice), - onPressed: _recoveryKeyInputLoading - ? null - : () async { - final req = await showFutureLoadingDialog( - context: context, - future: () => widget.client - .userDeviceKeys[widget.client.userID!]! - .startVerification(), - ); - if (req.error != null) return; - await KeyVerificationDialog(request: req.result!) - .show(context); - Navigator.of(context, rootNavigator: false).pop(); - }, - ), - const SizedBox(height: 16), - ElevatedButton.icon( - style: ElevatedButton.styleFrom( - onPrimary: Colors.red, - ), - icon: const Icon(Icons.delete_outlined), - label: Text(L10n.of(context)!.recoveryKeyLost), - onPressed: _recoveryKeyInputLoading - ? null - : () async { - if (OkCancelResult.ok == - await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.recoveryKeyLost, - message: L10n.of(context)!.wipeChatBackup, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - isDestructiveAction: true, - )) { - setState(() => _createBootstrap(true)); - } - }, - ) - ], - ), - ), - ), - ); - case BootstrapState.askWipeCrossSigning: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.wipeCrossSigning(_wipe!), - ); - break; - case BootstrapState.askSetupCrossSigning: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.askSetupCrossSigning( - setupMasterKey: true, - setupSelfSigningKey: true, - setupUserSigningKey: true, - ), - ); - break; - case BootstrapState.askWipeOnlineKeyBackup: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.wipeOnlineKeyBackup(_wipe!), - ); - - break; - case BootstrapState.askSetupOnlineKeyBackup: - WidgetsBinding.instance.addPostFrameCallback( - (_) => bootstrap.askSetupOnlineKeyBackup(true), - ); - break; - case BootstrapState.error: - titleText = L10n.of(context)!.oopsSomethingWentWrong; - body = const Icon(Icons.error_outline, color: Colors.red, size: 40); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(false), - )); - break; - case BootstrapState.done: - titleText = L10n.of(context)!.everythingReady; - body = Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset('assets/backup.png', fit: BoxFit.contain), - Text(L10n.of(context)!.yourChatBackupHasBeenSetUp), - ], - ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(false), - )); - break; - } - } - - final title = Text(titleText!); - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: body, - actions: buttons, - ); - } - return AlertDialog( - title: title, - content: body, - actions: buttons, - ); - } -} diff --git a/lib/pages/bootstrap/bootstrap_page.dart b/lib/pages/bootstrap/bootstrap_page.dart new file mode 100644 index 0000000000..777155b94a --- /dev/null +++ b/lib/pages/bootstrap/bootstrap_page.dart @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/bootstrap/view_model/bootstrap_view_model.dart'; +import 'package:fluffychat/pages/bootstrap/widgets/new_passphrase_view.dart'; +import 'package:fluffychat/pages/bootstrap/widgets/restore_bootstrap_view.dart'; +import 'package:fluffychat/pages/bootstrap/widgets/store_recovery_key_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/view_model_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class BootstrapPage extends StatelessWidget { + final bool reset; + const BootstrapPage({required this.reset, super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return ViewModelBuilder( + create: () => + BootstrapViewModel(client: Matrix.of(context).client, reset: reset), + builder: (context, viewModel, _) { + final cryptoIdentityState = viewModel.value.cryptoIdentityState; + if (cryptoIdentityState?.connected == true && !reset) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => viewModel.goToRoomsPageAfterSuccess(context), + ); + } + + final title = cryptoIdentityState == null + ? L10n.of(context).loadingPleaseWait + : cryptoIdentityState.initialized && !viewModel.value.reset + ? L10n.of(context).restoreCryptoIdentity + : viewModel.value.reset + ? viewModel.value.recoveryKey != null + ? L10n.of(context).youAreReadyToStart + : L10n.of(context).resetCryptoIdentity + : L10n.of(context).setUpCryptoIdentity; + + return LoginScaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + leading: viewModel.value.recoveryKey != null + ? null + : CloseButton( + onPressed: () async { + if (!reset) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).skipChatBackup, + message: L10n.of(context).skipChatBackupWarning, + okLabel: L10n.of(context).skip, + isDestructive: true, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + } + context.go('/rooms'); + }, + ), + title: Text(title), + actions: [ + if (viewModel.value.recoveryKey != null) + Padding( + padding: EdgeInsets.all(8), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + padding: EdgeInsets.symmetric(horizontal: 16), + ), + onPressed: () => context.go('/rooms'), + child: Text(L10n.of(context).continueText), + ), + ), + ], + ), + + body: cryptoIdentityState == null + ? Center(child: CircularProgressIndicator.adaptive()) + : !cryptoIdentityState.initialized || viewModel.value.reset + ? viewModel.value.recoveryKey == null + ? NewPassphraseView(viewModel) + : StoreRecoveryKeyView(viewModel) + : RestoreBootstrapView(viewModel), + ); + }, + ); + } +} diff --git a/lib/pages/bootstrap/view_model/bootstrap_state.dart b/lib/pages/bootstrap/view_model/bootstrap_state.dart new file mode 100644 index 0000000000..5f20a30e02 --- /dev/null +++ b/lib/pages/bootstrap/view_model/bootstrap_state.dart @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + +class BootstrapViewModelState { + String? recoveryKey; + bool isLoading = false; + Object? unlockWithError; + ({bool connected, bool initialized})? cryptoIdentityState; + bool reset = false; + KeyVerification? keyVerification; + List? connectedDevices; + bool obscureText = true; + bool waitingForSecrets = false; + bool noSecretsreceived = false; + + bool newPassphraseEqualsRepeatPassphrase = false; + bool newPassphraseLongEnough = false; + bool newPassphraseUpperAndLowerCase = false; + bool newPassphraseSpecialCharacters = false; + bool newPassphraseNumbers = false; + bool passphraseOrRecoveryKeyEntered = false; + bool recoveryKeyDownloaded = false; + bool recoveryKeyStoredInSecureStorage = false; +} diff --git a/lib/pages/bootstrap/view_model/bootstrap_view_model.dart b/lib/pages/bootstrap/view_model/bootstrap_view_model.dart new file mode 100644 index 0000000000..161f83d9c7 --- /dev/null +++ b/lib/pages/bootstrap/view_model/bootstrap_view_model.dart @@ -0,0 +1,313 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + +import 'bootstrap_state.dart'; + +class BootstrapViewModel extends ValueNotifier { + final Client client; + final bool reset; + + final TextEditingController enterPassphraseOrRecovController = + TextEditingController(); + final TextEditingController newPassphraseController = TextEditingController(); + final TextEditingController repeatPassphraseController = + TextEditingController(); + final ScrollController devicesScrollController = ScrollController(); + + BootstrapViewModel({required this.client, required this.reset}) + : super(BootstrapViewModelState()..reset = reset) { + _init(); + } + + @override + void dispose() { + _cancelKeyVerification(); + enterPassphraseOrRecovController.dispose(); + newPassphraseController.dispose(); + repeatPassphraseController.dispose(); + devicesScrollController.dispose(); + super.dispose(); + } + + void _checkCanCreatePassphrase([_]) { + final passphrase = newPassphraseController.text; + value.newPassphraseEqualsRepeatPassphrase = + passphrase.isNotEmpty && passphrase == repeatPassphraseController.text; + value.newPassphraseLongEnough = passphrase.length >= 12; + value.newPassphraseUpperAndLowerCase = + passphrase.contains(RegExp(r'[A-Z]')) && + passphrase.contains(RegExp(r'[a-z]')); + value.newPassphraseSpecialCharacters = passphrase.contains( + RegExp(r'[!@#$%^&*(),.?":{}|<>]'), + ); + value.newPassphraseNumbers = passphrase.contains(RegExp(r'\d')); + notifyListeners(); + } + + Future retryKeyVerification() async { + value.noSecretsreceived = false; + value.keyVerification = await client.userDeviceKeys[client.userID!]! + .startVerification(); + value.keyVerification?.onUpdate = _onKeyVerificationUpdate; + notifyListeners(); + } + + Future _init() async { + final state = value.cryptoIdentityState = await client + .getCryptoIdentityState(); + newPassphraseController.addListener(_checkCanCreatePassphrase); + repeatPassphraseController.addListener(_checkCanCreatePassphrase); + enterPassphraseOrRecovController.addListener( + _passphraseOrRecoveryKeyEntered, + ); + if (state.initialized) { + if (state.connected) return notifyListeners(); + + await client.updateUserDeviceKeys(); + + final devices = value.connectedDevices = + client.userDeviceKeys[client.userID!]?.deviceKeys.values + .where( + (device) => device.hasValidSignatureChain( + verifiedByTheirMasterKey: true, + ), + ) + .toList() ?? + []; + if (devices.isNotEmpty) { + value.keyVerification = await client.userDeviceKeys[client.userID!]! + .startVerification(); + value.keyVerification?.onUpdate = _onKeyVerificationUpdate; + } + if (supportsSecureStorage) { + try { + final keyFromSecureStorage = await FlutterSecureStorage().read( + key: _secureStorageKey, + ); + if (keyFromSecureStorage != null) { + enterPassphraseOrRecovController.text = keyFromSecureStorage; + } + } catch (e, s) { + Logs().e('Unable to read key from secure storage', e, s); + } + } + } + notifyListeners(); + } + + void _passphraseOrRecoveryKeyEntered() { + final passphraseOrRecoveryKeyEntered = + enterPassphraseOrRecovController.text.isNotEmpty; + if (value.passphraseOrRecoveryKeyEntered != + passphraseOrRecoveryKeyEntered) { + value.passphraseOrRecoveryKeyEntered = passphraseOrRecoveryKeyEntered; + notifyListeners(); + } + } + + Future _onKeyVerificationUpdate() async { + if (value.keyVerification?.state == KeyVerificationState.done) { + value.waitingForSecrets = true; + value.noSecretsreceived = false; + notifyListeners(); + value.cryptoIdentityState = await client.getCryptoIdentityState(); + var tries = 0; + const max = 10; + while (value.cryptoIdentityState?.connected != true) { + Logs().d('Waiting for secrets... [$tries/$max]'); + if (tries >= max) return; + await Future.delayed(const Duration(seconds: 1)); + value.cryptoIdentityState = await client.getCryptoIdentityState(); + tries++; + } + + if (value.cryptoIdentityState?.connected != true) { + value.waitingForSecrets = false; + value.noSecretsreceived = true; + } + } + notifyListeners(); + } + + Future setOrSkipPassphrase( + String? passphrase, + BuildContext context, + ) async { + value.isLoading = true; + notifyListeners(); + try { + value.recoveryKey = await client.initCryptoIdentity( + passphrase: passphrase, + wipeCrossSigning: !reset, + wipeKeyBackup: !reset, + wipeSecureStorage: !reset, + setupMasterKey: !reset, + setupSelfSigningKey: !reset, + setupUserSigningKey: !reset, + ); + } catch (e, s) { + if (!context.mounted) return; + ErrorReporter( + context, + 'Unable to init crypto identity', + ).onErrorCallback(e, s); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + value.isLoading = false; + } + notifyListeners(); + } + + void _cancelKeyVerification() { + final keyVerification = value.keyVerification; + if (keyVerification != null && + keyVerification.state != KeyVerificationState.done && + keyVerification.state != KeyVerificationState.error) { + keyVerification.cancel(); + } + } + + bool get supportsSecureStorage => + PlatformInfos.isMobile || PlatformInfos.isDesktop; + + Future unlock(BuildContext context) async { + final key = enterPassphraseOrRecovController.text.trim(); + if (key.isEmpty) return; + + _cancelKeyVerification(); + + value.unlockWithError = null; + value.isLoading = true; + notifyListeners(); + try { + await client.restoreCryptoIdentity(key); + value.isLoading = false; + value.cryptoIdentityState = await client.getCryptoIdentityState(); + notifyListeners(); + return; + } catch (e, s) { + if (e is! InvalidPassphraseException) { + const errorMessage = 'Unexpected error on unlock passphrase'; + if (context.mounted) { + ErrorReporter(context, errorMessage).onErrorCallback(e, s); + } else { + Logs().wtf(errorMessage, e, s); + } + } + value.isLoading = false; + value.unlockWithError = e; + notifyListeners(); + if (supportsSecureStorage) { + await FlutterSecureStorage().delete(key: _secureStorageKey); + } + return; + } + } + + void goToRoomsPageAfterSuccess(BuildContext context) { + for (final room in client.rooms) { + final lastEvent = room.lastEvent; + if (lastEvent == null || + lastEvent.messageType != MessageTypes.BadEncrypted || + lastEvent.content['can_request_session'] != true) { + continue; + } + final sessionId = lastEvent.content.tryGet('session_id'); + final senderKey = lastEvent.content.tryGet('sender_key'); + if (sessionId != null && senderKey != null) { + client.encryption?.keyManager.maybeAutoRequest( + room.id, + sessionId, + senderKey, + ); + } + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: Duration(seconds: 5), + showCloseIcon: true, + backgroundColor: Colors.green.shade700, + content: Text( + L10n.of(context).youAreReadyToStart, + style: TextStyle(color: Colors.white), + ), + ), + ); + context.go('/rooms'); + } + + void toggleObscureText() { + value.obscureText = !value.obscureText; + notifyListeners(); + } + + void startResetAccount() { + value.reset = true; + notifyListeners(); + } + + String get _secureStorageKey => 'ssss_recovery_key_${client.userID}'; + + Future openRecoveryKeyFile(BuildContext context) async { + final result = await FilePicker.pickFile( + allowedExtensions: ['txt'], + type: FileType.custom, + ); + final file = result?.xFile; + if (file == null) return; + try { + final key = await file.readAsString(); + enterPassphraseOrRecovController.text = key; + } catch (e, s) { + Logs().d('Unable to read recovery key file', e, s); + if (context.mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } + if (context.mounted) await unlock(context); + } + + Future toggleRecoveryKeyDownloaded( + bool? downloaded, + BuildContext context, + ) async { + final path = await FilePicker.saveFile( + fileName: + 'FluffyChat-Recovery-Key-${DateTime.now().toIso8601String()}.txt', + bytes: Uint8List.fromList(value.recoveryKey!.codeUnits), + ); + if (path == null) return; + value.recoveryKeyDownloaded = downloaded == true; + notifyListeners(); + } + + Future toggleRecoveryKeyStoredInSecureStorage(bool? stored) async { + if (stored == true) { + await FlutterSecureStorage().write( + key: _secureStorageKey, + value: value.recoveryKey, + ); + } else { + await FlutterSecureStorage().delete(key: _secureStorageKey); + } + value.recoveryKeyStoredInSecureStorage = stored == true; + notifyListeners(); + } +} diff --git a/lib/pages/bootstrap/widgets/new_passphrase_view.dart b/lib/pages/bootstrap/widgets/new_passphrase_view.dart new file mode 100644 index 0000000000..67c70c2a2a --- /dev/null +++ b/lib/pages/bootstrap/widgets/new_passphrase_view.dart @@ -0,0 +1,129 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/bootstrap/view_model/bootstrap_view_model.dart'; +import 'package:flutter/material.dart'; + +class NewPassphraseView extends StatelessWidget { + final BootstrapViewModel viewModel; + + const NewPassphraseView(this.viewModel, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final canCreatePassphrase = + viewModel.value.newPassphraseEqualsRepeatPassphrase && + viewModel.value.newPassphraseNumbers && + viewModel.value.newPassphraseSpecialCharacters && + viewModel.value.newPassphraseUpperAndLowerCase && + viewModel.value.newPassphraseLongEnough; + + return ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Text(L10n.of(context).newPassphraseDescription, textAlign: .center), + const SizedBox(height: 16), + TextField( + obscureText: viewModel.value.obscureText, + readOnly: viewModel.value.isLoading, + controller: viewModel.newPassphraseController, + decoration: InputDecoration( + suffixIcon: IconButton( + icon: Icon( + viewModel.value.obscureText + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + ), + onPressed: viewModel.toggleObscureText, + ), + hintText: L10n.of(context).newPassphrase, + ), + ), + const SizedBox(height: 16), + TextField( + obscureText: viewModel.value.obscureText, + readOnly: viewModel.value.isLoading, + controller: viewModel.repeatPassphraseController, + decoration: InputDecoration( + hintText: L10n.of(context).repeatPassphrase, + ), + ), + const SizedBox(height: 16), + ElevatedButton( + onPressed: canCreatePassphrase && !viewModel.value.isLoading + ? () => viewModel.setOrSkipPassphrase( + viewModel.newPassphraseController.text, + context, + ) + : null, + child: viewModel.value.isLoading + ? CircularProgressIndicator.adaptive() + : Text(L10n.of(context).continueText), + ), + const SizedBox(height: 16), + TextButton( + onPressed: viewModel.value.isLoading + ? null + : () => viewModel.setOrSkipPassphrase(null, context), + style: TextButton.styleFrom(foregroundColor: theme.colorScheme.error), + child: Text(L10n.of(context).skip), + ), + const SizedBox(height: 16), + _PassphraseCheckListTile( + checked: viewModel.value.newPassphraseEqualsRepeatPassphrase, + label: L10n.of(context).passphrasesMatch, + ), + const SizedBox(height: 16), + _PassphraseCheckListTile( + checked: viewModel.value.newPassphraseLongEnough, + label: L10n.of(context).passphraseLengthRequirement, + ), + const SizedBox(height: 16), + _PassphraseCheckListTile( + checked: viewModel.value.newPassphraseUpperAndLowerCase, + label: L10n.of(context).passphraseUpperAndLowerCaseRequirement, + ), + const SizedBox(height: 16), + _PassphraseCheckListTile( + checked: viewModel.value.newPassphraseSpecialCharacters, + label: L10n.of(context).passphraseSpecialCharactersRequirement, + ), + const SizedBox(height: 16), + _PassphraseCheckListTile( + checked: viewModel.value.newPassphraseNumbers, + label: L10n.of(context).passphraseNumberRequirement, + ), + ], + ); + } +} + +class _PassphraseCheckListTile extends StatelessWidget { + final String label; + final bool checked; + const _PassphraseCheckListTile({required this.label, required this.checked}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Row( + spacing: 8.0, + children: [ + Icon( + checked ? Icons.check_circle_outlined : Icons.circle_outlined, + color: checked + ? theme.brightness == Brightness.light + ? Colors.green.shade800 + : Colors.green.shade300 + : theme.colorScheme.error, + size: 20, + ), + Text(label, style: TextStyle(fontSize: 12)), + ], + ); + } +} diff --git a/lib/pages/bootstrap/widgets/restore_bootstrap_view.dart b/lib/pages/bootstrap/widgets/restore_bootstrap_view.dart new file mode 100644 index 0000000000..568b799da7 --- /dev/null +++ b/lib/pages/bootstrap/widgets/restore_bootstrap_view.dart @@ -0,0 +1,198 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/bootstrap/view_model/bootstrap_view_model.dart'; +import 'package:fluffychat/pages/key_verification/key_verification_dialog.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/device_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/matrix.dart'; + +class RestoreBootstrapView extends StatelessWidget { + final BootstrapViewModel viewModel; + + const RestoreBootstrapView(this.viewModel, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final keyVerification = viewModel.value.keyVerification; + if (keyVerification != null) { + Logs().v('Key verification state:', keyVerification.state); + if (keyVerification.state == KeyVerificationState.askSas) { + WidgetsBinding.instance.addPostFrameCallback((_) { + KeyVerificationDialog(request: keyVerification).show(context); + }); + } + } + final devices = + viewModel.value.connectedDevices + ?.map( + (device) => ( + title: device.displayname, + lastActive: device.lastActive, + icon: device.icon, + ), + ) + .toList() ?? + []; + return ListView( + padding: const EdgeInsets.all(16.0), + children: [ + if (keyVerification != null) ...[ + ListTile( + leading: + (keyVerification.state == KeyVerificationState.error || + viewModel.value.noSecretsreceived) + ? IconButton( + onPressed: viewModel.value.isLoading + ? null + : viewModel.retryKeyVerification, + tooltip: L10n.of(context).tryAgain, + icon: Icon(Icons.refresh_outlined), + ) + : Padding( + padding: const EdgeInsets.all(10.0), + child: CircularProgressIndicator.adaptive(), + ), + minLeadingWidth: 40, + title: Text( + viewModel.value.waitingForSecrets + ? L10n.of(context).waitingForKeys + : viewModel.value.noSecretsreceived + ? L10n.of(context).noKeysTransmitted + : L10n.of(context).restoreBootstrapDevicesDescription, + + style: TextStyle(fontSize: 14), + ), + ), + const SizedBox(height: 16), + Material( + color: theme.colorScheme.surfaceContainer, + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: ConstrainedBox( + constraints: BoxConstraints(maxHeight: 128), + child: Scrollbar( + thumbVisibility: true, + trackVisibility: true, + controller: viewModel.devicesScrollController, + child: ListView.builder( + controller: viewModel.devicesScrollController, + shrinkWrap: true, + itemCount: devices.length, + itemBuilder: (context, i) => ListTile( + leading: CircleAvatar( + foregroundColor: theme.colorScheme.onPrimary, + backgroundColor: theme.colorScheme.primary, + child: Icon(devices[i].icon), + ), + title: Text( + devices[i].title, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle(fontSize: 14), + ), + subtitle: Text( + L10n.of(context).lastActiveAgo( + devices[i].lastActive.localizedTime(context), + ), + style: TextStyle(fontSize: 11), + ), + ), + ), + ), + ), + ), + Row( + children: [ + Expanded(child: Divider(height: 64)), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16), + child: Text(L10n.of(context).or), + ), + Expanded(child: Divider(height: 64)), + ], + ), + ] else ...[ + Text( + L10n.of(context).restoreBootstrapEmptyDevicesDescription, + textAlign: .center, + ), + const SizedBox(height: 32), + ], + TextField( + readOnly: viewModel.value.isLoading, + obscureText: viewModel.value.obscureText, + controller: viewModel.enterPassphraseOrRecovController, + minLines: 1, + maxLines: viewModel.value.obscureText ? 1 : 4, + onSubmitted: (_) => viewModel.unlock(context), + decoration: InputDecoration( + hintText: L10n.of(context).passphraseOrKey, + prefixIcon: IconButton( + icon: Icon( + viewModel.value.obscureText + ? Icons.visibility_outlined + : Icons.visibility_off_outlined, + ), + onPressed: viewModel.toggleObscureText, + ), + errorText: viewModel.value.unlockWithError?.toLocalizedString( + context, + ), + errorMaxLines: 4, + suffixIcon: viewModel.value.isLoading + ? SizedBox.square( + dimension: 32, + child: Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + ) + : TextButton( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + ), + ), + onPressed: viewModel.value.passphraseOrRecoveryKeyEntered + ? () => viewModel.unlock(context) + : () => viewModel.openRecoveryKeyFile(context), + child: Text( + viewModel.value.passphraseOrRecoveryKeyEntered + ? L10n.of(context).unlock + : L10n.of(context).openFile, + ), + ), + ), + ), + const SizedBox(height: 16), + TextButton( + onPressed: () async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).warning, + message: L10n.of(context).resetAccountWarning, + isDestructive: true, + okLabel: L10n.of(context).resetAccount, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + viewModel.startResetAccount(); + }, + style: TextButton.styleFrom(foregroundColor: theme.colorScheme.error), + child: Text(L10n.of(context).resetAccount), + ), + ], + ); + } +} diff --git a/lib/pages/bootstrap/widgets/store_recovery_key_view.dart b/lib/pages/bootstrap/widgets/store_recovery_key_view.dart new file mode 100644 index 0000000000..7939c167c5 --- /dev/null +++ b/lib/pages/bootstrap/widgets/store_recovery_key_view.dart @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/bootstrap/view_model/bootstrap_view_model.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; + +class StoreRecoveryKeyView extends StatelessWidget { + final BootstrapViewModel viewModel; + const StoreRecoveryKeyView(this.viewModel, {super.key}); + + @override + Widget build(BuildContext context) { + return ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Text(L10n.of(context).storeRecoveryKeyDescription), + const SizedBox(height: 16), + TextField( + controller: TextEditingController(text: viewModel.value.recoveryKey), + readOnly: true, + minLines: 2, + maxLines: 4, + decoration: InputDecoration( + suffixIcon: IconButton( + icon: Icon(Icons.copy_outlined), + onPressed: () => + FluffyShare.share(viewModel.value.recoveryKey!, context), + ), + ), + ), + const SizedBox(height: 16), + CheckboxListTile.adaptive( + value: viewModel.value.recoveryKeyDownloaded, + onChanged: (copied) => + viewModel.toggleRecoveryKeyDownloaded(copied, context), + title: Text(L10n.of(context).saveAsFile), + ), + if (viewModel.supportsSecureStorage) + CheckboxListTile.adaptive( + value: viewModel.value.recoveryKeyStoredInSecureStorage, + onChanged: viewModel.toggleRecoveryKeyStoredInSecureStorage, + title: Text(_getSecureStorageLocalizedName(context)), + ), + ], + ); + } + + String _getSecureStorageLocalizedName(BuildContext context) { + if (PlatformInfos.isAndroid) { + return L10n.of(context).storeInAndroidKeystore; + } + if (PlatformInfos.isIOS || PlatformInfos.isMacOS) { + return L10n.of(context).storeInAppleKeyChain; + } + return L10n.of(context).storeSecurlyOnThisDevice; + } +} diff --git a/lib/pages/chat/add_widget_tile.dart b/lib/pages/chat/add_widget_tile.dart deleted file mode 100644 index 1034083bf8..0000000000 --- a/lib/pages/chat/add_widget_tile.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pages/chat/add_widget_tile_view.dart'; - -class AddWidgetTile extends StatefulWidget { - final Room room; - - const AddWidgetTile({Key? key, required this.room}) : super(key: key); - - @override - State createState() => AddWidgetTileState(); -} - -class AddWidgetTileState extends State { - final TextEditingController urlController = TextEditingController(); - final TextEditingController nameController = TextEditingController(); - String widgetType = 'm.etherpad'; - - late final bool initiallyExpanded; - - String? nameError; - String? urlError; - - @override - void initState() { - initiallyExpanded = widget.room.widgets.isEmpty; - super.initState(); - } - - void setWidgetType(String value) => setState(() => widgetType = value); - - void addWidget() { - try { - nameError = null; - urlError = null; - - final room = widget.room; - final name = nameController.text; - final uri = Uri.tryParse(urlController.text); - - if (name.length < 3) { - setState(() { - nameError = L10n.of(context)!.widgetNameError; - }); - return; - } - - if (uri == null || uri.scheme != 'https') { - setState(() { - urlError = L10n.of(context)!.widgetUrlError; - }); - return; - } - setState(() {}); - - late MatrixWidget matrixWidget; - switch (widgetType) { - case 'm.etherpad': - matrixWidget = MatrixWidget.etherpad(room, name, uri); - break; - case 'm.jitsi': - matrixWidget = MatrixWidget.jitsi(room, name, uri); - break; - case 'm.video': - matrixWidget = MatrixWidget.video(room, name, uri); - break; - default: - matrixWidget = MatrixWidget.custom(room, name, uri); - break; - } - widget.room.addWidget(matrixWidget); - Navigator.of(context).pop(); - } catch (e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.errorAddingWidget))); - } - } - - @override - Widget build(BuildContext context) => AddWidgetTileView(controller: this); -} diff --git a/lib/pages/chat/add_widget_tile_view.dart b/lib/pages/chat/add_widget_tile_view.dart deleted file mode 100644 index 0f98b7cc0a..0000000000 --- a/lib/pages/chat/add_widget_tile_view.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/pages/chat/add_widget_tile.dart'; - -class AddWidgetTileView extends StatelessWidget { - final AddWidgetTileState controller; - - const AddWidgetTileView({Key? key, required this.controller}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return ExpansionTile( - title: Text(L10n.of(context)!.addWidget), - leading: const Icon(Icons.add), - initiallyExpanded: controller.initiallyExpanded, - children: [ - CupertinoSegmentedControl( - groupValue: controller.widgetType, - padding: const EdgeInsets.all(8), - children: { - 'm.etherpad': Text(L10n.of(context)!.widgetEtherpad), - 'm.jitsi': Text(L10n.of(context)!.widgetJitsi), - 'm.video': Text(L10n.of(context)!.widgetVideo), - 'm.custom': Text(L10n.of(context)!.widgetCustom), - }.map((key, value) => MapEntry( - key, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: value, - ))), - onValueChanged: controller.setWidgetType, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: controller.nameController, - autofocus: true, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.label), - label: Text(L10n.of(context)!.widgetName), - errorText: controller.nameError, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: controller.urlController, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.add_link), - label: Text(L10n.of(context)!.link), - errorText: controller.urlError, - ), - ), - ), - ButtonBar( - children: [ - TextButton( - onPressed: controller.addWidget, - child: Text(L10n.of(context)!.addWidget), - ), - ], - ) - ], - ); - } -} diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 4d9640be05..5911070b78 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1,89 +1,154 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; import 'dart:io'; -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:flutter/services.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:collection/collection.dart'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:record/record.dart'; -import 'package:scroll_to_index/scroll_to_index.dart'; -import 'package:vrouter/vrouter.dart'; - +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat_view.dart'; import 'package:fluffychat/pages/chat/event_info_dialog.dart'; -import 'package:fluffychat/pages/chat/recording_dialog.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/event_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/pages/chat/start_poll_bottom_sheet.dart'; +import 'package:fluffychat/pages/chat/trust_user_key_dialog.dart'; +import 'package:fluffychat/pages/chat/utils/web_file_to_x_file.dart'; +import 'package:fluffychat/pages/chat_details/chat_details.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/voip/callkeep_manager.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; +import 'package:mime/mime.dart'; +import 'package:pasteboard/pasteboard.dart'; +import 'package:scroll_to_index/scroll_to_index.dart'; +import 'package:universal_html/universal_html.dart' as web; + import '../../utils/account_bundles.dart'; import '../../utils/localized_exception_extension.dart'; -import '../../utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart'; -import '../../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; import 'send_file_dialog.dart'; import 'send_location_dialog.dart'; -import 'sticker_picker_dialog.dart'; -class Chat extends StatefulWidget { - final Widget? sideView; +class ChatPage extends StatelessWidget { + final String roomId; + final List? shareItems; + final String? eventId; - const Chat({Key? key, this.sideView}) : super(key: key); + const ChatPage({ + super.key, + required this.roomId, + this.eventId, + this.shareItems, + }); + + @override + Widget build(BuildContext context) { + final room = Matrix.of(context).client.getRoomById(roomId); + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ), + ); + } + + return ChatPageWithRoom( + key: Key('chat_page_${roomId}_$eventId'), + room: room, + shareItems: shareItems, + eventId: eventId, + ); + } +} + +class ChatPageWithRoom extends StatefulWidget { + final Room room; + final List? shareItems; + final String? eventId; + + const ChatPageWithRoom({ + super.key, + required this.room, + this.shareItems, + this.eventId, + }); @override ChatController createState() => ChatController(); } -class ChatController extends State { - Room? room; +class ChatController extends State + with WidgetsBindingObserver { + Room get room => sendingClient.getRoomById(roomId) ?? widget.room; - Client? sendingClient; + late Client sendingClient; Timeline? timeline; - MatrixState? matrix; + String? activeThreadId; + + late final Set bigEmojis; - String? get roomId => context.vRouter.pathParameters['roomid']; + late final String readMarkerEventId; + + String get roomId => widget.room.id; final AutoScrollController scrollController = AutoScrollController(); - FocusNode inputFocus = FocusNode(); + late final FocusNode inputFocus; Timer? typingCoolDown; Timer? typingTimeout; bool currentlyTyping = false; bool dragging = false; + final GlobalKey inputBarKey = GlobalKey(); + void onDragEntered(_) => setState(() => dragging = true); void onDragExited(_) => setState(() => dragging = false); - void onDragDone(DropDoneDetails details) async { + Future onDragDone(DropDoneDetails details) async { setState(() => dragging = false); - for (final xfile in details.files) { - final bytes = await xfile.readAsBytes(); - await showDialog( - context: context, - useRootNavigator: false, - builder: (c) => SendFileDialog( - file: MatrixFile( - bytes: bytes, - name: xfile.name, - ).detectFileType, - room: room!, - ), - ); - } + if (details.files.isEmpty) return; + + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: details.files, + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, + ), + ); } bool get canSaveSelectedEvent => @@ -96,50 +161,100 @@ class ChatController extends State { MessageTypes.File, }.contains(selectedEvents.single.messageType); - void saveSelectedEvent() => selectedEvents.single.saveFile(context); + void saveSelectedEvent(BuildContext context) => + selectedEvents.single.saveFile(context); List selectedEvents = []; - late List filteredEvents; - final Set unfolded = {}; Event? replyEvent; Event? editEvent; - bool showScrollDownButton = false; + bool _scrolledUp = false; + + bool get showScrollDownButton => + _scrolledUp || timeline?.allowNewEvent == false; bool get selectMode => selectedEvents.isNotEmpty; final int _loadHistoryCount = 100; - String inputText = ''; - String pendingText = ''; - bool get canLoadMore => - timeline!.events.isEmpty || - timeline!.events.last.type != EventTypes.RoomCreate; - bool showEmojiPicker = false; - EmojiPickerType emojiPickerType = EmojiPickerType.keyboard; - - void requestHistory() async { - if (canLoadMore) { - try { - await timeline!.requestHistory(historyCount: _loadHistoryCount); - } catch (err) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - (err).toLocalizedString(context), - ), - ), + String? get threadLastEventId { + final threadId = activeThreadId; + if (threadId == null) return null; + return timeline?.events + .filterByVisibleInGui(threadId: threadId) + .firstOrNull + ?.eventId; + } + + void enterThread(String eventId) => setState(() { + activeThreadId = eventId; + selectedEvents.clear(); + }); + + void closeThread() => setState(() { + activeThreadId = null; + selectedEvents.clear(); + }); + + Future recreateChat() async { + final room = this.room; + final userId = room.directChatMatrixID; + if (userId == null) { + throw Exception( + 'Try to recreate a room with is not a DM room. This should not be possible from the UI!', + ); + } + await showFutureLoadingDialog( + context: context, + future: () => room.invite(userId), + ); + } + + Future leaveChat() async { + final success = await showFutureLoadingDialog( + context: context, + future: room.leave, + ); + if (!mounted) return; + if (success.error != null) return; + context.go('/rooms'); + } + + Future requestHistory([_]) async { + Logs().v('Requesting history...'); + await timeline?.requestHistory(historyCount: _loadHistoryCount); + } + + Future requestFuture() async { + final timeline = this.timeline; + if (timeline == null) return; + Logs().v('Requesting future...'); + + final mostRecentEvent = timeline.events.filterByVisibleInGui().firstOrNull; + + await timeline.requestFuture(historyCount: _loadHistoryCount); + + if (mostRecentEvent != null) { + setReadMarker(eventId: mostRecentEvent.eventId); + WidgetsBinding.instance.addPostFrameCallback((_) { + final index = timeline.events.filterByVisibleInGui().indexOf( + mostRecentEvent, ); - rethrow; - } + if (index >= 0) { + scrollController.scrollToIndex( + index, + preferPosition: AutoScrollPosition.begin, + ); + } + }); } } @@ -147,139 +262,392 @@ class ChatController extends State { if (!mounted) { return; } - setReadMarker(); if (!scrollController.hasClients) return; - if (scrollController.position.pixels == - scrollController.position.maxScrollExtent && - timeline!.events.isNotEmpty && - timeline!.events[timeline!.events.length - 1].type != - EventTypes.RoomCreate) { - requestHistory(); + if (timeline?.allowNewEvent == false || + scrollController.position.pixels > 0 && _scrolledUp == false) { + setState(() => _scrolledUp = true); + } else if (scrollController.position.pixels <= 0 && _scrolledUp == true) { + setState(() => _scrolledUp = false); + setReadMarker(); + } + } + + void _loadDraft() { + final prefs = Matrix.of(context).store; + final draft = prefs.getString('draft_$roomId'); + if (draft != null && draft.isNotEmpty) { + sendController.text = draft; + } + } + + Future _shareItems([_]) async { + final shareItems = widget.shareItems; + if (shareItems == null || shareItems.isEmpty) return; + if (!room.otherPartyCanReceiveMessages) { + final theme = Theme.of(context); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: theme.colorScheme.errorContainer, + closeIconColor: theme.colorScheme.onErrorContainer, + content: Text( + L10n.of(context).otherPartyNotLoggedIn, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + showCloseIcon: true, + ), + ); + return; } - if (scrollController.position.pixels > 0 && showScrollDownButton == false) { - setState(() => showScrollDownButton = true); - } else if (scrollController.position.pixels == 0 && - showScrollDownButton == true) { - setState(() => showScrollDownButton = false); + final proceed = await showTrustUserInRoomDialog(context, room); + if (!mounted || !proceed) return; + for (final item in shareItems) { + if (item is FileShareItem) continue; + if (item is TextShareItem) room.sendTextEvent(item.value); + if (item is ContentShareItem) room.sendEvent(item.value.copy()); + } + final files = shareItems + .whereType() + .map((item) => item.value) + .toList(); + if (files.isEmpty) return; + showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: files, + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, + ), + ); + } + + KeyEventResult _customEnterKeyHandling(FocusNode node, KeyEvent evt) { + if (evt is KeyDownEvent && + evt.logicalKey == LogicalKeyboardKey.arrowUp && + !PlatformInfos.isMobile && + editEvent == null && + replyEvent == null && + sendController.text.isEmpty) { + _editLastSentMessage(); + return KeyEventResult.handled; + } + + if (evt is KeyDownEvent && + evt.logicalKey == LogicalKeyboardKey.escape && + editEvent != null) { + _cancelEditWithConfirmation(); + return KeyEventResult.handled; + } + + if (!HardwareKeyboard.instance.isShiftPressed && + evt.logicalKey.keyLabel == 'Enter' && + AppSettings.sendOnEnter.value) { + if (evt is KeyDownEvent) { + send(); + } + return KeyEventResult.handled; + } else if (evt.logicalKey.keyLabel == 'Enter' && evt is KeyDownEvent) { + final currentLineNum = + sendController.text + .substring(0, sendController.selection.baseOffset) + .split('\n') + .length - + 1; + final currentLine = sendController.text.split('\n')[currentLineNum]; + + for (final pattern in [ + '- [ ] ', + '- [x] ', + '* [ ] ', + '* [x] ', + '- ', + '* ', + '+ ', + ]) { + if (currentLine.startsWith(pattern)) { + if (currentLine == pattern) { + return KeyEventResult.ignored; + } + sendController.text += '\n$pattern'; + return KeyEventResult.handled; + } + } + + return KeyEventResult.ignored; + } else { + return KeyEventResult.ignored; } } @override void initState() { + inputFocus = FocusNode(onKeyEvent: _customEnterKeyHandling); + scrollController.addListener(_updateScrollController); inputFocus.addListener(_inputFocusListener); - final voipPlugin = Matrix.of(context).voipPlugin; - if (voipPlugin != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - CallKeepManager().setVoipPlugin(voipPlugin); - CallKeepManager().initialize().catchError((_) => true); - }); - } + _loadDraft(); + WidgetsBinding.instance.addPostFrameCallback(_shareItems); + web.window.addEventListener('paste', _handleClipboardFilePasteWeb); super.initState(); - } + _displayChatDetailsColumn = ValueNotifier( + AppSettings.displayChatDetailsColumn.value, + ); - void updateView() { - if (!mounted) return; - setState( - () { - filteredEvents = timeline!.getFilteredEvents(unfolded: unfolded); + bigEmojis = defaultEmojiSet.fold( + {}, + (emojis, category) => { + ...emojis, + ...(category.emoji.map((emoji) => emoji.emoji)), }, ); + + sendingClient = Matrix.of(context).client; + final lastEventThreadId = + room.lastEvent?.relationshipType == RelationshipTypes.thread + ? room.lastEvent?.relationshipEventId + : null; + readMarkerEventId = room.hasNewMessages + ? lastEventThreadId ?? room.fullyRead + : ''; + WidgetsBinding.instance.addObserver(this); + _tryLoadTimeline(); } - void unfold(String eventId) { - var i = filteredEvents.indexWhere((e) => e.eventId == eventId); + final Set expandedEventIds = {}; + + void expandEventsFrom(Event event, bool expand) { + final events = timeline!.events.filterByVisibleInGui( + threadId: activeThreadId, + ); + final start = events.indexOf(event); setState(() { - while (i < filteredEvents.length - 1 && filteredEvents[i].isState) { - unfolded.add(filteredEvents[i].eventId); - i++; + for (var i = start; i < events.length; i++) { + final event = events[i]; + if (!event.isCollapsedState) return; + if (expand) { + expandedEventIds.add(event.eventId); + } else { + expandedEventIds.remove(event.eventId); + } } - filteredEvents = timeline!.getFilteredEvents(unfolded: unfolded); }); } - Future getTimeline() async { - if (timeline == null) { - timeline = await room!.getTimeline(onUpdate: updateView); - if (timeline!.events.isNotEmpty) { - if (room!.markedUnread) room!.markUnread(false); - setReadMarker(); + Future _tryLoadTimeline() async { + final initialEventId = widget.eventId; + loadTimelineFuture = _getTimeline(); + try { + await loadTimelineFuture; + // We launched the chat with a given initial event ID: + if (initialEventId != null) { + scrollToEventId(initialEventId); + return; } - // when the scroll controller is attached we want to scroll to an event id, if specified - // and update the scroll controller...which will trigger a request history, if the - // "load more" button is visible on the screen - SchedulerBinding.instance.addPostFrameCallback((_) async { - if (mounted) { - final event = VRouter.of(context).queryParameters['event']; - if (event != null) { - scrollToEventId(event); - } - _updateScrollController(); - } - }); + var readMarkerEventIndex = readMarkerEventId.isEmpty + ? -1 + : timeline!.events + .filterByVisibleInGui( + exceptionEventId: readMarkerEventId, + threadId: activeThreadId, + ) + .indexWhere((e) => e.eventId == readMarkerEventId); + + // Read marker is existing but not found in first events. Try a single + // requestHistory call before opening timeline on event context: + if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + await timeline?.requestHistory(historyCount: _loadHistoryCount); + readMarkerEventIndex = timeline!.events + .filterByVisibleInGui( + exceptionEventId: readMarkerEventId, + threadId: activeThreadId, + ) + .indexWhere((e) => e.eventId == readMarkerEventId); + } + + if (readMarkerEventIndex > 1) { + Logs().v('Scroll up to visible event', readMarkerEventId); + scrollToEventId(readMarkerEventId, highlightEvent: false); + return; + } else if (readMarkerEventId.isNotEmpty && readMarkerEventIndex == -1) { + _showScrollUpMaterialBanner(readMarkerEventId); + } + + // Mark room as read on first visit if requirements are fulfilled + setReadMarker(); + + if (!mounted) return; + } catch (e, s) { + ErrorReporter(context, 'Unable to load timeline').onErrorCallback(e, s); + rethrow; } - filteredEvents = timeline!.getFilteredEvents(unfolded: unfolded); - timeline!.requestKeys(); - return true; + } + + String? scrollUpBannerEventId; + + void discardScrollUpBannerEventId() => setState(() { + scrollUpBannerEventId = null; + }); + + void _showScrollUpMaterialBanner(String eventId) => setState(() { + scrollUpBannerEventId = eventId; + }); + + String? animateInEventId; + + Future _insert(int index) async { + if (index > 0) return; + final firstEvent = timeline?.events.firstOrNull; + final eventId = firstEvent?.transactionId ?? firstEvent?.eventId; + animateInEventId = eventId; + await Future.delayed(FluffyThemes.animationDuration); + if (animateInEventId == eventId) animateInEventId = null; + } + + void updateView() { + if (!mounted) return; + setReadMarker(); + setState(() {}); + } + + Future? loadTimelineFuture; + + Future _getTimeline({String? eventContextId}) async { + final matrix = Matrix.of(context); + await matrix.client.roomsLoading; + await matrix.client.accountDataLoading; + if (eventContextId != null && + (!eventContextId.isValidMatrixIdStrict() || + eventContextId.sigil != '\$')) { + eventContextId = null; + } + try { + timeline?.cancelSubscriptions(); + timeline = await room.getTimeline( + onUpdate: updateView, + onInsert: _insert, + eventContextId: eventContextId, + ); + } catch (e, s) { + Logs().w('Unable to load timeline on event ID $eventContextId', e, s); + if (!mounted) return; + timeline = await room.getTimeline(onUpdate: updateView); + if (!mounted) return; + if (e is TimeoutException || e is IOException) { + _showScrollUpMaterialBanner(eventContextId!); + } + } + timeline!.requestKeys(onlineKeyBackupOnly: false); + if (room.markedUnread) room.markUnread(false); + + return; + } + + String? scrollToEventIdMarker; + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state != AppLifecycleState.resumed) return; + if (!mounted) return; + setReadMarker(); } Future? _setReadMarkerFuture; - void setReadMarker([_]) { - if (_setReadMarkerFuture == null && - (room!.hasNewMessages || room!.notificationCount > 0) && - timeline != null && - timeline!.events.isNotEmpty && - Matrix.of(context).webHasFocus) { - Logs().v('Set read marker...'); - // ignore: unawaited_futures - _setReadMarkerFuture = timeline!.setReadMarker().then((_) { - _setReadMarkerFuture = null; - }); - room!.client.updateIosBadge(); + void setReadMarker({String? eventId}) { + if (eventId?.isValidMatrixIdStrict() == false) return; + if (_setReadMarkerFuture != null) return; + if (_scrolledUp) return; + if (scrollUpBannerEventId != null) return; + + if (eventId == null && + !room.hasNewMessages && + room.notificationCount == 0) { + return; } + + // Do not send read markers when app is not in foreground + if (WidgetsBinding.instance.lifecycleState != AppLifecycleState.resumed) { + return; + } + + final timeline = this.timeline; + if (timeline == null || timeline.events.isEmpty) return; + + Logs().d('Set read marker...', eventId); + // ignore: unawaited_futures + _setReadMarkerFuture = timeline + .setReadMarker( + eventId: eventId, + public: AppSettings.sendPublicReadReceipts.value, + ) + .then((_) { + _setReadMarkerFuture = null; + }); } @override void dispose() { timeline?.cancelSubscriptions(); timeline = null; + _storeInputTimeoutTimer?.cancel(); + typingCoolDown?.cancel(); + typingTimeout?.cancel(); + sendController.dispose(); + scrollController.dispose(); inputFocus.removeListener(_inputFocusListener); + inputFocus.dispose(); + web.window.removeEventListener('paste', _handleClipboardFilePasteWeb); + if (currentlyTyping) room.setTyping(false); + MxcImage.clearCache(widget.room.id); super.dispose(); } TextEditingController sendController = TextEditingController(); - void setSendingClient(Client? c) { - // first cancle typing with the old sending client + void setSendingClient(Client c) { + // first cancel typing with the old sending client if (currentlyTyping) { // no need to have the setting typing to false be blocking typingCoolDown?.cancel(); typingCoolDown = null; - room!.setTyping(false); + room.setTyping(false); currentlyTyping = false; } + // then cancel the old timeline + // fixes bug with read reciepts and quick switching + loadTimelineFuture = _getTimeline(eventContextId: room.fullyRead).onError( + ErrorReporter( + context, + 'Unable to load timeline after changing sending Client', + ).onErrorCallback, + ); + // then set the new sending client setState(() => sendingClient = c); } void setActiveClient(Client c) => setState(() { - Matrix.of(context).setActiveClient(c); - }); + Matrix.of(context).setActiveClient(c); + }); Future send() async { + final proceed = await showTrustUserInRoomDialog(context, room); + if (!mounted || !proceed) return; if (sendController.text.trim().isEmpty) return; + _storeInputTimeoutTimer?.cancel(); + final prefs = Matrix.of(context).store; + prefs.remove('draft_$roomId'); var parseCommands = true; final commandMatch = RegExp(r'^\/(\w+)').firstMatch(sendController.text); if (commandMatch != null && - !room!.client.commands.keys.contains(commandMatch[1]!.toLowerCase())) { - final l10n = L10n.of(context)!; + !sendingClient.commands.keys.contains(commandMatch[1]!.toLowerCase())) { + final l10n = L10n.of(context); final dialogResult = await showOkCancelAlertDialog( context: context, - useRootNavigator: false, title: l10n.commandInvalid, message: l10n.commandMissing(commandMatch[0]!), okLabel: l10n.sendAsText, @@ -290,158 +658,242 @@ class ChatController extends State { } // ignore: unawaited_futures - room!.sendTextEvent(sendController.text, - inReplyTo: replyEvent, - editEventId: editEvent?.eventId, - parseCommands: parseCommands); + room.sendTextEvent( + sendController.text, + inReplyTo: replyEvent, + editEventId: editEvent?.eventId, + parseCommands: parseCommands, + threadRootEventId: activeThreadId, + ); sendController.value = TextEditingValue( text: pendingText, selection: const TextSelection.collapsed(offset: 0), ); setState(() { - inputText = pendingText; + sendController.text = pendingText; + _inputTextIsEmpty = pendingText.isEmpty; replyEvent = null; editEvent = null; pendingText = ''; }); } - void sendFileAction() async { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.any); - if (result.fileName == null) return; - await showDialog( + Future sendFileAction({FileType type = FileType.any}) async { + final files = await selectFiles(context, allowMultiple: true, type: type); + if (files.isEmpty) return; + if (!mounted) return; + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixFile( - bytes: result.toUint8List(), - name: result.fileName!, - ).detectFileType, - room: room!, + files: files, + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, ), ); } - void sendImageAction() async { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; - await showDialog( + Future sendImageFromClipBoard(Uint8List? image) async { + if (image == null) return; + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixImageFile( - bytes: result.toUint8List(), - name: result.fileName!, - ), - room: room!, + files: [XFile.fromData(image)], + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, ), ); } - void openCameraAction() async { + Future openCameraAction() async { // Make sure the textfield is unfocused before opening the camera FocusScope.of(context).requestFocus(FocusNode()); final file = await ImagePicker().pickImage(source: ImageSource.camera); if (file == null) return; - final bytes = await file.readAsBytes(); - await showDialog( + if (!mounted) return; + + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixImageFile( - bytes: bytes, - name: file.path, - ), - room: room!, + files: [file], + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, ), ); } - void openVideoCameraAction() async { + Future _handleClipboardFilePasteWeb(web.Event event) async { + if (event is! web.ClipboardEvent) return; + + final clipboardFiles = event.clipboardData?.files; + final length = clipboardFiles?.length ?? 0; + if (clipboardFiles == null || length < 1) return; + + // Browser will clear clipboardData when we await! + // We MUST extract the files synchronously first. + final localFiles = clipboardFiles.toList(); + + if (localFiles.isEmpty) return; + + event.preventDefault(); + event.stopPropagation(); + + final xFilesResult = await showFutureLoadingDialog( + context: context, + future: () async { + // Convert one after another seems to be more stable + final xFiles = []; + for (final file in localFiles) { + xFiles.add(await webToXFile(file)); + } + return xFiles; + }, + ); + final xFiles = xFilesResult.result; + if (xFiles == null || xFiles.isEmpty) return; + + if (!mounted) return; + showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: xFiles, + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, + ), + ); + } + + Future _handleClipboardImagePaste() async { + final files = await Pasteboard.files(); + if (files.isNotEmpty) { + if (!mounted) return; + await showAdaptiveDialog( + context: context, + builder: (c) => SendFileDialog( + files: files.map(XFile.new).toList(), + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, + ), + ); + return; + } + final image = await Pasteboard.image; + if (image != null) { + await sendImageFromClipBoard(image); + return; + } + // No image in clipboard — fall back to pasting text + final textData = await Clipboard.getData('text/plain'); + if (textData?.text != null) { + final selection = sendController.selection; + final text = sendController.text; + final newText = text.replaceRange( + selection.start, + selection.end, + textData!.text!, + ); + sendController.value = TextEditingValue( + text: newText, + selection: TextSelection.collapsed( + offset: selection.start + textData.text!.length, + ), + ); + onInputBarChanged(sendController.text); + } + } + + Future openVideoCameraAction() async { // Make sure the textfield is unfocused before opening the camera FocusScope.of(context).requestFocus(FocusNode()); - final file = await ImagePicker().pickVideo(source: ImageSource.camera); + final file = await ImagePicker().pickVideo( + source: ImageSource.camera, + maxDuration: const Duration(minutes: 1), + ); if (file == null) return; - final bytes = await file.readAsBytes(); - await showDialog( + if (!mounted) return; + + await showAdaptiveDialog( context: context, - useRootNavigator: false, builder: (c) => SendFileDialog( - file: MatrixVideoFile( - bytes: bytes, - name: file.path, - ), - room: room!, + files: [file], + room: room, + outerContext: context, + threadRootEventId: activeThreadId, + threadLastEventId: threadLastEventId, ), ); } - void sendStickerAction() async { - final sticker = await showModalBottomSheet( + Future onVoiceMessageSend( + String path, + int duration, + List waveform, + String fileName, + ) async { + final proceed = await showTrustUserInRoomDialog(context, room); + if (!mounted || !proceed) return; + final scaffoldMessenger = ScaffoldMessenger.of(context); + final audioFile = XFile(path); + + final bytesResult = await showFutureLoadingDialog( context: context, - useRootNavigator: false, - builder: (c) => StickerPickerDialog(room: room!), + future: audioFile.readAsBytes, ); - if (sticker == null) return; - final eventContent = { - 'body': sticker.body, - if (sticker.info != null) 'info': sticker.info, - 'url': sticker.url.toString(), - }; - // send the sticker - await room!.sendEvent( - eventContent, - type: EventTypes.Sticker, - ); - } - - void voiceMessageAction() async { - if (PlatformInfos.isAndroid) { - final info = await DeviceInfoPlugin().androidInfo; - if ((info.version.sdkInt ?? 16) < 19) { - showOkAlertDialog( - context: context, - title: L10n.of(context)!.unsupportedAndroidVersion, - message: L10n.of(context)!.unsupportedAndroidVersionLong, - okLabel: L10n.of(context)!.close, - ); - return; - } + final bytes = bytesResult.result; + if (bytes == null) return; + + final mimeType = lookupMimeType(fileName, headerBytes: bytes); + final extension = mimeType == null ? null : extensionFromMime(mimeType); + if (extension != null) { + fileName = + 'voice_message_${DateTime.now().millisecondsSinceEpoch}.$extension'; } - if (await Record().hasPermission() == false) return; - final result = await showDialog( - context: context, - useRootNavigator: false, - builder: (c) => const RecordingDialog(), - ); - if (result == null) return; - final audioFile = File(result.path); final file = MatrixAudioFile( - bytes: audioFile.readAsBytesSync(), - name: audioFile.path, + bytes: bytes, + name: fileName, + mimeType: mimeType, ); - await room!.sendFileEvent( - file, - inReplyTo: replyEvent, - extraContent: { - 'info': { - ...file.info, - 'duration': result.duration, - }, - 'org.matrix.msc3245.voice': {}, - 'org.matrix.msc1767.audio': { - 'duration': result.duration, - 'waveform': result.waveform, + + try { + await room.sendFileEvent( + file, + inReplyTo: replyEvent, + threadRootEventId: activeThreadId, + extraContent: { + 'info': {...file.info, 'duration': duration}, + 'org.matrix.msc3245.voice': {}, + 'org.matrix.msc1767.audio': { + 'duration': duration, + 'waveform': waveform, + }, }, - }, - ); + ); + } catch (e) { + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), + ); + return; + } setState(() { replyEvent = null; }); + return; + } + + void hideEmojiPicker() { + setState(() => showEmojiPicker = false); } void emojiPickerAction() { @@ -450,22 +902,19 @@ class ChatController extends State { } else { inputFocus.unfocus(); } - emojiPickerType = EmojiPickerType.keyboard; setState(() => showEmojiPicker = !showEmojiPicker); } void _inputFocusListener() { if (showEmojiPicker && inputFocus.hasFocus) { - emojiPickerType = EmojiPickerType.keyboard; setState(() => showEmojiPicker = false); } } - void sendLocationAction() async { - await showDialog( + Future sendLocationAction() async { + await showAdaptiveDialog( context: context, - useRootNavigator: false, - builder: (c) => SendLocationDialog(room: room!), + builder: (c) => SendLocationDialog(room: room), ); } @@ -474,13 +923,16 @@ class ChatController extends State { if (selectedEvents.length == 1) { return selectedEvents.first .getDisplayEvent(timeline!) - .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)!)); + .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context))); } for (final event in selectedEvents) { if (copyString.isNotEmpty) copyString += '\n\n'; - copyString += event.getDisplayEvent(timeline!).calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true); + copyString += event + .getDisplayEvent(timeline!) + .calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + ); } return copyString; } @@ -493,87 +945,104 @@ class ChatController extends State { }); } - void reportEventAction() async { + Future reportEventAction() async { final event = selectedEvents.single; - final score = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.reportMessage, - message: L10n.of(context)!.howOffensiveIsThisContent, - cancelLabel: L10n.of(context)!.cancel, - okLabel: L10n.of(context)!.ok, - actions: [ - AlertDialogAction( - key: -100, - label: L10n.of(context)!.extremeOffensive, - ), - AlertDialogAction( - key: -50, - label: L10n.of(context)!.offensive, - ), - AlertDialogAction( - key: 0, - label: L10n.of(context)!.inoffensive, - ), - ]); - if (score == null) return; + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); + if (!mounted) return; final reason = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.whyDoYouWantToReportThis, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [DialogTextField(hintText: L10n.of(context)!.reason)]); - if (reason == null || reason.single.isEmpty) return; + context: context, + title: l10n.whyDoYouWantToReportThis, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.reason, + ); + if (reason == null || reason.isEmpty) return; + if (!mounted) return; final result = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.reportContent( - event.roomId!, - event.eventId, - reason: reason.single, - score: score, - ), + future: () => Matrix.of( + context, + ).client.reportEvent(event.roomId!, event.eventId, reason: reason), ); if (result.error != null) return; + if (!mounted) return; setState(() { showEmojiPicker = false; selectedEvents.clear(); }); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.contentHasBeenReported))); + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.contentHasBeenReported)), + ); } - void redactEventsAction() async { - final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.messageWillBeRemovedWarning, - okLabel: L10n.of(context)!.remove, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok; - if (!confirmed) return; - for (final event in selectedEvents) { - await showFutureLoadingDialog( - context: context, - future: () async { - if (event.status.isSent) { - if (event.canRedact) { - await event.redactEvent(); - } else { - final client = currentRoomBundle.firstWhere( - (cl) => selectedEvents.first.senderId == cl!.userID, - orElse: () => null); - if (client == null) { - return; - } - final room = client.getRoomById(roomId!)!; - await Event.fromJson(event.toJson(), room).redactEvent(); - } + Future deleteErrorEventsAction() async { + try { + if (selectedEvents.any((event) => event.status != EventStatus.error)) { + throw Exception( + 'Tried to delete failed to send events but one event is not failed to sent', + ); + } + for (final event in selectedEvents) { + await event.cancelSend(); + } + setState(selectedEvents.clear); + } catch (e, s) { + if (!mounted) return; + ErrorReporter( + context, + 'Error while delete error events action', + ).onErrorCallback(e, s); + } + } + + Future redactEventsAction() async { + final reasonInput = selectedEvents.any((event) => event.status.isSent) + ? await showTextInputDialog( + context: context, + title: L10n.of(context).redactMessage, + message: L10n.of(context).redactMessageDescription, + isDestructive: true, + hintText: L10n.of(context).optionalRedactReason, + maxLength: 255, + maxLines: 3, + minLines: 1, + okLabel: L10n.of(context).remove, + cancelLabel: L10n.of(context).cancel, + ) + : null; + if (reasonInput == null) return; + final reason = reasonInput.isEmpty ? null : reasonInput; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + futureWithProgress: (onProgress) async { + final count = selectedEvents.length; + for (final (i, event) in selectedEvents.indexed) { + onProgress(i / count); + if (event.status.isSent) { + if (event.canRedact) { + await event.redactEvent(reason: reason); } else { - await event.remove(); + final client = currentRoomBundle.firstWhere( + (cl) => selectedEvents.first.senderId == cl!.userID, + orElse: () => null, + ); + if (client == null) { + return; + } + final room = client.getRoomById(roomId)!; + await Event.fromJson( + event.toJson(), + room, + ).redactEvent(reason: reason); } - }); - } + } else { + await event.cancelSend(); + } + } + }, + ); setState(() { showEmojiPicker = false; selectedEvents.clear(); @@ -581,39 +1050,65 @@ class ChatController extends State { } List get currentRoomBundle { - final clients = matrix!.currentBundle!; - clients.removeWhere((c) => c!.getRoomById(roomId!) == null); + final clients = Matrix.of(context).currentBundle!; + clients.removeWhere((c) => c!.getRoomById(roomId) == null); return clients; } bool get canRedactSelectedEvents { - final clients = matrix!.currentBundle; + if (isArchived) return false; + final clients = Matrix.of(context).currentBundle; for (final event in selectedEvents) { + if (!event.status.isSent) return false; if (event.canRedact == false && - !(clients!.any((cl) => event.senderId == cl!.userID))) return false; + !(clients!.any((cl) => event.senderId == cl!.userID))) { + return false; + } } return true; } - bool get canEditSelectedEvents { - if (selectedEvents.length != 1 || !selectedEvents.first.status.isSent) { + bool get canPinSelectedEvents { + if (isArchived || + !room.canChangeStateEvent(EventTypes.RoomPinnedEvents) || + selectedEvents.length != 1 || + !selectedEvents.single.status.isSent || + activeThreadId != null) { return false; } - return currentRoomBundle - .any((cl) => selectedEvents.first.senderId == cl!.userID); + return true; } - void forwardEventsAction() async { - if (selectedEvents.length == 1) { - Matrix.of(context).shareContent = selectedEvents.first.content; - } else { - Matrix.of(context).shareContent = { - 'msgtype': 'm.text', - 'body': _getSelectedEventString(), - }; + bool get canEditSelectedEvents { + if (isArchived || + selectedEvents.length != 1 || + !selectedEvents.first.status.isSent) { + return false; } + return currentRoomBundle.any( + (cl) => selectedEvents.first.senderId == cl!.userID, + ); + } + + Future forwardEventsAction() async { + if (selectedEvents.isEmpty) return; + final timeline = this.timeline; + if (timeline == null) return; + + final forwardEvents = List.from( + selectedEvents, + ).map((event) => event.getDisplayEvent(timeline)).toList(); + + await showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: forwardEvents + .map((event) => ContentShareItem(event.content.copy())) + .toList(), + ), + ); + if (!mounted) return; setState(() => selectedEvents.clear()); - VRouter.of(context).to('/rooms'); } void sendAgainAction() { @@ -638,79 +1133,73 @@ class ChatController extends State { inputFocus.requestFocus(); } - void scrollToEventId(String eventId) async { - var eventIndex = filteredEvents.indexWhere((e) => e.eventId == eventId); + Future scrollToEventId( + String eventId, { + bool highlightEvent = true, + }) async { + final foundEvent = timeline!.events.firstWhereOrNull( + (event) => event.eventId == eventId, + ); + + final eventIndex = foundEvent == null + ? -1 + : timeline!.events + .filterByVisibleInGui( + exceptionEventId: eventId, + threadId: activeThreadId, + ) + .indexOf(foundEvent); + if (eventIndex == -1) { - // event id not found...maybe we can fetch it? - // the try...finally is here to start and close the loading dialog reliably - await showFutureLoadingDialog( - context: context, - future: () async { - // okay, we first have to fetch if the event is in the room - try { - final event = await timeline!.getEventById(eventId); - if (event == null) { - // event is null...meaning something is off - return; - } - } catch (err) { - if (err is MatrixException && err.errcode == 'M_NOT_FOUND') { - // event wasn't found, as the server gave a 404 or something - return; - } - rethrow; - } - // okay, we know that the event *is* in the room - while (eventIndex == -1) { - if (!canLoadMore) { - // we can't load any more events but still haven't found ours yet...better stop here - return; - } - try { - await timeline!.requestHistory(historyCount: _loadHistoryCount); - } catch (err) { - if (err is TimeoutException) { - // loading the history timed out...so let's do nothing - return; - } - rethrow; - } - eventIndex = - filteredEvents.indexWhere((e) => e.eventId == eventId); - } - }); - } - if (!mounted) { + setState(() { + timeline = null; + _scrolledUp = false; + loadTimelineFuture = _getTimeline(eventContextId: eventId).onError( + ErrorReporter( + context, + 'Unable to load timeline after scroll to ID', + ).onErrorCallback, + ); + }); + await loadTimelineFuture; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + scrollToEventId(eventId); + }); return; } + if (highlightEvent) { + setState(() { + scrollToEventIdMarker = eventId; + }); + } await scrollController.scrollToIndex( - eventIndex, + eventIndex + 1, + duration: FluffyThemes.animationDuration, preferPosition: AutoScrollPosition.middle, ); _updateScrollController(); } - void scrollDown() => scrollController.jumpTo(0); - - void onEmojiSelected(_, Emoji? emoji) { - switch (emojiPickerType) { - case EmojiPickerType.reaction: - senEmojiReaction(emoji); - break; - case EmojiPickerType.keyboard: - typeEmoji(emoji); - onInputBarChanged(sendController.text); - break; + Future scrollDown() async { + if (!timeline!.allowNewEvent) { + setState(() { + timeline = null; + _scrolledUp = false; + loadTimelineFuture = _getTimeline().onError( + ErrorReporter( + context, + 'Unable to load timeline after scroll down', + ).onErrorCallback, + ); + }); + await loadTimelineFuture; } + scrollController.jumpTo(0); } - void senEmojiReaction(Emoji? emoji) { - setState(() => showEmojiPicker = false); - if (emoji == null) return; - // make sure we don't send the same emoji twice - if (_allReactionEvents - .any((e) => e.content['m.relates_to']['key'] == emoji.emoji)) return; - return sendEmojiAction(emoji.emoji); + void onEmojiSelected(_, Emoji? emoji) { + typeEmoji(emoji); + onInputBarChanged(sendController.text); } void typeEmoji(Emoji? emoji) { @@ -729,43 +1218,18 @@ class ChatController extends State { ); } - late Iterable _allReactionEvents; - void emojiPickerBackspace() { - switch (emojiPickerType) { - case EmojiPickerType.reaction: - setState(() => showEmojiPicker = false); - break; - case EmojiPickerType.keyboard: - sendController - ..text = sendController.text.characters.skipLast(1).toString() - ..selection = TextSelection.fromPosition( - TextPosition(offset: sendController.text.length)); - break; - } - } - - void pickEmojiReactionAction(Iterable allReactionEvents) async { - _allReactionEvents = allReactionEvents; - emojiPickerType = EmojiPickerType.reaction; - setState(() => showEmojiPicker = true); - } - - void sendEmojiAction(String? emoji) async { - final events = List.from(selectedEvents); - setState(() => selectedEvents.clear()); - for (final event in events) { - await room!.sendReaction( - event.eventId, - emoji!, + sendController + ..text = sendController.text.characters.skipLast(1).toString() + ..selection = TextSelection.fromPosition( + TextPosition(offset: sendController.text.length), ); - } } void clearSelectedEvents() => setState(() { - selectedEvents.clear(); - showEmojiPicker = false; - }); + selectedEvents.clear(); + showEmojiPicker = false; + }); void clearSingleSelectedEvent() { if (selectedEvents.length <= 1) { @@ -773,67 +1237,96 @@ class ChatController extends State { } } - void editSelectedEventAction() { + void _startEditingEvent(Event event, {bool clearSelection = false}) { + final timeline = this.timeline; + if (timeline == null) return; + final client = currentRoomBundle.firstWhere( - (cl) => selectedEvents.first.senderId == cl!.userID, - orElse: () => null); - if (client == null) { - return; - } + (c) => c?.userID == event.senderId, + orElse: () => null, + ); + if (client == null) return; + setSendingClient(client); setState(() { pendingText = sendController.text; - editEvent = selectedEvents.first; - inputText = sendController.text = editEvent! - .getDisplayEvent(timeline!) - .calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, hideReply: true); - selectedEvents.clear(); + editEvent = event; + sendController.text = event + .getDisplayEvent(timeline) + .calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ); + if (clearSelection) selectedEvents.clear(); }); inputFocus.requestFocus(); } - void goToNewRoomAction() async { - if (OkCancelResult.ok != - await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.goToTheNewRoom, - message: room! - .getState(EventTypes.RoomTombstone)! - .parsedTombstoneContent - .body, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - )) { - return; - } - final result = await showFutureLoadingDialog( - context: context, - future: () => room!.client.joinRoom(room! - .getState(EventTypes.RoomTombstone)! - .parsedTombstoneContent - .replacementRoom), + void editSelectedEventAction() { + _startEditingEvent(selectedEvents.first, clearSelection: true); + } + + void _editLastSentMessage() { + final timeline = this.timeline; + if (timeline == null) return; + + final events = timeline.events.filterByVisibleInGui( + threadId: activeThreadId, ); - await showFutureLoadingDialog( + + final lastOwnMessage = events.firstWhereOrNull( + (e) => + e.type == EventTypes.Message && + e.messageType == MessageTypes.Text && + e.status.isSent && + !e.redacted && + currentRoomBundle.any((c) => c?.userID == e.senderId), + ); + + if (lastOwnMessage == null) return; + + _startEditingEvent(lastOwnMessage); + } + + Future goToNewRoomAction() async { + final result = await showFutureLoadingDialog( context: context, - future: room!.leave, + future: () async { + final users = await room.requestParticipants( + [Membership.join, Membership.leave], + true, + false, + ); + users.sort((a, b) => a.powerLevel.level.compareTo(b.powerLevel.level)); + final via = users + .map((user) => user.id.domain) + .whereType() + .toSet() + .take(10) + .toList(); + return room.client.joinRoom( + room + .getState(EventTypes.RoomTombstone)! + .parsedTombstoneContent + .replacementRoom, + via: via, + ); + }, ); - if (result.error == null) { - VRouter.of(context).toSegments(['rooms', result.result!]); - } + if (result.error != null) return; + if (!mounted) return; + context.go('/rooms/${result.result!}'); + + await showFutureLoadingDialog(context: context, future: room.leave); } void onSelectMessage(Event event) { if (!event.redacted) { if (selectedEvents.contains(event)) { - setState( - () => selectedEvents.remove(event), - ); + setState(() => selectedEvents.remove(event)); } else { - setState( - () => selectedEvents.add(event), - ); + setState(() => selectedEvents.add(event)); } selectedEvents.sort( (a, b) => a.originServerTs.compareTo(b.originServerTs), @@ -859,56 +1352,66 @@ class ChatController extends State { return index + 1; } - void onInputBarSubmitted(_) { + void onInputBarSubmitted(String _) { send(); FocusScope.of(context).requestFocus(inputFocus); } - void onAddPopupMenuButtonSelected(String choice) { - if (choice == 'file') { - sendFileAction(); - } - if (choice == 'image') { - sendImageAction(); - } - if (choice == 'camera') { - openCameraAction(); - } - if (choice == 'camera-video') { - openVideoCameraAction(); - } - if (choice == 'sticker') { - sendStickerAction(); - } - if (choice == 'location') { - sendLocationAction(); + void onAddPopupMenuButtonSelected(AddPopupMenuActions choice) { + room.client.getConfig(); + + switch (choice) { + case AddPopupMenuActions.image: + sendFileAction(type: FileType.image); + return; + case AddPopupMenuActions.video: + sendFileAction(type: FileType.video); + return; + case AddPopupMenuActions.file: + sendFileAction(); + return; + case AddPopupMenuActions.poll: + showAdaptiveBottomSheet( + context: context, + builder: (context) => StartPollBottomSheet(room: room), + ); + return; + case AddPopupMenuActions.photoCamera: + openCameraAction(); + return; + case AddPopupMenuActions.videoCamera: + openVideoCameraAction(); + return; + case AddPopupMenuActions.location: + sendLocationAction(); + return; } } - unpinEvent(String eventId) async { + Future unpinEvent(String eventId) async { final response = await showOkCancelAlertDialog( context: context, - title: L10n.of(context)!.unpin, - message: L10n.of(context)!.confirmEventUnpin, - okLabel: L10n.of(context)!.unpin, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).unpin, + message: L10n.of(context).confirmEventUnpin, + okLabel: L10n.of(context).unpin, + cancelLabel: L10n.of(context).cancel, ); + if (!mounted) return; if (response == OkCancelResult.ok) { - final events = room!.pinnedEventIds + final events = room.pinnedEventIds ..removeWhere((oldEvent) => oldEvent == eventId); showFutureLoadingDialog( context: context, - future: () => room!.setPinnedEvents(events), + future: () => room.setPinnedEvents(events), ); } } void pinEvent() { - final room = this.room; - if (room == null) return; final pinnedEventIds = room.pinnedEventIds; final selectedEventIds = selectedEvents.map((e) => e.eventId).toSet(); - final unpin = selectedEventIds.length == 1 && + final unpin = + selectedEventIds.length == 1 && pinnedEventIds.contains(selectedEventIds.single); if (unpin) { pinnedEventIds.removeWhere(selectedEventIds.contains); @@ -921,9 +1424,38 @@ class ChatController extends State { ); } + Timer? _storeInputTimeoutTimer; + static const Duration _storeInputTimeout = Duration(milliseconds: 500); + + double? inputBarHeight; + + void updateInputBarHeight() { + RenderBox? renderBox; + if (inputBarKey.currentContext?.findRenderObject() != null) { + renderBox = inputBarKey.currentContext!.findRenderObject() as RenderBox; + } + + final height = renderBox?.size.height ?? 72.0; + if (height != inputBarHeight) { + setState(() { + inputBarHeight = height; + }); + } + } + void onInputBarChanged(String text) { - setReadMarker(); - if (text.endsWith(' ') && matrix!.hasComplexBundles) { + if (_inputTextIsEmpty != text.isEmpty) { + setState(() { + _inputTextIsEmpty = text.isEmpty; + }); + } + + _storeInputTimeoutTimer?.cancel(); + _storeInputTimeoutTimer = Timer(_storeInputTimeout, () async { + final prefs = Matrix.of(context).store; + await prefs.setString('draft_$roomId', text); + }); + if (text.endsWith(' ') && Matrix.of(context).hasComplexBundles) { final clients = currentRoomBundle; for (final client in clients) { final prefix = client!.sendPrefix; @@ -931,101 +1463,182 @@ class ChatController extends State { text.toLowerCase() == '${prefix.toLowerCase()} ') { setSendingClient(client); setState(() { - inputText = ''; - sendController.text = ''; + sendController.clear(); }); return; } } } - typingCoolDown?.cancel(); - typingCoolDown = Timer(const Duration(seconds: 2), () { - typingCoolDown = null; - currentlyTyping = false; - room!.setTyping(false); - }); - typingTimeout ??= Timer(const Duration(seconds: 30), () { - typingTimeout = null; - currentlyTyping = false; - }); - if (!currentlyTyping) { - currentlyTyping = true; - room! - .setTyping(true, timeout: const Duration(seconds: 30).inMilliseconds); + if (AppSettings.sendTypingNotifications.value) { + typingCoolDown?.cancel(); + typingCoolDown = Timer(const Duration(seconds: 2), () { + if (!mounted) return; + typingCoolDown = null; + currentlyTyping = false; + room.setTyping(false); + }); + typingTimeout ??= Timer(const Duration(seconds: 30), () { + typingTimeout = null; + currentlyTyping = false; + }); + if (!currentlyTyping) { + currentlyTyping = true; + room.setTyping( + true, + timeout: const Duration(seconds: 30).inMilliseconds, + ); + } } - setState(() => inputText = text); } + bool _inputTextIsEmpty = true; + + bool get isArchived => + {Membership.leave, Membership.ban}.contains(room.membership); + void showEventInfo([Event? event]) => (event ?? selectedEvents.single).showInfoDialog(context); - void onPhoneButtonTap() async { + Future onPhoneButtonTap() async { // VoIP required Android SDK 21 if (PlatformInfos.isAndroid) { - DeviceInfoPlugin().androidInfo.then((value) { - if ((value.version.sdkInt ?? 16) < 21) { - Navigator.pop(context); - showOkAlertDialog( - context: context, - title: L10n.of(context)!.unsupportedAndroidVersion, - message: L10n.of(context)!.unsupportedAndroidVersionLong, - okLabel: L10n.of(context)!.close, - ); - } - }); + final androidInfo = await DeviceInfoPlugin().androidInfo; + if (!mounted) return; + if (androidInfo.version.sdkInt < 21) { + Navigator.pop(context); + await showOkAlertDialog( + context: context, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, + ); + return; + } } - final callType = await showModalActionSheet( + final callType = await showModalActionPopup( context: context, - title: L10n.of(context)!.warning, - message: L10n.of(context)!.videoCallsBetaWarning, - cancelLabel: L10n.of(context)!.cancel, + title: L10n.of(context).warning, + message: L10n.of(context).videoCallsBetaWarning, + cancelLabel: L10n.of(context).cancel, actions: [ - SheetAction( - label: L10n.of(context)!.voiceCall, - icon: Icons.phone_outlined, - key: CallType.kVoice, + AdaptiveModalAction( + label: L10n.of(context).voiceCall, + icon: const Icon(Icons.phone_outlined), + value: CallType.kVoice, ), - SheetAction( - label: L10n.of(context)!.videoCall, - icon: Icons.video_call_outlined, - key: CallType.kVideo, + AdaptiveModalAction( + label: L10n.of(context).videoCall, + icon: const Icon(Icons.video_call_outlined), + value: CallType.kVideo, ), ], ); if (callType == null) return; + if (!mounted) return; - final success = await showFutureLoadingDialog( - context: context, - future: () => - Matrix.of(context).voipPlugin!.voip.requestTurnServerCredentials()); - if (success.result != null) { - final voipPlugin = Matrix.of(context).voipPlugin; - await voipPlugin!.voip.inviteToCall(room!.id, callType).catchError((e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text((e as Object).toLocalizedString(context))), + final voipPlugin = Matrix.of(context).voipPlugin; + try { + await voipPlugin!.voip.inviteToCall(room, callType); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } + + void cancelReplyEventAction() => setState(() { + if (editEvent != null) { + sendController.text = pendingText; + pendingText = ''; + } + replyEvent = null; + editEvent = null; + }); + + Future _cancelEditWithConfirmation() async { + final originalText = editEvent! + .getDisplayEvent(timeline!) + .calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, ); - }); - } else { - await showOkAlertDialog( + + if (sendController.text != originalText) { + final result = await showOkCancelAlertDialog( context: context, - title: L10n.of(context)!.unavailable, - okLabel: L10n.of(context)!.next, - useRootNavigator: false, + title: L10n.of(context).areYouSure, + message: L10n.of(context).discardEdits, + okLabel: L10n.of(context).ok, + cancelLabel: L10n.of(context).cancel, ); + if (result == OkCancelResult.cancel) return; } + + cancelReplyEventAction(); } - void cancelReplyEventAction() => setState(() { - if (editEvent != null) { - inputText = sendController.text = pendingText; - pendingText = ''; - } - replyEvent = null; - editEvent = null; - }); + late final ValueNotifier _displayChatDetailsColumn; + + Future toggleDisplayChatDetailsColumn() async { + await AppSettings.displayChatDetailsColumn.setItem( + !_displayChatDetailsColumn.value, + ); + _displayChatDetailsColumn.value = !_displayChatDetailsColumn.value; + } @override - Widget build(BuildContext context) => ChatView(this); + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Actions( + actions: kIsWeb + ? {} + : >{ + PasteTextIntent: CallbackAction( + onInvoke: (PasteTextIntent intent) => + _handleClipboardImagePaste(), + ), + }, + child: Row( + children: [ + Expanded(child: ChatView(this)), + ValueListenableBuilder( + valueListenable: _displayChatDetailsColumn, + builder: (context, displayChatDetailsColumn, _) => + !FluffyThemes.isThreeColumnMode(context) || + room.membership != Membership.join || + !displayChatDetailsColumn + ? const SizedBox(height: double.infinity, width: 0) + : Container( + width: FluffyThemes.columnWidth, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + border: Border( + left: BorderSide(width: 1, color: theme.dividerColor), + ), + ), + child: ChatDetails( + roomId: roomId, + embeddedCloseButton: IconButton( + icon: const Icon(Icons.close), + onPressed: toggleDisplayChatDetailsColumn, + ), + ), + ), + ), + ], + ), + ); + } } -enum EmojiPickerType { reaction, keyboard } +enum AddPopupMenuActions { + image, + video, + file, + poll, + photoCamera, + videoCamera, + location, +} diff --git a/lib/pages/chat/chat_app_bar_list_tile.dart b/lib/pages/chat/chat_app_bar_list_tile.dart new file mode 100644 index 0000000000..eb9824f89f --- /dev/null +++ b/lib/pages/chat/chat_app_bar_list_tile.dart @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; + +class ChatAppBarListTile extends StatelessWidget { + final Widget? leading; + final String title; + final Widget? trailing; + final void Function()? onTap; + + static const double fixedHeight = 40.0; + + const ChatAppBarListTile({ + super.key, + this.leading, + required this.title, + this.trailing, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final leading = this.leading; + final trailing = this.trailing; + return SizedBox( + height: fixedHeight, + child: InkWell( + onTap: onTap, + child: Row( + children: [ + ?leading, + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Linkify( + text: title, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: theme.colorScheme.onSurfaceVariant, + overflow: TextOverflow.ellipsis, + fontSize: 14, + ), + linkStyle: TextStyle( + color: theme.colorScheme.onSurfaceVariant, + fontSize: 14, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.onSurfaceVariant, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + ?trailing, + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart index 91a770f024..6305f453ca 100644 --- a/lib/pages/chat/chat_app_bar_title.dart +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -1,61 +1,173 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; -import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/sync_status_localization.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatAppBarTitle extends StatelessWidget { final ChatController controller; - const ChatAppBarTitle(this.controller, {Key? key}) : super(key: key); + const ChatAppBarTitle(this.controller, {super.key}); @override Widget build(BuildContext context) { final room = controller.room; - if (room == null) { - return Container(); - } if (controller.selectedEvents.isNotEmpty) { - return Text(controller.selectedEvents.length.toString()); + return Text( + controller.selectedEvents.length.toString(), + style: TextStyle( + color: Theme.of(context).colorScheme.onTertiaryContainer, + ), + ); } - final directChatMatrixID = room.directChatMatrixID; return InkWell( + hoverColor: Colors.transparent, splashColor: Colors.transparent, highlightColor: Colors.transparent, - onTap: directChatMatrixID != null - ? () => showModalBottomSheet( - context: context, - builder: (c) => UserBottomSheet( - user: room - .unsafeGetUserFromMemoryOrFallback(directChatMatrixID), - outerContext: context, - onMention: () => controller.sendController.text += - '${room.unsafeGetUserFromMemoryOrFallback(directChatMatrixID).mention} ', - ), - ) - : () => VRouter.of(context).toSegments(['rooms', room.id, 'details']), + onTap: controller.isArchived + ? null + : () => FluffyThemes.isThreeColumnMode(context) + ? controller.toggleDisplayChatDetailsColumn() + : context.go('/rooms/${room.id}/details'), child: Row( children: [ Hero( tag: 'content_banner', child: Avatar( mxContent: room.avatar, - name: room.displayname, + name: room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), size: 32, ), ), const SizedBox(width: 12), Expanded( - child: Text( - room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 16, - ), + child: Column( + crossAxisAlignment: .start, + children: [ + Text( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 16), + ), + StreamBuilder( + stream: room.client.onSyncStatus.stream, + builder: (context, snapshot) { + final status = + room.client.onSyncStatus.value ?? + const SyncStatusUpdate(SyncStatus.waitingForResponse); + final hide = + FluffyThemes.isColumnMode(context) || + (room.client.onSync.value != null && + status.status != SyncStatus.error && + room.client.prevBatch != null); + final style = TextStyle(fontSize: 11); + return AnimatedSize( + duration: FluffyThemes.animationDuration, + child: hide + ? room.isDirectChat + ? PresenceBuilder( + userId: room.directChatMatrixID, + builder: (context, presence) { + final statusMessage = presence?.statusMsg; + + final lastActiveTimestamp = + presence?.lastActiveTimestamp; + + return Row( + children: [ + if (presence?.currentlyActive == true) + Text( + L10n.of(context).currentlyActive, + style: style, + ) + else if (lastActiveTimestamp != null) + Text( + L10n.of(context).lastActiveAgo( + lastActiveTimestamp + .localizedTimeShort( + context, + ), + ), + style: style, + ), + if (statusMessage != null) ...[ + if ((presence?.currentlyActive == + true || + lastActiveTimestamp != null)) + Text(' ◦ ', style: style), + Expanded( + child: Text( + statusMessage, + style: style, + maxLines: 1, + ), + ), + ], + ], + ); + }, + ) + : Row( + children: [ + Text( + L10n.of(context).countParticipants( + (room.summary.mJoinedMemberCount ?? + 1) + + (room + .summary + .mInvitedMemberCount ?? + 0), + ), + maxLines: 1, + style: style, + ), + if (room.topic.isNotEmpty) ...[ + Text(' ◦ ', style: style), + Expanded( + child: Text( + room.topic, + style: style, + maxLines: 1, + ), + ), + ], + ], + ) + : Row( + children: [ + SizedBox.square( + dimension: 10, + child: CircularProgressIndicator.adaptive( + strokeWidth: 1, + value: status.progress, + ), + ), + const SizedBox(width: 4), + Expanded( + child: Text( + status.calcLocalizedString(context), + style: TextStyle(fontSize: 12), + ), + ), + ], + ), + ); + }, + ), + ], ), ), ], diff --git a/lib/pages/chat/chat_emoji_picker.dart b/lib/pages/chat/chat_emoji_picker.dart index 069c4fc129..76cf1aa68b 100644 --- a/lib/pages/chat/chat_emoji_picker.dart +++ b/lib/pages/chat/chat_emoji_picker.dart @@ -1,26 +1,125 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/sticker_picker_dialog.dart'; +import 'package:fluffychat/pages/chat/trust_user_key_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; import 'chat.dart'; class ChatEmojiPicker extends StatelessWidget { final ChatController controller; - const ChatEmojiPicker(this.controller, {Key? key}) : super(key: key); + const ChatEmojiPicker(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); return AnimatedContainer( - duration: const Duration(milliseconds: 300), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), height: controller.showEmojiPicker - ? MediaQuery.of(context).size.height / 2 + ? MediaQuery.sizeOf(context).height / 2 : 0, child: controller.showEmojiPicker - ? EmojiPicker( - onEmojiSelected: controller.onEmojiSelected, - onBackspacePressed: controller.emojiPickerBackspace, + ? DefaultTabController( + length: 2, + child: Column( + children: [ + TabBar( + tabs: [ + Tab(text: L10n.of(context).emojis), + Tab(text: L10n.of(context).stickers), + ], + ), + Expanded( + child: TabBarView( + children: [ + EmojiPicker( + onEmojiSelected: controller.onEmojiSelected, + onBackspacePressed: controller.emojiPickerBackspace, + config: Config( + locale: Localizations.localeOf(context), + emojiViewConfig: EmojiViewConfig( + noRecents: const NoRecent(), + backgroundColor: + theme.colorScheme.onInverseSurface, + ), + bottomActionBarConfig: const BottomActionBarConfig( + enabled: false, + ), + categoryViewConfig: CategoryViewConfig( + backspaceColor: theme.colorScheme.primary, + iconColor: theme.colorScheme.primary.withAlpha( + 128, + ), + iconColorSelected: theme.colorScheme.primary, + indicatorColor: theme.colorScheme.primary, + backgroundColor: theme.colorScheme.surface, + ), + skinToneConfig: SkinToneConfig( + dialogBackgroundColor: Color.lerp( + theme.colorScheme.surface, + theme.colorScheme.primaryContainer, + 0.75, + )!, + indicatorColor: theme.colorScheme.onSurface, + ), + ), + ), + StickerPickerDialog( + room: controller.room, + onSelected: (sticker) async { + final proceed = await showTrustUserInRoomDialog( + context, + controller.room, + ); + if (!proceed) return; + controller.room.sendEvent( + { + 'body': sticker.body, + 'info': sticker.info ?? {}, + 'url': sticker.url.toString(), + }, + type: EventTypes.Sticker, + threadRootEventId: controller.activeThreadId, + threadLastEventId: controller.threadLastEventId, + ); + controller.hideEmojiPicker(); + }, + ), + ], + ), + ), + ], + ), ) : null, ); } } + +class NoRecent extends StatelessWidget { + const NoRecent({super.key}); + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + L10n.of(context).emoteKeyboardNoRecents, + style: Theme.of(context).textTheme.bodyLarge, + textAlign: TextAlign.center, + ), + ), + ); + } +} diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index da4f5d00e5..0022f82833 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -1,114 +1,252 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:scroll_to_index/scroll_to_index.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/encrpytion_info.dart'; import 'package:fluffychat/pages/chat/events/message.dart'; import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/pages/chat/typing_indicators.dart'; -import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix_api_lite/model/event_types.dart'; +import 'package:scroll_to_index/scroll_to_index.dart'; + +import '../../config/app_config.dart'; +import '../../utils/date_time_extension.dart'; class ChatEventList extends StatelessWidget { final ChatController controller; - const ChatEventList({ - Key? key, - required this.controller, - }) : super(key: key); + + const ChatEventList({super.key, required this.controller}); @override Widget build(BuildContext context) { + final timeline = controller.timeline; + + if (timeline == null) { + return const Center(child: CupertinoActivityIndicator()); + } + final theme = Theme.of(context); + + final colors = [theme.secondaryBubbleColor, theme.bubbleColor]; + final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0; + final events = timeline.events.filterByVisibleInGui( + threadId: controller.activeThreadId, + ); + // create a map of eventId --> index to greatly improve performance of // ListView's findChildIndexCallback final thisEventsKeyMap = {}; - for (var i = 0; i < controller.filteredEvents.length; i++) { - thisEventsKeyMap[controller.filteredEvents[i].eventId] = i; + for (var i = 0; i < events.length; i++) { + thisEventsKeyMap[events[i].eventId] = i; } - return ListView.custom( - padding: EdgeInsets.only( - top: 16, - bottom: 4, - left: horizontalPadding, - right: horizontalPadding, - ), - reverse: true, - controller: controller.scrollController, - keyboardDismissBehavior: PlatformInfos.isIOS - ? ScrollViewKeyboardDismissBehavior.onDrag - : ScrollViewKeyboardDismissBehavior.manual, - childrenDelegate: SliverChildBuilderDelegate( - (BuildContext context, int i) { - // Footer to display typing indicator and read receipts: - if (i == 0) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - SeenByRow(controller), - TypingIndicators(controller), - ], - ); - } - - // Request history button or progress indicator: - if (i == controller.filteredEvents.length + 1) { - if (controller.timeline!.isRequestingHistory) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ); - } - if (controller.canLoadMore) { - Center( - child: OutlinedButton( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - ), - onPressed: controller.requestHistory, - child: Text(L10n.of(context)!.loadMore), - ), - ); - } - return Container(); - } - - // The message at this index: - return AutoScrollTag( - key: ValueKey(controller.filteredEvents[i - 1].eventId), - index: i - 1, - controller: controller.scrollController, - child: Message(controller.filteredEvents[i - 1], - onSwipe: (direction) => controller.replyAction( - replyTo: controller.filteredEvents[i - 1]), - onInfoTab: controller.showEventInfo, - onAvatarTab: (Event event) => showModalBottomSheet( - context: context, - builder: (c) => UserBottomSheet( - user: event.senderFromMemoryOrFallback, - outerContext: context, - onMention: () => controller.sendController.text += - '${event.senderFromMemoryOrFallback.mention} ', + + final hasWallpaper = + controller.room.client.applicationAccountConfig.wallpaperUrl != null; + + return SelectionArea( + child: MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: TextScaler.linear(AppSettings.fontSizeFactor.value), + ), + child: ListView.custom( + padding: EdgeInsets.only( + top: 8 + MediaQuery.paddingOf(context).top, + bottom: + 8 + + (controller.inputBarHeight ?? + (72 + (FluffyThemes.isColumnMode(context) ? 16 : 0))), + left: horizontalPadding, + right: horizontalPadding, + ), + reverse: true, + controller: controller.scrollController, + keyboardDismissBehavior: PlatformInfos.isIOS + ? ScrollViewKeyboardDismissBehavior.onDrag + : ScrollViewKeyboardDismissBehavior.manual, + childrenDelegate: SliverChildBuilderDelegate( + (BuildContext context, int i) { + // Footer to display typing indicator and read receipts: + if (i == 0) { + if (timeline.canRequestFuture) { + return Center( + child: TextButton.icon( + onPressed: timeline.isRequestingFuture + ? null + : controller.requestFuture, + icon: timeline.isRequestingFuture + ? CircularProgressIndicator.adaptive(strokeWidth: 2) + : const Icon(Icons.arrow_downward_outlined), + label: Text(L10n.of(context).loadMore), + ), + ); + } + return Column( + mainAxisSize: .min, + children: [ + if (events.isNotEmpty) SeenByRow(event: events.first), + TypingIndicators(controller), + EncryptionInfo(room: controller.room), + ], + ); + } + + // Request history button or progress indicator: + if (i == events.length + 1) { + if (controller.activeThreadId != null || + !timeline.canRequestHistory) { + return const SizedBox.shrink(); + } + return Builder( + builder: (context) { + final visibleIndex = timeline.events.lastIndexWhere( + (event) => + !event.isCollapsedState && event.isVisibleInGui, + ); + if (visibleIndex > timeline.events.length - 50) { + WidgetsBinding.instance.addPostFrameCallback( + controller.requestHistory, + ); + } + return Center( + child: TextButton.icon( + onPressed: timeline.isRequestingHistory + ? null + : controller.requestHistory, + icon: timeline.isRequestingHistory + ? CircularProgressIndicator.adaptive(strokeWidth: 2) + : const Icon(Icons.arrow_upward_outlined), + label: Text(L10n.of(context).loadMore), ), + ); + }, + ); + } + i--; + + // The message at this index: + final event = events[i]; + final animateIn = + (event.transactionId ?? event.eventId) == + controller.animateInEventId; + + final nextEvent = i + 1 < events.length ? events[i + 1] : null; + final previousEvent = i > 0 ? events[i - 1] : null; + + // Collapsed state event + final canExpand = + event.isCollapsedState && + nextEvent?.isCollapsedState == true && + previousEvent?.isCollapsedState != true; + final isCollapsed = + event.isCollapsedState && + previousEvent?.isCollapsedState == true && + !controller.expandedEventIds.contains(event.eventId); + + final displayDate = + event.type == EventTypes.RoomCreate || + nextEvent == null || + !event.originServerTs.sameDay(nextEvent.originServerTs); + + return AutoScrollTag( + key: ValueKey(event.transactionId ?? event.eventId), + index: i, + controller: controller.scrollController, + child: Column( + mainAxisSize: .min, + children: [ + if (!isCollapsed && displayDate) + Padding( + padding: const EdgeInsets.only(top: 8.0, bottom: 16.0), + child: Center( + child: Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius * 2, + ), + color: theme.colorScheme.inverseSurface.withAlpha( + 200, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 2.0, + ), + child: Text( + event.originServerTs.localizedDate(context), + style: TextStyle( + fontWeight: FontWeight.bold, + color: theme.colorScheme.onInverseSurface, + ), + ), + ), + ), + ), + ), + ), + Message( + event, + bigEmojis: controller.bigEmojis, + animateIn: animateIn, + onSwipe: () => controller.replyAction(replyTo: event), + onInfoTab: controller.showEventInfo, + onMention: () => controller.sendController.text += + '${event.senderFromMemoryOrFallback.mention} ', + highlightMarker: + controller.scrollToEventIdMarker == event.eventId, + onSelect: controller.onSelectMessage, + scrollToEventId: controller.scrollToEventId, + longPressSelect: controller.selectedEvents.isNotEmpty, + selected: controller.selectedEvents.any( + (e) => e.eventId == event.eventId, + ), + singleSelected: + controller.selectedEvents.singleOrNull?.eventId == + event.eventId, + onEdit: controller.editSelectedEventAction, + timeline: timeline, + displayReadMarker: + i > 0 && + controller.readMarkerEventId == event.eventId, + nextEvent: nextEvent, + previousEvent: previousEvent, + wallpaperMode: hasWallpaper, + scrollController: controller.scrollController, + colors: colors, + isCollapsed: isCollapsed, + enterThread: controller.activeThreadId == null + ? controller.enterThread + : null, + onExpand: canExpand + ? () => controller.expandEventsFrom( + event, + !controller.expandedEventIds.contains( + event.eventId, + ), + ) + : null, ), - unfold: controller.unfold, - onSelect: controller.onSelectMessage, - scrollToEventId: (String eventId) => - controller.scrollToEventId(eventId), - longPressSelect: controller.selectedEvents.isEmpty, - selected: controller.selectedEvents.any((e) => - e.eventId == controller.filteredEvents[i - 1].eventId), - timeline: controller.timeline!, - nextEvent: i < controller.filteredEvents.length - ? controller.filteredEvents[i] - : null), - ); - }, - childCount: controller.filteredEvents.length + 2, - findChildIndexCallback: (key) => - controller.findChildIndexCallback(key, thisEventsKeyMap), + ], + ), + ); + }, + childCount: events.length + 2, + findChildIndexCallback: (key) => + controller.findChildIndexCallback(key, thisEventsKeyMap), + ), + ), ), ); } diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 346b3b4429..879717fa98 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,273 +1,392 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:animations/animations.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:fluffychat/config/app_config.dart'; +import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/recording_input_row.dart'; +import 'package:fluffychat/pages/chat/recording_view_model.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../config/themes.dart'; import 'chat.dart'; import 'input_bar.dart'; class ChatInputRow extends StatelessWidget { final ChatController controller; - const ChatInputRow(this.controller, {Key? key}) : super(key: key); + static const double height = 56.0; + + const ChatInputRow(this.controller, {super.key}); @override Widget build(BuildContext context) { - if (controller.showEmojiPicker && - controller.emojiPickerType == EmojiPickerType.reaction) { - return Container(); + final theme = Theme.of(context); + final textMessageOnly = + controller.sendController.text.isNotEmpty || + controller.replyEvent != null || + controller.editEvent != null; + + if (!controller.room.otherPartyCanReceiveMessages) { + return Center( + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Text( + L10n.of(context).otherPartyNotLoggedIn, + style: theme.textTheme.bodySmall, + textAlign: TextAlign.center, + ), + ), + ); } - return Row( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: controller.selectMode - ? [ - SizedBox( - height: 56, - child: TextButton( - onPressed: controller.forwardEventsAction, - child: Row( - children: [ - const Icon(Icons.keyboard_arrow_left_outlined), - Text(L10n.of(context)!.forward), - ], - ), - ), - ), - controller.selectedEvents.length == 1 - ? controller.selectedEvents.first - .getDisplayEvent(controller.timeline!) - .status - .isSent - ? SizedBox( - height: 56, - child: TextButton( - onPressed: controller.replyAction, - child: Row( - children: [ - Text(L10n.of(context)!.reply), - const Icon(Icons.keyboard_arrow_right), - ], - ), - ), - ) - : SizedBox( - height: 56, - child: TextButton( - onPressed: controller.sendAgainAction, - child: Row( - children: [ - Text(L10n.of(context)!.tryToSendAgain), - const SizedBox(width: 4), - const Icon(Icons.send_outlined, size: 16), - ], - ), - ), - ) - : Container(), - ] - : [ - KeyBoardShortcuts( - child: AnimatedContainer( - duration: const Duration(milliseconds: 200), - height: 56, - width: controller.inputText.isEmpty ? 56 : 0, - alignment: Alignment.center, - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: PopupMenuButton( - icon: const Icon(Icons.add_outlined), - onSelected: controller.onAddPopupMenuButtonSelected, - itemBuilder: (BuildContext context) => - >[ - PopupMenuItem( - value: 'file', - child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.green, - foregroundColor: Colors.white, - child: Icon(Icons.attachment_outlined), - ), - title: Text(L10n.of(context)!.sendFile), - contentPadding: const EdgeInsets.all(0), + + final selectedTextButtonStyle = TextButton.styleFrom( + foregroundColor: theme.colorScheme.onTertiaryContainer, + ); + + return RecordingViewModel( + builder: (context, recordingViewModel) { + if (recordingViewModel.isRecording) { + return RecordingInputRow( + state: recordingViewModel, + onSend: controller.onVoiceMessageSend, + ); + } + return Row( + crossAxisAlignment: .end, + mainAxisAlignment: .spaceBetween, + children: controller.selectMode + ? [ + if (controller.selectedEvents.every( + (event) => event.status == EventStatus.error, + )) + SizedBox( + height: height, + child: TextButton( + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, + ), + onPressed: controller.deleteErrorEventsAction, + child: Row( + children: [ + const Icon(Icons.delete_forever_outlined), + Text(L10n.of(context).delete), + ], ), ), - PopupMenuItem( - value: 'image', - child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.blue, - foregroundColor: Colors.white, - child: Icon(Icons.image_outlined), - ), - title: Text(L10n.of(context)!.sendImage), - contentPadding: const EdgeInsets.all(0), + ) + else + SizedBox( + height: height, + child: TextButton( + style: selectedTextButtonStyle, + onPressed: controller.forwardEventsAction, + child: Row( + children: [ + const Icon(Icons.keyboard_arrow_left_outlined), + Text(L10n.of(context).forward), + ], ), ), - if (PlatformInfos.isMobile) - PopupMenuItem( - value: 'camera', + ), + controller.selectedEvents.length == 1 + ? controller.selectedEvents.first + .getDisplayEvent(controller.timeline!) + .status + .isSent + ? SizedBox( + height: height, + child: TextButton( + style: selectedTextButtonStyle, + onPressed: controller.replyAction, + child: Row( + children: [ + Text(L10n.of(context).reply), + const Icon(Icons.keyboard_arrow_right), + ], + ), + ), + ) + : SizedBox( + height: height, + child: TextButton( + style: selectedTextButtonStyle, + onPressed: controller.sendAgainAction, + child: Row( + children: [ + Text(L10n.of(context).tryToSendAgain), + const SizedBox(width: 4), + const Icon(Icons.send_outlined, size: 16), + ], + ), + ), + ) + : const SizedBox.shrink(), + ] + : [ + const SizedBox(width: 8), + AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + width: textMessageOnly ? 0 : 48, + height: height, + alignment: Alignment.center, + decoration: const BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: PopupMenuButton( + useRootNavigator: true, + icon: const Icon(Icons.add_circle_outline), + iconColor: theme.colorScheme.onPrimaryContainer, + onSelected: controller.onAddPopupMenuButtonSelected, + itemBuilder: (BuildContext context) => [ + if (PlatformInfos.isMobile) + PopupMenuItem( + value: AddPopupMenuActions.location, + child: ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon(Icons.gps_fixed_outlined), + ), + title: Text(L10n.of(context).shareLocation), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: AddPopupMenuActions.poll, child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.purple, - foregroundColor: Colors.white, - child: Icon(Icons.camera_alt_outlined), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon(Icons.poll_outlined), ), - title: Text(L10n.of(context)!.openCamera), + title: Text(L10n.of(context).startPoll), contentPadding: const EdgeInsets.all(0), ), ), - if (PlatformInfos.isMobile) - PopupMenuItem( - value: 'camera-video', + PopupMenuDivider(), + if (PlatformInfos.isMobile) ...[ + PopupMenuItem( + value: AddPopupMenuActions.videoCamera, + child: ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon(Icons.videocam_outlined), + ), + title: Text(L10n.of(context).recordAVideo), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuItem( + value: AddPopupMenuActions.photoCamera, + child: ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon(Icons.camera_alt_outlined), + ), + title: Text(L10n.of(context).takeAPhoto), + contentPadding: const EdgeInsets.all(0), + ), + ), + PopupMenuDivider(), + ], + PopupMenuItem( + value: AddPopupMenuActions.image, child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.red, - foregroundColor: Colors.white, - child: Icon(Icons.videocam_outlined), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon(Icons.photo_outlined), ), - title: Text(L10n.of(context)!.openVideoCamera), + title: Text(L10n.of(context).sendImage), contentPadding: const EdgeInsets.all(0), ), ), - if (controller.room! - .getImagePacks(ImagePackUsage.sticker) - .isNotEmpty) - PopupMenuItem( - value: 'sticker', + PopupMenuItem( + value: AddPopupMenuActions.video, child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.orange, - foregroundColor: Colors.white, - child: Icon(Icons.emoji_emotions_outlined), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon( + Icons.video_camera_back_outlined, + ), ), - title: Text(L10n.of(context)!.sendSticker), + title: Text(L10n.of(context).sendVideo), contentPadding: const EdgeInsets.all(0), ), ), - if (PlatformInfos.isMobile) - PopupMenuItem( - value: 'location', + PopupMenuItem( + value: AddPopupMenuActions.file, child: ListTile( - leading: const CircleAvatar( - backgroundColor: Colors.brown, - foregroundColor: Colors.white, - child: Icon(Icons.gps_fixed_outlined), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.onPrimaryContainer, + foregroundColor: + theme.colorScheme.primaryContainer, + child: const Icon(Icons.attachment_outlined), ), - title: Text(L10n.of(context)!.shareLocation), + title: Text(L10n.of(context).sendFile), contentPadding: const EdgeInsets.all(0), ), ), - ], + ], + ), ), - ), - keysToPress: { - LogicalKeyboardKey.altLeft, - LogicalKeyboardKey.keyA - }, - onKeysPressed: () => - controller.onAddPopupMenuButtonSelected('file'), - helpLabel: L10n.of(context)!.sendFile, - ), - Container( - height: 56, - alignment: Alignment.center, - child: KeyBoardShortcuts( - child: IconButton( - tooltip: L10n.of(context)!.emojis, - icon: PageTransitionSwitcher( - transitionBuilder: ( - Widget child, - Animation primaryAnimation, - Animation secondaryAnimation, - ) { - return SharedAxisTransition( - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - transitionType: SharedAxisTransitionType.scaled, - child: child, - fillColor: Colors.transparent, - ); - }, - child: Icon( + Container( + height: height, + width: 48, + alignment: Alignment.center, + child: IconButton( + tooltip: L10n.of(context).emojis, + color: theme.colorScheme.onPrimaryContainer, + icon: Icon( controller.showEmojiPicker ? Icons.keyboard - : Icons.emoji_emotions_outlined, + : Icons.add_reaction_outlined, key: ValueKey(controller.showEmojiPicker), ), + onPressed: controller.emojiPickerAction, ), - onPressed: controller.emojiPickerAction, ), - keysToPress: { - LogicalKeyboardKey.altLeft, - LogicalKeyboardKey.keyE - }, - onKeysPressed: controller.emojiPickerAction, - helpLabel: L10n.of(context)!.emojis, - ), - ), - if (controller.matrix!.isMultiAccount && - controller.matrix!.hasComplexBundles && - controller.matrix!.currentBundle!.length > 1) - Container( - height: 56, - alignment: Alignment.center, - child: _ChatAccountPicker(controller), - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: InputBar( - room: controller.room!, - minLines: 1, - maxLines: 8, - autofocus: !PlatformInfos.isMobile, - keyboardType: TextInputType.multiline, - textInputAction: - AppConfig.sendOnEnter ? TextInputAction.send : null, - onSubmitted: controller.onInputBarSubmitted, - focusNode: controller.inputFocus, - controller: controller.sendController, - decoration: InputDecoration( - hintText: L10n.of(context)!.writeAMessage, - hintMaxLines: 1, - border: InputBorder.none, - enabledBorder: InputBorder.none, - filled: false, + if (Matrix.of(context).isMultiAccount && + Matrix.of(context).hasComplexBundles && + Matrix.of(context).currentBundle!.length > 1) + Container( + height: height, + width: 48, + alignment: Alignment.center, + child: _ChatAccountPicker(controller), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 2.0), + child: InputBar( + room: controller.room, + minLines: 1, + maxLines: 8, + autofocus: !PlatformInfos.isMobile, + keyboardType: TextInputType.multiline, + textInputAction: + AppSettings.sendOnEnter.value == true && + PlatformInfos.isMobile + ? TextInputAction.send + : null, + onSubmitted: controller.onInputBarSubmitted, + onSubmitImage: controller.sendImageFromClipBoard, + focusNode: controller.inputFocus, + controller: controller.sendController, + decoration: InputDecoration( + contentPadding: const EdgeInsets.only( + left: 6.0, + right: 6.0, + bottom: 6.0, + top: 3.0, + ), + counter: const SizedBox.shrink(), + hintText: controller.room.encrypted + ? L10n.of(context).encryptedMessage + : L10n.of(context).unencryptedMessage, + hintMaxLines: 1, + border: InputBorder.none, + enabledBorder: InputBorder.none, + filled: false, + ), + onChanged: controller.onInputBarChanged, + suggestionEmojis: + getDefaultEmojiLocale( + AppSettings.emojiSuggestionLocale.value.isNotEmpty + ? Locale( + AppSettings.emojiSuggestionLocale.value, + ) + : Localizations.localeOf(context), + ).fold( + [], + (emojis, category) => + emojis..addAll(category.emoji), + ), + ), ), - onChanged: controller.onInputBarChanged, - ), - ), - ), - if (PlatformInfos.platformCanRecord && - controller.inputText.isEmpty) - Container( - height: 56, - alignment: Alignment.center, - child: IconButton( - tooltip: L10n.of(context)!.voiceMessage, - icon: const Icon(Icons.mic_none_outlined), - onPressed: controller.voiceMessageAction, ), - ), - if (!PlatformInfos.isMobile || controller.inputText.isNotEmpty) - Container( - height: 56, - alignment: Alignment.center, - child: IconButton( - icon: const Icon(Icons.send_outlined), - onPressed: controller.send, - tooltip: L10n.of(context)!.send, + Container( + height: height, + width: height, + alignment: Alignment.center, + child: + PlatformInfos.platformCanRecord && + !controller.sendController.text.isNotEmpty && + controller.editEvent == null + ? HoverBuilder( + builder: (context, hovered) => IconButton( + tooltip: L10n.of(context).voiceMessage, + onPressed: hovered + ? () => recordingViewModel.startRecording( + controller.room, + ) + : () => ScaffoldMessenger.of(context) + .showSnackBar( + SnackBar( + margin: EdgeInsets.only( + bottom: height + 16, + left: 16, + right: 16, + top: 16, + ), + showCloseIcon: true, + content: Text( + L10n.of( + context, + ).longPressToRecordVoiceMessage, + ), + ), + ), + onLongPress: () => recordingViewModel + .startRecording(controller.room), + style: IconButton.styleFrom( + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + ), + icon: Icon( + hovered ? Icons.mic : Icons.mic_none_outlined, + ), + ), + ) + : IconButton( + key: Key('send_button'), + tooltip: L10n.of(context).send, + onPressed: controller.send, + style: IconButton.styleFrom( + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + ), + icon: const Icon(Icons.send_outlined), + ), ), - ), - ], + ], + ); + }, ); } } @@ -275,11 +394,12 @@ class ChatInputRow extends StatelessWidget { class _ChatAccountPicker extends StatelessWidget { final ChatController controller; - const _ChatAccountPicker(this.controller, {Key? key}) : super(key: key); + const _ChatAccountPicker(this.controller); - void _popupMenuButtonSelected(String mxid) { - final client = controller.matrix!.currentBundle! - .firstWhere((cl) => cl!.userID == mxid, orElse: () => null); + void _popupMenuButtonSelected(String mxid, BuildContext context) { + final client = Matrix.of( + context, + ).currentBundle!.firstWhere((cl) => cl!.userID == mxid, orElse: () => null); if (client == null) { Logs().w('Attempted to switch to a non-existing client $mxid'); return; @@ -289,37 +409,40 @@ class _ChatAccountPicker extends StatelessWidget { @override Widget build(BuildContext context) { - controller.matrix ??= Matrix.of(context); final clients = controller.currentRoomBundle; return Padding( padding: const EdgeInsets.all(8.0), child: FutureBuilder( - future: controller.sendingClient!.fetchOwnProfile(), + future: controller.sendingClient.fetchOwnProfile(), builder: (context, snapshot) => PopupMenuButton( - onSelected: _popupMenuButtonSelected, + useRootNavigator: true, + onSelected: (mxid) => _popupMenuButtonSelected(mxid, context), itemBuilder: (BuildContext context) => clients - .map((client) => PopupMenuItem( - value: client!.userID, - child: FutureBuilder( - future: client.fetchOwnProfile(), - builder: (context, snapshot) => ListTile( - leading: Avatar( - mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - client.userID!.localpart, - size: 20, - ), - title: - Text(snapshot.data?.displayName ?? client.userID!), - contentPadding: const EdgeInsets.all(0), + .map( + (client) => PopupMenuItem( + value: client!.userID, + child: FutureBuilder( + future: client.fetchOwnProfile(), + builder: (context, snapshot) => ListTile( + leading: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: + snapshot.data?.displayName ?? + client.userID!.localpart, + size: 20, ), + title: Text(snapshot.data?.displayName ?? client.userID!), + contentPadding: const EdgeInsets.all(0), ), - )) + ), + ), + ) .toList(), child: Avatar( mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - controller.matrix!.client.userID!.localpart, + name: + snapshot.data?.displayName ?? + Matrix.of(context).client.userID!.localpart, size: 20, ), ), diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 3f1fdcc8d2..ae1b35fd2a 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -1,26 +1,29 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:desktop_drop/desktop_drop.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +import 'dart:ui' as ui; -import 'package:fluffychat/config/app_config.dart'; +import 'package:desktop_drop/desktop_drop.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; import 'package:fluffychat/pages/chat/chat_app_bar_title.dart'; import 'package:fluffychat/pages/chat/chat_event_list.dart'; -import 'package:fluffychat/pages/chat/encryption_button.dart'; import 'package:fluffychat/pages/chat/pinned_events.dart'; -import 'package:fluffychat/pages/chat/reactions_picker.dart'; import 'package:fluffychat/pages/chat/reply_display.dart'; -import 'package:fluffychat/pages/chat/tombstone_display.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; -import 'package:fluffychat/widgets/connection_status_header.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import 'package:fluffychat/widgets/unread_badge_back_button.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/stream_extension.dart'; import 'chat_emoji_picker.dart'; import 'chat_input_row.dart'; @@ -30,271 +33,430 @@ enum _EventContextAction { info, report } class ChatView extends StatelessWidget { final ChatController controller; - const ChatView(this.controller, {Key? key}) : super(key: key); - - List _appBarActions(BuildContext context) { - if (controller.selectMode) { - return [ - if (controller.canEditSelectedEvents) - IconButton( - icon: const Icon(Icons.edit_outlined), - tooltip: L10n.of(context)!.edit, - onPressed: controller.editSelectedEventAction, - ), - IconButton( - icon: const Icon(Icons.copy_outlined), - tooltip: L10n.of(context)!.copy, - onPressed: controller.copyEventsAction, - ), - if (controller.canSaveSelectedEvent) - IconButton( - icon: Icon(Icons.adaptive.share), - tooltip: L10n.of(context)!.share, - onPressed: controller.saveSelectedEvent, - ), - if (controller.canRedactSelectedEvents) - IconButton( - icon: const Icon(Icons.delete_outlined), - tooltip: L10n.of(context)!.redactMessage, - onPressed: controller.redactEventsAction, - ), - IconButton( - icon: const Icon(Icons.push_pin_outlined), - onPressed: controller.pinEvent, - tooltip: L10n.of(context)!.pinMessage, - ), - if (controller.selectedEvents.length == 1) - PopupMenuButton<_EventContextAction>( - onSelected: (action) { - switch (action) { - case _EventContextAction.info: - controller.showEventInfo(); - controller.clearSelectedEvents(); - break; - case _EventContextAction.report: - controller.reportEventAction(); - break; - } - }, - itemBuilder: (context) => [ - PopupMenuItem( - value: _EventContextAction.info, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(Icons.info_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.messageInfo), - ], - ), - ), - PopupMenuItem( - value: _EventContextAction.report, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon( - Icons.shield_outlined, - color: Colors.red, - ), - const SizedBox(width: 12), - Text(L10n.of(context)!.reportMessage), - ], - ), - ), - ], - ), - ]; - } else { - return [ - if (Matrix.of(context).voipPlugin != null && - controller.room!.isDirectChat) - IconButton( - onPressed: controller.onPhoneButtonTap, - icon: const Icon(Icons.call_outlined), - tooltip: L10n.of(context)!.placeCall, - ), - EncryptionButton(controller.room!), - ChatSettingsPopupMenu(controller.room!, !controller.room!.isDirectChat), - ]; - } - } + const ChatView(this.controller, {super.key}); @override Widget build(BuildContext context) { - controller.matrix ??= Matrix.of(context); - final client = controller.matrix!.client; - controller.sendingClient ??= client; - controller.room = controller.sendingClient!.getRoomById(controller.roomId!); - if (controller.room == null) { - return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.oopsSomethingWentWrong), - ), - body: Center( - child: Text(L10n.of(context)!.youAreNoLongerParticipatingInThisChat), - ), - ); - } - - if (controller.room!.membership == Membership.invite) { + final theme = Theme.of(context); + if (controller.room.membership == Membership.invite) { showFutureLoadingDialog( - context: context, future: () => controller.room!.join()); + context: context, + future: () => controller.room.join(), + exceptionContext: ExceptionContext.joinRoom, + ); } final bottomSheetPadding = FluffyThemes.isColumnMode(context) ? 16.0 : 8.0; + final scrollUpBannerEventId = controller.scrollUpBannerEventId; - return VWidgetGuard( - onSystemPop: (redirector) async { + final accountConfig = Matrix.of(context).client.applicationAccountConfig; + + return PopScope( + canPop: + controller.selectedEvents.isEmpty && + !controller.showEmojiPicker && + controller.activeThreadId == null, + onPopInvokedWithResult: (pop, _) async { + if (pop) return; if (controller.selectedEvents.isNotEmpty) { controller.clearSelectedEvents(); - redirector.stopRedirection(); } else if (controller.showEmojiPicker) { controller.emojiPickerAction(); - redirector.stopRedirection(); + } else if (controller.activeThreadId != null) { + controller.closeThread(); } }, - child: GestureDetector( - onTapDown: controller.setReadMarker, - behavior: HitTestBehavior.opaque, - child: StreamBuilder( - stream: controller.room!.onUpdate.stream - .rateLimit(const Duration(milliseconds: 250)), - builder: (context, snapshot) => FutureBuilder( - future: controller.getTimeline(), - builder: (BuildContext context, snapshot) { - return Scaffold( - appBar: AppBar( - elevation: 2, - actionsIconTheme: IconThemeData( - color: controller.selectedEvents.isEmpty - ? null - : Theme.of(context).colorScheme.primary, - ), - leading: controller.selectMode - ? IconButton( - icon: const Icon(Icons.close), - onPressed: controller.clearSelectedEvents, - tooltip: L10n.of(context)!.close, - color: Theme.of(context).colorScheme.primary, - ) - : UnreadBadgeBackButton(roomId: controller.roomId!), - titleSpacing: 0, - title: ChatAppBarTitle(controller), - actions: _appBarActions(context), - ), - floatingActionButton: controller.showScrollDownButton && - controller.selectedEvents.isEmpty - ? Padding( - padding: const EdgeInsets.only(bottom: 56.0), - child: FloatingActionButton( - onPressed: controller.scrollDown, - mini: true, - child: const Icon(Icons.arrow_downward_outlined), - ), + child: StreamBuilder( + stream: controller.room.client.onRoomState.stream + .where((update) => update.roomId == controller.room.id) + .rateLimit(const Duration(seconds: 1)), + builder: (context, snapshot) => FutureBuilder( + future: controller.loadTimelineFuture, + builder: (BuildContext context, snapshot) { + var appbarBottomHeight = 0.0; + final activeThreadId = controller.activeThreadId; + if (activeThreadId != null) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + if (controller.room.pinnedEventIds.isNotEmpty && + activeThreadId == null) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + if (scrollUpBannerEventId != null && activeThreadId == null) { + appbarBottomHeight += ChatAppBarListTile.fixedHeight; + } + return Scaffold( + key: Key('chat_page'), + extendBodyBehindAppBar: true, + appBar: AppBar( + shape: FluffyThemes.isColumnMode(context) + ? Border( + bottom: BorderSide(color: theme.dividerColor, width: 1), ) : null, - backgroundColor: Theme.of(context).colorScheme.surface, - body: DropTarget( + actionsIconTheme: IconThemeData( + color: controller.selectedEvents.isEmpty + ? null + : theme.colorScheme.onTertiaryContainer, + ), + backgroundColor: controller.selectedEvents.isEmpty + ? controller.activeThreadId != null + ? theme.colorScheme.secondaryContainer + : theme.colorScheme.surface.withAlpha(240) + : theme.colorScheme.tertiaryContainer, + automaticallyImplyLeading: false, + leading: controller.selectMode + ? IconButton( + icon: const Icon(Icons.close), + onPressed: controller.clearSelectedEvents, + tooltip: L10n.of(context).close, + color: theme.colorScheme.onTertiaryContainer, + ) + : activeThreadId != null + ? IconButton( + icon: const Icon(Icons.close), + onPressed: controller.closeThread, + tooltip: L10n.of(context).backToMainChat, + color: theme.colorScheme.onSecondaryContainer, + ) + : FluffyThemes.isColumnMode(context) + ? null + : const Center(child: BackButton()), + titleSpacing: FluffyThemes.isColumnMode(context) ? 24 : 0, + title: ChatAppBarTitle(controller), + actions: [ + if (controller.selectMode) ...[ + if (controller.canEditSelectedEvents) + IconButton( + icon: const Icon(Icons.edit_outlined), + tooltip: L10n.of(context).edit, + onPressed: controller.editSelectedEventAction, + ), + if (controller.selectedEvents.length == 1 && + controller.activeThreadId == null && + controller.room.canSendDefaultMessages) + IconButton( + icon: const Icon(Icons.message_outlined), + tooltip: L10n.of(context).replyInThread, + onPressed: () => controller.enterThread( + controller.selectedEvents.single.eventId, + ), + ), + IconButton( + icon: const Icon(Icons.copy_outlined), + tooltip: L10n.of(context).copyToClipboard, + onPressed: controller.copyEventsAction, + ), + if (controller.canRedactSelectedEvents) + IconButton( + icon: const Icon(Icons.delete_outlined), + tooltip: L10n.of(context).redactMessage, + onPressed: controller.redactEventsAction, + ), + if (controller.selectedEvents.length == 1) + PopupMenuButton<_EventContextAction>( + useRootNavigator: true, + onSelected: (action) { + switch (action) { + case _EventContextAction.info: + controller.showEventInfo(); + controller.clearSelectedEvents(); + break; + case _EventContextAction.report: + controller.reportEventAction(); + break; + } + }, + itemBuilder: (context) => [ + if (controller.canPinSelectedEvents) + PopupMenuItem( + onTap: controller.pinEvent, + value: null, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.push_pin_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).pinMessage), + ], + ), + ), + if (controller.canSaveSelectedEvent) + PopupMenuItem( + onTap: () => + controller.saveSelectedEvent(context), + value: null, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.download_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).downloadFile), + ], + ), + ), + PopupMenuItem( + value: _EventContextAction.info, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.info_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).messageInfo), + ], + ), + ), + if (controller.selectedEvents.single.status.isSent) + PopupMenuItem( + value: _EventContextAction.report, + child: Row( + mainAxisSize: .min, + children: [ + const Icon( + Icons.shield_outlined, + color: Colors.red, + ), + const SizedBox(width: 12), + Text(L10n.of(context).reportMessage), + ], + ), + ), + ], + ), + ] else if (!controller.room.isArchived) ...[ + if ((AppSettings.experimentalVoip.value && + controller.room.isDirectChat)) + IconButton( + onPressed: controller.onPhoneButtonTap, + icon: const Icon(Icons.call_outlined), + tooltip: L10n.of(context).placeCall, + ), + ChatSettingsPopupMenu(controller.room, true), + ], + ], + bottom: PreferredSize( + preferredSize: Size.fromHeight(appbarBottomHeight), + child: Column( + mainAxisSize: .min, + children: [ + PinnedEvents(controller), + if (activeThreadId != null) + SizedBox( + height: ChatAppBarListTile.fixedHeight, + child: Center( + child: TextButton.icon( + onPressed: () => + controller.scrollToEventId(activeThreadId), + icon: const Icon(Icons.message), + label: Text(L10n.of(context).replyInThread), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.onSecondaryContainer, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4), + ), + ), + ), + ), + ), + if (scrollUpBannerEventId != null && + activeThreadId == null) + ChatAppBarListTile( + leading: IconButton( + color: theme.colorScheme.onSurfaceVariant, + icon: const Icon(Icons.close), + tooltip: L10n.of(context).close, + onPressed: () { + controller.discardScrollUpBannerEventId(); + controller.setReadMarker(); + }, + ), + title: L10n.of(context).jumpToLastReadMessage, + trailing: TextButton( + onPressed: () { + controller.scrollToEventId(scrollUpBannerEventId); + controller.discardScrollUpBannerEventId(); + }, + child: Text(L10n.of(context).jump), + ), + ), + ], + ), + ), + ), + floatingActionButton: + controller.showScrollDownButton && + controller.selectedEvents.isEmpty + ? Padding( + padding: EdgeInsets.only( + bottom: theme.appBarTheme.toolbarHeight ?? 56, + ), + child: FloatingActionButton( + onPressed: controller.scrollDown, + heroTag: null, + mini: true, + backgroundColor: theme.colorScheme.surface, + foregroundColor: theme.colorScheme.onSurface, + child: const Icon(Icons.arrow_downward_outlined), + ), + ) + : null, + body: NotificationListener( + onNotification: (SizeChangedLayoutNotification notification) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => controller.updateInputBarHeight(), + ); + return true; + }, + child: DropTarget( onDragDone: controller.onDragDone, onDragEntered: controller.onDragEntered, onDragExited: controller.onDragExited, - child: Stack( - children: [ - if (Matrix.of(context).wallpaper != null) - Image.file( - Matrix.of(context).wallpaper!, - width: double.infinity, - height: double.infinity, - fit: BoxFit.cover, - ), - SafeArea( - child: Column( - children: [ - TombstoneDisplay(controller), - PinnedEvents(controller), - Expanded( - child: GestureDetector( - onTap: controller.clearSingleSelectedEvent, - child: Builder( - builder: (context) { - if (snapshot.hasError) { - SentryController.captureException( - snapshot.error, - StackTrace.current, - ); - } - if (controller.timeline == null) { - return const Center( - child: CircularProgressIndicator - .adaptive(strokeWidth: 2), - ); - } - - return ChatEventList( - controller: controller, - ); - }, - )), + child: SafeArea( + top: false, + child: Stack( + children: [ + if (accountConfig.wallpaperUrl != null) + Opacity( + opacity: accountConfig.wallpaperOpacity ?? 0.5, + child: ImageFiltered( + imageFilter: ui.ImageFilter.blur( + sigmaX: accountConfig.wallpaperBlur ?? 0.0, + sigmaY: accountConfig.wallpaperBlur ?? 0.0, + ), + child: MxcImage( + cacheKey: accountConfig.wallpaperUrl.toString(), + uri: accountConfig.wallpaperUrl, + fit: BoxFit.cover, + height: MediaQuery.sizeOf(context).height, + width: MediaQuery.sizeOf(context).width, + isThumbnail: false, + placeholder: (_) => Container(), + ), ), - if (controller.room!.canSendDefaultMessages && - controller.room!.membership == Membership.join) - Container( - margin: EdgeInsets.only( - bottom: bottomSheetPadding, - left: bottomSheetPadding, - right: bottomSheetPadding, + ), + GestureDetector( + onTap: controller.clearSingleSelectedEvent, + child: ChatEventList(controller: controller), + ), + Positioned( + bottom: 0, + left: 0, + right: 0, + child: SizeChangedLayoutNotifier( + child: Container( + key: controller.inputBarKey, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + theme.colorScheme.surface.withAlpha(0), + theme.colorScheme.surface.withAlpha(0), + theme.colorScheme.surface, + theme.colorScheme.surface, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, ), + ), + alignment: Alignment.center, + child: Container( + margin: EdgeInsets.all(bottomSheetPadding), constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 2.5), - alignment: Alignment.center, - child: Material( - borderRadius: const BorderRadius.only( - bottomLeft: - Radius.circular(AppConfig.borderRadius), - bottomRight: - Radius.circular(AppConfig.borderRadius), - ), - elevation: 6, - shadowColor: Theme.of(context) - .dividerColor - .withAlpha(100), - clipBehavior: Clip.hardEdge, - color: Theme.of(context).brightness == - Brightness.light - ? Colors.white - : Colors.black, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const ConnectionStatusHeader(), - ReactionsPicker(controller), - ReplyDisplay(controller), - ChatInputRow(controller), - ChatEmojiPicker(controller), - ], - ), + maxWidth: FluffyThemes.maxTimelineWidth, ), + child: controller.room.isExtinct + ? ElevatedButton.icon( + icon: const Icon(Icons.chevron_right), + label: Text( + L10n.of(context).enterNewChat, + ), + onPressed: controller.goToNewRoomAction, + ) + : controller.room.canSendDefaultMessages && + controller.room.membership == + Membership.join + ? Material( + clipBehavior: Clip.hardEdge, + color: + controller.selectedEvents.isNotEmpty + ? theme + .colorScheme + .tertiaryContainer + : theme + .colorScheme + .surfaceContainer, + borderRadius: BorderRadius.circular(32), + child: + controller.room.isAbandonedDMRoom == + true + ? Row( + mainAxisAlignment: .spaceEvenly, + children: [ + TextButton.icon( + style: TextButton.styleFrom( + padding: + const EdgeInsets.all( + 16, + ), + foregroundColor: theme + .colorScheme + .error, + ), + icon: const Icon( + Icons.archive_outlined, + ), + onPressed: + controller.leaveChat, + label: Text( + L10n.of(context).leave, + ), + ), + TextButton.icon( + style: TextButton.styleFrom( + padding: + const EdgeInsets.all( + 16, + ), + ), + icon: const Icon( + Icons.forum_outlined, + ), + onPressed: + controller.recreateChat, + label: Text( + L10n.of( + context, + ).reopenChat, + ), + ), + ], + ) + : Column( + mainAxisSize: .min, + children: [ + ReplyDisplay(controller), + ChatInputRow(controller), + ChatEmojiPicker(controller), + ], + ), + ) + : SizedBox.shrink(), ), - ], - ), - ), - if (controller.dragging) - Container( - color: Theme.of(context) - .scaffoldBackgroundColor - .withOpacity(0.9), - alignment: Alignment.center, - child: const Icon( - Icons.upload_outlined, - size: 100, + ), ), ), - ], + if (controller.dragging) + Container( + color: theme.scaffoldBackgroundColor.withAlpha(230), + alignment: Alignment.center, + child: const Icon(Icons.upload_outlined, size: 100), + ), + ], + ), ), ), - ); - }, - ), + ), + ); + }, ), ), ); diff --git a/lib/pages/chat/command_hints.dart b/lib/pages/chat/command_hints.dart index 617c4f80ba..e872284f3c 100644 --- a/lib/pages/chat/command_hints.dart +++ b/lib/pages/chat/command_hints.dart @@ -1,46 +1,95 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + // This file is auto-generated using scripts/generate_command_hints_glue.sh. -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/l10n/l10n.dart'; + +String commandExample(String command) { + switch (command) { + case 'markasdm': + case 'kick': + case 'dm': + case 'ban': + case 'unban': + case 'ignore': + case 'unignore': + case 'invite': + return '/$command '; + case 'html': + case 'sendraw': + case 'plain': + return '/$command '; + case 'op': + return '/$command '; + default: + return '/$command'; + } +} String commandHint(L10n l10n, String command) { switch (command) { - case "ban": + case 'ban': return l10n.commandHint_ban; - case "clearcache": + case 'clearcache': return l10n.commandHint_clearcache; - case "create": + case 'create': return l10n.commandHint_create; - case "discardsession": + case 'discardsession': return l10n.commandHint_discardsession; - case "dm": + case 'dm': return l10n.commandHint_dm; - case "html": + case 'html': return l10n.commandHint_html; - case "invite": + case 'invite': return l10n.commandHint_invite; - case "join": + case 'join': return l10n.commandHint_join; - case "kick": + case 'kick': return l10n.commandHint_kick; - case "leave": + case 'leave': return l10n.commandHint_leave; - case "me": + case 'me': return l10n.commandHint_me; - case "myroomavatar": + case 'myroomavatar': return l10n.commandHint_myroomavatar; - case "myroomnick": + case 'myroomnick': return l10n.commandHint_myroomnick; - case "op": + case 'op': return l10n.commandHint_op; - case "plain": + case 'plain': return l10n.commandHint_plain; - case "react": + case 'react': return l10n.commandHint_react; - case "send": + case 'send': return l10n.commandHint_send; - case "unban": + case 'unban': return l10n.commandHint_unban; + case 'markasdm': + return l10n.commandHint_markasdm; + case 'markasgroup': + return l10n.commandHint_markasgroup; + case 'googly': + return l10n.commandHint_googly; + case 'hug': + return l10n.commandHint_hug; + case 'cuddle': + return l10n.commandHint_cuddle; + case 'sendraw': + return l10n.commandHint_sendraw; + case 'ignore': + return l10n.commandHint_ignore; + case 'unignore': + return l10n.commandHint_unignore; + case 'roomupgrade': + return l10n.commandHint_roomupgrade; + case 'logout': + return l10n.commandHint_logout; + case 'logoutall': + return l10n.commandHint_logoutall; default: - return ""; + return ''; } } diff --git a/lib/pages/chat/cupertino_widgets_bottom_sheet.dart b/lib/pages/chat/cupertino_widgets_bottom_sheet.dart deleted file mode 100644 index 9079475683..0000000000 --- a/lib/pages/chat/cupertino_widgets_bottom_sheet.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/link.dart'; - -import 'edit_widgets_dialog.dart'; - -class CupertinoWidgetsBottomSheet extends StatelessWidget { - final Room room; - - const CupertinoWidgetsBottomSheet({Key? key, required this.room}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return CupertinoActionSheet( - title: Text(L10n.of(context)!.matrixWidgets), - actions: [ - ...room.widgets.map( - (widget) => Link( - builder: (context, callback) { - return CupertinoActionSheetAction( - child: Text(widget.name ?? widget.url), - onPressed: callback ?? () {}, - ); - }, - target: LinkTarget.blank, - uri: Uri.parse(widget.url), - ), - ), - CupertinoActionSheetAction( - child: Text(L10n.of(context)!.editWidgets), - onPressed: () { - Navigator.of(context).pop(); - showCupertinoDialog( - context: context, - builder: (context) => EditWidgetsDialog(room: room), - useRootNavigator: false, - ); - }, - ), - CupertinoActionSheetAction( - child: Text(L10n.of(context)!.cancel), - onPressed: Navigator.of(context).pop, - ), - ], - ); - } -} diff --git a/lib/pages/chat/edit_widgets_dialog.dart b/lib/pages/chat/edit_widgets_dialog.dart deleted file mode 100644 index 8d35191377..0000000000 --- a/lib/pages/chat/edit_widgets_dialog.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'add_widget_tile.dart'; - -class EditWidgetsDialog extends StatelessWidget { - final Room room; - - const EditWidgetsDialog({Key? key, required this.room}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SimpleDialog( - title: Text(L10n.of(context)!.editWidgets), - children: [ - ...room.widgets.map((e) => ListTile( - title: Text(e.name ?? e.type), - leading: IconButton( - onPressed: () { - room.deleteWidget(e.id!); - Navigator.of(context).pop(); - }, - icon: const Icon(Icons.delete)), - )), - AddWidgetTile(room: room), - ], - ); - } -} diff --git a/lib/pages/chat/encrpytion_info.dart b/lib/pages/chat/encrpytion_info.dart new file mode 100644 index 0000000000..c6d2f0bb90 --- /dev/null +++ b/lib/pages/chat/encrpytion_info.dart @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +class EncryptionInfo extends StatelessWidget { + final Room room; + + const EncryptionInfo({super.key, required this.room}); + + Future _unverifiedDevices() async { + if (!room.encrypted) return 0; + final users = await room.requestParticipants(); + final devicesKeysLists = users + .map((user) => room.client.userDeviceKeys[user.id]) + .nonNulls; + final devices = devicesKeysLists.fold>( + [], + (devices, devicesKeysList) => [ + ...devices, + ...devicesKeysList.deviceKeys.values, + ], + ); + return devices + .where( + (device) => + !device.verified && + !device.blocked && + !device.hasValidSignatureChain(verifiedByTheirMasterKey: true) && + device.encryptToDevice, + ) + .length; + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: FutureBuilder( + future: _unverifiedDevices(), + builder: (context, asyncSnapshot) { + final unverifiedDevices = asyncSnapshot.data ?? 0; + if (unverifiedDevices == 0) return const SizedBox.shrink(); + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Center( + child: Padding( + padding: const EdgeInsets.all(4), + child: Material( + color: theme.colorScheme.surface.withAlpha(128), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 3, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 4.0, + ), + child: Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Icon(Icons.lock_person_outlined, size: 13), + ), + TextSpan(text: ' '), + TextSpan( + text: L10n.of( + context, + ).countUnverifiedDevices(unverifiedDevices), + ), + TextSpan(text: ' '), + TextSpan( + style: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + recognizer: TapGestureRecognizer() + ..onTap = () => + context.go('/rooms/${room.id}/encryption'), + text: 'Check', + ), + ], + ), + textAlign: TextAlign.center, + style: TextStyle(fontSize: 11), + ), + ), + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/chat/encryption_button.dart b/lib/pages/chat/encryption_button.dart deleted file mode 100644 index 89fe0b6e33..0000000000 --- a/lib/pages/chat/encryption_button.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import '../../widgets/matrix.dart'; - -class EncryptionButton extends StatefulWidget { - final Room room; - const EncryptionButton(this.room, {Key? key}) : super(key: key); - @override - _EncryptionButtonState createState() => _EncryptionButtonState(); -} - -class _EncryptionButtonState extends State { - StreamSubscription? _onSyncSub; - - void _enableEncryptionAction() async { - if (widget.room.encrypted) { - VRouter.of(context).toSegments(['rooms', widget.room.id, 'encryption']); - return; - } - if (widget.room.joinRules == JoinRules.public) { - await showOkAlertDialog( - useRootNavigator: false, - context: context, - okLabel: L10n.of(context)!.ok, - message: L10n.of(context)!.noEncryptionForPublicRooms, - ); - return; - } - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.enableEncryption, - message: widget.room.client.encryptionEnabled - ? L10n.of(context)!.enableEncryptionWarning - : L10n.of(context)!.needPantalaimonWarning, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok) { - await showFutureLoadingDialog( - context: context, - future: () => widget.room.enableEncryption(), - ); - // we want to enable the lock icon - setState(() {}); - } - } - - @override - void dispose() { - _onSyncSub?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - if (widget.room.encrypted) { - _onSyncSub ??= Matrix.of(context) - .client - .onSync - .stream - .where((s) => s.deviceLists != null) - .listen((s) => setState(() {})); - } - return FutureBuilder>( - future: - widget.room.encrypted ? widget.room.requestParticipants() : null, - builder: (BuildContext context, snapshot) { - Color? color; - if (widget.room.encrypted && snapshot.hasData) { - final users = snapshot.data!; - users.removeWhere((u) => - !{Membership.invite, Membership.join}.contains(u.membership) || - !widget.room.client.userDeviceKeys.containsKey(u.id)); - var allUsersValid = true; - var oneUserInvalid = false; - for (final u in users) { - final status = widget.room.client.userDeviceKeys[u.id]!.verified; - if (status != UserVerifiedStatus.verified) { - allUsersValid = false; - } - if (status == UserVerifiedStatus.unknownDevice) { - oneUserInvalid = true; - } - } - if (oneUserInvalid) color = Colors.red; - if (!allUsersValid) color = Colors.orange; - } else if (!widget.room.encrypted && - widget.room.joinRules != JoinRules.public) { - color = Colors.red; - } - return IconButton( - tooltip: widget.room.encrypted - ? L10n.of(context)!.encrypted - : L10n.of(context)!.encryptionNotEnabled, - icon: Icon( - widget.room.encrypted - ? Icons.lock_outlined - : Icons.lock_open_outlined, - size: 20, - color: color), - onPressed: _enableEncryptionAction, - ); - }); - } -} diff --git a/lib/pages/chat/event_info_dialog.dart b/lib/pages/chat/event_info_dialog.dart index 16862bf089..731cc945f6 100644 --- a/lib/pages/chat/event_info_dialog.dart +++ b/lib/pages/chat/event_info_dialog.dart @@ -1,47 +1,47 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; +import 'dart:convert'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; extension EventInfoDialogExtension on Event { - void showInfoDialog(BuildContext context) => showModalBottomSheet( - context: context, - builder: (context) => - EventInfoDialog(l10n: L10n.of(context)!, event: this), - ); + void showInfoDialog(BuildContext context) => showAdaptiveBottomSheet( + context: context, + builder: (context) => EventInfoDialog(l10n: L10n.of(context), event: this), + ); } class EventInfoDialog extends StatelessWidget { final Event event; final L10n l10n; - const EventInfoDialog({ - required this.event, - required this.l10n, - Key? key, - }) : super(key: key); - String get prettyJson { - const JsonDecoder decoder = JsonDecoder(); - const JsonEncoder encoder = JsonEncoder.withIndent(' '); + const EventInfoDialog({required this.event, required this.l10n, super.key}); + + String prettyJson(MatrixEvent event) { + const decoder = JsonDecoder(); + const encoder = JsonEncoder.withIndent(' '); final object = decoder.convert(jsonEncode(event.toJson())); return encoder.convert(object); } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final originalSource = event.originalSource; return Scaffold( appBar: AppBar( - title: Text(L10n.of(context)!.messageInfo), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), + title: Text(L10n.of(context).messageInfo), + leading: CloseButton( onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, ), ), body: ListView( @@ -50,49 +50,59 @@ class EventInfoDialog extends StatelessWidget { leading: Avatar( mxContent: event.senderFromMemoryOrFallback.avatarUrl, name: event.senderFromMemoryOrFallback.calcDisplayname(), + client: event.room.client, + presenceUserId: event.senderId, ), - title: Text(L10n.of(context)!.sender), + title: Text(L10n.of(context).sender), subtitle: Text( - '${event.senderFromMemoryOrFallback.calcDisplayname()} [${event.senderId}]'), + '${event.senderFromMemoryOrFallback.calcDisplayname()} [${event.senderId}]', + ), ), ListTile( - title: Text(L10n.of(context)!.time), + title: Text('${L10n.of(context).time}:'), subtitle: Text(event.originServerTs.localizedTime(context)), ), ListTile( - title: Text(L10n.of(context)!.messageType), - subtitle: Text(event.humanreadableType), + title: Text('${L10n.of(context).status}:'), + subtitle: Text(event.status.name), ), - ListTile(title: Text('${L10n.of(context)!.sourceCode}:')), + ListTile(title: Text('${L10n.of(context).sourceCode}:')), Padding( padding: const EdgeInsets.all(12.0), child: Material( borderRadius: BorderRadius.circular(AppConfig.borderRadius), - color: Theme.of(context).colorScheme.surface, + color: theme.colorScheme.surfaceContainer, child: SingleChildScrollView( - padding: const EdgeInsets.all(8), + padding: const EdgeInsets.all(16), scrollDirection: Axis.horizontal, - child: SelectableText(prettyJson), + child: SelectableText( + prettyJson(MatrixEvent.fromJson(event.toJson())), + style: TextStyle(color: theme.colorScheme.onSurface), + ), ), ), ), + if (event.messageType != MessageTypes.BadEncrypted && + originalSource != null) ...[ + ListTile(title: Text('${L10n.of(context).encrypted}:')), + Padding( + padding: const EdgeInsets.all(12.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: SelectableText( + prettyJson(originalSource), + style: TextStyle(color: theme.colorScheme.onSurface), + ), + ), + ), + ), + ], ], ), ); } } - -extension on Event { - String get humanreadableType { - if (type == EventTypes.Message) { - return messageType.split('m.').last; - } - if (type.startsWith('m.room.')) { - return type.split('m.room.').last; - } - if (type.startsWith('m.')) { - return type.split('m.').last; - } - return type; - } -} diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 9b6177a745..e5b54c10a2 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -1,150 +1,256 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; import 'dart:io'; +import 'package:async/async.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; +import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; -import '../../../utils/matrix_sdk_extensions.dart/event_extension.dart'; +import '../../../utils/matrix_sdk_extensions/event_extension.dart'; +import '../../../widgets/fluffy_chat_app.dart'; +import '../../../widgets/matrix.dart'; class AudioPlayerWidget extends StatefulWidget { final Color color; + final Color linkColor; + final double fontSize; final Event event; - static String? currentId; - static const int wavesCount = 40; - const AudioPlayerWidget(this.event, {this.color = Colors.black, Key? key}) - : super(key: key); + const AudioPlayerWidget( + this.event, { + required this.color, + required this.linkColor, + required this.fontSize, + super.key, + }); @override - _AudioPlayerState createState() => _AudioPlayerState(); + AudioPlayerState createState() => AudioPlayerState(); } enum AudioPlayerStatus { notDownloaded, downloading, downloaded } -class _AudioPlayerState extends State { - AudioPlayerStatus status = AudioPlayerStatus.notDownloaded; - final AudioPlayer audioPlayer = AudioPlayer(); - - StreamSubscription? onAudioPositionChanged; - StreamSubscription? onDurationChanged; - StreamSubscription? onPlayerStateChanged; - StreamSubscription? onPlayerError; +class AudioPlayerState extends State { + static const double buttonSize = 36; - String? statusText; - int currentPosition = 0; - double maxPosition = 0; + AudioPlayerStatus status = AudioPlayerStatus.notDownloaded; + double? _downloadProgress; - File? audioFile; + late final MatrixState matrix; + List? _waveform; + String? _durationString; @override void dispose() { - if (audioPlayer.playerState.playing) { - audioPlayer.stop(); - } - onAudioPositionChanged?.cancel(); - onDurationChanged?.cancel(); - onPlayerStateChanged?.cancel(); - onPlayerError?.cancel(); - super.dispose(); + final audioPlayer = matrix.voiceMessageEventId.value != widget.event.eventId + ? null + : matrix.audioPlayer; + if (audioPlayer != null) { + if (audioPlayer.playing && !audioPlayer.isAtEndPosition) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(matrix.context).showMaterialBanner( + MaterialBanner( + padding: EdgeInsets.zero, + leading: StreamBuilder( + stream: audioPlayer.playerStateStream.asBroadcastStream(), + builder: (context, _) => IconButton( + onPressed: () { + if (audioPlayer.isAtEndPosition) { + audioPlayer.seek(Duration.zero); + } else if (audioPlayer.playing) { + audioPlayer.pause(); + } else { + audioPlayer.play(); + } + }, + icon: audioPlayer.playing && !audioPlayer.isAtEndPosition + ? const Icon(Icons.pause_outlined) + : const Icon(Icons.play_arrow_outlined), + ), + ), + content: StreamBuilder( + stream: audioPlayer.positionStream.asBroadcastStream(), + builder: (context, _) => GestureDetector( + onTap: () => FluffyChatApp.router.go( + '/rooms/${widget.event.room.id}?event=${widget.event.eventId}', + ), + child: Text( + '🎙️ ${audioPlayer.position.minuteSecondString} / ${audioPlayer.duration?.minuteSecondString} - ${widget.event.senderFromMemoryOrFallback.calcDisplayname()}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ), + actions: [ + IconButton( + onPressed: () { + audioPlayer.pause(); + audioPlayer.dispose(); + matrix.voiceMessageEventId.value = matrix.audioPlayer = + null; + + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of( + matrix.context, + ).clearMaterialBanners(); + }); + }, + icon: const Icon(Icons.close_outlined), + ), + ], + ), + ); + }); + return; + } + audioPlayer.pause(); + audioPlayer.dispose(); + matrix.voiceMessageEventId.value = matrix.audioPlayer = null; + } } - Future _downloadAction() async { - if (status != AudioPlayerStatus.notDownloaded) return; + Future _onButtonTap() async { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(matrix.context).clearMaterialBanners(); + }); + final currentPlayer = + matrix.voiceMessageEventId.value != widget.event.eventId + ? null + : matrix.audioPlayer; + if (currentPlayer != null && !currentPlayer.isAtEndPosition) { + if (currentPlayer.playing) { + currentPlayer.pause(); + } else { + currentPlayer.play(); + } + return; + } + + matrix.voiceMessageEventId.value = widget.event.eventId; + matrix.audioPlayer + ?..stop() + ..dispose(); + File? file; + MatrixFile? matrixFile; + setState(() => status = AudioPlayerStatus.downloading); try { - final matrixFile = - await widget.event.downloadAndDecryptAttachmentCached(); - if (matrixFile == null) throw ('Download failed'); - final tempDir = await getTemporaryDirectory(); - final fileName = Uri.encodeComponent( - widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last); - final file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); - await file.writeAsBytes(matrixFile.bytes); + final fileSize = widget.event.content + .tryGetMap('info') + ?.tryGet('size'); + matrixFile = await widget.event.downloadAndDecryptAttachment( + onDownloadProgress: fileSize != null && fileSize > 0 + ? (progress) { + final progressPercentage = progress / fileSize; + setState(() { + _downloadProgress = progressPercentage < 1 + ? progressPercentage + : null; + }); + } + : null, + ); + + final attachmentUrl = widget.event.attachmentOrThumbnailMxcUrl(); + + if (!kIsWeb && attachmentUrl != null) { + final tempDir = await getTemporaryDirectory(); + final fileName = Uri.encodeComponent(attachmentUrl.pathSegments.last); + file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); + + await file.writeAsBytes(matrixFile.bytes); + + if (Platform.isIOS && + matrixFile.mimeType.toLowerCase() == 'audio/ogg') { + Logs().v('Convert ogg audio file for iOS...'); + final convertedFile = File('${file.path}.caf'); + if (await convertedFile.exists() == false) { + OpusCaf().convertOpusToCaf(file.path, convertedFile.path); + } + file = convertedFile; + } + } setState(() { - audioFile = file; status = AudioPlayerStatus.downloaded; }); - _playAction(); } catch (e, s) { Logs().v('Could not download audio file', e, s); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(e.toLocalizedString(context)), - ), - ); + if (!mounted) rethrow; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + rethrow; } - } + if (!context.mounted) return; + if (matrix.voiceMessageEventId.value != widget.event.eventId) return; - void _playAction() async { - if (AudioPlayerWidget.currentId != widget.event.eventId) { - if (AudioPlayerWidget.currentId != null) { - if (audioPlayer.playerState.playing) { - await audioPlayer.stop(); - setState(() {}); - } - } - AudioPlayerWidget.currentId = widget.event.eventId; - } - if (audioPlayer.playerState.playing) { - await audioPlayer.pause(); - return; - } else if (audioPlayer.position != Duration.zero) { - await audioPlayer.play(); - return; - } + final audioPlayer = matrix.audioPlayer = AudioPlayer(); - onAudioPositionChanged ??= audioPlayer.positionStream.listen((state) { - setState(() { - statusText = - '${state.inMinutes.toString().padLeft(2, '0')}:${(state.inSeconds % 60).toString().padLeft(2, '0')}'; - currentPosition = ((state.inMilliseconds.toDouble() / maxPosition) * - AudioPlayerWidget.wavesCount) - .round(); - }); - }); - onDurationChanged ??= audioPlayer.durationStream.listen((max) => max == null - ? null - : setState(() => maxPosition = max.inMilliseconds.toDouble())); - onPlayerStateChanged ??= - audioPlayer.playingStream.listen((_) => setState(() {})); - audioPlayer.setFilePath(audioFile!.path); - audioPlayer.play().catchError((e, s) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.oopsSomethingWentWrong), + if (file != null) { + audioPlayer.setFilePath(file.path); + } else { + await audioPlayer.setAudioSource( + AudioSource.uri( + Uri.dataFromBytes(matrixFile.bytes, mimeType: matrixFile.mimeType), ), ); - SentryController.captureException(e, s); - }); - } + } + if (!mounted) return; - static const double buttonSize = 36; + audioPlayer.play().onError( + ErrorReporter(context, 'Unable to play audio message').onErrorCallback, + ); + } - String? get _durationString { - final durationInt = widget.event.content - .tryGetMap('info') - ?.tryGet('duration'); - if (durationInt == null) return null; - final duration = Duration(milliseconds: durationInt); - return '${duration.inMinutes.toString().padLeft(2, '0')}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}'; + Future _toggleSpeed() async { + final audioPlayer = matrix.audioPlayer; + if (audioPlayer == null) return; + switch (audioPlayer.speed) { + case 1.0: + await audioPlayer.setSpeed(1.25); + break; + case 1.25: + await audioPlayer.setSpeed(1.5); + break; + case 1.5: + await audioPlayer.setSpeed(2.0); + break; + case 2.0: + await audioPlayer.setSpeed(0.5); + break; + case 0.5: + default: + await audioPlayer.setSpeed(1.0); + break; + } + setState(() {}); } - List _getWaveform() { + List? _getWaveform() { final eventWaveForm = widget.event.content - .tryGetMap('org.matrix.msc1767.audio') + .tryGetMap('org.matrix.msc1767.audio') ?.tryGetList('waveform'); - if (eventWaveForm == null) { - return List.filled(AudioPlayerWidget.wavesCount, 500); + if (eventWaveForm == null || eventWaveForm.isEmpty) { + return null; } while (eventWaveForm.length < AudioPlayerWidget.wavesCount) { for (var i = 0; i < eventWaveForm.length; i = i + 2) { @@ -160,93 +266,270 @@ class _AudioPlayerState extends State { return eventWaveForm.map((i) => i > 1024 ? 1024 : i).toList(); } - late final List waveform; - @override void initState() { super.initState(); - waveform = _getWaveform(); + matrix = Matrix.of(context); + _waveform = _getWaveform(); + + if (matrix.voiceMessageEventId.value == widget.event.eventId && + matrix.audioPlayer != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(matrix.context).clearMaterialBanners(); + }); + } + + final durationInt = widget.event.content + .tryGetMap('info') + ?.tryGet('duration'); + if (durationInt != null) { + final duration = Duration(milliseconds: durationInt); + _durationString = duration.minuteSecondString; + } } @override Widget build(BuildContext context) { - final statusText = this.statusText ??= _durationString ?? '00:00'; - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 6.0), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox( - width: buttonSize, - height: buttonSize, - child: status == AudioPlayerStatus.downloading - ? CircularProgressIndicator(strokeWidth: 2, color: widget.color) - : InkWell( - borderRadius: BorderRadius.circular(64), - child: Material( - color: widget.color.withAlpha(64), - borderRadius: BorderRadius.circular(64), - child: Icon( - audioPlayer.playerState.playing - ? Icons.pause_outlined - : Icons.play_arrow_outlined, - color: widget.color, - ), + final theme = Theme.of(context); + final waveform = _waveform; + + return ValueListenableBuilder( + valueListenable: matrix.voiceMessageEventId, + builder: (context, eventId, _) { + final audioPlayer = eventId != widget.event.eventId + ? null + : matrix.audioPlayer; + + final fileDescription = widget.event.fileDescription; + + return StreamBuilder( + stream: audioPlayer == null + ? null + : StreamGroup.merge([ + audioPlayer.positionStream.asBroadcastStream(), + audioPlayer.playerStateStream.asBroadcastStream(), + ]), + builder: (context, _) { + final maxPosition = + audioPlayer?.duration?.inMilliseconds.toDouble() ?? 1.0; + var currentPosition = + audioPlayer?.position.inMilliseconds.toDouble() ?? 0.0; + if (currentPosition > maxPosition) currentPosition = maxPosition; + + final wavePosition = + (currentPosition / maxPosition) * AudioPlayerWidget.wavesCount; + + final statusText = audioPlayer == null + ? _durationString ?? '00:00' + : audioPlayer.position.minuteSecondString; + return Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth, ), - onLongPress: () => widget.event.saveFile(context), - onTap: () { - if (status == AudioPlayerStatus.downloaded) { - _playAction(); - } else { - _downloadAction(); - } - }, - ), - ), - const SizedBox(width: 8), - Expanded( - child: Row( - children: [ - for (var i = 0; i < AudioPlayerWidget.wavesCount; i++) - Expanded( - child: InkWell( - onTap: () => audioPlayer.seek(Duration( - milliseconds: - (maxPosition / AudioPlayerWidget.wavesCount) - .round() * - i)), - child: Container( - height: 32, - alignment: Alignment.center, - child: Opacity( - opacity: currentPosition > i ? 1 : 0.5, - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 1), - decoration: BoxDecoration( - color: widget.color, - borderRadius: BorderRadius.circular(64), + child: Row( + mainAxisSize: .min, + children: [ + SizedBox( + width: buttonSize, + height: buttonSize, + child: status == AudioPlayerStatus.downloading + ? CircularProgressIndicator( + strokeWidth: 2, + color: widget.color, + value: _downloadProgress, + ) + : InkWell( + borderRadius: BorderRadius.circular(64), + onLongPress: () => + widget.event.saveFile(context), + onTap: _onButtonTap, + child: Material( + color: widget.color.withAlpha(64), + borderRadius: BorderRadius.circular(64), + child: Icon( + audioPlayer?.playing == true && + audioPlayer?.isAtEndPosition == + false + ? Icons.pause_outlined + : Icons.play_arrow_outlined, + color: widget.color, + ), + ), + ), + ), + const SizedBox(width: 8), + Expanded( + child: Stack( + children: [ + if (waveform != null) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + ), + child: Row( + children: [ + for ( + var i = 0; + i < AudioPlayerWidget.wavesCount; + i++ + ) + Expanded( + child: Container( + height: 32, + alignment: Alignment.center, + child: Container( + margin: + const EdgeInsets.symmetric( + horizontal: 1, + ), + decoration: BoxDecoration( + color: i < wavePosition + ? widget.color + : widget.color.withAlpha( + 128, + ), + borderRadius: + BorderRadius.circular(64), + ), + height: 32 * (waveform[i] / 1024), + ), + ), + ), + ], + ), + ), + SizedBox( + height: 32, + child: Slider( + thumbColor: + widget.event.senderId == + widget.event.room.client.userID + ? theme.colorScheme.onPrimary + : theme.colorScheme.primary, + activeColor: waveform == null + ? widget.color + : Colors.transparent, + inactiveColor: waveform == null + ? widget.color.withAlpha(128) + : Colors.transparent, + max: maxPosition, + value: currentPosition, + onChanged: (position) => audioPlayer == null + ? _onButtonTap() + : audioPlayer.seek( + Duration( + milliseconds: position.round(), + ), + ), + ), ), - height: 32 * (waveform[i] / 1024)), + ], + ), + ), + const SizedBox(width: 8), + SizedBox( + width: 36, + child: Text( + statusText, + style: TextStyle(color: widget.color, fontSize: 12), + ), + ), + const SizedBox(width: 8), + AnimatedCrossFade( + firstChild: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + Icons.mic_none_outlined, + color: widget.color, + ), + ), + secondChild: Material( + color: widget.color.withAlpha(64), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + child: InkWell( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + onTap: _toggleSpeed, + child: SizedBox( + width: 32, + height: 20, + child: Center( + child: Text( + '${audioPlayer?.speed}x', + style: TextStyle( + color: widget.color, + fontSize: 9, + ), + ), + ), + ), + ), + ), + alignment: Alignment.center, + crossFadeState: audioPlayer == null + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + duration: FluffyThemes.animationDuration, + ), + ], + ), + ), + if (fileDescription != null) ...[ + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + style: TextStyle( + color: widget.color, + fontSize: widget.fontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: widget.linkColor, + fontSize: widget.fontSize, + decoration: TextDecoration.underline, + decorationColor: widget.linkColor, ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), ), ), - ) - ], - ), - ), - const SizedBox(width: 8), - Container( - alignment: Alignment.centerRight, - width: 42, - child: Text( - statusText, - style: TextStyle( - color: widget.color, + ], + ], ), - ), - ), - ], - ), + ); + }, + ); + }, ); } } + +extension on AudioPlayer { + bool get isAtEndPosition { + final duration = this.duration; + if (duration == null) return true; + return position >= duration; + } +} + +extension on Duration { + String get minuteSecondString => + '${inMinutes.toString().padLeft(2, '0')}:${(inSeconds % 60).toString().padLeft(2, '0')}'; +} diff --git a/lib/pages/chat/events/cute_events.dart b/lib/pages/chat/events/cute_events.dart new file mode 100644 index 0000000000..8295926ec1 --- /dev/null +++ b/lib/pages/chat/events/cute_events.dart @@ -0,0 +1,189 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:math'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class CuteContent extends StatefulWidget { + final Event event; + + const CuteContent(this.event, {super.key}); + + @override + State createState() => _CuteContentState(); +} + +class _CuteContentState extends State { + static bool _isOverlayShown = false; + + @override + void initState() { + if (AppSettings.autoplayImages.value && !_isOverlayShown) { + addOverlay(); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: widget.event.fetchSenderUser(), + builder: (context, snapshot) { + final label = generateLabel(snapshot.data); + + return GestureDetector( + onTap: addOverlay, + child: Column( + mainAxisSize: .min, + mainAxisAlignment: .center, + children: [ + Text(widget.event.text, style: const TextStyle(fontSize: 150)), + if (label != null) Text(label), + ], + ), + ); + }, + ); + } + + Future addOverlay() async { + _isOverlayShown = true; + await Future.delayed(const Duration(milliseconds: 50)); + if (!mounted) return; + + OverlayEntry? overlay; + overlay = OverlayEntry( + builder: (context) => CuteEventOverlay( + emoji: widget.event.text, + onAnimationEnd: () { + _isOverlayShown = false; + overlay?.remove(); + }, + ), + ); + Overlay.of(context).insert(overlay); + } + + String? generateLabel(User? user) { + switch (widget.event.content['cute_type']) { + case 'googly_eyes': + return L10n.of(context).googlyEyesContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + case 'cuddle': + return L10n.of(context).cuddleContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + case 'hug': + return L10n.of(context).hugContent( + user?.displayName ?? + widget.event.senderFromMemoryOrFallback.displayName ?? + '', + ); + } + return null; + } +} + +class CuteEventOverlay extends StatefulWidget { + final String emoji; + final VoidCallback onAnimationEnd; + + const CuteEventOverlay({ + super.key, + required this.emoji, + required this.onAnimationEnd, + }); + + @override + State createState() => _CuteEventOverlayState(); +} + +class _CuteEventOverlayState extends State + with TickerProviderStateMixin { + final List items = List.generate( + 50, + (index) => Size(Random().nextDouble(), 4 + (Random().nextDouble() * 4)), + ); + + AnimationController? controller; + + @override + void initState() { + controller = AnimationController( + duration: const Duration(milliseconds: 2500), + vsync: this, + ); + controller?.forward(); + controller?.addStatusListener(_hideOverlay); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: controller!, + builder: (context, _) => LayoutBuilder( + builder: (context, constraints) { + final width = constraints.maxWidth - _CuteOverlayContent.size; + final height = constraints.maxHeight + _CuteOverlayContent.size; + return SizedBox( + height: constraints.maxHeight, + width: constraints.maxWidth, + child: OverflowBox( + child: Stack( + alignment: Alignment.bottomLeft, + fit: StackFit.expand, + children: items + .map( + (position) => Positioned( + left: position.width * width, + bottom: + (height * + .25 * + position.height * + (controller?.value ?? 0)) - + _CuteOverlayContent.size, + child: _CuteOverlayContent(emoji: widget.emoji), + ), + ) + .toList(), + ), + ), + ); + }, + ), + ); + } + + void _hideOverlay(AnimationStatus status) { + if (status == AnimationStatus.completed) { + widget.onAnimationEnd.call(); + } + } +} + +class _CuteOverlayContent extends StatelessWidget { + static const double size = 64.0; + final String emoji; + + const _CuteOverlayContent({required this.emoji}); + + @override + Widget build(BuildContext context) { + return SizedBox.square( + dimension: size, + child: Text(emoji, style: const TextStyle(fontSize: 48)), + ); + } +} diff --git a/lib/pages/chat/events/file_send_status_indicator.dart b/lib/pages/chat/events/file_send_status_indicator.dart new file mode 100644 index 0000000000..8be7092de0 --- /dev/null +++ b/lib/pages/chat/events/file_send_status_indicator.dart @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class FileSendStatusIndicator extends StatelessWidget { + final FileSendingStatus fileSendingStatus; + const FileSendStatusIndicator({super.key, required this.fileSendingStatus}); + + @override + Widget build(BuildContext context) { + return CircleAvatar( + child: Stack( + alignment: Alignment.center, + children: [ + switch (fileSendingStatus) { + FileSendingStatus.generatingThumbnail => Icon( + Icons.compress_outlined, + size: 18, + ), + FileSendingStatus.encrypting => Icon(Icons.lock_outlined, size: 18), + FileSendingStatus.uploading => Icon( + Icons.upload_outlined, + size: 18, + ), + }, + const CircularProgressIndicator(strokeWidth: 3), + ], + ), + ); + } +} diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index 7fbe913955..9dd1bdef44 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -1,150 +1,743 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_matrix_html/flutter_html.dart'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/code_highlight_theme.dart'; +import 'package:fluffychat/utils/event_checkbox_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:highlight/highlight.dart' show highlight; +import 'package:html/dom.dart' as dom; +import 'package:html/parser.dart' as parser; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../../config/app_config.dart'; -import '../../../config/setting_keys.dart'; -import '../../../pages/image_viewer/image_viewer.dart'; -import '../../../utils/matrix_sdk_extensions.dart/matrix_locals.dart'; import '../../../utils/url_launcher.dart'; class HtmlMessage extends StatelessWidget { final String html; - final int? maxLines; final Room room; - final TextStyle? defaultTextStyle; - final TextStyle? linkStyle; - final double? emoteSize; + final Color textColor; + final double fontSize; + final TextStyle linkStyle; + final void Function(LinkableElement) onOpen; + final String? eventId; + final Set? checkboxCheckedEvents; const HtmlMessage({ - Key? key, + super.key, required this.html, - this.maxLines, required this.room, - this.defaultTextStyle, - this.linkStyle, - this.emoteSize, - }) : super(key: key); + required this.fontSize, + required this.linkStyle, + this.textColor = Colors.black, + required this.onOpen, + this.eventId, + this.checkboxCheckedEvents, + }); - @override - Widget build(BuildContext context) { - // riot-web is notorious for creating bad reply fallback events from invalid messages which, if - // not handled properly, can lead to impersination. As such, we strip the entire `` tags - // here already, to prevent that from happening. - // We do *not* do this in an AST and just with simple regex here, as riot-web tends to create - // miss-matching tags, and this way we actually correctly identify what we want to strip and, well, - // strip it. - final renderHtml = html.replaceAll( - RegExp('.*', - caseSensitive: false, multiLine: false, dotAll: true), - ''); - - // there is no need to pre-validate the html, as we validate it while rendering - - final matrix = Matrix.of(context); - - final themeData = Theme.of(context); - return Html( - data: renderHtml, - defaultTextStyle: defaultTextStyle, - emoteSize: emoteSize, - linkStyle: linkStyle ?? - themeData.textTheme.bodyText2!.copyWith( - color: themeData.colorScheme.secondary, - decoration: TextDecoration.underline, + /// Keep in sync with: https://spec.matrix.org/latest/client-server-api/#mroommessage-msgtypes + static const Set allowedHtmlTags = { + 'font', + 'del', + 's', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'blockquote', + 'p', + 'a', + 'ul', + 'ol', + 'sup', + 'sub', + 'li', + 'b', + 'i', + 'u', + 'strong', + 'em', + 'strike', + 'code', + 'hr', + 'br', + 'div', + 'table', + 'thead', + 'tbody', + 'tr', + 'th', + 'td', + 'caption', + 'pre', + 'span', + 'img', + 'details', + 'summary', + // Not in the allowlist of the matrix spec yet but should be harmless: + 'ruby', + 'rp', + 'rt', + 'html', + 'body', + }; + + static const Set ignoredHtmlTags = {'mx-reply'}; + + /// We add line breaks before these tags: + static const Set blockHtmlTags = { + 'p', + 'ul', + 'ol', + 'pre', + 'div', + 'table', + 'details', + 'blockquote', + }; + + /// We add line breaks before these tags: + static const Set fullLineHtmlTag = { + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'li', + }; + + /// Adding line breaks before block elements. + List _renderWithLineBreaks( + dom.NodeList nodes, + BuildContext context, { + int depth = 1, + }) { + final onlyElements = nodes.whereType().toList(); + return [ + for (var i = 0; i < nodes.length; i++) ...[ + // Actually render the node child: + _renderHtml(nodes[i], context, depth: depth + 1), + // Add linebreaks between blocks: + if (nodes[i] is dom.Element && + onlyElements.indexOf(nodes[i] as dom.Element) < + onlyElements.length - 1) ...[ + if (blockHtmlTags.contains((nodes[i] as dom.Element).localName)) + const TextSpan(text: '\n\n'), + if (fullLineHtmlTag.contains((nodes[i] as dom.Element).localName)) + const TextSpan(text: '\n'), + ], + ], + ]; + } + + InlineSpan _renderCodeBlockNode(dom.Node node) { + if (node is! dom.Element) { + return TextSpan(text: node.text); + } + final style = + atomOneDarkTheme[node.className.split('-').last] ?? + atomOneDarkTheme['root']; + + return TextSpan( + children: node.nodes.map(_renderCodeBlockNode).toList(), + style: style, + ); + } + + /// Transforms a Node to an InlineSpan. + InlineSpan _renderHtml(dom.Node node, BuildContext context, {int depth = 1}) { + // We must not render elements nested more than 100 elements deep: + if (depth >= 100) return const TextSpan(); + + if (node is dom.Element && + ignoredHtmlTags.contains(node.localName?.toLowerCase())) { + return const TextSpan(); + } + + // This is a text node or not permitted node, so we render it as text: + if (node is! dom.Element || !allowedHtmlTags.contains(node.localName)) { + var text = node.text ?? ''; + // Single linebreak nodes between Elements are ignored: + if (text == '\n') text = ''; + + return LinkifySpan( + text: text, + options: const LinkifyOptions(humanize: false), + linkStyle: linkStyle, + onOpen: onOpen, + ); + } + + switch (node.localName) { + case 'br': + return const TextSpan(text: '\n'); + case 'a': + final href = node.attributes['href']; + if (href == null) continue block; + final matrixId = node.attributes['href'] + ?.parseIdentifierIntoParts() + ?.primaryIdentifier; + if (matrixId != null) { + if (matrixId.sigil == '@') { + final user = room.unsafeGetUserFromMemoryOrFallback(matrixId); + return WidgetSpan( + child: MatrixPill( + key: Key('user_pill_$matrixId'), + name: user.calcDisplayname(), + avatar: user.avatarUrl, + uri: href, + outerContext: context, + fontSize: fontSize, + color: linkStyle.color, + ), + ); + } + if (matrixId.sigil == '#' || matrixId.sigil == '!') { + final room = matrixId.sigil == '!' + ? this.room.client.getRoomById(matrixId) + : this.room.client.getRoomByAlias(matrixId); + return WidgetSpan( + child: MatrixPill( + name: room?.getLocalizedDisplayname() ?? matrixId, + avatar: room?.avatar, + uri: href, + outerContext: context, + fontSize: fontSize, + color: linkStyle.color, + ), + ); + } + } + return WidgetSpan( + child: Tooltip( + message: href, + child: InkWell( + splashColor: Colors.transparent, + onTap: () => UrlLauncher(context, href, node.text).launchUrl(), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + style: linkStyle, + ), + style: const TextStyle(height: 1.25), + ), + ), ), - shrinkToFit: true, - maxLines: maxLines, - onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), - onPillTap: (url) => UrlLauncher(context, url).launchUrl(), - getMxcUrl: (String mxc, double? width, double? height, - {bool? animated = false}) { - final ratio = MediaQuery.of(context).devicePixelRatio; - return Uri.parse(mxc) - .getThumbnail( - matrix.client, - width: (width ?? 800) * ratio, - height: (height ?? 800) * ratio, - method: ThumbnailMethod.scale, - animated: AppConfig.autoplayImages ? animated : false, - ) - .toString(); - }, - onImageTap: (String mxc) => showDialog( - context: Matrix.of(context).navigatorContext, - useRootNavigator: false, - builder: (_) => ImageViewer(Event( - type: EventTypes.Message, - content: { - 'body': mxc, - 'url': mxc, - 'msgtype': MessageTypes.Image, - }, - senderId: room.client.userID!, - originServerTs: DateTime.now(), - eventId: 'fake_event', - room: room))), - setCodeLanguage: (String key, String value) async { - await matrix.store.setItem('${SettingKeys.codeLanguage}.$key', value); - }, - getCodeLanguage: (String key) async { - return await matrix.store.getItem('${SettingKeys.codeLanguage}.$key'); - }, - getPillInfo: (String url) async { - final identityParts = url.parseIdentifierIntoParts(); - final identifier = identityParts?.primaryIdentifier; - if (identifier == null) { - return {}; + ); + case 'li': + if (!{'ol', 'ul'}.contains(node.parent?.localName)) { + continue block; } - if (identifier.sigil == '@') { - // we have a user pill - final user = room.getState('m.room.member', identifier); - if (user != null) { - return user.content; - } - // there might still be a profile... - final profile = await room.client.getProfileFromUserId(identifier); - return { - 'displayname': profile.displayName, - 'avatar_url': profile.avatarUrl.toString(), - }; + final eventId = this.eventId; + + final isCheckbox = node.className == 'task-list-item'; + final checkboxIndex = isCheckbox + ? node.rootElement + .getElementsByClassName('task-list-item') + .indexOf(node) + + 1 + : null; + final checkedByReaction = !isCheckbox + ? null + : checkboxCheckedEvents?.firstWhereOrNull( + (event) => event.checkedCheckboxId == checkboxIndex, + ); + final staticallyChecked = + isCheckbox && node.children.first.attributes['checked'] == 'true'; + + return WidgetSpan( + child: Padding( + padding: EdgeInsets.only(left: fontSize), + child: Text.rich( + TextSpan( + children: [ + if (!isCheckbox) ...[ + if (node.parent?.localName == 'ul') + const TextSpan(text: '• '), + if (node.parent?.localName == 'ol') + TextSpan( + text: + '${(node.parent?.nodes.whereType().toList().indexOf(node) ?? 0) + (int.tryParse(node.parent?.attributes['start'] ?? '1') ?? 1)}. ', + ), + ], + if (node.className == 'task-list-item') + WidgetSpan( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: SizedBox.square( + dimension: fontSize + 2, + child: CupertinoCheckbox( + checkColor: textColor, + side: BorderSide(color: textColor), + activeColor: textColor.withAlpha(64), + value: + staticallyChecked || checkedByReaction != null, + onChanged: + eventId == null || + checkboxIndex == null || + staticallyChecked || + !room.canSendDefaultMessages || + (checkedByReaction != null && + checkedByReaction.senderId != + room.client.userID) + ? null + : (_) => showFutureLoadingDialog( + context: context, + future: () => checkedByReaction != null + ? room.redactEvent( + checkedByReaction.eventId, + ) + : room.checkCheckbox( + eventId, + checkboxIndex, + ), + ), + ), + ), + ), + ), + ..._renderWithLineBreaks(node.nodes, context, depth: depth), + ], + style: TextStyle(fontSize: fontSize, color: textColor), + ), + ), + ), + ); + case 'blockquote': + return WidgetSpan( + child: Container( + padding: const EdgeInsets.only(left: 8.0), + decoration: BoxDecoration( + border: Border(left: BorderSide(color: textColor, width: 5)), + ), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ), + style: TextStyle( + fontStyle: FontStyle.italic, + fontSize: fontSize, + color: textColor, + ), + ), + ), + ); + case 'code': + final isInline = node.parent?.localName != 'pre'; + final lang = + node.className + .split(' ') + .singleWhereOrNull( + (className) => className.startsWith('language-'), + ) + ?.split('language-') + .last ?? + 'md'; + final highlightedHtml = highlight + .parse(node.text, language: lang) + .toHtml(); + final element = parser.parse(highlightedHtml).body; + if (element == null) { + return const TextSpan(text: 'Unable to render code block!'); } - if (identifier.sigil == '#') { - // we have an alias pill - for (final r in room.client.rooms) { - final state = r.getState('m.room.canonical_alias'); - if (state != null && - ((state.content['alias'] is String && - state.content['alias'] == identifier) || - (state.content['alt_aliases'] is List && - state.content['alt_aliases'].contains(identifier)))) { - // we have a room! - return { - 'displayname': - r.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - 'avatar_url': r.getState('m.room.avatar')?.content['url'], - }; - } - } - return {}; + + return WidgetSpan( + child: Material( + color: atomOneBackgroundColor, + shape: RoundedRectangleBorder( + side: const BorderSide(color: hightlightTextColor), + borderRadius: BorderRadius.circular(4), + ), + child: Padding( + padding: isInline + ? const EdgeInsets.symmetric(horizontal: 4.0) + : const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + child: Text.rich( + TextSpan(children: [_renderCodeBlockNode(element)]), + selectionColor: hightlightTextColor.withAlpha(128), + ), + ), + ), + ); + case 'img': + final mxcUrl = Uri.tryParse(node.attributes['src'] ?? ''); + if (mxcUrl == null || mxcUrl.scheme != 'mxc') { + return TextSpan(text: node.attributes['alt']); } - if (identifier.sigil == '!') { - // we have a room ID pill - final r = room.client.getRoomById(identifier); - if (r == null) { - return {}; - } - return { - 'displayname': - r.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - 'avatar_url': r.getState('m.room.avatar')?.content['url'], - }; + + final width = double.tryParse(node.attributes['width'] ?? ''); + final height = double.tryParse(node.attributes['height'] ?? ''); + const defaultDimension = 64.0; + final actualWidth = width ?? height ?? defaultDimension; + final actualHeight = height ?? width ?? defaultDimension; + + return WidgetSpan( + child: SizedBox( + width: actualWidth, + height: actualHeight, + child: MxcImage( + uri: mxcUrl, + width: actualWidth, + height: actualHeight, + isThumbnail: (actualWidth * actualHeight) > (256 * 256), + ), + ), + ); + case 'table': + return WidgetSpan( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Table( + defaultColumnWidth: const IntrinsicColumnWidth(), + border: TableBorder.all(color: textColor.withAlpha(100)), + children: node.nodes + .whereType() + .expand( + (e) => + e.localName == 'thead' || + e.localName == 'tbody' || + e.localName == 'tfoot' + ? e.nodes.whereType() + : [e], + ) + .where((e) => e.localName == 'tr') + .map( + (tr) => TableRow( + children: tr.nodes + .whereType() + .where( + (e) => e.localName == 'td' || e.localName == 'th', + ) + .map( + (cell) => Padding( + padding: const EdgeInsets.symmetric( + horizontal: 6, + vertical: 3, + ), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + cell.nodes, + context, + depth: depth, + ), + style: cell.localName == 'th' + ? const TextStyle( + fontWeight: FontWeight.bold, + ) + : null, + ), + style: TextStyle( + fontSize: fontSize, + color: textColor, + ), + ), + ), + ) + .toList(), + ), + ) + .toList(), + ), + ), + ); + case 'thead': + case 'tbody': + case 'tfoot': + case 'tr': + case 'th': + case 'td': + case 'caption': + // These are handled by the 'table' case above; if encountered + // outside a table, render children inline as fallback. + return TextSpan( + children: _renderWithLineBreaks(node.nodes, context, depth: depth), + ); + case 'hr': + return const WidgetSpan(child: Divider()); + case 'details': + var obscure = true; + return WidgetSpan( + child: StatefulBuilder( + builder: (context, setState) => InkWell( + splashColor: Colors.transparent, + onTap: () => setState(() { + obscure = !obscure; + }), + child: Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Icon( + obscure ? Icons.arrow_right : Icons.arrow_drop_down, + size: fontSize * 1.2, + color: textColor, + ), + ), + if (obscure) + ...node.nodes + .where( + (node) => + node is dom.Element && + node.localName == 'summary', + ) + .map( + (node) => _renderHtml(node, context, depth: depth), + ) + else + ..._renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ], + ), + style: TextStyle(fontSize: fontSize, color: textColor), + ), + ), + ), + ); + case 'span': + if (!node.attributes.containsKey('data-mx-spoiler')) { + continue block; } - return {}; - }, + var obscure = true; + return WidgetSpan( + child: StatefulBuilder( + builder: (context, setState) => InkWell( + splashColor: Colors.transparent, + onTap: () => setState(() { + obscure = !obscure; + }), + child: Text.rich( + TextSpan( + children: _renderWithLineBreaks( + node.nodes, + context, + depth: depth, + ), + ), + style: TextStyle( + fontSize: fontSize, + color: textColor, + backgroundColor: obscure ? textColor : null, + ), + ), + ), + ), + ); + block: + default: + return TextSpan( + style: switch (node.localName) { + 'body' => TextStyle(fontSize: fontSize, color: textColor), + 'a' => linkStyle, + 'strong' => const TextStyle(fontWeight: FontWeight.bold), + 'em' || 'i' => const TextStyle(fontStyle: FontStyle.italic), + 'del' || 's' || 'strikethrough' => const TextStyle( + decoration: TextDecoration.lineThrough, + ), + 'u' => const TextStyle(decoration: TextDecoration.underline), + 'h1' => TextStyle(fontSize: fontSize * 1.6, height: 2), + 'h2' => TextStyle(fontSize: fontSize * 1.5, height: 2), + 'h3' => TextStyle(fontSize: fontSize * 1.4, height: 2), + 'h4' => TextStyle(fontSize: fontSize * 1.3, height: 1.75), + 'h5' => TextStyle(fontSize: fontSize * 1.2, height: 1.75), + 'h6' => TextStyle(fontSize: fontSize * 1.1, height: 1.5), + 'span' => TextStyle( + color: + node.attributes['color']?.hexToColor ?? + node.attributes['data-mx-color']?.hexToColor ?? + textColor, + backgroundColor: node.attributes['data-mx-bg-color']?.hexToColor, + ), + 'sup' => const TextStyle( + fontFeatures: [FontFeature.superscripts()], + ), + 'sub' => const TextStyle(fontFeatures: [FontFeature.subscripts()]), + _ => null, + }, + children: _renderWithLineBreaks(node.nodes, context, depth: depth), + ); + } + } + + @override + Widget build(BuildContext context) { + final element = parser.parse(html).body ?? dom.Element.html(''); + final configuredMaxLines = AppSettings.messagePreviewMaxLines.value; + final maxLines = configuredMaxLines <= 0 ? null : configuredMaxLines; + final span = _renderHtml(element, context); + final style = TextStyle(fontSize: fontSize, color: textColor); + + if (maxLines == null) { + return Text.rich( + span, + style: style, + selectionColor: textColor.withAlpha(128), + ); + } + + // Heuristic: if plain text has enough newlines or length, it will overflow. + final plainText = element.text; + final lineCount = '\n'.allMatches(plainText).length + 1; + final likelyOverflows = + lineCount > maxLines || plainText.length > maxLines * 50; + + if (!likelyOverflows) { + return Text.rich( + span, + style: style, + selectionColor: textColor.withAlpha(128), + ); + } + + return _CollapsibleText( + span: span, + style: style, + maxLines: maxLines, + textColor: textColor, + linkColor: linkStyle.color ?? textColor, + fontSize: fontSize, + ); + } +} + +class _CollapsibleText extends StatefulWidget { + final InlineSpan span; + final TextStyle style; + final int maxLines; + final Color textColor; + final Color linkColor; + final double fontSize; + + const _CollapsibleText({ + required this.span, + required this.style, + required this.maxLines, + required this.textColor, + required this.linkColor, + required this.fontSize, + }); + + @override + State<_CollapsibleText> createState() => _CollapsibleTextState(); +} + +class _CollapsibleTextState extends State<_CollapsibleText> { + bool _expanded = false; + + @override + Widget build(BuildContext context) { + final l10n = L10n.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: Alignment.topLeft, + child: Text.rich( + widget.span, + style: widget.style, + maxLines: _expanded ? null : widget.maxLines, + overflow: _expanded ? TextOverflow.visible : TextOverflow.ellipsis, + selectionColor: widget.textColor.withAlpha(128), + ), + ), + Center( + child: TextButton.icon( + onPressed: () => setState(() => _expanded = !_expanded), + style: TextButton.styleFrom(foregroundColor: widget.linkColor), + icon: Icon(_expanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), + label: Text(_expanded ? l10n.showLess : l10n.showMore), + ), + ), + ], + ); + } +} + +class MatrixPill extends StatelessWidget { + final String name; + final BuildContext outerContext; + final Uri? avatar; + final String uri; + final double? fontSize; + final Color? color; + + const MatrixPill({ + super.key, + required this.name, + required this.outerContext, + this.avatar, + required this.uri, + required this.fontSize, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + splashColor: Colors.transparent, + onTap: UrlLauncher(outerContext, uri).launchUrl, + child: Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Avatar(mxContent: avatar, name: name, size: 16), + ), + ), + TextSpan( + text: name, + style: TextStyle( + color: color, + decorationColor: color, + decoration: TextDecoration.underline, + fontSize: fontSize, + height: 1.25, + ), + ), + ], + ), + ), ); } } + +extension on String { + Color? get hexToColor { + var hexCode = this; + if (hexCode.startsWith('#')) hexCode = hexCode.substring(1); + if (hexCode.length == 6) hexCode = 'FF$hexCode'; + final colorValue = int.tryParse(hexCode, radix: 16); + return colorValue == null ? null : Color(colorValue); + } +} + +extension on dom.Element { + dom.Element get rootElement => parent?.rootElement ?? this; +} diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart index 27872f3265..b17356237a 100644 --- a/lib/pages/chat/events/image_bubble.dart +++ b/lib/pages/chat/events/image_bubble.dart @@ -1,487 +1,175 @@ -import 'dart:typed_data'; - +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:lottie/lottie.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../../utils/matrix_sdk_extensions.dart/event_extension.dart'; +import '../../../widgets/blur_hash.dart'; -class ImageBubble extends StatefulWidget { +class ImageBubble extends StatelessWidget { final Event event; final bool tapToView; final BoxFit fit; - final bool maxSize; final Color? backgroundColor; + final Color? textColor; + final Color? linkColor; final bool thumbnailOnly; final bool animated; final double width; final double height; - final void Function()? onLoaded; final void Function()? onTap; + final BorderRadius? borderRadius; + final Timeline? timeline; const ImageBubble( this.event, { this.tapToView = true, - this.maxSize = true, this.backgroundColor, - this.fit = BoxFit.cover, + this.fit = BoxFit.contain, this.thumbnailOnly = true, - this.onLoaded, this.width = 400, this.height = 300, this.animated = false, this.onTap, - Key? key, - }) : super(key: key); + this.borderRadius, + this.timeline, + this.textColor, + this.linkColor, + super.key, + }); @override - _ImageBubbleState createState() => _ImageBubbleState(); -} - -class _ImageBubbleState extends State { - // for plaintext: holds the http URL for the thumbnail - String? thumbnailUrl; - // for plaintext. holds the http URL for the thumbnial, without the animated flag - String? thumbnailUrlNoAnimated; - // for plaintext: holds the http URL of the original - String? attachmentUrl; - MatrixFile? _file; - MatrixFile? _thumbnail; - bool _requestedThumbnailOnFailure = false; - // In case we have animated = false, this will hold the first frame so that we make - // sure that things are never animated - Widget? _firstFrame; - - // the mimetypes that we know how to render, from the flutter Image widget - final _knownMimetypes = { - 'image/jpg', - 'image/jpeg', - 'image/png', - 'image/apng', - 'image/webp', - 'image/gif', - 'image/bmp', - 'image/x-bmp', - }; - - // overrides for certain mimetypes if they need different images to render - // memory are for in-memory renderers (e2ee rooms), network for network url renderers. - // The map values themself are set in initState() as they need to be able to access - // `this`. - final _contentRenderers = {}; - - String getMimetype([bool thumbnail = false]) => thumbnail - ? widget.event.thumbnailMimetype.toLowerCase() - : widget.event.attachmentMimetype.toLowerCase(); - - MatrixFile? get _displayFile => _file ?? _thumbnail; - String? get displayUrl => widget.thumbnailOnly ? thumbnailUrl : attachmentUrl; - - dynamic _error; - - Future _requestFile({bool getThumbnail = false}) async { - try { - final res = await widget.event - .downloadAndDecryptAttachmentCached(getThumbnail: getThumbnail); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (getThumbnail) { - if (mounted) { - setState(() => _thumbnail = res); - } - } else { - if (widget.onLoaded != null) { - widget.onLoaded!(); - } - if (mounted) { - setState(() => _file = res); - } - } - }); - } catch (err) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() => _error = err); - } - }); - } - } - - Widget frameBuilder(_, Widget child, int? frame, __) { - // as servers might return animated gifs as thumbnails and we want them to *not* play - // animated, we'll have to store the first frame in a variable and display that instead - if (widget.animated) { - return child; - } - if (frame == 0) { - _firstFrame = child; - } - return _firstFrame ?? child; - } + Widget build(BuildContext context) { + final theme = Theme.of(context); - @override - void initState() { - // add the custom renderers for other mimetypes - _contentRenderers['image/svg+xml'] = _ImageBubbleContentRenderer( - memory: (Uint8List bytes, String key) => SvgPicture.memory( - bytes, - key: ValueKey(key), - fit: widget.fit, - ), - network: (String? url) => url == null - ? Container() - : SvgPicture.network( - url, - key: ValueKey(url), - placeholderBuilder: (context) => getPlaceholderWidget(), - fit: widget.fit, - ), - ); - _contentRenderers['image/lottie+json'] = _ImageBubbleContentRenderer( - memory: (Uint8List bytes, String key) => Lottie.memory( - bytes, - key: ValueKey(key), - fit: widget.fit, - errorBuilder: (context, error, stacktrace) => - getErrorWidget(context, error), - animate: widget.animated, - ), - network: (String? url) => url == null - ? Container() - : Lottie.network( - url, - key: ValueKey(url), - fit: widget.fit, - errorBuilder: (context, error, stacktrace) => - getErrorWidget(context, error), - animate: widget.animated, - ), - ); + var borderRadius = + this.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius); - // add all the custom content renderer mimetypes to the known mimetypes set - for (final key in _contentRenderers.keys) { - _knownMimetypes.add(key); - } + final fileDescription = event.fileDescription; + final textColor = this.textColor; - thumbnailUrl = widget.event - .getAttachmentUrl(getThumbnail: true, animated: widget.animated) - ?.toString(); - thumbnailUrlNoAnimated = widget.event - .getAttachmentUrl(getThumbnail: true, animated: false) - ?.toString(); - attachmentUrl = - widget.event.getAttachmentUrl(animated: widget.animated)?.toString(); - if (thumbnailUrl == null) { - _requestFile(getThumbnail: true); - } - if (!widget.thumbnailOnly && attachmentUrl == null) { - _requestFile(); - } else { - // if the full attachment is cached, we might as well fetch it anyways. - // no need to stick with thumbnail only, since we don't do any networking - widget.event.isAttachmentCached().then((cached) { - if (cached) { - _requestFile(); - } - }); + if (fileDescription != null) { + borderRadius = borderRadius.copyWith( + bottomLeft: Radius.zero, + bottomRight: Radius.zero, + ); } - super.initState(); - } - Widget getErrorWidget(BuildContext context, [dynamic error]) { - final String filename = widget.event.content.containsKey('filename') - ? widget.event.content['filename'] - : widget.event.body; - return getPlaceholderWidget( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - OutlinedButton.icon( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - primary: Theme.of(context).textTheme.bodyText1!.color, + return Column( + mainAxisSize: .min, + spacing: 8, + children: [ + Material( + color: Colors.transparent, + clipBehavior: Clip.hardEdge, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, + side: BorderSide( + color: event.messageType == MessageTypes.Sticker + ? Colors.transparent + : theme.dividerColor, ), - icon: const Icon(Icons.download_outlined), - onPressed: () => widget.event.saveFile(context), - label: Text( - filename, - overflow: TextOverflow.fade, - softWrap: false, - maxLines: 1, + ), + child: InkWell( + onTap: onTap, + borderRadius: borderRadius, + child: Stack( + alignment: Alignment.center, + children: [ + Hero( + tag: event.eventId, + child: AppSettings.showThumbnailsInTimeline.value + ? MxcImage( + cacheKey: event.transactionId ?? event.eventId, + cacheName: event.room.id, + event: event, + width: width, + height: height, + fit: fit, + animated: animated, + isThumbnail: thumbnailOnly, + placeholder: event.messageType == MessageTypes.Sticker + ? null + : (_) => _ImageBubblePlaceholder( + event: event, + width: width, + height: height, + fit: fit, + ), + ) + : _ImageBubblePlaceholder( + event: event, + width: width, + height: height, + fit: fit, + ), + ), + ], ), ), - const SizedBox(height: 8), - if (widget.event.sizeString != null) Text(widget.event.sizeString!), - const SizedBox(height: 8), - Text((error ?? _error).toString()), - ], - ), - ); - } - - Widget getPlaceholderWidget({Widget? child}) { - Widget? blurhash; - if (widget.event.infoMap['xyz.amorgan.blurhash'] is String) { - final ratio = - widget.event.infoMap['w'] is int && widget.event.infoMap['h'] is int - ? widget.event.infoMap['w'] / widget.event.infoMap['h'] - : 1.0; - var width = 32; - var height = 32; - if (ratio > 1.0) { - height = (width / ratio).round(); - } else { - width = (height * ratio).round(); - } - blurhash = BlurHash( - hash: widget.event.infoMap['xyz.amorgan.blurhash'], - decodingWidth: width, - decodingHeight: height, - imageFit: widget.fit, - ); - } - return Stack( - children: [ - if (blurhash != null) blurhash, - Center( - child: - child ?? const CircularProgressIndicator.adaptive(strokeWidth: 2), ), + if (fileDescription != null && textColor != null) + SizedBox( + width: width, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: AppConfig.messageFontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), ], ); } +} - // Build a memory file (e2ee) - Widget getMemoryWidget() { - final isOriginal = _file != null || - widget.event.attachmentOrThumbnailMxcUrl(getThumbnail: true) == - widget.event.attachmentMxcUrl; - final key = isOriginal - ? widget.event.attachmentMxcUrl.toString() - : widget.event.thumbnailMxcUrl.toString(); - final mimetype = getMimetype(!isOriginal); - if (_contentRenderers.containsKey(mimetype)) { - return _contentRenderers[mimetype]!.memory!(_displayFile!.bytes, key); - } else { - return Image.memory( - _displayFile!.bytes, - key: ValueKey(key), - fit: widget.fit, - errorBuilder: (context, error, stacktrace) { - if (widget.event.hasThumbnail && !_requestedThumbnailOnFailure) { - _requestedThumbnailOnFailure = true; - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - _file = null; - _requestFile(getThumbnail: true); - }); - }); - return getPlaceholderWidget(); - } - return getErrorWidget(context, error); - }, - frameBuilder: frameBuilder, - ); - } - } +class _ImageBubblePlaceholder extends StatelessWidget { + final Event event; + final double width, height; + final BoxFit fit; - // build a network file (plaintext) - Widget getNetworkWidget() { - // For network files we try to utilize server-side thumbnailing as much as possible. - // Thus, we do the following logic: - // - try to display our URL - // - on failure: Attempt to display the in-event thumbnail instead - // - on failrue / non-existance: Display button to download or view in-app - final mimetype = getMimetype(_requestedThumbnailOnFailure); - if (displayUrl == attachmentUrl && - _contentRenderers.containsKey(mimetype)) { - return _contentRenderers[mimetype]!.network!(displayUrl); - } else { - return CachedNetworkImage( - // as we change the url on-error we need a key so that the widget actually updates - key: ValueKey(displayUrl), - imageUrl: displayUrl!, - placeholder: (context, url) { - if (!widget.thumbnailOnly && - displayUrl != thumbnailUrl && - displayUrl == attachmentUrl) { - // we have to display the thumbnail while loading - return FutureBuilder( - future: (() async { - return await DefaultCacheManager() - .getFileFromCache(thumbnailUrl!) != - null; - })(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (!snapshot.hasData) { - return getPlaceholderWidget(); - } - final effectiveUrl = snapshot.data == true - ? thumbnailUrl! - : thumbnailUrlNoAnimated!; - return CachedNetworkImage( - key: ValueKey(effectiveUrl), - imageUrl: effectiveUrl, - placeholder: (c, u) => getPlaceholderWidget(), - imageBuilder: (context, imageProvider) => Image( - image: imageProvider, - frameBuilder: frameBuilder, - fit: widget.fit, - ), - ); - }, - ); - } - return getPlaceholderWidget(); - }, - imageBuilder: (context, imageProvider) => Image( - image: imageProvider, - frameBuilder: frameBuilder, - fit: widget.fit, - ), - errorWidget: (context, url, error) { - if (widget.event.hasThumbnail && !_requestedThumbnailOnFailure) { - // the image failed to load but the event has a thumbnail attached....so we can - // try to load this one! - _requestedThumbnailOnFailure = true; - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - thumbnailUrl = widget.event - .getAttachmentUrl( - getThumbnail: true, - useThumbnailMxcUrl: true, - animated: widget.animated) - ?.toString(); - thumbnailUrlNoAnimated = widget.event - .getAttachmentUrl( - getThumbnail: true, - useThumbnailMxcUrl: true, - animated: false) - ?.toString(); - attachmentUrl = widget.event - .getAttachmentUrl( - useThumbnailMxcUrl: true, animated: widget.animated) - ?.toString(); - }); - }); - return getPlaceholderWidget(); - } else if (widget.thumbnailOnly && - displayUrl != attachmentUrl && - _knownMimetypes.contains(mimetype)) { - // Okay, the thumbnail failed to load, but we do know how to render the image - // ourselves. Let's offer the user a button to view it. - return getPlaceholderWidget( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - OutlinedButton( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - primary: Theme.of(context).textTheme.bodyText1!.color, - ), - onPressed: () => onTap(context), - child: Text( - L10n.of(context)!.tapToShowImage, - overflow: TextOverflow.fade, - softWrap: false, - maxLines: 1, - ), - ), - if (widget.event.sizeString != null) ...[ - const SizedBox(height: 8), - Text(widget.event.sizeString!), - ] - ], - )); - } - return getErrorWidget(context, error); - }, - ); - } - } + const _ImageBubblePlaceholder({ + required this.event, + required this.width, + required this.height, + required this.fit, + }); @override Widget build(BuildContext context) { - Widget content; - String key; - if (_error != null) { - content = getErrorWidget(context); - key = 'error'; - } else if (_displayFile != null) { - content = getMemoryWidget(); - key = 'memory-' + (content.key as ValueKey).value; - } else if (displayUrl != null) { - content = getNetworkWidget(); - key = 'network-' + (content.key as ValueKey).value; - } else { - content = getPlaceholderWidget(); - key = 'placeholder'; - } - if (widget.maxSize) { - content = AspectRatio( - aspectRatio: widget.width / widget.height, - child: content, - ); - } - return InkWell( - onTap: () => onTap(context), - child: Hero( - tag: widget.event.eventId, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 1000), - child: Container( - key: ValueKey(key), - constraints: widget.maxSize - ? BoxConstraints.loose(Size( - widget.width, - widget.height, - )) - : null, - child: content, - ), - ), + final blurHashString = + event.infoMap.tryGet('xyz.amorgan.blurhash') ?? + 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + return SizedBox( + width: width, + height: height, + child: BlurHash( + blurhash: blurHashString, + width: width, + height: height, + fit: fit, ), ); } - - void onTap(BuildContext context) { - if (widget.onTap != null) { - widget.onTap!(); - return; - } - if (!widget.tapToView) return; - showDialog( - context: Matrix.of(context).navigatorContext, - useRootNavigator: false, - builder: (_) => ImageViewer(widget.event, onLoaded: () { - // If the original file didn't load yet, we want to do that now. - // This is so that the original file displays after going on the image viewer, - // waiting for it to load, and then hitting back. This ensures that we always - // display the best image available, with requiring as little network as possible - if (_file == null) { - widget.event.isAttachmentCached().then((cached) { - if (cached) { - _requestFile(); - } - }); - } - }), - ); - } -} - -class _ImageBubbleContentRenderer { - final Widget Function(Uint8List, String)? memory; - final Widget Function(String?)? network; - - _ImageBubbleContentRenderer({this.memory, this.network}); } diff --git a/lib/pages/chat/events/map_bubble.dart b/lib/pages/chat/events/map_bubble.dart index 4d7370c71f..dc9ab9acc2 100644 --- a/lib/pages/chat/events/map_bubble.dart +++ b/lib/pages/chat/events/map_bubble.dart @@ -1,8 +1,15 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; +import '../../../config/app_config.dart'; + class MapBubble extends StatelessWidget { final double latitude; final double longitude; @@ -10,6 +17,8 @@ class MapBubble extends StatelessWidget { final double width; final double height; final double radius; + final VoidCallback? onTap; + const MapBubble({ required this.latitude, required this.longitude, @@ -17,71 +26,78 @@ class MapBubble extends StatelessWidget { this.width = 400, this.height = 400, this.radius = 10.0, - Key? key, - }) : super(key: key); + this.onTap, + super.key, + }); @override Widget build(BuildContext context) { - return ClipRRect( - borderRadius: BorderRadius.circular(radius), - child: Container( - constraints: BoxConstraints.loose(Size(width, height)), - child: AspectRatio( - aspectRatio: width / height, - child: Stack( - children: [ - FlutterMap( - options: MapOptions( - center: LatLng(latitude, longitude), - zoom: zoom, + final theme = Theme.of(context); + + return Container( + constraints: BoxConstraints.loose(Size(width, height)), + child: AspectRatio( + aspectRatio: width / height, + child: Stack( + children: [ + FlutterMap( + options: MapOptions( + initialCenter: LatLng(latitude, longitude), + initialZoom: zoom, + ), + children: [ + TileLayer( + maxZoom: 20, + minZoom: 0, + urlTemplate: + 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: AppConfig.appId, + subdomains: const ['a', 'b', 'c'], ), - layers: [ - TileLayerOptions( - maxZoom: 20, - minZoom: 0, - urlTemplate: - 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - subdomains: ['a', 'b', 'c'], - ), - MarkerLayerOptions( - rotate: true, - markers: [ - Marker( - point: LatLng(latitude, longitude), - width: 30, - height: 30, - builder: (_) => Transform.translate( - // No idea why the offset has to be like this, instead of -15 - // It has been determined by trying out, though, that this yields - // the tip of the location pin to be static when zooming. - // Might have to do with psychological perception of where the tip exactly is - offset: const Offset(0, -12.5), - child: const Icon( - Icons.location_pin, - color: Colors.red, - size: 30, - ), + MarkerLayer( + rotate: true, + markers: [ + Marker( + point: LatLng(latitude, longitude), + width: 30, + height: 30, + child: Transform.translate( + // No idea why the offset has to be like this, instead of -15 + // It has been determined by trying out, though, that this yields + // the tip of the location pin to be static when zooming. + // Might have to do with psychological perception of where the tip exactly is + offset: const Offset(0, -12.5), + child: const Icon( + Icons.location_pin, + color: Colors.red, + size: 30, ), ), - ], - ), - ], - ), - Container( - alignment: Alignment.bottomRight, - child: Text( - ' © OpenStreetMap contributors ', - style: TextStyle( - color: Theme.of(context).brightness == Brightness.dark - ? Colors.white - : Colors.black, - backgroundColor: - Theme.of(context).appBarTheme.backgroundColor, - ), + ), + ], ), + ], + ), + Container( + alignment: Alignment.bottomRight, + child: Text( + ' © OpenStreetMap contributors ', + style: TextStyle( + color: theme.brightness == Brightness.dark + ? Colors.white + : Colors.black, + backgroundColor: theme.appBarTheme.backgroundColor, + ), + ), + ), + Material( + color: Colors.transparent, + child: Tooltip( + message: L10n.of(context).openInMaps, + child: InkWell(onTap: onTap, child: SizedBox.expand()), ), - ], - ), + ), + ], ), ), ); diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 605e8a091f..930de3b285 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -1,361 +1,968 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:matrix/matrix.dart'; -import 'package:swipe_to_action/swipe_to_action.dart'; +import 'dart:ui' as ui; +import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; +import 'package:swipe_to_action/swipe_to_action.dart'; + import '../../../config/app_config.dart'; import 'message_content.dart'; import 'message_reactions.dart'; import 'reply_content.dart'; import 'state_message.dart'; -import 'verification_request_content.dart'; class Message extends StatelessWidget { final Event event; final Event? nextEvent; - final void Function(Event)? onSelect; - final void Function(Event)? onAvatarTab; - final void Function(Event)? onInfoTab; - final void Function(String)? scrollToEventId; - final void Function(String) unfold; - final void Function(SwipeDirection) onSwipe; + final Event? previousEvent; + final bool displayReadMarker; + final void Function(Event) onSelect; + final void Function(Event) onInfoTab; + final void Function(String) scrollToEventId; + final void Function() onSwipe; + final void Function() onMention; + final void Function() onEdit; + final void Function(String eventId)? enterThread; final bool longPressSelect; final bool selected; + final bool singleSelected; final Timeline timeline; + final bool highlightMarker; + final bool animateIn; + final bool wallpaperMode; + final ScrollController scrollController; + final List colors; + final void Function()? onExpand; + final bool isCollapsed; + final Set bigEmojis; - const Message(this.event, - {this.nextEvent, - this.longPressSelect = false, - this.onSelect, - this.onInfoTab, - this.onAvatarTab, - this.scrollToEventId, - required this.onSwipe, - required this.unfold, - this.selected = false, - required this.timeline, - Key? key}) - : super(key: key); - - /// Indicates wheither the user may use a mouse instead - /// of touchscreen. - static bool useMouse = false; + const Message( + this.event, { + this.nextEvent, + this.previousEvent, + this.displayReadMarker = false, + this.longPressSelect = false, + required this.bigEmojis, + required this.onSelect, + required this.onInfoTab, + required this.scrollToEventId, + required this.onSwipe, + this.selected = false, + required this.onEdit, + required this.singleSelected, + required this.timeline, + this.highlightMarker = false, + this.animateIn = false, + this.wallpaperMode = false, + required this.onMention, + required this.scrollController, + required this.colors, + this.onExpand, + required this.enterThread, + this.isCollapsed = false, + super.key, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + if (!{ EventTypes.Message, EventTypes.Sticker, - EventTypes.Encrypted, - EventTypes.CallInvite + EventTypes.CallInvite, + PollEventContent.startType, }.contains(event.type)) { if (event.type.startsWith('m.call.')) { - return Container(); + return const SizedBox.shrink(); } - return StateMessage(event, unfold: unfold); + return StateMessage(event, onExpand: onExpand, isCollapsed: isCollapsed); } if (event.type == EventTypes.Message && event.messageType == EventTypes.KeyVerificationRequest) { - return VerificationRequestContent(event: event, timeline: timeline); + return StateMessage(event); } final client = Matrix.of(context).client; final ownMessage = event.senderId == client.userID; final alignment = ownMessage ? Alignment.topRight : Alignment.topLeft; - var color = Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.black; - final displayTime = event.type == EventTypes.RoomCreate || - nextEvent == null || - !event.originServerTs.sameEnvironment(nextEvent!.originServerTs); - final sameSender = nextEvent != null && - [ - EventTypes.Message, - EventTypes.Sticker, - EventTypes.Encrypted, - ].contains(nextEvent!.type) - ? nextEvent!.senderId == event.senderId && !displayTime - : false; + + var color = theme.colorScheme.surfaceContainerHigh; + final displayTime = + event.type == EventTypes.RoomCreate || + previousEvent == null || + !event.originServerTs.sameEnvironment(previousEvent!.originServerTs); + + final nextEventSameSender = + nextEvent != null && + {EventTypes.Message, EventTypes.Sticker}.contains(nextEvent!.type) && + nextEvent!.senderId == event.senderId && + nextEvent!.originServerTs.sameEnvironment(event.originServerTs); + + final previousEventSameSender = + previousEvent != null && + { + EventTypes.Message, + EventTypes.Sticker, + }.contains(previousEvent!.type) && + previousEvent!.senderId == event.senderId && + previousEvent!.originServerTs.sameEnvironment(event.originServerTs); + final textColor = ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground; - final rowMainAxisAlignment = - ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start; + ? theme.onBubbleColor + : theme.colorScheme.onSurface; + + final linkColor = ownMessage + ? theme.brightness == Brightness.light + ? theme.colorScheme.primaryFixed + : theme.colorScheme.onTertiaryContainer + : theme.colorScheme.primary; + + final rowMainAxisAlignment = ownMessage + ? MainAxisAlignment.end + : MainAxisAlignment.start; final displayEvent = event.getDisplayEvent(timeline); + const hardCorner = Radius.circular(3); + const roundedCorner = Radius.circular(AppConfig.borderRadius); final borderRadius = BorderRadius.only( - topLeft: !ownMessage - ? const Radius.circular(2) - : const Radius.circular(AppConfig.borderRadius), - topRight: ownMessage - ? const Radius.circular(2) - : const Radius.circular(AppConfig.borderRadius), - bottomLeft: const Radius.circular(AppConfig.borderRadius), - bottomRight: const Radius.circular(AppConfig.borderRadius), + topLeft: !ownMessage ? hardCorner : roundedCorner, + topRight: ownMessage && nextEventSameSender ? hardCorner : roundedCorner, + bottomLeft: !ownMessage && previousEventSameSender + ? hardCorner + : roundedCorner, + bottomRight: ownMessage ? hardCorner : roundedCorner, ); - final noBubble = { - MessageTypes.Video, - MessageTypes.Image, - MessageTypes.Sticker, - }.contains(event.messageType); + const avatarSize = Avatar.defaultSize; + final noBubble = + ({ + MessageTypes.Video, + MessageTypes.Image, + MessageTypes.Sticker, + }.contains(event.messageType) && + event.fileDescription == null && + !event.redacted); if (ownMessage) { color = displayEvent.status.isError ? Colors.redAccent - : Theme.of(context).colorScheme.primary; + : theme.bubbleColor; + } + + final sentReactions = {}; + if (singleSelected) { + sentReactions.addAll( + event + .aggregatedEvents(timeline, RelationshipTypes.reaction) + .where( + (event) => + event.senderId == event.room.client.userID && + event.type == 'm.reaction', + ) + .map( + (event) => event.content + .tryGetMap('m.relates_to') + ?.tryGet('key'), + ) + .whereType(), + ); } - final rowChildren = [ - sameSender || ownMessage - ? SizedBox( - width: Avatar.defaultSize, - child: Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Center( - child: SizedBox( - width: 16 * AppConfig.bubbleSizeFactor, - height: 16 * AppConfig.bubbleSizeFactor, - child: event.status == EventStatus.sending - ? const CircularProgressIndicator.adaptive( - strokeWidth: 2) - : event.status == EventStatus.error - ? const Icon(Icons.error, color: Colors.red) - : null, + final hasReactions = event.hasAggregatedEvents( + timeline, + RelationshipTypes.reaction, + ); + + final threadChildren = event.aggregatedEvents( + timeline, + RelationshipTypes.thread, + ); + final isEdited = event.hasAggregatedEvents( + timeline, + RelationshipTypes.edit, + ); + + final showReactionPicker = + singleSelected && event.room.canSendDefaultMessages; + + final enterThread = this.enterThread; + final sender = event.senderFromMemoryOrFallback; + + final wallpaperTextShadow = !wallpaperMode + ? null + : [ + Shadow( + offset: Offset(0.0, 0.0), + blurRadius: 2, + color: theme.colorScheme.surface, + ), + ]; + final eventStateTextColor = theme.colorScheme.onSurface; + + return Center( + child: Swipeable( + key: ValueKey(event.transactionId ?? event.eventId), + background: const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Center(child: Icon(Icons.check_outlined)), + ), + direction: AppSettings.swipeRightToLeftToReply.value + ? SwipeDirection.endToStart + : SwipeDirection.startToEnd, + onSwipe: (_) => onSwipe(), + child: Container( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.maxTimelineWidth, + ), + padding: EdgeInsets.only( + left: 8.0, + right: 8.0, + top: nextEventSameSender ? 1.0 : 8.0, + bottom: previousEventSameSender || previousEvent == null + ? 1.0 + : 8.0, + ), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: ownMessage ? .end : .start, + children: [ + Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 0, + bottom: 0, + left: 0, + right: 0, + child: InkWell( + hoverColor: longPressSelect ? Colors.transparent : null, + enableFeedback: !selected, + onTap: longPressSelect ? null : () => onSelect(event), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: selected || highlightMarker + ? theme.colorScheme.secondaryContainer.withAlpha( + 128, + ) + : Colors.transparent, + ), + ), ), - ), - )) - : FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final user = snapshot.data ?? event.senderFromMemoryOrFallback; - return Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - onTap: () => onAvatarTab!(event), - ); - }), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (!sameSender) - Padding( - padding: const EdgeInsets.only(left: 8.0, bottom: 4), - child: ownMessage || event.room.isDirectChat - ? const SizedBox(height: 12) - : FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final displayname = - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback - .calcDisplayname(); - return Text( - displayname, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: displayname.color, + Row( + crossAxisAlignment: .start, + mainAxisAlignment: rowMainAxisAlignment, + children: [ + if (longPressSelect && !event.redacted) + SizedBox( + height: avatarSize, + width: avatarSize, + child: IconButton( + padding: EdgeInsets.zero, + tooltip: L10n.of(context).select, + icon: Icon( + selected + ? Icons.check_circle + : Icons.circle_outlined, ), - ); - }), - ), - Container( - alignment: alignment, - padding: const EdgeInsets.only(left: 8), - child: Material( - color: noBubble ? Colors.transparent : color, - elevation: event.type == EventTypes.Sticker ? 0 : 6, - shadowColor: - Theme.of(context).secondaryHeaderColor.withAlpha(100), - borderRadius: borderRadius, - clipBehavior: Clip.antiAlias, - child: InkWell( - onHover: (b) => useMouse = true, - onTap: !useMouse && longPressSelect - ? () {} - : () => onSelect!(event), - onLongPress: !longPressSelect ? null : () => onSelect!(event), - borderRadius: borderRadius, - child: Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), - ), - padding: noBubble - ? EdgeInsets.zero - : EdgeInsets.all(16 * AppConfig.bubbleSizeFactor), - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 1.5), - child: Stack( - children: [ - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (event.relationshipType == - RelationshipTypes.reply) - FutureBuilder( - future: event.getReplyEvent(timeline), - builder: (BuildContext context, snapshot) { - final replyEvent = snapshot.hasData - ? snapshot.data! - : Event( - eventId: event.relationshipEventId!, - content: { - 'msgtype': 'm.text', - 'body': '...' - }, - senderId: event.senderId, - type: 'm.room.message', - room: event.room, - status: EventStatus.sent, - originServerTs: DateTime.now(), - ); - return InkWell( - onTap: () { - if (scrollToEventId != null) { - scrollToEventId!(replyEvent.eventId); - } - }, - child: AbsorbPointer( - child: Container( - margin: EdgeInsets.symmetric( - vertical: 4.0 * - AppConfig.bubbleSizeFactor), - child: ReplyContent(replyEvent, - ownMessage: ownMessage, - timeline: timeline), + onPressed: () => onSelect(event), + ), + ) + else if (nextEventSameSender || ownMessage) + SizedBox(width: avatarSize) + else + FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final user = snapshot.data ?? sender; + return Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + onTap: () => showMemberActionsPopupMenu( + context: context, + user: user, + onMention: onMention, + ), + size: avatarSize, + presenceUserId: user.stateKey, + presenceBackgroundColor: wallpaperMode + ? Colors.transparent + : null, + ); + }, + ), + Expanded( + child: Column( + crossAxisAlignment: .start, + mainAxisSize: .min, + children: [ + Padding( + padding: EdgeInsets.only(left: 8.0), + child: Row( + mainAxisAlignment: ownMessage ? .end : .start, + children: [ + if (sender.powerLevel.role != + PowerLevelRole.user && + !nextEventSameSender && + !ownMessage && + !event.room.isDirectChat) + Padding( + padding: const EdgeInsets.only( + right: 2.0, + ), + child: Icon( + sender.powerLevel.role == + PowerLevelRole.moderator + ? Icons.add_moderator_outlined + : Icons.admin_panel_settings, + size: 14, + color: theme + .colorScheme + .onPrimaryContainer, ), ), - ); - }, + if ((!nextEventSameSender) && !ownMessage) + FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final displayname = + snapshot.data?.calcDisplayname() ?? + sender.calcDisplayname(); + return ConstrainedBox( + constraints: BoxConstraints( + maxWidth: 200, + ), + child: Text( + displayname, + style: TextStyle( + fontWeight: FontWeight.bold, + color: event.room.isDirectChat + ? Colors.transparent + : (theme.brightness == + Brightness.light + ? displayname.color + : displayname + .lightColorText), + fontSize: 11, + shadows: wallpaperTextShadow, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ); + }, + ), + ], ), - MessageContent( - displayEvent, - textColor: textColor, - onInfoTab: onInfoTab, ), - if (event.hasAggregatedEvents( - timeline, RelationshipTypes.edit)) - Padding( - padding: EdgeInsets.only( - top: 4.0 * AppConfig.bubbleSizeFactor), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.edit_outlined, - color: textColor.withAlpha(164), - size: 14, + + Container( + alignment: alignment, + padding: const EdgeInsets.only(left: 8), + child: GestureDetector( + onLongPress: longPressSelect + ? null + : () { + HapticFeedback.heavyImpact(); + onSelect(event); + }, + child: _AnimateIn( + key: ValueKey( + event.transactionId ?? event.eventId, + ), + animateIn: animateIn, + child: Container( + decoration: BoxDecoration( + color: noBubble + ? Colors.transparent + : color, + borderRadius: borderRadius, ), - Text( - ' - ${displayEvent.originServerTs.localizedTimeShort(context)}', - style: TextStyle( - color: textColor.withAlpha(164), - fontSize: 12, + clipBehavior: Clip.antiAlias, + child: BubbleBackground( + colors: colors, + ignore: + noBubble || + !ownMessage || + MediaQuery.highContrastOf(context), + scrollController: scrollController, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + constraints: const BoxConstraints( + maxWidth: + FluffyThemes.columnWidth * 1.5, + ), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (event.inReplyToEventId( + includingFallback: false, + ) != + null) + FutureBuilder( + future: event.getReplyEvent( + timeline, + ), + builder: (BuildContext context, snapshot) { + final replyEvent = + snapshot.hasData + ? snapshot.data! + : Event( + eventId: + event + .inReplyToEventId() ?? + '\$fake_event_id', + content: { + 'msgtype': 'm.text', + 'body': '...', + }, + senderId: + event.senderId, + type: + 'm.room.message', + room: event.room, + status: + EventStatus.sent, + originServerTs: + DateTime.now(), + ); + return Padding( + padding: + const EdgeInsets.only( + left: 16, + right: 16, + top: 8, + ), + child: Material( + color: Colors.transparent, + borderRadius: ReplyContent + .borderRadius, + child: InkWell( + borderRadius: + ReplyContent + .borderRadius, + onTap: () => + scrollToEventId( + replyEvent + .eventId, + ), + child: AbsorbPointer( + child: ReplyContent( + replyEvent, + ownMessage: + ownMessage, + timeline: timeline, + ), + ), + ), + ), + ); + }, + ), + MessageContent( + displayEvent, + textColor: textColor, + linkColor: linkColor, + onInfoTab: onInfoTab, + borderRadius: borderRadius, + timeline: timeline, + selected: selected, + bigEmojis: bigEmojis, + ), + ], + ), ), ), - ], + ), ), ), + ), + + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: Alignment.bottomCenter, + child: !hasReactions + ? const SizedBox.shrink() + : Container( + alignment: ownMessage + ? Alignment.centerRight + : Alignment.centerLeft, + padding: EdgeInsets.only( + top: 1.0, + left: 8.0, + right: ownMessage ? 0 : 12.0, + ), + child: MessageReactions(event, timeline), + ), + ), + Row( + mainAxisAlignment: ownMessage ? .end : .start, + children: [ + const SizedBox(width: 8), + if (event.status.isSent && + (displayTime || + !previousEventSameSender || + selected)) + Text( + ' ${selected ? event.originServerTs.localizedDetailedTime(context) : event.originServerTs.localizedTimeOfDay(context)}', + style: TextStyle( + color: eventStateTextColor, + fontSize: 11, + shadows: wallpaperTextShadow, + ), + ), + if (isEdited) ...[ + Text(' ', style: TextStyle(fontSize: 11)), + Text( + L10n.of(context).edited, + style: TextStyle( + color: eventStateTextColor, + fontSize: 11, + shadows: wallpaperTextShadow, + ), + ), + ], + if (event.status == EventStatus.error) ...[ + Text(' ', style: TextStyle(fontSize: 11)), + Text( + L10n.of(context).couldNotBeSent, + style: TextStyle( + fontSize: 11, + color: theme.colorScheme.error, + shadows: wallpaperTextShadow, + ), + ), + Text(' ', style: TextStyle(fontSize: 11)), + Icon( + Icons.error_outlined, + size: 14, + color: theme.colorScheme.error, + shadows: wallpaperTextShadow, + ), + ], + if (event.status == EventStatus.sending) ...[ + Text( + switch (event.fileSendingStatus) { + null => L10n.of(context).sending, + FileSendingStatus.generatingThumbnail => + L10n.of(context).generatingThumbnail, + FileSendingStatus.encrypting => L10n.of( + context, + ).encrypting, + FileSendingStatus.uploading => L10n.of( + context, + ).uploading, + }, + style: TextStyle( + color: eventStateTextColor, + fontSize: 11, + shadows: wallpaperTextShadow, + ), + ), + Text(' ', style: TextStyle(fontSize: 11)), + SizedBox.square( + dimension: 11, + child: CircularProgressIndicator( + strokeWidth: 1, + ), + ), + ], + ], + ), + Align( + alignment: ownMessage + ? Alignment.bottomRight + : Alignment.bottomLeft, + child: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: showReactionPicker + ? Padding( + padding: const EdgeInsets.all(4.0), + child: Material( + elevation: 4, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + shadowColor: theme.colorScheme.surface + .withAlpha(128), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisSize: .min, + children: [ + ...AppConfig.defaultReactions.map( + (emoji) => IconButton( + padding: EdgeInsets.zero, + icon: Center( + child: Opacity( + opacity: + sentReactions + .contains(emoji) + ? 0.33 + : 1, + child: Text( + emoji, + style: + const TextStyle( + fontSize: 20, + ), + textAlign: + TextAlign.center, + ), + ), + ), + onPressed: + sentReactions.contains( + emoji, + ) + ? null + : () { + onSelect(event); + event.room + .sendReaction( + event.eventId, + emoji, + ); + }, + ), + ), + IconButton( + icon: const Icon( + Icons.add_reaction_outlined, + ), + tooltip: L10n.of( + context, + ).customReaction, + onPressed: () async { + final emoji = await showAdaptiveBottomSheet( + context: context, + builder: (context) => Scaffold( + appBar: AppBar( + title: Text( + L10n.of( + context, + ).customReaction, + ), + leading: CloseButton( + onPressed: () => + Navigator.of( + context, + ).pop(null), + ), + ), + body: SizedBox( + height: + double.infinity, + child: EmojiPicker( + onEmojiSelected: + (_, emoji) => + Navigator.of( + context, + ).pop( + emoji + .emoji, + ), + config: Config( + locale: + Localizations.localeOf( + context, + ), + emojiViewConfig: + const EmojiViewConfig( + backgroundColor: + Colors + .transparent, + ), + bottomActionBarConfig: + const BottomActionBarConfig( + enabled: + false, + ), + categoryViewConfig: CategoryViewConfig( + initCategory: + Category + .SMILEYS, + backspaceColor: theme + .colorScheme + .primary, + iconColor: theme + .colorScheme + .primary + .withAlpha( + 128, + ), + iconColorSelected: + theme + .colorScheme + .primary, + indicatorColor: theme + .colorScheme + .primary, + backgroundColor: + theme + .colorScheme + .surface, + ), + skinToneConfig: SkinToneConfig( + dialogBackgroundColor: Color.lerp( + theme + .colorScheme + .surface, + theme + .colorScheme + .primaryContainer, + 0.75, + )!, + indicatorColor: theme + .colorScheme + .onSurface, + ), + ), + ), + ), + ), + ); + if (emoji == null) { + return; + } + if (sentReactions.contains( + emoji, + )) { + return; + } + onSelect(event); + + await event.room + .sendReaction( + event.eventId, + emoji, + ); + }, + ), + ], + ), + ), + ), + ) + : const SizedBox.shrink(), + ), + ), ], ), - ], - ), + ), + ], ), - ), + ], ), - ), - ], + if (enterThread != null) + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: Alignment.bottomCenter, + child: threadChildren.isEmpty + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.only( + top: 2.0, + bottom: 8.0, + left: avatarSize + 8, + ), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: TextButton.icon( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4), + ), + foregroundColor: + theme.colorScheme.onSecondaryContainer, + backgroundColor: + theme.colorScheme.secondaryContainer, + ), + onPressed: () => enterThread(event.eventId), + icon: const Icon(Icons.message), + label: Text( + '${L10n.of(context).countReplies(threadChildren.length)} | ${threadChildren.first.calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)), withSenderNamePrefix: true)}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ), + ), + ), + if (displayReadMarker) + Row( + children: [ + Expanded( + child: Divider( + color: theme.colorScheme.surfaceContainerHighest, + ), + ), + Container( + margin: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 16.0, + ), + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 3, + ), + color: theme.colorScheme.surface.withAlpha(128), + ), + child: Text( + L10n.of(context).readUpToHere, + style: TextStyle(fontSize: 11), + ), + ), + Expanded( + child: Divider( + color: theme.colorScheme.surfaceContainerHighest, + ), + ), + ], + ), + ], + ), ), ), - ]; - final row = Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: rowMainAxisAlignment, - children: rowChildren, ); - Widget container; - if (event.hasAggregatedEvents(timeline, RelationshipTypes.reaction) || - displayTime || - selected) { - container = Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: - ownMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start, - children: [ - if (displayTime || selected) - Padding( - padding: displayTime - ? EdgeInsets.symmetric( - vertical: 8.0 * AppConfig.bubbleSizeFactor) - : EdgeInsets.zero, - child: Center( - child: Material( - color: displayTime - ? Theme.of(context).backgroundColor - : Theme.of(context).backgroundColor.withOpacity(0.33), - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - clipBehavior: Clip.antiAlias, - child: Padding( - padding: const EdgeInsets.all(6.0), - child: Text( - event.originServerTs.localizedTime(context), - style: TextStyle(fontSize: 14 * AppConfig.fontSizeFactor), - ), - ), - )), - ), - row, - if (event.hasAggregatedEvents(timeline, RelationshipTypes.reaction)) - Padding( - padding: EdgeInsets.only( - top: 4.0 * AppConfig.bubbleSizeFactor, - left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, - right: 12.0, - ), - child: MessageReactions(event, timeline), - ), - ], + } +} + +class BubbleBackground extends StatelessWidget { + const BubbleBackground({ + super.key, + required this.scrollController, + required this.colors, + required this.ignore, + required this.child, + }); + + final ScrollController scrollController; + final List colors; + final bool ignore; + final Widget child; + + @override + Widget build(BuildContext context) { + if (ignore) return child; + return CustomPaint( + painter: BubblePainter( + repaint: scrollController, + colors: colors, + context: context, + ), + child: child, + ); + } +} + +class BubblePainter extends CustomPainter { + BubblePainter({ + required this.context, + required this.colors, + required super.repaint, + }); + + final BuildContext context; + final List colors; + ScrollableState? _scrollable; + + @override + void paint(Canvas canvas, Size size) { + final scrollable = _scrollable ??= Scrollable.of(context); + final scrollableBox = scrollable.context.findRenderObject() as RenderBox; + final scrollableRect = Offset.zero & scrollableBox.size; + final bubbleBox = context.findRenderObject() as RenderBox; + + final origin = bubbleBox.localToGlobal( + Offset.zero, + ancestor: scrollableBox, + ); + final paint = Paint() + ..shader = ui.Gradient.linear( + scrollableRect.topCenter, + scrollableRect.bottomCenter, + colors, + [0.0, 1.0], + TileMode.clamp, + Matrix4.translationValues(-origin.dx, -origin.dy, 0.0).storage, ); - } else { - container = row; + canvas.drawRect(Offset.zero & size, paint); + } + + @override + bool shouldRepaint(BubblePainter oldDelegate) { + final scrollable = Scrollable.of(context); + final oldScrollable = _scrollable; + _scrollable = scrollable; + return scrollable.position != oldScrollable?.position; + } +} + +class _AnimateIn extends StatefulWidget { + final bool animateIn; + final Widget child; + const _AnimateIn({required this.animateIn, required this.child, super.key}); + + @override + State<_AnimateIn> createState() => __AnimateInState(); +} + +class __AnimateInState extends State<_AnimateIn> { + bool _animationFinished = false; + + @override + Widget build(BuildContext context) { + if (!widget.animateIn) return widget.child; + if (!_animationFinished) { + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + _animationFinished = true; + }); + }); } - return Swipeable( - key: ValueKey(event.eventId), - background: const Padding( - padding: EdgeInsets.symmetric(horizontal: 12.0), - child: Center( - child: Icon(Icons.reply_outlined), - ), - ), - direction: SwipeDirection.endToStart, - onSwipe: onSwipe, - child: Center( - child: Container( - color: selected - ? Theme.of(context).primaryColor.withAlpha(100) - : Theme.of(context).primaryColor.withAlpha(0), - constraints: - const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 4.0 * AppConfig.bubbleSizeFactor, - ), - child: container, - ), - ), - ), + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: _animationFinished ? widget.child : const SizedBox.shrink(), ); } } diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 59e4d64996..91fffa01f4 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -1,271 +1,323 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; +import 'dart:math'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/events/poll.dart'; import 'package:fluffychat/pages/chat/events/video_player.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; -import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../../config/app_config.dart'; +import '../../../utils/event_checkbox_extension.dart'; import '../../../utils/platform_infos.dart'; import '../../../utils/url_launcher.dart'; -import '../../bootstrap/bootstrap_dialog.dart'; import 'audio_player.dart'; +import 'cute_events.dart'; import 'html_message.dart'; import 'image_bubble.dart'; import 'map_bubble.dart'; import 'message_download_content.dart'; -import 'sticker.dart'; class MessageContent extends StatelessWidget { final Event event; final Color textColor; + final Color linkColor; final void Function(Event)? onInfoTab; + final BorderRadius borderRadius; + final Timeline timeline; + final bool selected; + final Set bigEmojis; - const MessageContent(this.event, - {this.onInfoTab, Key? key, required this.textColor}) - : super(key: key); - - void _verifyOrRequestKey(BuildContext context) async { - if (event.content['can_request_session'] != true) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text( - event.type == EventTypes.Encrypted - ? L10n.of(context)!.needPantalaimonWarning - : event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - ), - ))); - return; - } - final client = Matrix.of(context).client; - if (client.isUnknownSession && client.encryption!.crossSigning.enabled) { - await BootstrapDialog( - client: Matrix.of(context).client, - ).show(context); - final timeline = await event.room.getTimeline(); - timeline.requestKeys(); - timeline.cancelSubscriptions(); - } else { - final success = await showFutureLoadingDialog( - context: context, - future: () => event.requestKey(), - ); - if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(L10n.of(context)!.requestToReadOlderMessages))); - } - } - } + const MessageContent( + this.event, { + this.onInfoTab, + super.key, + required this.timeline, + required this.textColor, + required this.linkColor, + required this.borderRadius, + required this.selected, + required this.bigEmojis, + }); @override Widget build(BuildContext context) { - final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - final buttonTextColor = - event.senderId == Matrix.of(context).client.userID ? textColor : null; + const fontSize = AppConfig.messageFontSize; + final buttonTextColor = textColor; switch (event.type) { case EventTypes.Message: case EventTypes.Encrypted: case EventTypes.Sticker: switch (event.messageType) { case MessageTypes.Image: + case MessageTypes.Sticker: + if (event.redacted) continue textmessage; + final maxSize = event.messageType == MessageTypes.Sticker + ? 128.0 + : 256.0; + final w = event.content + .tryGetMap('info') + ?.tryGet('w'); + final h = event.content + .tryGetMap('info') + ?.tryGet('h'); + var width = maxSize; + var height = maxSize; + var fit = event.messageType == MessageTypes.Sticker + ? BoxFit.contain + : BoxFit.cover; + if (w != null && h != null) { + fit = BoxFit.contain; + if (w > h) { + width = maxSize; + height = max(32, maxSize * (h / w)); + } else { + height = maxSize; + width = max(32, maxSize * (w / h)); + } + } return ImageBubble( event, - width: 400, - height: 300, - fit: BoxFit.cover, + width: width, + height: height, + fit: fit, + borderRadius: borderRadius, + timeline: timeline, + textColor: textColor, + onTap: () => showDialog( + context: context, + builder: (_) => ImageViewer( + event, + timeline: timeline, + outerContext: context, + ), + ), ); - case MessageTypes.Sticker: - return Sticker(event); + case CuteEventContent.eventType: + return CuteContent(event); case MessageTypes.Audio: - if (PlatformInfos.isMobile || PlatformInfos.isMacOS) { + if (PlatformInfos.isMobile || + PlatformInfos.isMacOS || + PlatformInfos.isWeb + // Disabled until https://github.com/bleonard252/just_audio_mpv/issues/3 + // is fixed + // || PlatformInfos.isLinux + ) { return AudioPlayerWidget( event, color: textColor, + linkColor: linkColor, + fontSize: fontSize, ); } - return MessageDownloadContent(event, textColor); + return MessageDownloadContent( + event, + textColor: textColor, + linkColor: linkColor, + ); case MessageTypes.Video: - if (PlatformInfos.isMobile || PlatformInfos.isWeb) { - return EventVideoPlayer(event); - } - return MessageDownloadContent(event, textColor); + return EventVideoPlayer( + event, + textColor: textColor, + linkColor: linkColor, + timeline: timeline, + ); case MessageTypes.File: - return MessageDownloadContent(event, textColor); - - case MessageTypes.Text: - case MessageTypes.Notice: - case MessageTypes.Emote: - if (AppConfig.renderHtml && - !event.redacted && - event.isRichMessage) { - var html = event.formattedText; - if (event.messageType == MessageTypes.Emote) { - html = '* $html'; - } - final bigEmotes = event.onlyEmotes && - event.numberEmotes > 0 && - event.numberEmotes <= 10; - return HtmlMessage( - html: html, - defaultTextStyle: TextStyle( - color: textColor, - fontSize: bigEmotes ? fontSize * 3 : fontSize, - ), - linkStyle: TextStyle( - color: textColor.withAlpha(150), - fontSize: bigEmotes ? fontSize * 3 : fontSize, - decoration: TextDecoration.underline, - ), - room: event.room, - emoteSize: bigEmotes ? fontSize * 3 : fontSize * 1.5, - ); - } - // else we fall through to the normal message rendering - continue textmessage; - case MessageTypes.BadEncrypted: - case EventTypes.Encrypted: - return _ButtonContent( - textColor: buttonTextColor, - onPressed: () => _verifyOrRequestKey(context), - icon: const Icon(Icons.lock_outline), - label: L10n.of(context)!.encrypted, + return MessageDownloadContent( + event, + textColor: textColor, + linkColor: linkColor, ); case MessageTypes.Location: - final geoUri = - Uri.tryParse(event.content.tryGet('geo_uri')!); + final geoUri = Uri.tryParse( + event.content.tryGet('geo_uri')!, + ); if (geoUri != null && geoUri.scheme == 'geo') { final latlong = geoUri.path .split(';') .first .split(',') - .map((s) => double.tryParse(s)) + .map(double.tryParse) .toList(); if (latlong.length == 2 && latlong.first != null && latlong.last != null) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - MapBubble( - latitude: latlong.first!, - longitude: latlong.last!, - ), - const SizedBox(height: 6), - OutlinedButton.icon( - icon: Icon(Icons.location_on_outlined, color: textColor), - onPressed: - UrlLauncher(context, geoUri.toString()).launchUrl, - label: Text( - L10n.of(context)!.openInMaps, - style: TextStyle(color: textColor), - ), - ), - ], + return MapBubble( + onTap: () => + UrlLauncher(context, geoUri.toString()).launchUrl(), + latitude: latlong.first!, + longitude: latlong.last!, ); } } continue textmessage; + case MessageTypes.Text: + case MessageTypes.Notice: + case MessageTypes.Emote: case MessageTypes.None: textmessage: default: if (event.redacted) { - return FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - return _ButtonContent( - label: L10n.of(context)!.redactedAnEvent(snapshot.data - ?.calcDisplayname() ?? - event.senderFromMemoryOrFallback.calcDisplayname()), - icon: const Icon(Icons.delete_outlined), - textColor: buttonTextColor, - onPressed: () => onInfoTab!(event), - ); - }); + return RedactionWidget( + event: event, + buttonTextColor: buttonTextColor, + onInfoTab: onInfoTab, + fontSize: fontSize, + ); + } + var html = AppSettings.renderHtml.value && event.isRichMessage + ? event.formattedText + : event.body.replaceAll('<', '<').replaceAll('>', '>'); + if (event.messageType == MessageTypes.Emote) { + html = '* $html'; } - final bigEmotes = event.onlyEmotes && - event.numberEmotes > 0 && - event.numberEmotes <= 10; - return FutureBuilder( - future: event.calcLocalizedBody(MatrixLocals(L10n.of(context)!), - hideReply: true), - builder: (context, snapshot) { - return LinkText( - text: snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - hideReply: true), - textStyle: TextStyle( - color: textColor, - fontSize: bigEmotes ? fontSize * 3 : fontSize, - decoration: - event.redacted ? TextDecoration.lineThrough : null, - ), - linkStyle: TextStyle( - color: textColor.withAlpha(150), - fontSize: bigEmotes ? fontSize * 3 : fontSize, - decoration: TextDecoration.underline, - ), - onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), - ); - }); + + final bigEmotes = + !event.isRichMessage && bigEmojis.contains(event.body); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: HtmlMessage( + html: html, + textColor: textColor, + room: event.room, + fontSize: AppConfig.messageFontSize * (bigEmotes ? 5 : 1), + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + eventId: event.eventId, + checkboxCheckedEvents: event.aggregatedEvents( + timeline, + EventCheckboxRoomExtension.relationshipType, + ), + ), + ); } + case PollEventContent.startType: + if (event.redacted) { + return RedactionWidget( + event: event, + buttonTextColor: buttonTextColor, + onInfoTab: onInfoTab, + fontSize: fontSize, + ); + } + return PollWidget( + event: event, + timeline: timeline, + textColor: textColor, + linkColor: linkColor, + ); case EventTypes.CallInvite: return FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - return _ButtonContent( - label: L10n.of(context)!.startedACall( - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback.calcDisplayname()), - icon: const Icon(Icons.phone_outlined), - textColor: buttonTextColor, - onPressed: () => onInfoTab!(event), - ); - }); + future: event.fetchSenderUser(), + builder: (context, snapshot) { + return _ButtonContent( + label: L10n.of(context).startedACall( + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback.calcDisplayname(), + ), + icon: '📞', + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); default: return FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - return _ButtonContent( - label: L10n.of(context)!.userSentUnknownEvent( - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback.calcDisplayname(), - event.type), - icon: const Icon(Icons.info_outlined), - textColor: buttonTextColor, - onPressed: () => onInfoTab!(event), - ); - }); + future: event.fetchSenderUser(), + builder: (context, snapshot) { + return _ButtonContent( + label: L10n.of(context).userSentUnknownEvent( + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback.calcDisplayname(), + event.type, + ), + icon: 'ℹ️', + textColor: buttonTextColor, + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); } } } +class RedactionWidget extends StatelessWidget { + const RedactionWidget({ + super.key, + required this.event, + required this.buttonTextColor, + required this.onInfoTab, + required this.fontSize, + }); + + final Event event; + final Color buttonTextColor; + final void Function(Event p1)? onInfoTab; + final double fontSize; + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: event.redactedBecause?.fetchSenderUser(), + builder: (context, snapshot) { + final reason = event.redactedBecause?.content.tryGet('reason'); + final redactedBy = + snapshot.data?.calcDisplayname() ?? + event.redactedBecause?.senderId.localpart ?? + L10n.of(context).user; + return _ButtonContent( + label: reason == null + ? L10n.of(context).redactedBy(redactedBy) + : L10n.of(context).redactedByBecause(redactedBy, reason), + icon: '🗑️', + textColor: buttonTextColor.withAlpha(128), + onPressed: () => onInfoTab!(event), + fontSize: fontSize, + ); + }, + ); + } +} + class _ButtonContent extends StatelessWidget { final void Function() onPressed; final String label; - final Icon icon; + final String icon; final Color? textColor; + final double fontSize; const _ButtonContent({ required this.label, required this.icon, required this.textColor, required this.onPressed, - Key? key, - }) : super(key: key); + required this.fontSize, + }); @override Widget build(BuildContext context) { - return OutlinedButton.icon( - onPressed: onPressed, - icon: icon, - label: Text(label, overflow: TextOverflow.ellipsis), - style: OutlinedButton.styleFrom( - primary: textColor, - backgroundColor: Colors.white.withAlpha(64), + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: InkWell( + onTap: onPressed, + child: Text( + '$icon $label', + style: TextStyle(color: textColor, fontSize: fontSize), + ), ), ); } diff --git a/lib/pages/chat/events/message_download_content.dart b/lib/pages/chat/events/message_download_content.dart index 28f86953f7..fc681f16b9 100644 --- a/lib/pages/chat/events/message_download_content.dart +++ b/lib/pages/chat/events/message_download_content.dart @@ -1,17 +1,28 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat/events/file_send_status_indicator.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/event_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; - class MessageDownloadContent extends StatelessWidget { final Event event; final Color textColor; + final Color linkColor; - const MessageDownloadContent(this.event, this.textColor, {Key? key}) - : super(key: key); + const MessageDownloadContent( + this.event, { + required this.textColor, + required this.linkColor, + super.key, + }); @override Widget build(BuildContext context) { @@ -19,59 +30,95 @@ class MessageDownloadContent extends StatelessWidget { final filetype = (filename.contains('.') ? filename.split('.').last.toUpperCase() : event.content - .tryGetMap('info') - ?.tryGet('mimetype') - ?.toUpperCase() ?? - 'UNKNOWN'); - final sizeString = event.sizeString; - return InkWell( - onTap: () => event.saveFile(context), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: Icon( - Icons.file_download_outlined, - color: textColor, + .tryGetMap('info') + ?.tryGet('mimetype') + ?.toUpperCase() ?? + 'UNKNOWN'); + final sizeString = event.sizeString ?? '?MB'; + final fileDescription = event.fileDescription; + final fileSendingStatus = event.fileSendingStatus; + return Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + spacing: 8, + children: [ + Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + onTap: () => event.saveFile(context), + child: Container( + width: 400, + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisSize: .min, + spacing: 16, + children: [ + if (fileSendingStatus != null) + FileSendStatusIndicator( + fileSendingStatus: fileSendingStatus, + ) + else + CircleAvatar( + backgroundColor: textColor.withAlpha(32), + child: Icon( + Icons.file_download_outlined, + color: textColor, + ), + ), + Flexible( + child: Column( + crossAxisAlignment: .start, + mainAxisSize: .min, + children: [ + Text( + filename, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: textColor, + fontWeight: FontWeight.w500, + ), + ), + Text( + '$sizeString | $filetype', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: textColor, fontSize: 10), + ), + ], + ), + ), + ], + ), ), - title: Text( - filename, - maxLines: 1, + ), + ), + if (fileDescription != null) ...[ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), style: TextStyle( color: textColor, - fontWeight: FontWeight.bold, + fontSize: AppConfig.messageFontSize, ), - ), - trailing: PlatformInfos.isAndroid - ? IconButton( - onPressed: () => event.shareFile(context), - tooltip: L10n.of(context)!.share, - icon: Icon(Icons.adaptive.share_outlined), - ) - : null, - ), - const Divider(), - Row( - children: [ - Text( - filetype, - style: TextStyle( - color: textColor.withAlpha(150), - ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, ), - const Spacer(), - if (sizeString != null) - Text( - sizeString, - style: TextStyle( - color: textColor.withAlpha(150), - ), - ), - ], + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), ), ], - ), + ], ); } } diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 023f757d2c..8d406941bc 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -1,33 +1,35 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:cached_network_image/cached_network_image.dart'; import 'package:collection/collection.dart' show IterableExtension; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class MessageReactions extends StatelessWidget { final Event event; final Timeline timeline; - const MessageReactions(this.event, this.timeline, {Key? key}) - : super(key: key); + const MessageReactions(this.event, this.timeline, {super.key}); @override Widget build(BuildContext context) { - final allReactionEvents = - event.aggregatedEvents(timeline, RelationshipTypes.reaction); + final allReactionEvents = event.aggregatedEvents( + timeline, + RelationshipTypes.reaction, + ); final reactionMap = {}; final client = Matrix.of(context).client; for (final e in allReactionEvents) { final key = e.content - .tryGetMap('m.relates_to') + .tryGetMap('m.relates_to') ?.tryGet('key'); if (key != null) { if (!reactionMap.containsKey(key)) { @@ -46,137 +48,134 @@ class MessageReactions extends StatelessWidget { final reactionList = reactionMap.values.toList(); reactionList.sort((a, b) => b.count - a.count > 0 ? 1 : -1); - return Wrap(spacing: 4.0, runSpacing: 4.0, children: [ - ...reactionList - .map( - (r) => _Reaction( - reactionKey: r.key, - count: r.count, - reacted: r.reacted, - onTap: () { - if (r.reacted) { - final evt = allReactionEvents.firstWhereOrNull((e) => + final ownMessage = event.senderId == event.room.client.userID; + return Wrap( + spacing: 4.0, + runSpacing: 4.0, + alignment: ownMessage ? WrapAlignment.end : WrapAlignment.start, + children: [ + ...reactionList.map( + (r) => _Reaction( + reactionKey: r.key, + count: r.count, + reacted: r.reacted, + onTap: () { + if (r.reacted) { + final evt = allReactionEvents.firstWhereOrNull( + (e) => e.senderId == e.room.client.userID && - e.content['m.relates_to']['key'] == r.key); - if (evt != null) { - showFutureLoadingDialog( - context: context, - future: () => evt.redactEvent(), - ); - } - } else { + e.content.tryGetMap('m.relates_to')?['key'] == r.key, + ); + if (evt != null) { showFutureLoadingDialog( - context: context, - future: () => - event.room.sendReaction(event.eventId, r.key!)); + context: context, + future: evt.redactEvent, + ); } - }, - onLongPress: () async => await _AdaptableReactorsDialog( - client: client, - reactionEntry: r, - ).show(context), - ), - ) - .toList(), - if (allReactionEvents.any((e) => e.status.isSending)) - const SizedBox( - width: 28, - height: 28, - child: Padding( - padding: EdgeInsets.all(4.0), - child: CircularProgressIndicator.adaptive(strokeWidth: 1), + } else { + event.room.sendReaction(event.eventId, r.key); + } + }, + onLongPress: () async => await _AdaptableReactorsDialog( + client: client, + reactionEntry: r, + ).show(context), ), ), - ]); + ], + ); } } class _Reaction extends StatelessWidget { - final String? reactionKey; - final int? count; + final String reactionKey; + final int count; final bool? reacted; final void Function()? onTap; final void Function()? onLongPress; const _Reaction({ - this.reactionKey, - this.count, - this.reacted, - this.onTap, - this.onLongPress, + required this.reactionKey, + required this.count, + required this.reacted, + required this.onTap, + required this.onLongPress, }); @override Widget build(BuildContext context) { - final textColor = Theme.of(context).brightness == Brightness.dark - ? Colors.white - : Colors.black; - final color = Theme.of(context).scaffoldBackgroundColor; - final fontSize = DefaultTextStyle.of(context).style.fontSize; + final theme = Theme.of(context); + Widget content; - if (reactionKey!.startsWith('mxc://')) { - final src = Uri.parse(reactionKey!).getThumbnail( - Matrix.of(context).client, - width: 9999, - height: fontSize! * MediaQuery.of(context).devicePixelRatio, - method: ThumbnailMethod.scale, - ); + if (reactionKey.startsWith('mxc://')) { content = Row( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - CachedNetworkImage( - imageUrl: src.toString(), - height: fontSize, + MxcImage( + uri: Uri.parse(reactionKey), + width: 20, + height: 20, + animated: false, + isThumbnail: false, ), - const SizedBox(width: 4), - Text(count.toString(), + if (count > 1) ...[ + const SizedBox(width: 4), + Text( + count.toString(), + textAlign: TextAlign.center, style: TextStyle( - color: textColor, + color: theme.colorScheme.onSurface, fontSize: DefaultTextStyle.of(context).style.fontSize, - )), + ), + ), + ], ], ); } else { - var renderKey = Characters(reactionKey!); + var renderKey = Characters(reactionKey); if (renderKey.length > 10) { renderKey = renderKey.getRange(0, 9) + Characters('…'); } - content = Text('$renderKey $count', - style: TextStyle( - color: textColor, - fontSize: DefaultTextStyle.of(context).style.fontSize, - )); + content = Text(renderKey.toString(), style: TextStyle(fontSize: 14)); } - return InkWell( - onTap: () => onTap != null ? onTap!() : null, - onLongPress: () => onLongPress != null ? onLongPress!() : null, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - child: Container( - decoration: BoxDecoration( - color: color, - border: reacted! - ? Border.all( - width: 1, - color: Theme.of(context).primaryColor, - ) - : null, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), + return Badge( + isLabelVisible: count > 1, + label: Text(count.toString()), + textStyle: TextStyle(fontSize: 10), + textColor: theme.colorScheme.onPrimary, + backgroundColor: theme.colorScheme.primary.withAlpha(200), + child: InkWell( + onTap: () => onTap != null ? onTap!() : null, + onLongPress: () => onLongPress != null ? onLongPress!() : null, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: Container( + decoration: BoxDecoration( + color: theme.colorScheme.secondaryContainer, + border: Border.all( + color: reacted == true + ? theme.colorScheme.secondary + : theme.colorScheme.secondaryContainer, + width: 1, + ), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + ), + height: 24, + padding: const EdgeInsets.symmetric(horizontal: 3), + child: content, ), - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 3), - child: content, ), ); } } class _ReactionEntry { - String? key; + String key; int count; bool reacted; List? reactors; _ReactionEntry({ - this.key, + required this.key, required this.count, required this.reacted, this.reactors, @@ -187,25 +186,14 @@ class _AdaptableReactorsDialog extends StatelessWidget { final Client? client; final _ReactionEntry? reactionEntry; - const _AdaptableReactorsDialog({ - Key? key, - this.client, - this.reactionEntry, - }) : super(key: key); - - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - barrierDismissible: true, - useRootNavigator: false, - ); + const _AdaptableReactorsDialog({this.client, this.reactionEntry}); + + Future show(BuildContext context) => showDialog( + context: context, + builder: (context) => this, + barrierDismissible: true, + useRootNavigator: false, + ); @override Widget build(BuildContext context) { @@ -215,12 +203,13 @@ class _AdaptableReactorsDialog extends StatelessWidget { runSpacing: 4.0, alignment: WrapAlignment.center, children: [ - for (var reactor in reactionEntry!.reactors!) + for (final reactor in reactionEntry!.reactors!) Chip( avatar: Avatar( mxContent: reactor.avatarUrl, name: reactor.displayName, client: client, + presenceUserId: reactor.stateKey, ), label: Text(reactor.displayName!), ), @@ -228,16 +217,8 @@ class _AdaptableReactorsDialog extends StatelessWidget { ), ); - final title = Center(child: Text(reactionEntry!.key!)); + final title = Center(child: Text(reactionEntry!.key)); - return PlatformInfos.isCupertinoStyle - ? CupertinoAlertDialog( - title: title, - content: body, - ) - : AlertDialog( - title: title, - content: body, - ); + return AlertDialog(title: title, content: body); } } diff --git a/lib/pages/chat/events/poll.dart b/lib/pages/chat/events/poll.dart new file mode 100644 index 0000000000..03f75372e8 --- /dev/null +++ b/lib/pages/chat/events/poll.dart @@ -0,0 +1,224 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:async/async.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart' hide Result; + +class PollWidget extends StatelessWidget { + final Event event; + final Timeline timeline; + final Color textColor; + final Color linkColor; + const PollWidget({ + required this.event, + required this.timeline, + required this.textColor, + required this.linkColor, + super.key, + }); + + void _endPoll(BuildContext context) => + showFutureLoadingDialog(context: context, future: event.endPoll); + + void _toggleVote(BuildContext context, String answerId, int maxSelection) { + final userId = event.room.client.userID!; + final answerIds = event.getPollResponses(timeline)[userId] ?? {}; + if (!answerIds.remove(answerId)) { + answerIds.add(answerId); + if (answerIds.length > maxSelection) { + answerIds.clear(); + answerIds.add(answerId); + } + } + + showFutureLoadingDialog( + context: context, + future: () => event.answerPoll(answerIds.toList()), + ); + } + + @override + Widget build(BuildContext context) { + final eventContentResult = Result(() => event.parsedPollEventContent); + final eventContent = eventContentResult.asValue?.value; + if (eventContent == null) { + Logs().w('Invalid poll event', eventContentResult.error); + return const Text('Unable to parse poll event...'); + } + final responses = event.getPollResponses(timeline); + final pollHasBeenEnded = event.getPollHasBeenEnded(timeline); + final canVote = + event.room.canSendEvent(PollEventContent.responseType) && + !pollHasBeenEnded; + final maxPolls = responses.length; + final answersVisible = + eventContent.pollStartContent.kind == PollKind.disclosed || + pollHasBeenEnded; + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Linkify( + text: eventContent.pollStartContent.question.mText, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: AppConfig.messageFontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + Divider(color: linkColor.withAlpha(64)), + ...eventContent.pollStartContent.answers.map((answer) { + final votedUserIds = responses.entries + .where((entry) => entry.value.contains(answer.id)) + .map((entry) => entry.key) + .toSet(); + return Material( + color: Colors.transparent, + clipBehavior: Clip.hardEdge, + child: CheckboxListTile.adaptive( + value: + responses[event.room.client.userID!]?.contains(answer.id) ?? + false, + contentPadding: const EdgeInsets.symmetric(horizontal: 16), + checkboxScaleFactor: 1.5, + checkboxShape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(32), + ), + onChanged: !canVote + ? null + : (_) => _toggleVote( + context, + answer.id, + eventContent.pollStartContent.maxSelections, + ), + title: Text( + answer.mText, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: textColor, + fontSize: AppConfig.messageFontSize, + ), + ), + subtitle: answersVisible + ? Column( + crossAxisAlignment: .start, + mainAxisSize: .min, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + Text( + L10n.of( + context, + ).countVotes(votedUserIds.length), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: linkColor, + fontSize: 12, + ), + ), + const SizedBox(width: 2), + ...votedUserIds.map((userId) { + final user = event.room + .getState(EventTypes.RoomMember, userId) + ?.asUser(event.room); + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 2.0, + ), + child: Avatar( + mxContent: user?.avatarUrl, + name: + user?.calcDisplayname() ?? + userId.localpart, + size: 12, + ), + ); + }), + const SizedBox(width: 2), + ], + ), + ), + LinearProgressIndicator( + color: linkColor, + backgroundColor: linkColor.withAlpha(128), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + value: maxPolls == 0 + ? 0 + : votedUserIds.length / maxPolls, + ), + ], + ) + : null, + ), + ); + }), + if (!pollHasBeenEnded && event.senderId == event.room.client.userID) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: OutlinedButton( + onPressed: () => _endPoll(context), + style: OutlinedButton.styleFrom( + foregroundColor: linkColor, + side: BorderSide(color: linkColor.withAlpha(64)), + ), + child: Text(L10n.of(context).endPoll), + ), + ) + else if (!answersVisible) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Text( + L10n.of(context).answersWillBeVisibleWhenPollHasEnded, + style: TextStyle( + color: linkColor, + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ) + else if (pollHasBeenEnded) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Text( + L10n.of(context).pollHasBeenEnded, + style: TextStyle( + color: linkColor, + fontSize: 12, + fontStyle: FontStyle.italic, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/chat/events/reply_content.dart b/lib/pages/chat/events/reply_content.dart index cde75eb1ba..6f9ce424ee 100644 --- a/lib/pages/chat/events/reply_content.dart +++ b/lib/pages/chat/events/reply_content.dart @@ -1,11 +1,14 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; import '../../../config/app_config.dart'; -import 'html_message.dart'; class ReplyContent extends StatelessWidget { final Event replyEvent; @@ -15,98 +18,93 @@ class ReplyContent extends StatelessWidget { const ReplyContent( this.replyEvent, { this.ownMessage = false, - Key? key, + super.key, this.timeline, - }) : super(key: key); + }); + + static const BorderRadius borderRadius = BorderRadius.only( + topRight: Radius.circular(AppConfig.borderRadius / 2), + bottomRight: Radius.circular(AppConfig.borderRadius / 2), + ); @override Widget build(BuildContext context) { - Widget replyBody; + final theme = Theme.of(context); + final timeline = this.timeline; - final displayEvent = - timeline != null ? replyEvent.getDisplayEvent(timeline) : replyEvent; - final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - if (AppConfig.renderHtml && - [EventTypes.Message, EventTypes.Encrypted] - .contains(displayEvent.type) && - [MessageTypes.Text, MessageTypes.Notice, MessageTypes.Emote] - .contains(displayEvent.messageType) && - !displayEvent.redacted && - displayEvent.content['format'] == 'org.matrix.custom.html' && - displayEvent.content['formatted_body'] is String) { - String? html = displayEvent.content['formatted_body']; - if (displayEvent.messageType == MessageTypes.Emote) { - html = '* $html'; - } - replyBody = HtmlMessage( - html: html!, - defaultTextStyle: TextStyle( - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, - fontSize: fontSize, - ), - maxLines: 1, - room: displayEvent.room, - emoteSize: fontSize * 1.5, - ); - } else { - replyBody = Text( - displayEvent.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, - hideReply: true, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - style: TextStyle( - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, - fontSize: fontSize, - ), - ); - } - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 3, - height: fontSize * 2 + 6, - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, - ), - const SizedBox(width: 6), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - FutureBuilder( + final displayEvent = timeline != null + ? replyEvent.getDisplayEvent(timeline) + : replyEvent; + const fontSize = AppConfig.messageFontSize; + final color = theme.brightness == Brightness.dark + ? theme.colorScheme.onTertiaryContainer + : ownMessage + ? theme.colorScheme.tertiaryContainer + : theme.colorScheme.tertiary; + + return Material( + color: Colors.transparent, + borderRadius: borderRadius, + child: Row( + mainAxisSize: .min, + children: [ + Container( + width: 5, + height: fontSize * 2 + 16, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: color, + ), + ), + const SizedBox(width: 6), + Flexible( + child: Column( + crossAxisAlignment: .start, + mainAxisAlignment: .center, + children: [ + FutureBuilder( + initialData: displayEvent.senderFromMemoryOrFallback, future: displayEvent.fetchSenderUser(), builder: (context, snapshot) { return Text( - (snapshot.data?.calcDisplayname() ?? - displayEvent.senderFromMemoryOrFallback - .calcDisplayname()) + - ':', + '${snapshot.data?.calcDisplayname() ?? displayEvent.senderFromMemoryOrFallback.calcDisplayname()}:', maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontWeight: FontWeight.bold, - color: ownMessage - ? Theme.of(context).colorScheme.onPrimary - : Theme.of(context).colorScheme.onBackground, + color: color, fontSize: fontSize, ), ); - }), - replyBody, - ], + }, + ), + Text( + displayEvent + .calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + plaintextBody: true, + ) + .trim() + .replaceAll('\n', ' '), + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + color: theme.brightness == Brightness.dark + ? theme.colorScheme.onSurface + : ownMessage + ? theme.colorScheme.onTertiary + : theme.colorScheme.onSurface, + fontSize: fontSize, + ), + ), + ], + ), ), - ), - ], + const SizedBox(width: 6), + ], + ), ); } } diff --git a/lib/pages/chat/events/state_message.dart b/lib/pages/chat/events/state_message.dart index 6e270ae6db..90f8f79c21 100644 --- a/lib/pages/chat/events/state_message.dart +++ b/lib/pages/chat/events/state_message.dart @@ -1,75 +1,123 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/utd_dialog.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; import '../../../config/app_config.dart'; class StateMessage extends StatelessWidget { final Event event; - final void Function(String) unfold; - const StateMessage(this.event, {required this.unfold, Key? key}) - : super(key: key); + final void Function()? onExpand; + final bool isCollapsed; + const StateMessage( + this.event, { + this.onExpand, + this.isCollapsed = false, + super.key, + }); @override Widget build(BuildContext context) { - if (event.unsigned!['im.fluffychat.collapsed_state_event'] == true) { - return Container(); - } - final int counter = - event.unsigned!['im.fluffychat.collapsed_state_event_count'] ?? 0; - return Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 4.0, - ), - child: Center( - child: InkWell( - onTap: counter != 0 ? () => unfold(event.eventId) : null, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - child: Container( - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - color: Theme.of(context).brightness == Brightness.light - ? Colors.white - : Colors.grey.shade900, - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - FutureBuilder( - future: event - .calcLocalizedBody(MatrixLocals(L10n.of(context)!)), - builder: (context, snapshot) { - return Text( - snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!)), + final theme = Theme.of(context); + return AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: isCollapsed + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Center( + child: Padding( + padding: const EdgeInsets.all(4), + child: Material( + color: theme.colorScheme.surface.withAlpha(128), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 3, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 4.0, + ), + child: Text.rich( + TextSpan( + children: [ + if (event.type != EventTypes.Encrypted) + TextSpan( + text: event.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + ), + ) + else ...[ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Avatar( + name: event.senderFromMemoryOrFallback + .calcDisplayname(), + size: 14, + mxContent: event + .senderFromMemoryOrFallback + .avatarUrl, + ), + ), + ), + TextSpan( + text: L10n.of(context).messageNotDecryptable, + ), + if (!event.redacted) + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only(left: 4.0), + child: InkWell( + borderRadius: BorderRadius.circular(7), + onTap: () => + UtdDialog.show(context, event), + child: Icon( + Icons.info_outlined, + size: 14, + ), + ), + ), + ), + ], + if (onExpand != null) ...[ + const TextSpan(text: '\n'), + TextSpan( + style: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + recognizer: TapGestureRecognizer() + ..onTap = onExpand, + text: L10n.of(context).moreEvents, + ), + ], + ], + ), textAlign: TextAlign.center, style: TextStyle( - fontSize: 14 * AppConfig.fontSizeFactor, - color: Theme.of(context).textTheme.bodyText2!.color, + fontSize: 11, decoration: event.redacted ? TextDecoration.lineThrough : null, ), - ); - }), - if (counter != 0) - Text( - L10n.of(context)!.moreEvents(counter), - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14 * AppConfig.fontSizeFactor, + ), ), ), - ], + ), + ), ), - ), - ), - ), ); } } diff --git a/lib/pages/chat/events/sticker.dart b/lib/pages/chat/events/sticker.dart deleted file mode 100644 index 4e1618e6f7..0000000000 --- a/lib/pages/chat/events/sticker.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import '../../../config/app_config.dart'; -import 'image_bubble.dart'; - -class Sticker extends StatefulWidget { - final Event event; - - const Sticker(this.event, {Key? key}) : super(key: key); - - @override - _StickerState createState() => _StickerState(); -} - -class _StickerState extends State { - bool? animated; - - @override - Widget build(BuildContext context) { - return ImageBubble( - widget.event, - width: 400, - height: 400, - fit: BoxFit.contain, - onTap: () { - setState(() => animated = true); - showOkAlertDialog( - context: context, - message: widget.event.body, - okLabel: L10n.of(context)!.ok, - ); - }, - animated: animated ?? AppConfig.autoplayImages, - ); - } -} diff --git a/lib/pages/chat/events/verification_request_content.dart b/lib/pages/chat/events/verification_request_content.dart deleted file mode 100644 index 423e418d36..0000000000 --- a/lib/pages/chat/events/verification_request_content.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import '../../../config/app_config.dart'; - -class VerificationRequestContent extends StatelessWidget { - final Event event; - final Timeline timeline; - - const VerificationRequestContent( - {required this.event, required this.timeline, Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final events = event.aggregatedEvents(timeline, 'm.reference'); - final done = events.where((e) => e.type == EventTypes.KeyVerificationDone); - final start = - events.where((e) => e.type == EventTypes.KeyVerificationStart); - final cancel = - events.where((e) => e.type == EventTypes.KeyVerificationCancel); - final fullyDone = done.length >= 2; - final started = start.isNotEmpty; - final canceled = cancel.isNotEmpty; - return Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 4.0, - ), - child: Center( - child: Container( - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - border: Border.all( - color: Theme.of(context).dividerColor, - ), - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - color: Theme.of(context).backgroundColor, - ), - child: Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon(Icons.lock_outlined, - color: canceled - ? Colors.red - : (fullyDone ? Colors.green : Colors.grey)), - const SizedBox(width: 8), - Text(canceled - ? 'Error ${cancel.first.content.tryGet('code')}: ${cancel.first.content.tryGet('reason')}' - : (fullyDone - ? L10n.of(context)!.verifySuccess - : (started - ? L10n.of(context)!.loadingPleaseWait - : L10n.of(context)!.newVerificationRequest))) - ], - ), - ), - ), - ); - } -} diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart index 9cbcb9bc8b..5743e0f80d 100644 --- a/lib/pages/chat/events/video_player.dart +++ b/lib/pages/chat/events/video_player.dart @@ -1,141 +1,163 @@ -import 'dart:io'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; +import 'dart:math'; -import 'package:chewie/chewie.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/file_description.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/blur_hash.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:video_player/video_player.dart'; -import 'package:fluffychat/pages/chat/events/image_bubble.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/event_extension.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; +import '../../image_viewer/image_viewer.dart'; -class EventVideoPlayer extends StatefulWidget { +class EventVideoPlayer extends StatelessWidget { final Event event; - const EventVideoPlayer(this.event, {Key? key}) : super(key: key); - - @override - _EventVideoPlayerState createState() => _EventVideoPlayerState(); -} + final Timeline? timeline; + final Color? textColor; + final Color? linkColor; -class _EventVideoPlayerState extends State { - ChewieController? _chewieManager; - bool _isDownloading = false; - String? _networkUri; - File? _tmpFile; - - void _downloadAction() async { - setState(() => _isDownloading = true); - try { - final videoFile = await widget.event.downloadAndDecryptAttachment(); - if (kIsWeb) { - final blob = html.Blob([videoFile.bytes]); - _networkUri = html.Url.createObjectUrlFromBlob(blob); - } else { - final tempDir = await getTemporaryDirectory(); - final fileName = Uri.encodeComponent( - widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last); - final file = File('${tempDir.path}/${fileName}_${videoFile.name}'); - if (await file.exists() == false) { - await file.writeAsBytes(videoFile.bytes); - } - _tmpFile = file; - } - final tmpFile = _tmpFile; - final networkUri = _networkUri; - if (kIsWeb && networkUri != null && _chewieManager == null) { - _chewieManager ??= ChewieController( - videoPlayerController: VideoPlayerController.network(networkUri), - autoPlay: true, - autoInitialize: true, - ); - } else if (!kIsWeb && tmpFile != null && _chewieManager == null) { - _chewieManager ??= ChewieController( - videoPlayerController: VideoPlayerController.file(tmpFile), - autoPlay: true, - autoInitialize: true, - ); - } - } on MatrixConnectionException catch (e) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(e.toLocalizedString(context)), - )); - } catch (e, s) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(e.toLocalizedString(context)), - )); - SentryController.captureException(e, s); - } finally { - // Workaround for Chewie needs time to get the aspectRatio - await Future.delayed(const Duration(milliseconds: 100)); - setState(() => _isDownloading = false); - } - } - - @override - void dispose() { - _chewieManager?.dispose(); - super.dispose(); - } + const EventVideoPlayer( + this.event, { + this.timeline, + this.textColor, + this.linkColor, + super.key, + }); static const String fallbackBlurHash = 'L5H2EC=PM+yV0g-mq.wG9c010J}I'; @override Widget build(BuildContext context) { - final hasThumbnail = widget.event.hasThumbnail; - final blurHash = (widget.event.infoMap as Map) - .tryGet('xyz.amorgan.blurhash') ?? + final supportsVideoPlayer = PlatformInfos.supportsVideoPlayer; + + final blurHash = + (event.infoMap as Map).tryGet( + 'xyz.amorgan.blurhash', + ) ?? fallbackBlurHash; + final fileDescription = event.fileDescription; + const maxDimension = 300.0; + final infoMap = event.content.tryGetMap('info'); + final videoWidth = infoMap?.tryGet('w') ?? maxDimension; + final videoHeight = infoMap?.tryGet('h') ?? maxDimension; - final chewieManager = _chewieManager; - return Material( - color: Colors.black, - child: SizedBox( - height: 300, - child: chewieManager != null - ? Center(child: Chewie(controller: chewieManager)) - : Stack( - children: [ - if (hasThumbnail) - Center( - child: ImageBubble( - widget.event, - tapToView: false, - ), - ) - else - BlurHash(hash: blurHash), - Center( - child: OutlinedButton.icon( - style: OutlinedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.surface, + final modifier = max(videoWidth, videoHeight) / maxDimension; + final width = videoWidth / modifier; + final height = videoHeight / modifier; + + final durationInt = infoMap?.tryGet('duration'); + final duration = durationInt == null + ? null + : Duration(milliseconds: durationInt); + + return Column( + mainAxisSize: .min, + spacing: 8, + children: [ + Material( + color: Colors.black, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: InkWell( + onTap: () => supportsVideoPlayer + ? showDialog( + context: context, + builder: (_) => ImageViewer( + event, + timeline: timeline, + outerContext: context, + ), + ) + : event.saveFile(context), + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + child: SizedBox( + width: width, + height: height, + child: Hero( + tag: event.eventId, + child: Stack( + children: [ + if (event.hasThumbnail && + AppSettings.showThumbnailsInTimeline.value) + MxcImage( + event: event, + cacheKey: event.transactionId ?? event.eventId, + cacheName: event.room.id, + isThumbnail: true, + width: width, + height: height, + fit: BoxFit.cover, + placeholder: (context) => BlurHash( + blurhash: blurHash, + width: width, + height: height, + fit: BoxFit.cover, + ), + ) + else + BlurHash( + blurhash: blurHash, + width: width, + height: height, + fit: BoxFit.cover, ), - icon: _isDownloading - ? const SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator.adaptive( - strokeWidth: 2), - ) - : const Icon(Icons.download_outlined), - label: Text( - _isDownloading - ? L10n.of(context)!.loadingPleaseWait - : L10n.of(context)!.videoWithSize( - widget.event.sizeString ?? '?MB'), + Center( + child: CircleAvatar( + child: supportsVideoPlayer + ? const Icon(Icons.play_arrow_outlined) + : const Icon(Icons.file_download_outlined), ), - onPressed: _isDownloading ? null : _downloadAction, ), - ), - ], + if (duration != null) + Positioned( + bottom: 8, + left: 16, + child: Text( + '${duration.inMinutes.toString().padLeft(2, '0')}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}', + style: TextStyle( + color: Colors.white, + backgroundColor: Colors.black.withAlpha(32), + ), + ), + ), + ], + ), + ), + ), + ), + ), + if (fileDescription != null && textColor != null && linkColor != null) + SizedBox( + width: width, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Linkify( + text: fileDescription, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + style: TextStyle( + color: textColor, + fontSize: AppConfig.messageFontSize, + ), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: linkColor, + fontSize: AppConfig.messageFontSize, + decoration: TextDecoration.underline, + decorationColor: linkColor, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), - ), + ), + ), + ], ); } } diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index b2ffb156fe..81f95d3224 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -1,14 +1,20 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/trust_user_key_dialog.dart'; +import 'package:fluffychat/utils/markdown_context_builder.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:matrix/matrix.dart'; import 'package:slugify/slugify.dart'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import '../../widgets/avatar.dart'; import '../../widgets/matrix.dart'; import 'command_hints.dart'; @@ -20,12 +26,14 @@ class InputBar extends StatelessWidget { final TextInputType? keyboardType; final TextInputAction? textInputAction; final ValueChanged? onSubmitted; + final ValueChanged? onSubmitImage; final FocusNode? focusNode; final TextEditingController? controller; - final InputDecoration? decoration; + final InputDecoration decoration; final ValueChanged? onChanged; final bool? autofocus; final bool readOnly; + final List suggestionEmojis; const InputBar({ required this.room, @@ -33,43 +41,42 @@ class InputBar extends StatelessWidget { this.maxLines, this.keyboardType, this.onSubmitted, + this.onSubmitImage, this.focusNode, this.controller, - this.decoration, + required this.decoration, this.onChanged, this.autofocus, this.textInputAction, this.readOnly = false, - Key? key, - }) : super(key: key); + required this.suggestionEmojis, + super.key, + }); - List> getSuggestions(String text) { - if (controller!.selection.baseOffset != - controller!.selection.extentOffset || - controller!.selection.baseOffset < 0) { + List> getSuggestions(TextEditingValue text) { + if (text.selection.baseOffset != text.selection.extentOffset || + text.selection.baseOffset < 0) { return []; // no entries if there is selected text } - final searchText = - controller!.text.substring(0, controller!.selection.baseOffset); - final List> ret = >[]; + final searchText = text.text.substring(0, text.selection.baseOffset); + final ret = >[]; const maxResults = 30; - final commandMatch = RegExp(r'^\/([\w]*)$').firstMatch(searchText); + final commandMatch = RegExp(r'^/(\w*)$').firstMatch(searchText); if (commandMatch != null) { final commandSearch = commandMatch[1]!.toLowerCase(); for (final command in room.client.commands.keys) { if (command.contains(commandSearch)) { - ret.add({ - 'type': 'command', - 'name': command, - }); + ret.add({'type': 'command', 'name': command}); } if (ret.length > maxResults) return ret; } } - final emojiMatch = - RegExp(r'(?:\s|^):(?:([-\w]+)~)?([-\w]+)$').firstMatch(searchText); + final emojiMatch = RegExp( + r'(?:\s|^):(?:([\p{L}\p{N}_-]+)~)?([\p{L}\p{N}_-]+)$', + unicode: true, + ).firstMatch(searchText); if (emojiMatch != null) { final packSearch = emojiMatch[1]; final emoteSearch = emojiMatch[2]!.toLowerCase(); @@ -102,8 +109,8 @@ class InputBar extends StatelessWidget { 'type': 'emote', 'name': emote.key, 'pack': packSearch, - 'pack_avatar_url': - emotePacks[packSearch]!.pack.avatarUrl?.toString(), + 'pack_avatar_url': emotePacks[packSearch]!.pack.avatarUrl + ?.toString(), 'pack_display_name': emotePacks[packSearch]!.pack.displayName ?? packSearch, 'mxc': emote.value.url.toString(), @@ -114,6 +121,39 @@ class InputBar extends StatelessWidget { } } } + + // aside of emote packs, also propose normal (tm) unicode emojis + final matchingUnicodeEmojis = suggestionEmojis + .where((emoji) => emoji.name.toLowerCase().contains(emoteSearch)) + .toList(); + + // sort by the index of the search term in the name in order to have + // best matches first + // (thanks for the hint by github.com/nextcloud/circles devs) + matchingUnicodeEmojis.sort((a, b) { + final indexA = a.name.indexOf(emoteSearch); + final indexB = b.name.indexOf(emoteSearch); + if (indexA == -1 || indexB == -1) { + if (indexA == indexB) return 0; + if (indexA == -1) { + return 1; + } else { + return 0; + } + } + return indexA.compareTo(indexB); + }); + for (final emoji in matchingUnicodeEmojis) { + ret.add({ + 'type': 'emoji', + 'emoji': emoji.emoji, + 'label': emoji.name, + 'current_word': ':$emoteSearch', + }); + if (ret.length > maxResults) { + break; + } + } } final userMatch = RegExp(r'(?:\s|^)@([-\w]+)$').firstMatch(searchText); if (userMatch != null) { @@ -121,9 +161,10 @@ class InputBar extends StatelessWidget { for (final user in room.getParticipants()) { if ((user.displayName != null && (user.displayName!.toLowerCase().contains(userSearch) || - slugify(user.displayName!.toLowerCase()) - .contains(userSearch))) || - user.id.split(':')[0].toLowerCase().contains(userSearch)) { + slugify( + user.displayName!.toLowerCase(), + ).contains(userSearch))) || + user.id.localpart!.toLowerCase().contains(userSearch)) { ret.add({ 'type': 'user', 'mxid': user.id, @@ -147,22 +188,22 @@ class InputBar extends StatelessWidget { final state = r.getState(EventTypes.RoomCanonicalAlias); if ((state != null && ((state.content['alias'] is String && - state.content['alias'] - .split(':')[0] + state.content + .tryGet('alias')! + .localpart! .toLowerCase() .contains(roomSearch)) || (state.content['alt_aliases'] is List && - state.content['alt_aliases'].any((l) => - l is String && - l - .split(':')[0] - .toLowerCase() - .contains(roomSearch))))) || + (state.content['alt_aliases'] as List).any( + (l) => + l is String && + l.localpart!.toLowerCase().contains(roomSearch), + )))) || (r.name.toLowerCase().contains(roomSearch))) { ret.add({ 'type': 'room', 'mxid': (r.canonicalAlias.isNotEmpty) ? r.canonicalAlias : r.id, - 'displayname': r.displayname, + 'displayname': r.getLocalizedDisplayname(), 'avatar_url': r.avatar?.toString(), }); } @@ -177,54 +218,66 @@ class InputBar extends StatelessWidget { Widget buildSuggestion( BuildContext context, Map suggestion, + void Function(Map) onSelected, Client? client, ) { + final theme = Theme.of(context); const size = 30.0; - const padding = EdgeInsets.all(4.0); if (suggestion['type'] == 'command') { final command = suggestion['name']!; - final hint = commandHint(L10n.of(context)!, command); + final hint = commandHint(L10n.of(context), command); return Tooltip( message: hint, waitDuration: const Duration(days: 1), // don't show on hover - child: Container( - padding: padding, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('/' + command, - style: const TextStyle(fontFamily: 'monospace')), - Text( - hint, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: Theme.of(context).textTheme.caption, - ), - ], + child: ListTile( + onTap: () => onSelected(suggestion), + title: Text( + commandExample(command), + style: const TextStyle(fontFamily: 'RobotoMono'), + ), + subtitle: Text( + hint, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: theme.textTheme.bodySmall, ), ), ); } - if (suggestion['type'] == 'emote') { - final ratio = MediaQuery.of(context).devicePixelRatio; - final url = Uri.parse(suggestion['mxc'] ?? '').getThumbnail( - room.client, - width: size * ratio, - height: size * ratio, - method: ThumbnailMethod.scale, - animated: true, + if (suggestion['type'] == 'emoji') { + final label = suggestion['label']!; + return Tooltip( + message: label, + waitDuration: const Duration(days: 1), // don't show on hover + child: ListTile( + onTap: () => onSelected(suggestion), + leading: SizedBox.square( + dimension: size, + child: Text( + suggestion['emoji']!, + style: const TextStyle(fontSize: 16), + ), + ), + title: Text(label, maxLines: 1, overflow: TextOverflow.ellipsis), + ), ); - return Container( - padding: padding, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, + } + if (suggestion['type'] == 'emote') { + return ListTile( + onTap: () => onSelected(suggestion), + leading: MxcImage( + // ensure proper ordering ... + key: ValueKey(suggestion['name']), + uri: suggestion['mxc'] is String + ? Uri.parse(suggestion['mxc'] ?? '') + : null, + width: size, + height: size, + isThumbnail: false, + ), + title: Row( + crossAxisAlignment: .center, children: [ - CachedNetworkImage( - imageUrl: url.toString(), - width: size, - height: size, - ), - const SizedBox(width: 6), Text(suggestion['name']!), Expanded( child: Align( @@ -234,8 +287,8 @@ class InputBar extends StatelessWidget { child: suggestion['pack_avatar_url'] != null ? Avatar( mxContent: Uri.tryParse( - suggestion.tryGet('pack_avatar_url') ?? - ''), + suggestion.tryGet('pack_avatar_url') ?? '', + ), name: suggestion.tryGet('pack_display_name'), size: size * 0.9, client: client, @@ -250,40 +303,44 @@ class InputBar extends StatelessWidget { } if (suggestion['type'] == 'user' || suggestion['type'] == 'room') { final url = Uri.parse(suggestion['avatar_url'] ?? ''); - return Container( - padding: padding, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Avatar( - mxContent: url, - name: suggestion.tryGet('displayname') ?? - suggestion.tryGet('mxid'), - size: size, - client: client, - ), - const SizedBox(width: 6), - Text(suggestion['displayname'] ?? suggestion['mxid']!), - ], + return ListTile( + onTap: () => onSelected(suggestion), + leading: Avatar( + mxContent: url, + name: + suggestion.tryGet('displayname') ?? + suggestion.tryGet('mxid'), + size: size, + client: client, ), + title: Text(suggestion['displayname'] ?? suggestion['mxid']!), ); } - return Container(); + return const SizedBox.shrink(); } - void insertSuggestion(_, Map suggestion) { - final replaceText = - controller!.text.substring(0, controller!.selection.baseOffset); + String insertSuggestion(Map suggestion) { + final replaceText = controller!.text.substring( + 0, + controller!.selection.baseOffset, + ); var startText = ''; final afterText = replaceText == controller!.text ? '' : controller!.text.substring(controller!.selection.baseOffset + 1); var insertText = ''; if (suggestion['type'] == 'command') { - insertText = suggestion['name']! + ' '; + insertText = '${suggestion['name']!} '; startText = replaceText.replaceAllMapped( - RegExp(r'^(\/[\w]*)$'), - (Match m) => '/' + insertText, + RegExp(r'^(/\w*)$'), + (Match m) => '/$insertText', + ); + } + if (suggestion['type'] == 'emoji') { + insertText = '${suggestion['emoji']!} '; + startText = replaceText.replaceAllMapped( + suggestion['current_word']!, + (Match m) => insertText, ); } if (suggestion['type'] == 'emote') { @@ -305,118 +362,113 @@ class InputBar extends StatelessWidget { break; } } - insertText = ':${isUnique ? '' : insertPack! + '~'}$insertEmote: '; + insertText = ':${isUnique ? '' : '${insertPack!}~'}$insertEmote: '; startText = replaceText.replaceAllMapped( RegExp(r'(\s|^)(:(?:[-\w]+~)?[-\w]+)$'), (Match m) => '${m[1]}$insertText', ); } if (suggestion['type'] == 'user') { - insertText = suggestion['mention']! + ' '; + insertText = '${suggestion['mention']!} '; startText = replaceText.replaceAllMapped( RegExp(r'(\s|^)(@[-\w]+)$'), (Match m) => '${m[1]}$insertText', ); } if (suggestion['type'] == 'room') { - insertText = suggestion['mxid']! + ' '; + insertText = '${suggestion['mxid']!} '; startText = replaceText.replaceAllMapped( RegExp(r'(\s|^)(#[-\w]+)$'), (Match m) => '${m[1]}$insertText', ); } - if (insertText.isNotEmpty && startText.isNotEmpty) { - controller!.text = startText + afterText; - controller!.selection = TextSelection( - baseOffset: startText.length, - extentOffset: startText.length, - ); - } + + return startText + afterText; } @override Widget build(BuildContext context) { - final useShortCuts = (PlatformInfos.isWeb || - PlatformInfos.isDesktop || - AppConfig.sendOnEnter); - return Shortcuts( - shortcuts: !useShortCuts - ? {} - : { - LogicalKeySet(LogicalKeyboardKey.shift, LogicalKeyboardKey.enter): - NewLineIntent(), - LogicalKeySet(LogicalKeyboardKey.enter): SubmitLineIntent(), - }, - child: Actions( - actions: !useShortCuts - ? {} - : { - NewLineIntent: CallbackAction(onInvoke: (i) { - final val = controller!.value; - final selection = val.selection.start; - final messageWithoutNewLine = - controller!.text.substring(0, val.selection.start) + - '\n' + - controller!.text.substring(val.selection.end); - controller!.value = TextEditingValue( - text: messageWithoutNewLine, - selection: TextSelection.fromPosition( - TextPosition(offset: selection + 1), - ), - ); - return null; - }), - SubmitLineIntent: CallbackAction(onInvoke: (i) { - onSubmitted!(controller!.text); - return null; - }), - }, - child: TypeAheadField>( - direction: AxisDirection.up, - hideOnEmpty: true, - hideOnLoading: true, - keepSuggestionsOnSuggestionSelected: true, - - debounceDuration: const Duration( - milliseconds: - 50), // show suggestions after 50ms idle time (default is 300) - textFieldConfiguration: TextFieldConfiguration( - minLines: minLines, - maxLines: maxLines, - keyboardType: keyboardType!, - textInputAction: textInputAction, - autofocus: autofocus!, - onSubmitted: (text) { - // fix for library for now - // it sets the types for the callback incorrectly - onSubmitted!(text); - }, + final theme = Theme.of(context); + return Autocomplete>( + key: Key('chat_input_field'), + focusNode: focusNode, + textEditingController: controller, + optionsBuilder: getSuggestions, + fieldViewBuilder: (context, controller, focusNode, _) => MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: TextScaler.linear(AppSettings.fontSizeFactor.value), + ), + child: TextField( + controller: controller, + focusNode: focusNode, + readOnly: readOnly, + onEditingComplete: () { + // To not lose focus on iOS: + // https://github.com/krille-chan/fluffychat/issues/2784 + }, + contextMenuBuilder: (c, e) => MarkdownContextBuilder( + editableTextState: e, controller: controller, - decoration: decoration!, - focusNode: focusNode, - onChanged: (text) { - // fix for the library for now - // it sets the types for the callback incorrectly - onChanged!(text); + ), + contentInsertionConfiguration: ContentInsertionConfiguration( + onContentInserted: (KeyboardInsertedContent content) async { + final proceed = await showTrustUserInRoomDialog(context, room); + if (!proceed) return; + final data = content.data; + if (data == null) return; + + final file = MatrixFile( + mimeType: content.mimeType, + bytes: data, + name: content.uri.split('/').last, + ); + room.sendFileEvent(file, shrinkImageMaxDimension: 1600); }, - textCapitalization: TextCapitalization.sentences, ), - suggestionsCallback: getSuggestions, - itemBuilder: (c, s) => - buildSuggestion(c, s, Matrix.of(context).client), - onSuggestionSelected: (Map suggestion) => - insertSuggestion(context, suggestion), - errorBuilder: (BuildContext context, Object? error) => Container(), - loadingBuilder: (BuildContext context) => - Container(), // fix loading briefly flickering a dark box - noItemsFoundBuilder: (BuildContext context) => - Container(), // fix loading briefly showing no suggestions + minLines: minLines, + maxLines: maxLines, + keyboardType: keyboardType, + textInputAction: textInputAction, + autofocus: autofocus!, + inputFormatters: [ + LengthLimitingTextInputFormatter((maxPDUSize / 3).floor()), + ], + onSubmitted: (text) { + // fix for library for now + // it sets the types for the callback incorrectly + onSubmitted!(text); + }, + maxLength: AppSettings.textMessageMaxLength.value, + decoration: decoration, + onChanged: (text) { + // fix for the library for now + // it sets the types for the callback incorrectly + onChanged!(text); + }, + textCapitalization: TextCapitalization.sentences, ), ), + optionsViewBuilder: (c, onSelected, s) { + final suggestions = s.toList(); + return Material( + elevation: theme.appBarTheme.scrolledUnderElevation ?? 4, + shadowColor: theme.appBarTheme.shadowColor, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListView.builder( + shrinkWrap: true, + itemCount: suggestions.length, + itemBuilder: (context, i) => buildSuggestion( + c, + suggestions[i], + onSelected, + Matrix.of(context).client, + ), + ), + ); + }, + displayStringForOption: insertSuggestion, + optionsViewOpenDirection: OptionsViewOpenDirection.up, ); } } - -class NewLineIntent extends Intent {} - -class SubmitLineIntent extends Intent {} diff --git a/lib/pages/chat/pinned_events.dart b/lib/pages/chat/pinned_events.dart index 02e72c8fe9..0b8dc33f50 100644 --- a/lib/pages/chat/pinned_events.dart +++ b/lib/pages/chat/pinned_events.dart @@ -1,136 +1,104 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pages/chat/chat.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; -import 'package:fluffychat/utils/url_launcher.dart'; class PinnedEvents extends StatelessWidget { final ChatController controller; - const PinnedEvents(this.controller, {Key? key}) : super(key: key); + const PinnedEvents(this.controller, {super.key}); + + Future _displayPinnedEventsDialog(BuildContext context) async { + final l10n = L10n.of(context); + final eventsResult = await showFutureLoadingDialog( + context: context, + future: () => Future.wait( + controller.room.pinnedEventIds.map( + (eventId) => controller.room.getEventById(eventId), + ), + ), + ); + final events = eventsResult.result; + if (events == null) return; + if (!context.mounted) return; - Future _displayPinnedEventsDialog( - BuildContext context, List events) async { final eventId = events.length == 1 ? events.single?.eventId - : await showModalActionSheet( + : await showModalActionPopup( context: context, + title: l10n.pin, + cancelLabel: l10n.cancel, actions: events - .map((event) => SheetAction( - key: event?.eventId ?? '', - label: event?.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true, - hideReply: true, - ) ?? - 'UNKNOWN', - )) - .toList()); + .map( + (event) => AdaptiveModalAction( + value: event?.eventId ?? '', + icon: const Icon(Icons.push_pin_outlined), + label: + event + ?.calcLocalizedBodyFallback( + MatrixLocals(l10n), + withSenderNamePrefix: true, + hideReply: true, + ) + .trim() + .replaceAll('\n', ' ') ?? + 'UNKNOWN', + ), + ) + .toList(), + ); if (eventId != null) controller.scrollToEventId(eventId); } @override Widget build(BuildContext context) { - final pinnedEventIds = controller.room!.pinnedEventIds; + final theme = Theme.of(context); - if (pinnedEventIds.isEmpty) { - return Container(); - } - final completers = pinnedEventIds.map>((e) { - final completer = Completer(); - controller.room! - .getEventById(e) - .then((value) => completer.complete(value)); - return completer; - }); - return FutureBuilder>( - future: Future.wait(completers.map((e) => e.future).toList()), - builder: (context, snapshot) { - final pinnedEvents = snapshot.data; - final event = (pinnedEvents != null && pinnedEvents.isNotEmpty) - ? snapshot.data?.last - : null; + final pinnedEventIds = controller.room.pinnedEventIds; - if (event == null || pinnedEvents == null) { - return Container(); - } + if (pinnedEventIds.isEmpty || controller.activeThreadId != null) { + return const SizedBox.shrink(); + } - final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor; - return Material( - color: Theme.of(context).colorScheme.surfaceVariant, - child: InkWell( - onTap: () => _displayPinnedEventsDialog( - context, - pinnedEvents, - ), - child: Row( - children: [ - IconButton( - splashRadius: 20, - iconSize: 20, - color: Theme.of(context).colorScheme.onSurfaceVariant, - icon: const Icon(Icons.push_pin), - tooltip: L10n.of(context)!.unpin, - onPressed: controller.room - ?.canSendEvent(EventTypes.RoomPinnedEvents) ?? - false - ? () => controller.unpinEvent(event.eventId) - : null, - ), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: FutureBuilder( - future: event.calcLocalizedBody( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true, - hideReply: true, - ), - builder: (context, snapshot) { - return LinkText( - text: snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: true, - hideReply: true, - ), - maxLines: 2, - textStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurfaceVariant, - overflow: TextOverflow.ellipsis, - fontSize: fontSize, - decoration: event.redacted - ? TextDecoration.lineThrough - : null, - ), - linkStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .onSurfaceVariant, - fontSize: fontSize, - decoration: TextDecoration.underline, - ), - onLinkTap: (url) => - UrlLauncher(context, url).launchUrl(), - ); - }), - ), - ), - ], - ), - ), - ); - }); + return FutureBuilder( + future: controller.room.getEventById(pinnedEventIds.last), + builder: (context, snapshot) { + final event = snapshot.data; + return ChatAppBarListTile( + title: + event + ?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: true, + hideReply: true, + ) + .replaceAll('\n', ' ') ?? + L10n.of(context).loadingPleaseWait, + leading: IconButton( + splashRadius: 18, + iconSize: 18, + color: theme.colorScheme.onSurfaceVariant, + icon: const Icon(Icons.push_pin), + tooltip: L10n.of(context).unpin, + onPressed: controller.room.canSendEvent(EventTypes.RoomPinnedEvents) + ? () => controller.unpinEvent(event!.eventId) + : null, + ), + onTap: () => _displayPinnedEventsDialog(context), + ); + }, + ); } } diff --git a/lib/pages/chat/reactions_picker.dart b/lib/pages/chat/reactions_picker.dart deleted file mode 100644 index ab70d548d7..0000000000 --- a/lib/pages/chat/reactions_picker.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/app_emojis.dart'; -import 'package:fluffychat/pages/chat/chat.dart'; - -class ReactionsPicker extends StatelessWidget { - final ChatController controller; - const ReactionsPicker(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - if (controller.showEmojiPicker) return Container(); - final display = controller.editEvent == null && - controller.replyEvent == null && - controller.room!.canSendDefaultMessages && - controller.selectedEvents.isNotEmpty; - return AnimatedContainer( - duration: const Duration(milliseconds: 300), - height: (display) ? 56 : 0, - child: Material( - color: Colors.transparent, - child: Builder(builder: (context) { - if (!display) { - return Container(); - } - final emojis = List.from(AppEmojis.emojis); - final allReactionEvents = controller.selectedEvents.first - .aggregatedEvents( - controller.timeline!, RelationshipTypes.reaction) - .where((event) => - event.senderId == event.room.client.userID && - event.type == 'm.reaction'); - - for (final event in allReactionEvents) { - try { - emojis.remove(event.content['m.relates_to']['key']); - } catch (_) {} - } - return Row(children: [ - Expanded( - child: Container( - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: const BorderRadius.only( - bottomRight: - Radius.circular(AppConfig.borderRadius))), - padding: const EdgeInsets.only(right: 1), - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: emojis.length, - itemBuilder: (c, i) => InkWell( - borderRadius: BorderRadius.circular(8), - onTap: () => controller.sendEmojiAction(emojis[i]), - child: Container( - width: 56, - height: 56, - alignment: Alignment.center, - child: Text( - emojis[i], - style: const TextStyle(fontSize: 30), - ), - ), - ), - ))), - InkWell( - borderRadius: BorderRadius.circular(8), - child: Container( - margin: const EdgeInsets.symmetric(horizontal: 8), - width: 36, - height: 56, - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - shape: BoxShape.circle, - ), - child: const Icon(Icons.add_outlined), - ), - onTap: () => - controller.pickEmojiReactionAction(allReactionEvents)) - ]); - }), - ), - ); - } -} diff --git a/lib/pages/chat/recording_dialog.dart b/lib/pages/chat/recording_dialog.dart deleted file mode 100644 index 1958860d07..0000000000 --- a/lib/pages/chat/recording_dialog.dart +++ /dev/null @@ -1,231 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:record/record.dart'; -import 'package:wakelock/wakelock.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; -import 'events/audio_player.dart'; - -class RecordingDialog extends StatefulWidget { - static const String recordingFileType = 'm4a'; - const RecordingDialog({ - Key? key, - }) : super(key: key); - - @override - _RecordingDialogState createState() => _RecordingDialogState(); -} - -class _RecordingDialogState extends State { - Timer? _recorderSubscription; - Duration _duration = Duration.zero; - - bool error = false; - String? _recordedPath; - final _audioRecorder = Record(); - final List amplitudeTimeline = []; - - static const int bitRate = 64000; - static const int samplingRate = 22050; - - Future startRecording() async { - try { - final tempDir = await getTemporaryDirectory(); - _recordedPath = - '${tempDir.path}/recording${DateTime.now().microsecondsSinceEpoch}.${RecordingDialog.recordingFileType}'; - - final result = await _audioRecorder.hasPermission(); - if (result != true) { - setState(() => error = true); - return; - } - await Wakelock.enable(); - await _audioRecorder.start( - path: _recordedPath, - bitRate: bitRate, - samplingRate: samplingRate, - ); - setState(() => _duration = Duration.zero); - _recorderSubscription?.cancel(); - _recorderSubscription = - Timer.periodic(const Duration(milliseconds: 100), (_) async { - final amplitude = await _audioRecorder.getAmplitude(); - var value = 100 + amplitude.current * 2; - value = value < 1 ? 1 : value; - amplitudeTimeline.add(value); - setState(() { - _duration += const Duration(milliseconds: 100); - }); - }); - } catch (e, s) { - SentryController.captureException(e, s); - setState(() => error = true); - } - } - - @override - void initState() { - super.initState(); - startRecording(); - } - - @override - void dispose() { - Wakelock.disable(); - _recorderSubscription?.cancel(); - _audioRecorder.stop(); - super.dispose(); - } - - void _stopAndSend() async { - _recorderSubscription?.cancel(); - await _audioRecorder.stop(); - final path = _recordedPath; - if (path == null) throw ('Recording failed!'); - const waveCount = AudioPlayerWidget.wavesCount; - final step = amplitudeTimeline.length < waveCount - ? 1 - : (amplitudeTimeline.length / waveCount).round(); - final waveform = []; - for (var i = 0; i < amplitudeTimeline.length; i += step) { - waveform.add((amplitudeTimeline[i] / 100 * 1024).round()); - } - Navigator.of(context, rootNavigator: false).pop( - RecordingResult( - path: path, - duration: _duration.inMilliseconds, - waveform: waveform, - ), - ); - } - - @override - Widget build(BuildContext context) { - const maxDecibalWidth = 64.0; - final time = - '${_duration.inMinutes.toString().padLeft(2, '0')}:${(_duration.inSeconds % 60).toString().padLeft(2, '0')}'; - final content = error - ? Text(L10n.of(context)!.oopsSomethingWentWrong) - : Row( - children: [ - Container( - width: 16, - height: 16, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(32), - color: Colors.red, - ), - ), - Expanded( - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - children: amplitudeTimeline.reversed - .take(26) - .toList() - .reversed - .map((amplitude) => Container( - margin: const EdgeInsets.only(left: 2), - width: 4, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), - ), - height: maxDecibalWidth * (amplitude / 100))) - .toList(), - ), - ), - const SizedBox(width: 8), - SizedBox( - width: 48, - child: Text(time), - ), - ], - ); - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - content: content, - actions: [ - CupertinoDialogAction( - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), - child: Text( - L10n.of(context)!.cancel.toUpperCase(), - style: TextStyle( - color: Theme.of(context) - .textTheme - .bodyText2 - ?.color - ?.withAlpha(150), - ), - ), - ), - if (error != true) - CupertinoDialogAction( - onPressed: _stopAndSend, - child: Text(L10n.of(context)!.send.toUpperCase()), - ), - ], - ); - } - return AlertDialog( - content: content, - actions: [ - TextButton( - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), - child: Text( - L10n.of(context)!.cancel.toUpperCase(), - style: TextStyle( - color: - Theme.of(context).textTheme.bodyText2?.color?.withAlpha(150), - ), - ), - ), - if (error != true) - TextButton( - onPressed: _stopAndSend, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text(L10n.of(context)!.send.toUpperCase()), - const SizedBox(width: 4), - const Icon(Icons.send_outlined, size: 15), - ], - ), - ), - ], - ); - } -} - -class RecordingResult { - final String path; - final int duration; - final List waveform; - - const RecordingResult({ - required this.path, - required this.duration, - required this.waveform, - }); - - factory RecordingResult.fromJson(Map json) => - RecordingResult( - path: json['path'], - duration: json['duration'], - waveform: List.from(json['waveform']), - ); - - Map toJson() => { - 'path': path, - 'duration': duration, - 'waveform': waveform, - }; -} diff --git a/lib/pages/chat/recording_input_row.dart b/lib/pages/chat/recording_input_row.dart new file mode 100644 index 0000000000..b4a412669b --- /dev/null +++ b/lib/pages/chat/recording_input_row.dart @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/chat_input_row.dart'; +import 'package:fluffychat/pages/chat/recording_view_model.dart'; +import 'package:flutter/material.dart'; + +class RecordingInputRow extends StatelessWidget { + final RecordingViewModelState state; + final Future Function(String, int, List, String) onSend; + const RecordingInputRow({ + required this.state, + required this.onSend, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + const maxDecibalWidth = 36.0; + final time = + '${state.duration.inMinutes.toString().padLeft(2, '0')}:${(state.duration.inSeconds % 60).toString().padLeft(2, '0')}'; + return SizedBox( + height: ChatInputRow.height, + child: Row( + crossAxisAlignment: .center, + mainAxisAlignment: .spaceBetween, + children: [ + const SizedBox(width: 8), + Container( + alignment: .center, + width: 48, + child: IconButton( + tooltip: L10n.of(context).cancel, + icon: const Icon(Icons.delete_outlined), + color: theme.colorScheme.error, + onPressed: state.cancel, + ), + ), + if (state.isPaused) + Container( + alignment: .center, + width: 48, + child: IconButton( + tooltip: L10n.of(context).resume, + icon: const Icon(Icons.play_circle_outline_outlined), + onPressed: state.resume, + ), + ) + else + Container( + alignment: .center, + width: 48, + child: IconButton( + tooltip: L10n.of(context).pause, + icon: const Icon(Icons.pause_circle_outline_outlined), + onPressed: state.pause, + ), + ), + Text(time), + Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + const width = 4; + return Row( + mainAxisSize: .min, + mainAxisAlignment: .end, + children: state.amplitudeTimeline.reversed + .take((constraints.maxWidth / (width + 2)).floor()) + .toList() + .reversed + .map( + (amplitude) => Container( + margin: const EdgeInsets.only(left: 2), + width: width.toDouble(), + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: BorderRadius.circular(2), + ), + height: maxDecibalWidth * (amplitude / 100), + ), + ) + .toList(), + ); + }, + ), + ), + IconButton( + style: IconButton.styleFrom( + disabledBackgroundColor: theme.bubbleColor.withAlpha(128), + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + ), + tooltip: L10n.of(context).sendAudio, + icon: const Icon(Icons.send_outlined), + onPressed: () => state.stopAndSend(onSend), + ), + const SizedBox(width: 4), + ], + ), + ); + } +} diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart new file mode 100644 index 0000000000..7d9d886d48 --- /dev/null +++ b/lib/pages/chat/recording_view_model.dart @@ -0,0 +1,222 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path/path.dart' as path_lib; +import 'package:path_provider/path_provider.dart'; +import 'package:record/record.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; + +import 'events/audio_player.dart'; + +class RecordingViewModel extends StatefulWidget { + final Widget Function(BuildContext, RecordingViewModelState) builder; + + const RecordingViewModel({required this.builder, super.key}); + + @override + RecordingViewModelState createState() => RecordingViewModelState(); +} + +class RecordingViewModelState extends State { + Timer? _recorderSubscription; + Duration duration = Duration.zero; + + bool get isRecording => _audioRecorder != null; + + AudioRecorder? _audioRecorder; + final List amplitudeTimeline = []; + + String? fileName; + + bool isPaused = false; + + Future startRecording(Room room) async { + room.client.getConfig(); // Preload server file configuration. + if (PlatformInfos.isAndroid) { + final info = await DeviceInfoPlugin().androidInfo; + if (!mounted) return; + if (info.version.sdkInt < 19) { + showOkAlertDialog( + context: context, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, + ); + return; + } + } + if (await AudioRecorder().hasPermission() == false) return; + + final audioRecorder = _audioRecorder ??= AudioRecorder(); + setState(() {}); + + try { + final codec = + !PlatformInfos + .isIOS && // Blocked by https://github.com/llfbandit/record/issues/560 + await audioRecorder.isEncoderSupported(AudioEncoder.opus) + ? AudioEncoder.opus + : AudioEncoder.aacLc; + fileName = + 'voice_message_${DateTime.now().millisecondsSinceEpoch}.${codec.fileExtension}'; + String? path; + if (!kIsWeb) { + final tempDir = await getTemporaryDirectory(); + path = path_lib.join(tempDir.path, fileName); + } + + final result = await audioRecorder.hasPermission(); + if (result != true) { + if (!mounted) return; + showOkAlertDialog( + context: context, + title: L10n.of(context).oopsSomethingWentWrong, + message: L10n.of(context).noPermission, + ); + return; + } + await WakelockPlus.enable(); + + await audioRecorder.start( + RecordConfig( + bitRate: AppSettings.audioRecordingBitRate.value, + sampleRate: AppSettings.audioRecordingSamplingRate.value, + numChannels: AppSettings.audioRecordingNumChannels.value, + autoGain: AppSettings.audioRecordingAutoGain.value, + echoCancel: AppSettings.audioRecordingEchoCancel.value, + noiseSuppress: AppSettings.audioRecordingNoiseSuppress.value, + encoder: codec, + ), + path: path ?? '', + ); + if (!mounted) return; + setState(() => duration = Duration.zero); + _subscribe(); + } catch (e, s) { + Logs().w('Unable to start voice message recording', e, s); + if (!mounted) return; + showOkAlertDialog( + context: context, + title: L10n.of(context).oopsSomethingWentWrong, + message: e.toString(), + ); + setState(_reset); + } + } + + @override + void dispose() { + _reset(); + super.dispose(); + } + + void _subscribe() { + _recorderSubscription?.cancel(); + _recorderSubscription = Timer.periodic(const Duration(milliseconds: 100), ( + _, + ) async { + final amplitude = await _audioRecorder!.getAmplitude(); + var value = 100 + amplitude.current * 2; + value = value < 1 ? 1 : value; + amplitudeTimeline.add(value); + setState(() { + duration += const Duration(milliseconds: 100); + }); + }); + } + + void _reset() { + WakelockPlus.disable(); + _recorderSubscription?.cancel(); + _audioRecorder?.stop(); + _audioRecorder = null; + + fileName = null; + duration = Duration.zero; + amplitudeTimeline.clear(); + isPaused = false; + } + + void cancel() { + setState(_reset); + } + + void pause() { + _audioRecorder?.pause(); + _recorderSubscription?.cancel(); + setState(() { + isPaused = true; + }); + } + + void resume() { + _audioRecorder?.resume(); + _subscribe(); + setState(() { + isPaused = false; + }); + } + + Future stopAndSend( + Future Function( + String path, + int duration, + List waveform, + String fileName, + ) + onSend, + ) async { + _recorderSubscription?.cancel(); + final path = await _audioRecorder?.stop(); + + if (path == null) throw ('Recording failed!'); + const waveCount = AudioPlayerWidget.wavesCount; + final step = amplitudeTimeline.length < waveCount + ? 1 + : (amplitudeTimeline.length / waveCount).round(); + final waveform = []; + for (var i = 0; i < amplitudeTimeline.length; i += step) { + waveform.add((amplitudeTimeline[i] / 100 * 1024).round()); + } + + onSend(path, duration.inMilliseconds, waveform, fileName!); + + cancel(); + } + + @override + Widget build(BuildContext context) => widget.builder(context, this); +} + +extension on AudioEncoder { + String get fileExtension { + switch (this) { + case AudioEncoder.aacLc: + case AudioEncoder.aacEld: + case AudioEncoder.aacHe: + return 'm4a'; + case AudioEncoder.opus: + return 'ogg'; + case AudioEncoder.wav: + return 'wav'; + case AudioEncoder.amrNb: + case AudioEncoder.amrWb: + case AudioEncoder.flac: + case AudioEncoder.pcm16bits: + throw UnsupportedError('Not yet used'); + } + } +} diff --git a/lib/pages/chat/reply_display.dart b/lib/pages/chat/reply_display.dart index ccb6e6a739..a407e43331 100644 --- a/lib/pages/chat/reply_display.dart +++ b/lib/pages/chat/reply_display.dart @@ -1,43 +1,51 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import '../../config/themes.dart'; import 'chat.dart'; import 'events/reply_content.dart'; class ReplyDisplay extends StatelessWidget { final ChatController controller; - const ReplyDisplay(this.controller, {Key? key}) : super(key: key); + const ReplyDisplay(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return AnimatedContainer( - duration: const Duration(milliseconds: 300), + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, height: controller.editEvent != null || controller.replyEvent != null ? 56 : 0, clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: Material( - color: Theme.of(context).secondaryHeaderColor, - child: Row( - children: [ - IconButton( - tooltip: L10n.of(context)!.close, - icon: const Icon(Icons.close), - onPressed: controller.cancelReplyEventAction, - ), - Expanded( - child: controller.replyEvent != null - ? ReplyContent(controller.replyEvent!, - timeline: controller.timeline!) - : _EditContent(controller.editEvent - ?.getDisplayEvent(controller.timeline!)), - ), - ], - ), + decoration: BoxDecoration(color: theme.colorScheme.onInverseSurface), + child: Row( + children: [ + IconButton( + tooltip: L10n.of(context).close, + icon: const Icon(Icons.close), + onPressed: controller.cancelReplyEventAction, + ), + Expanded( + child: controller.replyEvent != null + ? ReplyContent( + controller.replyEvent!, + timeline: controller.timeline, + ) + : _EditContent( + controller.editEvent?.getDisplayEvent(controller.timeline!), + ), + ), + ], ), ); } @@ -50,38 +58,28 @@ class _EditContent extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = Theme.of(context); final event = this.event; if (event == null) { - return Container(); + return const SizedBox.shrink(); } return Row( children: [ - Icon( - Icons.edit, - color: Theme.of(context).primaryColor, - ), + Icon(Icons.edit, color: theme.colorScheme.primary), Container(width: 15.0), - FutureBuilder( - future: event.calcLocalizedBody( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, - hideReply: true, - ), - builder: (context, snapshot) { - return Text( - snapshot.data ?? - event.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), - withSenderNamePrefix: false, - hideReply: true, - ), - overflow: TextOverflow.ellipsis, - maxLines: 1, - style: TextStyle( - color: Theme.of(context).textTheme.bodyText2!.color, - ), - ); - }), + Text( + event + .calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + withSenderNamePrefix: false, + hideReply: true, + ) + .trim() + .replaceAll('\n', ' '), + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle(color: theme.textTheme.bodyMedium!.color), + ), ], ); } diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index 2a3ac52ad8..975ee1b0f7 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -1,72 +1,94 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/pages/chat/chat.dart'; -import 'package:fluffychat/utils/room_status_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class SeenByRow extends StatelessWidget { - final ChatController controller; - const SeenByRow(this.controller, {Key? key}) : super(key: key); + final Event event; + const SeenByRow({super.key, required this.event}); @override Widget build(BuildContext context) { - final seenByUsers = controller.room!.getSeenByUsers( - controller.timeline!, - controller.filteredEvents, - controller.unfolded, - ); + final theme = Theme.of(context); + const maxAvatars = 7; - return Container( - width: double.infinity, - alignment: Alignment.center, - child: AnimatedContainer( - constraints: - const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), - height: seenByUsers.isEmpty ? 0 : 24, - duration: seenByUsers.isEmpty - ? const Duration(milliseconds: 0) - : const Duration(milliseconds: 300), - alignment: controller.filteredEvents.isNotEmpty && - controller.filteredEvents.first.senderId == - Matrix.of(context).client.userID - ? Alignment.topRight - : Alignment.topLeft, - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 4), - child: Wrap( - spacing: 4, - children: [ - ...(seenByUsers.length > maxAvatars - ? seenByUsers.sublist(0, maxAvatars) - : seenByUsers) - .map( - (user) => Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - size: 16, - fontSize: 9, - ), - ) - .toList(), - if (seenByUsers.length > maxAvatars) - SizedBox( - width: 16, - height: 16, - child: Material( - color: Theme.of(context).backgroundColor, - borderRadius: BorderRadius.circular(32), - child: Center( - child: Text( - '+${seenByUsers.length - maxAvatars}', - style: const TextStyle(fontSize: 9), + return StreamBuilder( + stream: event.room.client.onSync.stream.where( + (syncUpdate) => + syncUpdate.rooms?.join?[event.room.id]?.ephemeral?.any( + (ephemeral) => ephemeral.type == 'm.receipt', + ) ?? + false, + ), + builder: (context, asyncSnapshot) { + final seenByUsers = event.receipts + .map((r) => r.user) + .where( + (user) => + user.id != event.room.client.userID && + user.id != event.senderId, + ) + .toList(); + return Container( + width: double.infinity, + alignment: Alignment.center, + child: AnimatedContainer( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.maxTimelineWidth, + ), + height: seenByUsers.isEmpty ? 0 : 24, + duration: seenByUsers.isEmpty + ? Duration.zero + : FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: event.senderId == Matrix.of(context).client.userID + ? Alignment.topRight + : Alignment.topLeft, + padding: const EdgeInsets.only( + bottom: 4, + top: 1, + left: 8, + right: 8, + ), + child: Wrap( + spacing: 4, + children: [ + ...(seenByUsers.length > maxAvatars + ? seenByUsers.sublist(0, maxAvatars) + : seenByUsers) + .map( + (user) => Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + size: 16, + ), + ), + if (seenByUsers.length > maxAvatars) + SizedBox( + width: 16, + height: 16, + child: Material( + color: theme.colorScheme.surface, + borderRadius: BorderRadius.circular(32), + child: Center( + child: Text( + '+${seenByUsers.length - maxAvatars}', + style: const TextStyle(fontSize: 9), + ), + ), ), ), - ), - ), - ], - ), - ), + ], + ), + ), + ); + }, ); } } diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart index 3383c00162..f863a90d15 100644 --- a/lib/pages/chat/send_file_dialog.dart +++ b/lib/pages/chat/send_file_dialog.dart @@ -1,112 +1,413 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; +import 'package:async/async.dart' show Result; +import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/trust_user_key_dialog.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart' hide Result; +import 'package:mime/mime.dart'; -import '../../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; -import '../../utils/resize_image.dart'; +import '../../utils/resize_video.dart'; class SendFileDialog extends StatefulWidget { final Room room; - final MatrixFile file; + final List files; + final BuildContext outerContext; + final String? threadLastEventId, threadRootEventId; const SendFileDialog({ required this.room, - required this.file, - Key? key, - }) : super(key: key); + required this.files, + required this.outerContext, + required this.threadLastEventId, + required this.threadRootEventId, + super.key, + }); @override - _SendFileDialogState createState() => _SendFileDialogState(); + SendFileDialogState createState() => SendFileDialogState(); } -class _SendFileDialogState extends State { - bool origImage = false; +class SendFileDialogState extends State { + bool compress = true; /// Images smaller than 20kb don't need compression. - static const int minSizeToCompress = 20 * 1024; - - Future _send() async { - var file = widget.file; - MatrixImageFile? thumbnail; - if (file is MatrixVideoFile && file.bytes.length > minSizeToCompress) { - await showFutureLoadingDialog( - context: context, - future: () async { - file = await file.resizeVideo(); - thumbnail = await file.getVideoThumbnail(); - }); + static const int minSizeToCompress = 20 * 1000; + + final TextEditingController _labelTextController = TextEditingController(); + + Future _send(String? uniqueFileType) async { + final l10n = L10n.of(context); + + final proceed = await showTrustUserInRoomDialog(context, widget.room); + if (!context.mounted || !proceed) return; + + Future sendAction(setProgress) async { + if (!widget.room.otherPartyCanReceiveMessages) { + throw OtherPartyCanNotReceiveMessages(); + } + Navigator.of(context, rootNavigator: false).pop(); + final clientConfig = await Result.capture(widget.room.client.getConfig()); + final maxUploadSize = + clientConfig.asValue?.value.mUploadSize ?? 100 * 1000 * 1000; + + var sentFiles = 0; + + for (final xfile in widget.files) { + final MatrixFile file; + MatrixImageFile? thumbnail; + final mimeType = xfile.mimeType ?? lookupMimeType(xfile.path); + + // Generate video thumbnail + if (PlatformInfos.isMobile && + mimeType != null && + mimeType.startsWith('video')) { + setProgress(sentFiles / widget.files.length + 0.2); + thumbnail = await xfile.getVideoThumbnail(); + } + + // If file is a video, shrink it! + if (PlatformInfos.isMobile && + mimeType != null && + mimeType.startsWith('video')) { + setProgress(sentFiles / widget.files.length + 0.2); + final lengthResult = await Result.capture(xfile.length()); + final length = lengthResult.asValue?.value; + file = await xfile.getVideoInfo( + compress: length != null && length > minSizeToCompress && compress, + ); + } else { + // Else we just create a MatrixFile + file = MatrixFile( + bytes: await xfile.readAsBytes(), + name: xfile.name, + mimeType: mimeType, + ).detectFileType; + } + + if (file.bytes.length > maxUploadSize) { + throw FileTooBigMatrixException(file.bytes.length, maxUploadSize); + } + + if (widget.files.length > 1) { + setProgress(sentFiles / widget.files.length + 0.4); + } + + final label = _labelTextController.text.trim(); + + try { + await widget.room.sendFileEvent( + file, + thumbnail: thumbnail, + shrinkImageMaxDimension: compress ? 1600 : null, + extraContent: label.isEmpty ? null : {'body': label}, + threadRootEventId: widget.threadRootEventId, + threadLastEventId: widget.threadLastEventId, + ); + } on MatrixException catch (e) { + final retryAfterMs = e.retryAfterMs; + if (e.error != MatrixError.M_LIMIT_EXCEEDED || retryAfterMs == null) { + rethrow; + } + final retryAfterDuration = Duration( + milliseconds: retryAfterMs + 1000, + ); + + setProgress(sentFiles / widget.files.length + 0.2); + await Future.delayed(retryAfterDuration); + + await widget.room.sendFileEvent( + file, + thumbnail: thumbnail, + shrinkImageMaxDimension: compress ? 1600 : null, + extraContent: label.isEmpty ? null : {'body': label}, + ); + } + sentFiles++; + } } - final scaffoldMessenger = ScaffoldMessenger.of(context); - widget.room - .sendFileEvent( - file, - thumbnail: thumbnail, - shrinkImageMaxDimension: origImage ? null : 1600, - ) - .catchError((e) { - scaffoldMessenger.showSnackBar( - SnackBar(content: Text(e.toLocalizedString())), + + if (widget.files.length == 1 && !(uniqueFileType == 'video' && compress)) { + await sendAction((_) {}); + } else { + showFutureLoadingDialog( + context: widget.outerContext, + title: l10n.sendingAttachment, + futureWithProgress: sendAction, ); - }); + } - Navigator.of(context, rootNavigator: false).pop(); return; } + Future _calcCombinedFileSize() async { + final lengths = await Future.wait( + widget.files.map((file) => file.length()), + ); + return lengths.fold(0, (p, length) => p + length).sizeString; + } + @override Widget build(BuildContext context) { - var sendStr = L10n.of(context)!.sendFile; - if (widget.file is MatrixImageFile) { - sendStr = L10n.of(context)!.sendImage; - } else if (widget.file is MatrixAudioFile) { - sendStr = L10n.of(context)!.sendAudio; - } else if (widget.file is MatrixVideoFile) { - sendStr = L10n.of(context)!.sendVideo; + final theme = Theme.of(context); + + var sendStr = L10n.of(context).sendFile; + final uniqueFileType = widget.files + .map((file) => file.mimeType ?? lookupMimeType(file.name)) + .map((mimeType) => mimeType?.split('/').first) + .toSet() + .singleOrNull; + + final fileName = widget.files.length == 1 + ? widget.files.single.name + : L10n.of(context).countFiles(widget.files.length); + final fileTypes = widget.files + .map((file) => file.name.split('.').last) + .toSet() + .join(', ') + .toUpperCase(); + + if (uniqueFileType == 'image') { + if (widget.files.length == 1) { + sendStr = L10n.of(context).sendImage; + } else { + sendStr = L10n.of(context).sendImages(widget.files.length); + } + } else if (uniqueFileType == 'audio') { + sendStr = L10n.of(context).sendAudio; + } else if (uniqueFileType == 'video') { + sendStr = L10n.of(context).sendVideo; } - Widget contentWidget; - if (widget.file is MatrixImageFile) { - contentWidget = Column(mainAxisSize: MainAxisSize.min, children: [ - Flexible( - child: Image.memory( - widget.file.bytes, - fit: BoxFit.contain, + + final compressionSupported = + uniqueFileType != 'video' || PlatformInfos.isMobile; + + return FutureBuilder( + future: _calcCombinedFileSize(), + builder: (context, snapshot) { + final sizeString = + snapshot.data ?? L10n.of(context).calculatingFileSize; + + return AlertDialog.adaptive( + title: Text(sendStr), + content: SizedBox( + width: 256, + child: SingleChildScrollView( + child: Column( + mainAxisSize: .min, + children: [ + const SizedBox(height: 12), + if (uniqueFileType == 'image') + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: SizedBox( + height: 256, + child: Center( + child: ListView.builder( + shrinkWrap: true, + itemCount: widget.files.length, + scrollDirection: Axis.horizontal, + itemBuilder: (context, i) => Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: Colors.black, + clipBehavior: Clip.hardEdge, + child: FutureBuilder( + future: widget.files[i].readAsBytes(), + builder: (context, snapshot) { + final bytes = snapshot.data; + if (bytes == null) { + return const Center( + child: + CircularProgressIndicator.adaptive(), + ); + } + if (snapshot.error != null) { + Logs().w( + 'Unable to preview image', + snapshot.error, + snapshot.stackTrace, + ); + return const Center( + child: SizedBox( + width: 256, + height: 256, + child: Icon( + Icons.broken_image_outlined, + size: 64, + ), + ), + ); + } + return Image.memory( + bytes, + height: 256, + width: widget.files.length == 1 + ? 256 - 36 + : null, + fit: BoxFit.contain, + errorBuilder: (context, e, s) { + Logs().w( + 'Unable to preview image', + e, + s, + ); + return const Center( + child: SizedBox( + width: 256, + height: 256, + child: Icon( + Icons.broken_image_outlined, + size: 64, + ), + ), + ); + }, + ); + }, + ), + ), + ), + ), + ), + ), + ), + if (uniqueFileType != 'image') + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Row( + children: [ + Icon( + uniqueFileType == null + ? Icons.description_outlined + : uniqueFileType == 'video' + ? Icons.video_file_outlined + : uniqueFileType == 'audio' + ? Icons.audio_file_outlined + : Icons.description_outlined, + size: 32, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + Text( + fileName, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Text( + '$sizeString - $fileTypes', + style: theme.textTheme.labelSmall, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ], + ), + ), + if (widget.files.length == 1) + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: DialogTextField( + controller: _labelTextController, + labelText: L10n.of(context).optionalMessage, + minLines: 1, + maxLines: 1, + maxLength: 255, + counterText: '', + ), + ), + // Workaround for SwitchListTile.adaptive crashes in CupertinoDialog + if ({'image', 'video'}.contains(uniqueFileType)) + Row( + crossAxisAlignment: .center, + children: [ + if ({ + TargetPlatform.iOS, + TargetPlatform.macOS, + }.contains(theme.platform)) + CupertinoSwitch( + value: compressionSupported && compress, + onChanged: compressionSupported + ? (v) => setState(() => compress = v) + : null, + ) + else + Switch.adaptive( + value: compressionSupported && compress, + onChanged: compressionSupported + ? (v) => setState(() => compress = v) + : null, + ), + const SizedBox(width: 16), + Expanded( + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .start, + children: [ + Row( + mainAxisSize: .min, + children: [ + Text( + L10n.of(context).compress, + style: theme.textTheme.titleMedium, + textAlign: TextAlign.left, + ), + ], + ), + if (!compress) + Text( + ' ($sizeString)', + style: theme.textTheme.labelSmall, + ), + if (!compressionSupported) + Text( + L10n.of(context).notSupportedOnThisDevice, + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ], + ), + ], + ), + ), ), - ), - Row( - children: [ - Checkbox( - value: origImage, - onChanged: (v) => setState(() => origImage = v ?? false), + actions: [ + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(), + child: Text(L10n.of(context).cancel), ), - InkWell( - onTap: () => setState(() => origImage = !origImage), - child: Text(L10n.of(context)!.sendOriginal + - ' (${widget.file.sizeString})'), + AdaptiveDialogAction( + onPressed: () => _send(uniqueFileType), + child: Text(L10n.of(context).send), ), ], - ) - ]); - } else { - contentWidget = Text('${widget.file.name} (${widget.file.sizeString})'); - } - return AlertDialog( - title: Text(sendStr), - content: contentWidget, - actions: [ - TextButton( - onPressed: () { - // just close the dialog - Navigator.of(context, rootNavigator: false).pop(); - }, - child: Text(L10n.of(context)!.cancel), - ), - TextButton( - onPressed: _send, - child: Text(L10n.of(context)!.send), - ), - ], + ); + }, ); } } diff --git a/lib/pages/chat/send_location_dialog.dart b/lib/pages/chat/send_location_dialog.dart index 4c82eaaa93..ae29235a90 100644 --- a/lib/pages/chat/send_location_dialog.dart +++ b/lib/pages/chat/send_location_dialog.dart @@ -1,29 +1,29 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/events/map_bubble.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:geolocator/geolocator.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/pages/chat/events/map_bubble.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; - class SendLocationDialog extends StatefulWidget { final Room room; - const SendLocationDialog({ - required this.room, - Key? key, - }) : super(key: key); + const SendLocationDialog({required this.room, super.key}); @override - _SendLocationDialogState createState() => _SendLocationDialogState(); + SendLocationDialogState createState() => SendLocationDialogState(); } -class _SendLocationDialogState extends State { +class SendLocationDialogState extends State { bool disabled = false; bool denied = false; bool isSending = false; @@ -54,25 +54,29 @@ class _SendLocationDialogState extends State { return; } try { - Position _position; + Position position; try { - _position = await Geolocator.getCurrentPosition( - desiredAccuracy: LocationAccuracy.best, - timeLimit: const Duration(seconds: 30), + position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.best, + timeLimit: Duration(seconds: 30), + ), ); } on TimeoutException { - _position = await Geolocator.getCurrentPosition( - desiredAccuracy: LocationAccuracy.medium, - timeLimit: const Duration(seconds: 30), + position = await Geolocator.getCurrentPosition( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.medium, + timeLimit: Duration(seconds: 30), + ), ); } - setState(() => position = _position); + setState(() => this.position = position); } catch (e) { setState(() => error = e); } } - void sendAction() async { + Future sendAction() async { setState(() => isSending = true); final body = 'https://www.openstreetmap.org/?mlat=${position!.latitude}&mlon=${position!.longitude}#map=16/${position!.latitude}/${position!.longitude}'; @@ -82,6 +86,7 @@ class _SendLocationDialogState extends State { context: context, future: () => widget.room.sendLocation(body, uri), ); + if (!mounted) return; Navigator.of(context, rootNavigator: false).pop(); } @@ -94,51 +99,36 @@ class _SendLocationDialogState extends State { longitude: position!.longitude, ); } else if (disabled) { - contentWidget = Text(L10n.of(context)!.locationDisabledNotice); + contentWidget = Text(L10n.of(context).locationDisabledNotice); } else if (denied) { - contentWidget = Text(L10n.of(context)!.locationPermissionDeniedNotice); + contentWidget = Text(L10n.of(context).locationPermissionDeniedNotice); } else if (error != null) { - contentWidget = - Text(L10n.of(context)!.errorObtainingLocation(error.toString())); + contentWidget = Text( + L10n.of(context).errorObtainingLocation(error.toString()), + ); } else { contentWidget = Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: .min, + mainAxisAlignment: .center, children: [ const CupertinoActivityIndicator(), const SizedBox(width: 12), - Text(L10n.of(context)!.obtainingLocation), - ], - ); - } - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: Text(L10n.of(context)!.shareLocation), - content: contentWidget, - actions: [ - CupertinoDialogAction( - onPressed: Navigator.of(context, rootNavigator: false).pop, - child: Text(L10n.of(context)!.cancel), - ), - CupertinoDialogAction( - onPressed: isSending ? null : sendAction, - child: Text(L10n.of(context)!.send), - ), + Text(L10n.of(context).obtainingLocation), ], ); } - return AlertDialog( - title: Text(L10n.of(context)!.shareLocation), + return AlertDialog.adaptive( + title: Text(L10n.of(context).shareLocation), content: contentWidget, actions: [ - TextButton( + AdaptiveDialogAction( onPressed: Navigator.of(context, rootNavigator: false).pop, - child: Text(L10n.of(context)!.cancel), + child: Text(L10n.of(context).cancel), ), if (position != null) - TextButton( + AdaptiveDialogAction( onPressed: isSending ? null : sendAction, - child: Text(L10n.of(context)!.send), + child: Text(L10n.of(context).send), ), ], ); diff --git a/lib/pages/chat/start_poll_bottom_sheet.dart b/lib/pages/chat/start_poll_bottom_sheet.dart new file mode 100644 index 0000000000..41c404ee26 --- /dev/null +++ b/lib/pages/chat/start_poll_bottom_sheet.dart @@ -0,0 +1,165 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/trust_user_key_dialog.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class StartPollBottomSheet extends StatefulWidget { + final Room room; + const StartPollBottomSheet({required this.room, super.key}); + + @override + State createState() => _StartPollBottomSheetState(); +} + +class _StartPollBottomSheetState extends State { + final TextEditingController _bodyController = TextEditingController(); + bool _allowMultipleAnswers = false; + final List _answers = [ + TextEditingController(), + TextEditingController(), + ]; + PollKind _pollKind = PollKind.disclosed; + + bool _canCreate = false; + + bool isLoading = false; + + String? _txid; + + Future _createPoll() async { + final proceed = await showTrustUserInRoomDialog(context, widget.room); + if (!proceed || !mounted) return; + try { + var id = 0; + _txid ??= widget.room.client.generateUniqueTransactionId(); + await widget.room.startPoll( + question: _bodyController.text.trim(), + answers: _answers + .map( + (answerController) => PollAnswer( + id: (++id).toString(), + mText: answerController.text.trim(), + ), + ) + .toList(), + kind: _pollKind, + maxSelections: _allowMultipleAnswers ? _answers.length : 1, + txid: _txid, + ); + if (!mounted) return; + Navigator.of(context).pop(); + } catch (e, s) { + Logs().w('Unable to create poll', e, s); + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } + + void _updateCanCreate([_]) { + final newCanCreate = + _bodyController.text.trim().isNotEmpty && + !_answers.any((controller) => controller.text.trim().isEmpty); + if (_canCreate != newCanCreate) { + setState(() { + _canCreate = newCanCreate; + }); + } + } + + @override + Widget build(BuildContext context) { + const maxAnswers = 10; + return Scaffold( + appBar: AppBar( + leading: CloseButton(onPressed: Navigator.of(context).pop), + title: Text(L10n.of(context).startPoll), + ), + body: ListView( + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), + children: [ + TextField( + controller: _bodyController, + minLines: 2, + maxLines: 4, + maxLength: 1024, + onChanged: _updateCanCreate, + decoration: InputDecoration( + hintText: L10n.of(context).pollQuestion, + counter: const SizedBox.shrink(), + ), + ), + const Divider(height: 32), + ..._answers.map( + (answerController) => Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: TextField( + controller: answerController, + onChanged: _updateCanCreate, + maxLength: 64, + decoration: InputDecoration( + counter: const SizedBox.shrink(), + hintText: L10n.of(context).answerOption, + suffixIcon: _answers.length == 2 + ? null + : IconButton( + icon: const Icon(Icons.cancel_outlined), + onPressed: () => setState(() { + _answers.remove(answerController..dispose()); + }), + ), + ), + ), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: TextButton.icon( + icon: const Icon(Icons.add_outlined), + onPressed: _answers.length < maxAnswers + ? () => setState(() { + _answers.add(TextEditingController()); + }) + : null, + label: Text(L10n.of(context).addAnswerOption), + ), + ), + const Divider(height: 32), + ListTile( + contentPadding: EdgeInsets.zero, + leading: Switch.adaptive( + value: _pollKind == PollKind.disclosed, + onChanged: (allow) => setState(() { + _pollKind = allow ? PollKind.disclosed : PollKind.undisclosed; + }), + ), + title: Text(L10n.of(context).answersVisible), + ), + ListTile( + contentPadding: EdgeInsets.zero, + leading: Switch.adaptive( + value: _allowMultipleAnswers, + onChanged: (allow) => setState(() { + _allowMultipleAnswers = allow; + }), + ), + title: Text(L10n.of(context).allowMultipleAnswers), + ), + ElevatedButton( + onPressed: !isLoading && _canCreate ? _createPoll : null, + child: isLoading + ? const LinearProgressIndicator() + : Text(L10n.of(context).startPoll), + ), + ], + ), + ); + } +} diff --git a/lib/pages/chat/sticker_picker_dialog.dart b/lib/pages/chat/sticker_picker_dialog.dart index d76f772c10..1ef4962770 100644 --- a/lib/pages/chat/sticker_picker_dialog.dart +++ b/lib/pages/chat/sticker_picker_dialog.dart @@ -1,15 +1,26 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import '../../widgets/avatar.dart'; -import 'events/image_bubble.dart'; class StickerPickerDialog extends StatefulWidget { final Room room; + final void Function(ImagePackImageContent) onSelected; - const StickerPickerDialog({required this.room, Key? key}) : super(key: key); + const StickerPickerDialog({ + required this.onSelected, + required this.room, + super.key, + }); @override StickerPickerDialogState createState() => StickerPickerDialogState(); @@ -20,117 +31,149 @@ class StickerPickerDialogState extends State { @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final stickerPacks = widget.room.getImagePacks(ImagePackUsage.sticker); final packSlugs = stickerPacks.keys.toList(); - // ignore: prefer_function_declarations_over_variables - final _packBuilder = (BuildContext context, int packIndex) { - final pack = stickerPacks[packSlugs[packIndex]]!; - final filteredImagePackImageEntried = pack.images.entries.toList(); - if (searchFilter?.isNotEmpty ?? false) { - filteredImagePackImageEntried.removeWhere((e) => - !(e.key.toLowerCase().contains(searchFilter!.toLowerCase()) || - (e.value.body - ?.toLowerCase() - .contains(searchFilter!.toLowerCase()) ?? - false))); - } - final imageKeys = - filteredImagePackImageEntried.map((e) => e.key).toList(); - if (imageKeys.isEmpty) { - return Container(); - } - final packName = pack.pack.displayName ?? packSlugs[packIndex]; - return Column( - children: [ - if (packIndex != 0) const SizedBox(height: 20), - if (packName != 'user') - ListTile( - leading: Avatar( - mxContent: pack.pack.avatarUrl, - name: packName, - client: widget.room.client, - ), - title: Text(packName), - ), - const SizedBox(height: 6), - GridView.builder( - itemCount: imageKeys.length, - gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 100), - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (BuildContext context, int imageIndex) { - final image = pack.images[imageKeys[imageIndex]]!; - final fakeEvent = Event( - type: EventTypes.Sticker, - content: { - 'url': image.url.toString(), - 'info': image.info, - }, - originServerTs: DateTime.now(), - room: widget.room, - eventId: 'fake_event', - senderId: widget.room.client.userID!, - ); - return InkWell( - key: ValueKey(image.url.toString()), - onTap: () { - // copy the image - final imageCopy = - ImagePackImageContent.fromJson(image.toJson().copy()); - // set the body, if it doesn't exist, to the key - imageCopy.body ??= imageKeys[imageIndex]; - Navigator.of(context, rootNavigator: false) - .pop(imageCopy); - }, - child: AbsorbPointer( - absorbing: true, - child: ImageBubble( - fakeEvent, - tapToView: false, - fit: BoxFit.contain, - width: 100, - height: 100, - ), - ), - ); - }, - ), - ], - ); - }; - - return Scaffold( - body: SizedBox( - width: double.maxFinite, + return Material( + color: theme.colorScheme.onInverseSurface, + child: SafeArea( child: CustomScrollView( slivers: [ SliverAppBar( floating: true, - pinned: true, + toolbarHeight: 72, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, automaticallyImplyLeading: false, - titleSpacing: 0, - backgroundColor: Theme.of(context).dialogBackgroundColor, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context, rootNavigator: false).pop, - ), title: TextField( autofocus: false, decoration: InputDecoration( - hintText: L10n.of(context)!.search, - suffix: const Icon(Icons.search_outlined), - contentPadding: const EdgeInsets.symmetric(horizontal: 16), + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: const Icon(Icons.search_outlined), ), onChanged: (s) => setState(() => searchFilter = s), ), ), - SliverList( - delegate: SliverChildBuilderDelegate( - _packBuilder, - childCount: packSlugs.length, - )), + if (packSlugs.isEmpty) + SliverFillRemaining( + child: Center( + child: Column( + mainAxisSize: .min, + children: [ + Text(L10n.of(context).noEmotesFound), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: () => UrlLauncher( + context, + AppConfig.howDoIGetStickersTutorial, + ).launchUrl(), + icon: const Icon(Icons.explore_outlined), + label: Text(L10n.of(context).discover), + ), + ], + ), + ), + ) + else + SliverList.builder( + itemCount: packSlugs.length, + itemBuilder: (BuildContext context, int packIndex) { + final pack = stickerPacks[packSlugs[packIndex]]!; + final filteredImagePackImageEntried = pack.images.entries + .toList(); + if (searchFilter?.isNotEmpty ?? false) { + filteredImagePackImageEntried.removeWhere( + (e) => + !(e.key.toLowerCase().contains( + searchFilter!.toLowerCase(), + ) || + (e.value.body?.toLowerCase().contains( + searchFilter!.toLowerCase(), + ) ?? + false)), + ); + } + final imageKeys = filteredImagePackImageEntried + .map((e) => e.key) + .toList(); + if (imageKeys.isEmpty) { + return const SizedBox.shrink(); + } + final packName = + pack.pack.displayName ?? packSlugs[packIndex]; + return Column( + children: [ + if (packIndex != 0) const SizedBox(height: 20), + if (packName != 'user') + ListTile( + leading: Avatar( + mxContent: pack.pack.avatarUrl, + name: packName, + client: widget.room.client, + ), + title: Text(packName), + ), + const SizedBox(height: 6), + GridView.builder( + itemCount: imageKeys.length, + gridDelegate: + const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 84, + mainAxisSpacing: 8.0, + crossAxisSpacing: 8.0, + ), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (BuildContext context, int imageIndex) { + final image = pack.images[imageKeys[imageIndex]]!; + return Tooltip( + message: image.body ?? imageKeys[imageIndex], + child: InkWell( + radius: AppConfig.borderRadius, + key: ValueKey(image.url.toString()), + onTap: () { + // copy the image + final imageCopy = + ImagePackImageContent.fromJson( + image.toJson().copy(), + ); + // set the body, if it doesn't exist, to the key + imageCopy.body ??= imageKeys[imageIndex]; + widget.onSelected(imageCopy); + }, + child: AbsorbPointer( + absorbing: true, + child: MxcImage( + uri: image.url, + fit: BoxFit.contain, + width: 128, + height: 128, + animated: true, + isThumbnail: false, + ), + ), + ), + ); + }, + ), + ], + ); + }, + ), ], ), ), diff --git a/lib/pages/chat/tombstone_display.dart b/lib/pages/chat/tombstone_display.dart deleted file mode 100644 index ad8b971bc2..0000000000 --- a/lib/pages/chat/tombstone_display.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'chat.dart'; - -class TombstoneDisplay extends StatelessWidget { - final ChatController controller; - const TombstoneDisplay(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - if (controller.room!.getState(EventTypes.RoomTombstone) == null) { - return Container(); - } - return SizedBox( - height: 72, - child: Material( - color: Theme.of(context).colorScheme.surfaceVariant, - elevation: 1, - child: ListTile( - leading: CircleAvatar( - foregroundColor: Theme.of(context).colorScheme.onSecondary, - backgroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.upgrade_outlined), - ), - title: Text( - controller.room! - .getState(EventTypes.RoomTombstone)! - .parsedTombstoneContent - .body, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - ), - subtitle: Text(L10n.of(context)!.goToTheNewRoom), - onTap: controller.goToNewRoomAction, - ), - ), - ); - } -} diff --git a/lib/pages/chat/trust_user_key_dialog.dart b/lib/pages/chat/trust_user_key_dialog.dart new file mode 100644 index 0000000000..15660b9f66 --- /dev/null +++ b/lib/pages/chat/trust_user_key_dialog.dart @@ -0,0 +1,158 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/key_verification/key_verification_dialog.dart'; +import 'package:fluffychat/utils/beautify_string_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +Future showTrustUserInRoomDialog(BuildContext context, Room room) async { + if (!room.encrypted) return true; + + final users = await room.requestParticipants(); + if (!context.mounted) return false; + + users.removeWhere((user) { + if (user.id == room.client.userID) return true; + final keys = room.client.userDeviceKeys[user.id]; + final masterKey = keys?.masterKey; + + if (keys == null || + masterKey == null || + masterKey.verified || + masterKey.trustOnFirstUseSince != null) { + return true; + } + return false; + }); + + if (users.isEmpty) return true; + + final l10n = L10n.of(context); + final theme = Theme.of(context); + + final action = await showAdaptiveDialog<_Action>( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Center( + child: Icon( + Icons.lock_outlined, + size: 32, + color: theme.colorScheme.primary, + ), + ), + content: ConstrainedBox( + constraints: BoxConstraints(maxWidth: 128), + child: SelectionArea( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: .stretch, + mainAxisSize: .min, + children: [ + const SizedBox(height: 8), + Center( + child: Text( + users.length == 1 + ? l10n.messageCanOnlyBeReadByUser + : l10n.messageCanOnlyBeReadByUsers, + style: TextStyle(fontSize: 16), + textAlign: .center, + ), + ), + const SizedBox(height: 16), + for (final user in users) ...[ + Row( + children: [ + Avatar( + name: user.calcDisplayname(), + mxContent: user.avatarUrl, + size: 14, + ), + const SizedBox(width: 4), + Expanded( + child: Text( + user.calcDisplayname(), + style: theme.textTheme.labelSmall, + maxLines: 1, + textAlign: TextAlign.start, + ), + ), + ], + ), + DialogTextField( + controller: TextEditingController( + text: l10n.publicKey( + room + .client + .userDeviceKeys[user.id] + ?.masterKey + ?.publicKey + ?.beautifiedOneLine ?? + '???', + ), + ), + textStyle: theme.textTheme.labelSmall, + readOnly: true, + maxLines: 3, + ), + ], + ], + ), + ), + ), + ), + actions: [ + AdaptiveDialogAction( + autofocus: true, + bigButtons: true, + onPressed: () { + for (final user in users) { + room.client.userDeviceKeys[user.id]?.masterKey?.trustOnFirstUse(); + } + Navigator.of(context).pop(_Action.allow); + }, + child: Text(L10n.of(context).continueText), + ), + if (room.isDirectChat) + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => Navigator.of(context).pop(_Action.verification), + child: Text(L10n.of(context).interactiveVerification), + ), + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => Navigator.of(context).pop(_Action.deny), + child: Text(l10n.cancel), + ), + ], + ), + ); + + if (action == null) return false; + + switch (action) { + case _Action.allow: + for (final user in users) { + room.client.userDeviceKeys[user.id]?.masterKey?.trustOnFirstUse(); + } + case _Action.deny: + return false; + case _Action.verification: + final req = await room.client.userDeviceKeys[room.directChatMatrixID] + ?.startVerification(); + if (req == null) return false; + if (!context.mounted) return false; + final success = await KeyVerificationDialog(request: req).show(context); + return success == true; + } + + return true; +} + +enum _Action { allow, deny, verification } diff --git a/lib/pages/chat/typing_indicators.dart b/lib/pages/chat/typing_indicators.dart index 1466040fc5..9fa19a72a0 100644 --- a/lib/pages/chat/typing_indicators.dart +++ b/lib/pages/chat/typing_indicators.dart @@ -1,96 +1,165 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; class TypingIndicators extends StatelessWidget { final ChatController controller; - const TypingIndicators(this.controller, {Key? key}) : super(key: key); + const TypingIndicators(this.controller, {super.key}); @override Widget build(BuildContext context) { - final typingUsers = controller.room!.typingUsers - ..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID); - const topPadding = 20.0; - const bottomPadding = 4.0; - - return Container( - width: double.infinity, - alignment: Alignment.center, - child: AnimatedContainer( - constraints: - const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5), - height: typingUsers.isEmpty ? 0 : Avatar.defaultSize + bottomPadding, - duration: const Duration(milliseconds: 300), - curve: Curves.bounceInOut, - alignment: controller.filteredEvents.isNotEmpty && - controller.filteredEvents.first.senderId == - Matrix.of(context).client.userID - ? Alignment.topRight - : Alignment.topLeft, - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - padding: const EdgeInsets.only( - left: 8.0, - bottom: bottomPadding, - ), - child: Row( - children: [ - SizedBox( - height: Avatar.defaultSize, - width: typingUsers.length < 2 - ? Avatar.defaultSize - : Avatar.defaultSize + 16, - child: Stack( - children: [ - if (typingUsers.isNotEmpty) - Avatar( - mxContent: typingUsers.first.avatarUrl, - name: typingUsers.first.calcDisplayname(), - ), - if (typingUsers.length == 2) - Padding( - padding: const EdgeInsets.only(left: 16), - child: Avatar( - mxContent: typingUsers.length == 2 - ? typingUsers.last.avatarUrl - : null, - name: typingUsers.length == 2 - ? typingUsers.last.calcDisplayname() - : '+${typingUsers.length - 1}', - ), - ), - ], - ), + final theme = Theme.of(context); + + const avatarSize = Avatar.defaultSize / 2; + + return StreamBuilder( + stream: controller.room.client.onSync.stream.where( + (syncUpdate) => + syncUpdate.rooms?.join?[controller.room.id]?.ephemeral?.any( + (ephemeral) => ephemeral.type == 'm.typing', + ) ?? + false, + ), + builder: (context, _) { + final typingUsers = controller.room.typingUsers + ..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID); + + return Container( + width: double.infinity, + alignment: Alignment.center, + child: AnimatedContainer( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.maxTimelineWidth, ), - const SizedBox(width: 8), - Padding( - padding: const EdgeInsets.only(top: topPadding), - child: Material( - color: Theme.of(context).appBarTheme.backgroundColor, - elevation: 6, - shadowColor: - Theme.of(context).secondaryHeaderColor.withAlpha(100), - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(2), - topRight: Radius.circular(AppConfig.borderRadius), - bottomLeft: Radius.circular(AppConfig.borderRadius), - bottomRight: Radius.circular(AppConfig.borderRadius), + height: typingUsers.isEmpty ? 0 : avatarSize + 8, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: + controller.timeline!.events.isNotEmpty && + controller.timeline!.events.first.senderId == + Matrix.of(context).client.userID + ? Alignment.topRight + : Alignment.topLeft, + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0), + child: Row( + children: [ + Container( + alignment: Alignment.center, + height: avatarSize, + width: Avatar.defaultSize, + child: Stack( + children: [ + if (typingUsers.isNotEmpty) + Avatar( + size: avatarSize, + mxContent: typingUsers.first.avatarUrl, + name: typingUsers.first.calcDisplayname(), + ), + if (typingUsers.length == 2) + Padding( + padding: const EdgeInsets.only(left: 16), + child: Avatar( + size: avatarSize, + mxContent: typingUsers.length == 2 + ? typingUsers.last.avatarUrl + : null, + name: typingUsers.length == 2 + ? typingUsers.last.calcDisplayname() + : '+${typingUsers.length - 1}', + ), + ), + ], + ), ), - child: Padding( - padding: const EdgeInsets.all(8), - child: typingUsers.isEmpty - ? null - : Image.asset('assets/typing.gif', height: 12), + const SizedBox(width: 8), + Material( + color: theme.colorScheme.surfaceContainerHigh, + borderRadius: const BorderRadius.all( + Radius.circular(AppConfig.borderRadius), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: typingUsers.isEmpty ? null : const _TypingDots(), + ), ), - ), + ], ), - ], - ), - ), + ), + ); + }, + ); + } +} + +class _TypingDots extends StatefulWidget { + const _TypingDots(); + + @override + State<_TypingDots> createState() => __TypingDotsState(); +} + +class __TypingDotsState extends State<_TypingDots> { + int _tick = 0; + + late final Timer _timer; + + static const Duration animationDuration = Duration(milliseconds: 300); + + @override + void initState() { + _timer = Timer.periodic(animationDuration, (_) { + if (!mounted) { + return; + } + setState(() { + _tick = (_tick + 1) % 4; + }); + }); + super.initState(); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + const size = 8.0; + + return Row( + mainAxisSize: .min, + children: [ + for (var i = 1; i <= 3; i++) + AnimatedContainer( + duration: animationDuration * 1.5, + curve: FluffyThemes.animationCurve, + width: size, + height: _tick == i ? size * 2 : size, + margin: EdgeInsets.symmetric( + horizontal: 2, + vertical: _tick == i ? 4 : 8, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(size * 2), + color: theme.colorScheme.secondary, + ), + ), + ], ); } } diff --git a/lib/pages/chat/utd_dialog.dart b/lib/pages/chat/utd_dialog.dart new file mode 100644 index 0000000000..b03b0ac513 --- /dev/null +++ b/lib/pages/chat/utd_dialog.dart @@ -0,0 +1,76 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/event_info_dialog.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class UtdDialog extends StatelessWidget { + final Event event; + const UtdDialog(this.event, {super.key}); + + static Future show(BuildContext context, Event event) async { + event.requestKey(); + final action = await showAdaptiveDialog<_UtdDialogAction>( + barrierDismissible: true, + context: context, + builder: (_) => UtdDialog(event), + ); + if (action == null) return; + if (!context.mounted) return; + + switch (action) { + case _UtdDialogAction.info: + event.showInfoDialog(context); + case _UtdDialogAction.redact: + await showFutureLoadingDialog( + context: context, + future: () => event.redactEvent(), + ); + } + } + + @override + Widget build(BuildContext context) { + return AlertDialog.adaptive( + title: Text(L10n.of(context).whyIsThisMessageEncrypted), + content: ConstrainedBox( + constraints: BoxConstraints(maxHeight: 200), + child: Scrollbar( + thumbVisibility: true, + child: SingleChildScrollView( + child: SelectableText( + event.calcLocalizedBodyFallback(MatrixLocals(L10n.of(context))), + ), + ), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(_UtdDialogAction.info), + child: Text(L10n.of(context).messageInfo), + ), + if (event.canRedact) + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(_UtdDialogAction.redact), + child: Text( + L10n.of(context).redactMessage, + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + ), + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(L10n.of(context).close), + ), + ], + ); + } +} + +enum _UtdDialogAction { info, redact } diff --git a/lib/pages/chat/utils/web_file_to_x_file.dart b/lib/pages/chat/utils/web_file_to_x_file.dart new file mode 100644 index 0000000000..d83e100dcb --- /dev/null +++ b/lib/pages/chat/utils/web_file_to_x_file.dart @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:cross_file/cross_file.dart'; +import 'package:universal_html/universal_html.dart' as web; + +Future webToXFile(web.File file) async { + final reader = web.FileReader(); + reader.readAsArrayBuffer(file); + await reader.onLoad.first; + + return XFile( + file.relativePath ?? file.name, + name: file.name, + mimeType: file.type, + bytes: reader.result as Uint8List, + ); +} diff --git a/lib/pages/chat/widgets_bottom_sheet.dart b/lib/pages/chat/widgets_bottom_sheet.dart deleted file mode 100644 index 7a52929cef..0000000000 --- a/lib/pages/chat/widgets_bottom_sheet.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/link.dart'; - -import 'edit_widgets_dialog.dart'; - -class WidgetsBottomSheet extends StatelessWidget { - final Room room; - - const WidgetsBottomSheet({Key? key, required this.room}) : super(key: key); - - @override - Widget build(BuildContext context) { - return ListView.builder( - shrinkWrap: true, - itemBuilder: (context, index) { - if (index == room.widgets.length) { - return ListTile( - leading: const Icon(Icons.edit), - title: Text(L10n.of(context)!.editWidgets), - onTap: () { - Navigator.of(context).pop(); - showDialog( - context: context, - builder: (context) => EditWidgetsDialog(room: room), - useRootNavigator: false, - ); - }, - ); - } - final widget = room.widgets[index]; - return Link( - builder: (context, callback) { - return ListTile( - title: Text(widget.name ?? widget.url), - subtitle: Text(widget.type), - onTap: callback, - ); - }, - target: LinkTarget.blank, - uri: Uri.parse(widget.url), - ); - }, - itemCount: room.widgets.length + 1, - ); - } -} diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart new file mode 100644 index 0000000000..0dfe3caaec --- /dev/null +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -0,0 +1,359 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart' hide Visibility; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +class ChatAccessSettings extends StatefulWidget { + final String roomId; + const ChatAccessSettings({required this.roomId, super.key}); + + @override + State createState() => ChatAccessSettingsController(); +} + +class ChatAccessSettingsController extends State { + bool joinRulesLoading = false; + bool visibilityLoading = false; + bool historyVisibilityLoading = false; + bool guestAccessLoading = false; + Room get room => Matrix.of(context).client.getRoomById(widget.roomId)!; + Set get knownSpaceParents => { + ...room.client.rooms.where( + (space) => + space.isSpace && + space.spaceChildren.any((child) => child.roomId == room.id), + ), + ...room.spaceParents + .map((parent) => room.client.getRoomById(parent.roomId ?? '')) + .whereType(), + }; + + String get roomVersion => + room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version') ?? + 'Unknown'; + + /// Calculates which join rules are available based on the information on + /// https://spec.matrix.org/v1.11/rooms/#feature-matrix + List get availableJoinRules { + final joinRules = Set.from(JoinRules.values); + + final roomVersionInt = int.tryParse(roomVersion); + + // Knock is only supported for rooms up from version 7: + if (roomVersionInt != null && roomVersionInt <= 6) { + joinRules.remove(JoinRules.knock); + } + + // Restricted is only supported for rooms up from version 8: + if (roomVersionInt != null && roomVersionInt <= 7) { + joinRules.remove(JoinRules.restricted); + } + + // Knock-Restricted is only supported for rooms up from version 10: + if (roomVersionInt != null && roomVersionInt <= 9) { + joinRules.remove(JoinRules.knockRestricted); + } + + if (knownSpaceParents.isEmpty) { + joinRules.remove(JoinRules.restricted); + joinRules.remove(JoinRules.knockRestricted); + } + + // If an unsupported join rule is the current join rule, display it: + final currentJoinRule = room.joinRules; + if (currentJoinRule != null) joinRules.add(currentJoinRule); + + return joinRules.toList(); + } + + Future setJoinRule(JoinRules? newJoinRules) async { + if (newJoinRules == null) return; + setState(() { + joinRulesLoading = true; + }); + + try { + await room.setJoinRules( + newJoinRules, + allowConditionRoomIds: + { + JoinRules.restricted, + JoinRules.knockRestricted, + }.contains(newJoinRules) + ? knownSpaceParents.map((parent) => parent.id).toList() + : null, + ); + } catch (e, s) { + Logs().w('Unable to change join rules', e, s); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } finally { + if (mounted) { + setState(() { + joinRulesLoading = false; + }); + } + } + } + + Future setHistoryVisibility( + HistoryVisibility? historyVisibility, + ) async { + if (historyVisibility == null) return; + setState(() { + historyVisibilityLoading = true; + }); + + try { + await room.setHistoryVisibility(historyVisibility); + } catch (e, s) { + Logs().w('Unable to change history visibility', e, s); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } finally { + if (mounted) { + setState(() { + historyVisibilityLoading = false; + }); + } + } + } + + Future setGuestAccess(GuestAccess? guestAccess) async { + if (guestAccess == null) return; + setState(() { + guestAccessLoading = true; + }); + + try { + await room.setGuestAccess(guestAccess); + } catch (e, s) { + Logs().w('Unable to change guest access', e, s); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } finally { + if (mounted) { + setState(() { + guestAccessLoading = false; + }); + } + } + } + + Future updateRoomAction() async { + final l10n = L10n.of(context); + final roomVersion = room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version'); + final capabilitiesResult = await showFutureLoadingDialog( + context: context, + future: () => room.client.getCapabilities(), + ); + final capabilities = capabilitiesResult.result; + if (capabilities == null) return; + if (!mounted) return; + final newVersion = await showModalActionPopup( + context: context, + title: l10n.replaceRoomWithNewerVersion, + cancelLabel: l10n.cancel, + actions: capabilities.mRoomVersions!.available.entries + .where((r) => r.key != roomVersion) + .map( + (version) => AdaptiveModalAction( + value: version.key, + label: + '${version.key} (${version.value.toString().split('.').last})', + ), + ) + .toList(), + ); + if (newVersion == null) return; + if (!mounted) return; + final confirmUpgrade = await showOkCancelAlertDialog( + context: context, + okLabel: l10n.yes, + cancelLabel: l10n.cancel, + title: l10n.areYouSure, + message: l10n.roomUpgradeDescription, + isDestructive: true, + ); + if (confirmUpgrade == OkCancelResult.cancel) { + return; + } + if (!mounted) return; + final result = await showFutureLoadingDialog( + context: context, + futureWithProgress: (onProgress) async { + final newRoomId = await room.client.upgradeRoom(room.id, newVersion); + var newRoom = room.client.getRoomById(newRoomId); + while (newRoom == null) { + await room.client.onSync.stream.first; + newRoom = room.client.getRoomById(newRoomId); + } + + if ({ + JoinRules.invite, + JoinRules.knock, + JoinRules.knockRestricted, + }.contains(room.joinRules)) { + final users = await room.requestParticipants([ + Membership.join, + Membership.invite, + ]); + users.removeWhere((user) => user.id == room.client.userID); + for (final (i, user) in users.indexed) { + try { + Logs().v('Inviting...', user.id); + await newRoom.invite(user.id); + onProgress(i / users.length); + } on MatrixException catch (e) { + final retryAfterMs = e.retryAfterMs; + if (e.error != MatrixError.M_LIMIT_EXCEEDED || + retryAfterMs == null) { + rethrow; + } + Logs().d('Limit exceeded. Retry after $retryAfterMs'); + await Future.delayed(Duration(milliseconds: retryAfterMs)); + await newRoom.invite(user.id); + onProgress(i / users.length); + } + } + } + }, + ); + if (result.error != null) return; + if (!mounted) return; + context.go('/rooms/${room.id}'); + } + + Future addAlias() async { + final l10n = L10n.of(context); + final domain = room.client.userID?.domain; + if (domain == null) { + throw Exception('userID or domain is null! This should never happen.'); + } + + final input = await showTextInputDialog( + context: context, + title: l10n.editRoomAliases, + prefixText: '#', + suffixText: domain, + hintText: l10n.alias, + ); + if (!mounted) return; + final aliasLocalpart = input?.trim(); + if (aliasLocalpart == null || aliasLocalpart.isEmpty) return; + final alias = '#$aliasLocalpart:$domain'; + + final result = await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomAlias(alias, room.id), + ); + if (result.error != null) return; + if (!mounted) return; + setState(() {}); + + if (!room.canChangeStateEvent(EventTypes.RoomCanonicalAlias)) return; + + final canonicalAliasConsent = await showOkCancelAlertDialog( + context: context, + title: l10n.setAsCanonicalAlias, + message: alias, + okLabel: l10n.yes, + cancelLabel: l10n.no, + ); + if (!mounted) return; + + final altAliases = + room + .getState(EventTypes.RoomCanonicalAlias) + ?.content + .tryGetList('alt_aliases') + ?.toSet() ?? + {}; + if (room.canonicalAlias.isNotEmpty) altAliases.add(room.canonicalAlias); + altAliases.add(alias); + if (canonicalAliasConsent == OkCancelResult.ok) { + altAliases.remove(alias); + } else { + altAliases.remove(room.canonicalAlias); + } + + await showFutureLoadingDialog( + context: context, + future: () => room.client + .setRoomStateWithKey(room.id, EventTypes.RoomCanonicalAlias, '', { + 'alias': canonicalAliasConsent == OkCancelResult.ok + ? alias + : room.canonicalAlias, + if (altAliases.isNotEmpty) 'alt_aliases': altAliases.toList(), + }), + ); + } + + Future deleteAlias(String alias) async { + await showFutureLoadingDialog( + context: context, + future: () => room.client.deleteRoomAlias(alias), + ); + setState(() {}); + } + + Future setChatVisibilityOnDirectory(bool? visibility) async { + if (visibility == null) return; + setState(() { + visibilityLoading = true; + }); + + try { + await room.client.setRoomVisibilityOnDirectory( + room.id, + visibility: visibility == true ? Visibility.public : Visibility.private, + ); + setState(() {}); + } catch (e, s) { + Logs().w('Unable to change visibility', e, s); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } finally { + if (mounted) { + setState(() { + visibilityLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return ChatAccessSettingsPageView(this); + } +} diff --git a/lib/pages/chat_access_settings/chat_access_settings_page.dart b/lib/pages/chat_access_settings/chat_access_settings_page.dart new file mode 100644 index 0000000000..51d6f4b13c --- /dev/null +++ b/lib/pages/chat_access_settings/chat_access_settings_page.dart @@ -0,0 +1,318 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart' hide Visibility; +import 'package:matrix/matrix.dart'; + +class ChatAccessSettingsPageView extends StatelessWidget { + final ChatAccessSettingsController controller; + const ChatAccessSettingsPageView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = controller.room; + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).accessAndVisibility), + ), + body: MaxWidthBody( + child: StreamBuilder( + stream: room.client.onRoomState.stream.where( + (update) => update.roomId == controller.room.id, + ), + builder: (context, snapshot) { + final canonicalAlias = room.canonicalAlias; + final altAliases = + room + .getState(EventTypes.RoomCanonicalAlias) + ?.content + .tryGetList('alt_aliases') ?? + []; + return Column( + mainAxisSize: .min, + children: [ + ListTile( + title: Text( + L10n.of(context).visibilityOfTheChatHistory, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + RadioGroup( + groupValue: room.historyVisibility, + onChanged: + controller.historyVisibilityLoading || + !room.canChangeHistoryVisibility + ? (_) {} + : controller.setHistoryVisibility, + child: Column( + mainAxisSize: .min, + children: [ + for (final historyVisibility in HistoryVisibility.values) + RadioListTile.adaptive( + title: Text( + historyVisibility.getLocalizedString( + MatrixLocals(L10n.of(context)), + ), + ), + value: historyVisibility, + ), + ], + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).whoIsAllowedToJoinThisGroup, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + RadioGroup( + groupValue: room.joinRules, + onChanged: controller.setJoinRule, + child: Column( + mainAxisSize: .min, + children: [ + for (final joinRule in controller.availableJoinRules) + if (joinRule != JoinRules.private) + RadioListTile.adaptive( + enabled: + !controller.joinRulesLoading && + room.canChangeJoinRules, + title: Text( + joinRule.localizedString( + L10n.of(context), + controller.knownSpaceParents, + ), + ), + value: joinRule, + ), + ], + ), + ), + Divider(color: theme.dividerColor), + if ({ + JoinRules.public, + JoinRules.knock, + }.contains(room.joinRules)) ...[ + ListTile( + title: Text( + L10n.of(context).areGuestsAllowedToJoin, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + RadioGroup( + groupValue: room.guestAccess, + onChanged: controller.setGuestAccess, + child: Column( + mainAxisSize: .min, + children: [ + for (final guestAccess in GuestAccess.values) + RadioListTile.adaptive( + enabled: + !controller.guestAccessLoading && + room.canChangeGuestAccess, + title: Text( + guestAccess.getLocalizedString( + MatrixLocals(L10n.of(context)), + ), + ), + value: guestAccess, + ), + ], + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).publicChatAddresses, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + trailing: IconButton( + icon: const Icon(Icons.add_outlined), + tooltip: L10n.of(context).createNewAddress, + onPressed: controller.addAlias, + ), + ), + if (canonicalAlias.isNotEmpty) + _AliasListTile( + alias: canonicalAlias, + onDelete: + room.canChangeStateEvent( + EventTypes.RoomCanonicalAlias, + ) + ? () => controller.deleteAlias(canonicalAlias) + : null, + isCanonicalAlias: true, + ), + for (final alias in altAliases) + _AliasListTile( + alias: alias, + onDelete: + room.canChangeStateEvent( + EventTypes.RoomCanonicalAlias, + ) + ? () => controller.deleteAlias(alias) + : null, + ), + FutureBuilder( + future: room.client.getLocalAliases(room.id), + builder: (context, snapshot) { + final localAddresses = snapshot.data; + if (localAddresses == null) { + return const SizedBox.shrink(); + } + localAddresses.remove(room.canonicalAlias); + localAddresses.removeWhere(altAliases.contains); + return Column( + mainAxisSize: .min, + children: localAddresses + .map( + (alias) => _AliasListTile( + alias: alias, + published: false, + onDelete: () => controller.deleteAlias(alias), + ), + ) + .toList(), + ); + }, + ), + Divider(color: theme.dividerColor), + FutureBuilder( + future: room.client.getRoomVisibilityOnDirectory(room.id), + builder: (context, snapshot) => SwitchListTile.adaptive( + value: snapshot.data == Visibility.public, + title: Text( + L10n.of(context).chatCanBeDiscoveredViaSearchOnServer( + room.client.userID!.domain!, + ), + ), + onChanged: controller.setChatVisibilityOnDirectory, + ), + ), + ], + ListTile( + title: Text(L10n.of(context).globalChatId), + subtitle: SelectableText(room.id), + trailing: IconButton( + icon: const Icon(Icons.copy_outlined), + onPressed: () => FluffyShare.share(room.id, context), + ), + ), + ListTile( + title: Text(L10n.of(context).roomVersion), + subtitle: SelectableText( + room + .getState(EventTypes.RoomCreate)! + .content + .tryGet('room_version') ?? + 'Unknown', + ), + trailing: room.canSendEvent(EventTypes.RoomTombstone) + ? IconButton( + icon: const Icon(Icons.upgrade_outlined), + onPressed: controller.updateRoomAction, + ) + : null, + ), + ], + ); + }, + ), + ), + ); + } +} + +class _AliasListTile extends StatelessWidget { + const _AliasListTile({ + required this.alias, + required this.onDelete, + this.isCanonicalAlias = false, + this.published = true, + }); + + final String alias; + final void Function()? onDelete; + final bool isCanonicalAlias; + final bool published; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ListTile( + leading: isCanonicalAlias + ? const Icon(Icons.star) + : const Icon(Icons.link_outlined), + title: InkWell( + onTap: () => FluffyShare.share('https://matrix.to/#/$alias', context), + child: SelectableText( + alias, + style: TextStyle( + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + color: theme.colorScheme.primary, + fontSize: 14, + ), + ), + ), + trailing: onDelete != null + ? IconButton( + color: theme.colorScheme.error, + icon: const Icon(Icons.delete_outlined), + onPressed: onDelete, + ) + : null, + ); + } +} + +extension JoinRulesDisplayString on JoinRules { + String localizedString(L10n l10n, Set spaceParents) { + switch (this) { + case JoinRules.public: + return l10n.anyoneCanJoin; + case JoinRules.invite: + return l10n.invitedUsersOnly; + case JoinRules.knock: + return l10n.usersMustKnock; + case JoinRules.private: + return l10n.noOneCanJoin; + case JoinRules.restricted: + return l10n.spaceMemberOf( + spaceParents + .map((space) => space.getLocalizedDisplayname(MatrixLocals(l10n))) + .join(', '), + ); + case JoinRules.knockRestricted: + return l10n.spaceMemberOfCanKnock( + spaceParents + .map((space) => space.getLocalizedDisplayname(MatrixLocals(l10n))) + .join(', '), + ); + } + } +} diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 655f61f51b..f4142a63d0 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -1,292 +1,133 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:collection/collection.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_details/chat_details_view.dart'; import 'package:fluffychat/pages/settings/settings.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; - -enum AliasActions { copy, delete, setCanonical } +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; class ChatDetails extends StatefulWidget { - const ChatDetails({Key? key}) : super(key: key); + final String roomId; + final Widget? embeddedCloseButton; + + const ChatDetails({ + super.key, + required this.roomId, + this.embeddedCloseButton, + }); @override ChatDetailsController createState() => ChatDetailsController(); } class ChatDetailsController extends State { - List? members; bool displaySettings = false; void toggleDisplaySettings() => setState(() => displaySettings = !displaySettings); - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => widget.roomId; - void setDisplaynameAction() async { + Future setDisplaynameAction() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.changeTheNameOfTheGroup, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - initialText: room.getLocalizedDisplayname( - MatrixLocals( - L10n.of(context)!, - ), - ), - ) - ], + title: l10n.changeTheNameOfTheGroup, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + initialText: room.getLocalizedDisplayname(MatrixLocals(l10n)), ); if (input == null) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, - future: () => room.setName(input.single), + future: () => room.setName(input), ); + if (!mounted) return; if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.displaynameHasBeenChanged))); - } - } - - void editAliases() async { - final room = Matrix.of(context).client.getRoomById(roomId!); - - // The current endpoint doesnt seem to be implemented in Synapse. This may - // change in the future and then we just need to switch to this api call: - // - // final aliases = await showFutureLoadingDialog( - // context: context, - // future: () => room.client.requestRoomAliases(room.id), - // ); - // - // While this is not working we use the unstable api: - final aliases = await showFutureLoadingDialog( - context: context, - future: () => room!.client - .request( - RequestType.GET, - '/client/unstable/org.matrix.msc2432/rooms/${Uri.encodeComponent(room.id)}/aliases', - ) - .then((response) => List.from(response['aliases'])), - ); - // Switch to the stable api once it is implemented. - - if (aliases.error != null) return; - final adminMode = room!.canSendEvent('m.room.canonical_alias'); - if (aliases.result!.isEmpty && (room.canonicalAlias.isNotEmpty)) { - aliases.result!.add(room.canonicalAlias); - } - if (aliases.result!.isEmpty && adminMode) { - return setAliasAction(); - } - final select = await showConfirmationDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.editRoomAliases, - actions: [ - if (adminMode) - AlertDialogAction(label: L10n.of(context)!.create, key: 'new'), - ...aliases.result! - .map((alias) => AlertDialogAction(key: alias, label: alias)) - .toList(), - ], - ); - if (select == null) return; - if (select == 'new') { - return setAliasAction(); - } - final option = await showConfirmationDialog( - context: context, - title: select, - actions: [ - AlertDialogAction( - label: L10n.of(context)!.copyToClipboard, - key: AliasActions.copy, - isDefaultAction: true, - ), - if (adminMode) ...{ - AlertDialogAction( - label: L10n.of(context)!.setAsCanonicalAlias, - key: AliasActions.setCanonical, - isDestructiveAction: true, - ), - AlertDialogAction( - label: L10n.of(context)!.delete, - key: AliasActions.delete, - isDestructiveAction: true, - ), - }, - ], - ); - if (option == null) return; - switch (option) { - case AliasActions.copy: - await Clipboard.setData(ClipboardData(text: select)); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.copiedToClipboard)), - ); - break; - case AliasActions.delete: - await showFutureLoadingDialog( - context: context, - future: () => room.client.deleteRoomAlias(select), - ); - break; - case AliasActions.setCanonical: - await showFutureLoadingDialog( - context: context, - future: () => room.client.setRoomStateWithKey( - room.id, - EventTypes.RoomCanonicalAlias, - '', - { - 'alias': select, - }, - ), - ); - break; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.displaynameHasBeenChanged)), + ); } } - void setAliasAction() async { + Future setTopicAction() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final room = Matrix.of(context).client.getRoomById(roomId!)!; - final domain = room.client.userID!.domain; - final input = await showTextInputDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.setInvitationLink, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - prefixText: '#', - suffixText: domain, - hintText: L10n.of(context)!.alias, - initialText: room.canonicalAlias.localpart, - ) - ], - ); - if (input == null) return; - await showFutureLoadingDialog( - context: context, - future: () => - room.client.setRoomAlias('#' + input.single + ':' + domain!, room.id), - ); - } - - void setTopicAction() async { - final room = Matrix.of(context).client.getRoomById(roomId!)!; - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.setGroupDescription, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.setGroupDescription, - initialText: room.topic, - minLines: 1, - maxLines: 4, - ) - ], + title: l10n.setChatDescription, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.noChatDescriptionYet, + initialText: room.topic, + minLines: 4, + maxLines: 8, ); if (input == null) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, - future: () => room.setDescription(input.single), + future: () => room.setDescription(input), ); + if (!mounted) return; if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(L10n.of(context)!.groupDescriptionHasBeenChanged))); - } - } - - void setGuestAccessAction(GuestAccess guestAccess) => showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .getRoomById(roomId!)! - .setGuestAccess(guestAccess), - ); - - void setHistoryVisibilityAction(HistoryVisibility historyVisibility) => - showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .getRoomById(roomId!)! - .setHistoryVisibility(historyVisibility), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.chatDescriptionHasBeenChanged)), ); - - void setJoinRulesAction(JoinRules joinRule) => showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context) - .client - .getRoomById(roomId!)! - .setJoinRules(joinRule), - ); - - void goToEmoteSettings() async { - final room = Matrix.of(context).client.getRoomById(roomId!)!; - // okay, we need to test if there are any emote state events other than the default one - // if so, we need to be directed to a selection screen for which pack we want to look at - // otherwise, we just open the normal one. - if ((room.states['im.ponies.room_emotes'] ?? {}) - .keys - .any((String s) => s.isNotEmpty)) { - VRouter.of(context).to('multiple_emotes'); - } else { - VRouter.of(context).to('emotes'); } } - void setAvatarAction() async { + Future setAvatarAction() async { + final l10n = L10n.of(context); final room = Matrix.of(context).client.getRoomById(roomId!); final actions = [ if (PlatformInfos.isMobile) - SheetAction( - key: AvatarAction.camera, - label: L10n.of(context)!.openCamera, + AdaptiveModalAction( + value: AvatarAction.camera, + label: l10n.openCamera, isDefaultAction: true, - icon: Icons.camera_alt_outlined, + icon: const Icon(Icons.camera_alt_outlined), ), - SheetAction( - key: AvatarAction.file, - label: L10n.of(context)!.openGallery, - icon: Icons.photo_outlined, + AdaptiveModalAction( + value: AvatarAction.file, + label: l10n.openGallery, + icon: const Icon(Icons.photo_outlined), ), if (room?.avatar != null) - SheetAction( - key: AvatarAction.remove, - label: L10n.of(context)!.delete, - isDestructiveAction: true, - icon: Icons.delete_outlined, + AdaptiveModalAction( + value: AvatarAction.remove, + label: l10n.delete, + isDestructive: true, + icon: const Icon(Icons.delete_outlined), ), ]; final action = actions.length == 1 - ? actions.single.key - : await showModalActionSheet( + ? actions.single.value + : await showModalActionPopup( context: context, - title: L10n.of(context)!.editRoomAvatar, + title: l10n.editRoomAvatar, + cancelLabel: l10n.cancel, actions: actions, ); if (action == null) return; + if (!mounted) return; if (action == AvatarAction.remove) { await showFutureLoadingDialog( context: context, @@ -303,43 +144,30 @@ class ChatDetailsController extends State { imageQuality: 50, ); if (result == null) return; - file = MatrixFile( - bytes: await result.readAsBytes(), - name: result.path, - ); + file = MatrixFile(bytes: await result.readAsBytes(), name: result.path); } else { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; + if (!mounted) return; + final picked = await selectFiles( + context, + allowMultiple: false, + type: FileType.image, + ); + final pickedFile = picked.firstOrNull; + if (pickedFile == null) return; file = MatrixFile( - bytes: result.toUint8List(), - name: result.fileName!, + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, ); } + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => room!.setAvatar(file), ); } - void requestMoreMembersAction() async { - final room = Matrix.of(context).client.getRoomById(roomId!); - final participants = await showFutureLoadingDialog( - context: context, future: () => room!.requestParticipants()); - if (participants.error == null) { - setState(() => members = participants.result); - } - } - static const fixedWidth = 360.0; @override - Widget build(BuildContext context) { - members ??= - Matrix.of(context).client.getRoomById(roomId!)!.getParticipants(); - return SizedBox( - width: fixedWidth, - child: ChatDetailsView(this), - ); - } + Widget build(BuildContext context) => ChatDetailsView(this); } diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index 116c4fa7f7..4cda41ca99 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -1,395 +1,355 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pages/chat_details/participant_list_item.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; -import 'package:fluffychat/widgets/content_banner.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/url_launcher.dart'; +import '../../widgets/mxc_image_viewer.dart'; +import '../../widgets/qr_code_viewer.dart'; class ChatDetailsView extends StatelessWidget { final ChatDetailsController controller; - const ChatDetailsView(this.controller, {Key? key}) : super(key: key); + const ChatDetailsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final room = Matrix.of(context).client.getRoomById(controller.roomId!); if (room == null) { return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.oopsSomethingWentWrong), - ), + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), body: Center( - child: Text(L10n.of(context)!.youAreNoLongerParticipatingInThisChat), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), ), ); } - controller.members!.removeWhere((u) => u.membership == Membership.leave); - final actualMembersCount = (room.summary.mInvitedMemberCount ?? 0) + - (room.summary.mJoinedMemberCount ?? 0); - final canRequestMoreMembers = - controller.members!.length < actualMembersCount; - final iconColor = Theme.of(context).textTheme.bodyText1!.color; + final directChatMatrixID = room.directChatMatrixID; + final roomAvatar = room.avatar; + return StreamBuilder( - stream: room.onUpdate.stream, - builder: (context, snapshot) { - return Scaffold( - body: NestedScrollView( - headerSliverBuilder: - (BuildContext context, bool innerBoxIsScrolled) => [ - SliverAppBar( - leading: IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => - VRouter.of(context).path.startsWith('/spaces/') - ? VRouter.of(context).pop() - : VRouter.of(context) - .toSegments(['rooms', controller.roomId!]), - ), - elevation: Theme.of(context).appBarTheme.elevation, - expandedHeight: 300.0, - floating: true, - pinned: true, - actions: [ - if (room.canonicalAlias.isNotEmpty) - IconButton( - tooltip: L10n.of(context)!.share, - icon: Icon(Icons.adaptive.share_outlined), - onPressed: () => FluffyShare.share( - AppConfig.inviteLinkPrefix + room.canonicalAlias, - context), - ), - ChatSettingsPopupMenu(room, false) - ], - title: Text( - room.getLocalizedDisplayname( - MatrixLocals(L10n.of(context)!)), - ), - backgroundColor: - Theme.of(context).appBarTheme.backgroundColor, - flexibleSpace: FlexibleSpaceBar( - background: ContentBanner( - mxContent: room.avatar, - onEdit: room.canSendEvent('m.room.avatar') - ? controller.setAvatarAction - : null, - defaultIcon: Icons.group_outlined, - ), - ), + stream: room.client.onRoomState.stream.where( + (update) => update.roomId == room.id, + ), + builder: (context, snapshot) { + var members = room.getParticipants().toList() + ..sort((b, a) => a.powerLevel.level.compareTo(b.powerLevel.level)); + members = members.take(10).toList(); + final actualMembersCount = + (room.summary.mInvitedMemberCount ?? 0) + + (room.summary.mJoinedMemberCount ?? 0); + final canRequestMoreMembers = members.length < actualMembersCount; + final iconColor = theme.textTheme.bodyLarge!.color; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + return Scaffold( + appBar: AppBar( + leading: + controller.widget.embeddedCloseButton ?? + const Center(child: BackButton()), + elevation: theme.appBarTheme.elevation, + actions: [ + if (room.canonicalAlias.isNotEmpty) + IconButton( + tooltip: L10n.of(context).share, + icon: const Icon(Icons.qr_code_rounded), + onPressed: () => + showQrCodeViewer(context, room.canonicalAlias), + ) + else if (directChatMatrixID != null) + IconButton( + tooltip: L10n.of(context).share, + icon: const Icon(Icons.qr_code_rounded), + onPressed: () => + showQrCodeViewer(context, directChatMatrixID), ), - ], - body: MaxWidthBody( - child: ListView.builder( - itemCount: controller.members!.length + - 1 + - (canRequestMoreMembers ? 1 : 0), - itemBuilder: (BuildContext context, int i) => i == 0 - ? Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ListTile( - leading: room.canSendEvent('m.room.topic') - ? CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - radius: Avatar.defaultSize / 2, - child: const Icon(Icons.edit_outlined), - ) - : null, - title: Text( - '${L10n.of(context)!.groupDescription}:', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold)), - subtitle: LinkText( - text: room.topic.isEmpty - ? L10n.of(context)!.addGroupDescription - : room.topic, - linkStyle: - const TextStyle(color: Colors.blueAccent), - textStyle: TextStyle( - fontSize: 14, - color: Theme.of(context) - .textTheme - .bodyText2! - .color, - ), - onLinkTap: (url) => - UrlLauncher(context, url).launchUrl(), - ), - onTap: room.canSendEvent('m.room.topic') - ? controller.setTopicAction - : null, - ), - const SizedBox(height: 8), - const Divider(height: 1), - ListTile( - title: Text( - L10n.of(context)!.settings, - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), - trailing: Icon(controller.displaySettings - ? Icons.keyboard_arrow_down_outlined - : Icons.keyboard_arrow_right_outlined), - onTap: controller.toggleDisplaySettings, - ), - if (controller.displaySettings) ...[ - if (room.canSendEvent('m.room.name')) - ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.people_outline_outlined), - ), - title: Text(L10n.of(context)! - .changeTheNameOfTheGroup), - subtitle: Text(room.getLocalizedDisplayname( - MatrixLocals(L10n.of(context)!))), - onTap: controller.setDisplaynameAction, - ), - if (room.joinRules == JoinRules.public) - ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon(Icons.link_outlined), - ), - onTap: controller.editAliases, - title: - Text(L10n.of(context)!.editRoomAliases), - subtitle: Text( - (room.canonicalAlias.isNotEmpty) - ? room.canonicalAlias - : L10n.of(context)!.none), - ), - ListTile( - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.insert_emoticon_outlined), - ), - title: Text(L10n.of(context)!.emoteSettings), - subtitle: - Text(L10n.of(context)!.setCustomEmotes), - onTap: controller.goToEmoteSettings, - ), - PopupMenuButton( - onSelected: controller.setJoinRulesAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeJoinRules) - PopupMenuItem( - value: JoinRules.public, - child: Text(JoinRules.public - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + if (controller.widget.embeddedCloseButton == null) + ChatSettingsPopupMenu(room, false), + ], + title: Text(L10n.of(context).chatDetails), + backgroundColor: theme.appBarTheme.backgroundColor, + ), + body: MaxWidthBody( + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: members.length + 1 + (canRequestMoreMembers ? 1 : 0), + itemBuilder: (BuildContext context, int i) => i == 0 + ? Column( + crossAxisAlignment: .stretch, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Hero( + tag: + controller.widget.embeddedCloseButton != + null + ? 'embedded_content_banner' + : 'content_banner', + child: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, + onTap: roomAvatar != null + ? () => showDialog( + context: context, + builder: (_) => + MxcImageViewer(roomAvatar), + ) + : null, ), - if (room.canChangeJoinRules) - PopupMenuItem( - value: JoinRules.invite, - child: Text(JoinRules.invite - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + ), + if (!room.isDirectChat && + room.canChangeStateEvent( + EventTypes.RoomAvatar, + )) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon( + Icons.camera_alt_outlined, + ), + ), ), ], - child: ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon(Icons.shield_outlined)), - title: Text(L10n.of(context)! - .whoIsAllowedToJoinThisGroup), - subtitle: Text( - room.joinRules!.getLocalizedString( - MatrixLocals(L10n.of(context)!)), - ), - ), ), - PopupMenuButton( - onSelected: - controller.setHistoryVisibilityAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.invited, - child: Text(HistoryVisibility.invited - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), - ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.joined, - child: Text(HistoryVisibility.joined - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + ), + Expanded( + child: Column( + mainAxisAlignment: .center, + crossAxisAlignment: .start, + children: [ + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? controller.setDisplaynameAction() + : FluffyShare.share( + displayname, + context, + copyOnly: true, + ), + icon: Icon( + room.isDirectChat + ? Icons.chat_bubble_outline + : room.canChangeStateEvent( + EventTypes.RoomName, + ) + ? Icons.edit_outlined + : Icons.copy_outlined, + size: 16, ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.shared, - child: Text(HistoryVisibility.shared - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.onSurface, + iconColor: theme.colorScheme.onSurface, ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.worldReadable, - child: Text(HistoryVisibility - .worldReadable - .getLocalizedString( - MatrixLocals(L10n.of(context)!))), + label: Text( + room.isDirectChat + ? L10n.of(context).directChat + : displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 18), ), - ], - child: ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: - const Icon(Icons.visibility_outlined), - ), - title: Text(L10n.of(context)! - .visibilityOfTheChatHistory), - subtitle: Text( - room.historyVisibility!.getLocalizedString( - MatrixLocals(L10n.of(context)!)), ), - ), - ), - if (room.joinRules == JoinRules.public) - PopupMenuButton( - onSelected: controller.setGuestAccessAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeGuestAccess) - PopupMenuItem( - value: GuestAccess.canJoin, - child: Text( - GuestAccess.canJoin - .getLocalizedString(MatrixLocals( - L10n.of(context)!)), - ), - ), - if (room.canChangeGuestAccess) - PopupMenuItem( - value: GuestAccess.forbidden, - child: Text( - GuestAccess.forbidden - .getLocalizedString(MatrixLocals( - L10n.of(context)!)), - ), - ), - ], - child: ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context) - .scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.person_add_alt_1_outlined), + TextButton.icon( + onPressed: () => room.isDirectChat + ? null + : context.push( + '/rooms/${controller.roomId}/details/members', + ), + icon: const Icon( + Icons.group_outlined, + size: 14, ), - title: Text(L10n.of(context)! - .areGuestsAllowedToJoin), - subtitle: Text( - room.guestAccess.getLocalizedString( - MatrixLocals(L10n.of(context)!)), + style: TextButton.styleFrom( + foregroundColor: + theme.colorScheme.secondary, + iconColor: theme.colorScheme.secondary, + ), + label: Text( + L10n.of( + context, + ).countParticipants(actualMembersCount), + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), ), ), - ), - ListTile( - title: - Text(L10n.of(context)!.editChatPermissions), - subtitle: Text( - L10n.of(context)!.whoCanPerformWhichAction), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: iconColor, - child: const Icon( - Icons.edit_attributes_outlined), - ), - onTap: () => - VRouter.of(context).to('permissions'), + ], ), - ], - const Divider(height: 1), - ListTile( - title: Text( - actualMembersCount > 1 - ? L10n.of(context)!.countParticipants( - actualMembersCount.toString()) - : L10n.of(context)!.emptyChat, - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), + ), + ], + ), + if (room.canChangeStateEvent(EventTypes.RoomTopic) || + room.topic.isNotEmpty) ...[ + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).chatDescription, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, ), ), - room.canInvite - ? ListTile( - title: - Text(L10n.of(context)!.inviteContact), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).primaryColor, - foregroundColor: Colors.white, - radius: Avatar.defaultSize / 2, - child: const Icon(Icons.add_outlined), - ), - onTap: () => - VRouter.of(context).to('invite'), + trailing: + room.canChangeStateEvent(EventTypes.RoomTopic) + ? IconButton( + onPressed: controller.setTopicAction, + tooltip: L10n.of( + context, + ).setChatDescription, + icon: const Icon(Icons.edit_outlined), ) - : Container(), - ], - ) - : i < controller.members!.length + 1 - ? ParticipantListItem(controller.members![i - 1]) - : ListTile( - title: Text(L10n.of(context)! - .loadCountMoreParticipants( - (actualMembersCount - - controller.members!.length) - .toString())), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - child: const Icon( - Icons.refresh, - color: Colors.grey, - ), + : null, + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + ), + child: SelectableLinkify( + text: room.topic.isEmpty + ? L10n.of(context).noChatDescriptionYet + : room.topic, + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: const TextStyle( + color: Colors.blueAccent, + decorationColor: Colors.blueAccent, + ), + style: TextStyle( + fontSize: 14, + fontStyle: room.topic.isEmpty + ? FontStyle.italic + : FontStyle.normal, + color: theme.textTheme.bodyMedium!.color, + decorationColor: + theme.textTheme.bodyMedium!.color, ), - onTap: controller.requestMoreMembersAction, + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), ), - ), - ), + ), + const SizedBox(height: 16), + ], + if (!room.isDirectChat) ...[ + Divider(color: theme.dividerColor), + ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.surfaceContainer, + foregroundColor: iconColor, + child: const Icon( + Icons.admin_panel_settings_outlined, + ), + ), + title: Text(L10n.of(context).accessAndVisibility), + subtitle: Text( + L10n.of(context).accessAndVisibilityDescription, + ), + onTap: () => context.push( + '/rooms/${room.id}/details/access', + ), + trailing: const Icon(Icons.chevron_right_outlined), + ), + ListTile( + title: Text(L10n.of(context).chatPermissions), + subtitle: Text( + L10n.of(context).whoCanPerformWhichAction, + ), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.surfaceContainer, + foregroundColor: iconColor, + child: const Icon(Icons.tune_outlined), + ), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: () => context.push( + '/rooms/${room.id}/details/permissions', + ), + ), + ], + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of( + context, + ).countParticipants(actualMembersCount), + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + if (!room.isDirectChat && room.canInvite) + ListTile( + title: Text(L10n.of(context).inviteContact), + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.primaryContainer, + foregroundColor: + theme.colorScheme.onPrimaryContainer, + radius: Avatar.defaultSize / 2, + child: const Icon(Icons.add_outlined), + ), + trailing: const Icon(Icons.chevron_right_outlined), + onTap: () => context.go('/rooms/${room.id}/invite'), + ), + ], + ) + : i < members.length + 1 + ? ParticipantListItem(members[i - 1]) + : ListTile( + title: Text( + L10n.of(context).loadCountMoreParticipants( + (actualMembersCount - members.length), + ), + ), + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + child: const Icon( + Icons.group_outlined, + color: Colors.grey, + ), + ), + onTap: () => context.push( + '/rooms/${controller.roomId!}/details/members', + ), + trailing: const Icon(Icons.chevron_right_outlined), + ), ), - ); - }); + ), + ); + }, + ); } } diff --git a/lib/pages/chat_details/participant_list_item.dart b/lib/pages/chat_details/participant_list_item.dart index 20499b1d52..ba380a879f 100644 --- a/lib/pages/chat_details/participant_list_item.dart +++ b/lib/pages/chat_details/participant_list_item.dart @@ -1,71 +1,103 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import '../../widgets/avatar.dart'; -import '../user_bottom_sheet/user_bottom_sheet.dart'; class ParticipantListItem extends StatelessWidget { final User user; - const ParticipantListItem(this.user, {Key? key}) : super(key: key); + const ParticipantListItem(this.user, {super.key}); @override Widget build(BuildContext context) { - final membershipBatch = { - Membership.join: '', - Membership.ban: L10n.of(context)!.banned, - Membership.invite: L10n.of(context)!.invited, - Membership.leave: L10n.of(context)!.leftTheChat, + final theme = Theme.of(context); + + final membershipBatch = switch (user.membership) { + Membership.ban => L10n.of(context).banned, + Membership.invite => L10n.of(context).invited, + Membership.join => null, + Membership.knock => L10n.of(context).knocking, + Membership.leave => L10n.of(context).leftTheChat, + }; + + final permissionBatch = switch (user.powerLevel.role) { + PowerLevelRole.user => '', + PowerLevelRole.moderator => L10n.of(context).moderator, + PowerLevelRole.admin => L10n.of(context).admin, + PowerLevelRole.owner => L10n.of(context).owner, }; - final permissionBatch = user.powerLevel == 100 - ? L10n.of(context)!.admin - : user.powerLevel >= 50 - ? L10n.of(context)!.moderator - : ''; - return Opacity( - opacity: user.membership == Membership.join ? 1 : 0.5, - child: ListTile( - onTap: () => showModalBottomSheet( - context: context, - builder: (c) => UserBottomSheet( - user: user, - outerContext: context, + final isAdminOrOwner = + user.powerLevel.role == PowerLevelRole.admin || + user.powerLevel.role == PowerLevelRole.owner; + + return ListTile( + onTap: () => showMemberActionsPopupMenu(context: context, user: user), + title: Row( + children: [ + Expanded( + child: Text( + user.calcDisplayname(), + overflow: TextOverflow.ellipsis, + ), ), - ), - title: Row( - children: [ - Text(user.calcDisplayname()), - permissionBatch.isEmpty - ? Container() - : Container( - padding: const EdgeInsets.all(4), - margin: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: BorderRadius.circular(8), - ), - child: Center(child: Text(permissionBatch)), + if (permissionBatch.isNotEmpty) + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: isAdminOrOwner + ? theme.colorScheme.tertiary + : theme.colorScheme.tertiaryContainer, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + child: Text( + permissionBatch, + style: theme.textTheme.labelSmall?.copyWith( + color: isAdminOrOwner + ? theme.colorScheme.onTertiary + : theme.colorScheme.onTertiaryContainer, + ), + ), + ), + membershipBatch == null + ? const SizedBox.shrink() + : Container( + padding: const EdgeInsets.symmetric( + vertical: 4, + horizontal: 8, ), - membershipBatch[user.membership]!.isEmpty - ? Container() - : Container( - padding: const EdgeInsets.all(4), - margin: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: BorderRadius.circular(8), + margin: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: theme.colorScheme.secondaryContainer, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Text( + membershipBatch, + style: theme.textTheme.labelSmall?.copyWith( + color: theme.colorScheme.onSecondaryContainer, + ), ), - child: - Center(child: Text(membershipBatch[user.membership]!)), ), - ], + ), + ], + ), + subtitle: Text(user.id, maxLines: 1, overflow: TextOverflow.ellipsis), + leading: Opacity( + opacity: user.membership == Membership.join ? 1 : 0.5, + child: Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + presenceUserId: user.stateKey, ), - subtitle: Text(user.id), - leading: - Avatar(mxContent: user.avatarUrl, name: user.calcDisplayname()), ), ); } diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index 5892cf9bc4..fcdc6541a7 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -1,15 +1,22 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; import '../key_verification/key_verification_dialog.dart'; class ChatEncryptionSettings extends StatefulWidget { - const ChatEncryptionSettings({Key? key}) : super(key: key); + const ChatEncryptionSettings({super.key}); @override ChatEncryptionSettingsController createState() => @@ -17,7 +24,9 @@ class ChatEncryptionSettings extends StatefulWidget { } class ChatEncryptionSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + + Room get room => Matrix.of(context).client.getRoomById(roomId!)!; Future unblock(DeviceKeys key) async { if (key.blocked) { @@ -25,43 +34,86 @@ class ChatEncryptionSettingsController extends State { } } - Future onSelected( - BuildContext context, String action, DeviceKeys key) async { - final room = Matrix.of(context).client.getRoomById(roomId!); - switch (action) { - case 'verify': - await unblock(key); - final req = key.startVerification(); - req.onUpdate = () { - if (req.state == KeyVerificationState.done) { - setState(() {}); - } - }; - await KeyVerificationDialog(request: req).show(context); - break; - case 'verify_user': - await unblock(key); - final req = - await room!.client.userDeviceKeys[key.userId]!.startVerification(); - req.onUpdate = () { - if (req.state == KeyVerificationState.done) { - setState(() {}); - } - }; - await KeyVerificationDialog(request: req).show(context); - break; - case 'block': - if (key.directVerified) { - await key.setVerified(false); - } - await key.setBlocked(true); - setState(() {}); - break; - case 'unblock': - await unblock(key); - setState(() {}); - break; + String? uncollapsedUserId; + + void uncollapse(String? userId) { + setState(() { + if (uncollapsedUserId == userId) { + uncollapsedUserId = null; + } else { + uncollapsedUserId = userId; + } + }); + } + + Future enableEncryption(_) async { + final l10n = L10n.of(context); + if (room.encrypted) { + showOkAlertDialog( + context: context, + title: l10n.sorryThatsNotPossible, + message: l10n.disableEncryptionWarning, + ); + return; + } + if (room.joinRules == JoinRules.public) { + showOkAlertDialog( + context: context, + title: l10n.sorryThatsNotPossible, + message: l10n.noEncryptionForPublicRooms, + ); + return; } + if (!room.canChangeStateEvent(EventTypes.Encryption)) { + showOkAlertDialog( + context: context, + title: l10n.sorryThatsNotPossible, + message: l10n.noPermission, + ); + return; + } + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.areYouSure, + message: l10n.enableEncryptionWarning, + okLabel: l10n.yes, + cancelLabel: l10n.cancel, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => room.enableEncryption(), + ); + } + + Future startVerification() async { + final l10n = L10n.of(context); + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.verifyOtherUser, + message: l10n.verifyOtherUserDescription, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + final req = await room.client.userDeviceKeys[room.directChatMatrixID]! + .startVerification(); + req.onUpdate = () { + if (req.state == KeyVerificationState.done) { + setState(() {}); + } + }; + if (!mounted) return; + await KeyVerificationDialog(request: req).show(context); + } + + void toggleBlocked(DeviceKeys key) { + setState(() { + if (!key.blocked && key.verified) key.setVerified(false); + key.setBlocked(!key.blocked); + }); } @override diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart index 581bff85ae..f454d6811c 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart @@ -1,202 +1,246 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; -import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/utils/beautify_string_extension.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/device_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class ChatEncryptionSettingsView extends StatelessWidget { final ChatEncryptionSettingsController controller; - const ChatEncryptionSettingsView(this.controller, {Key? key}) - : super(key: key); + const ChatEncryptionSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { - final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; + final theme = Theme.of(context); - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => - VRouter.of(context).toSegments(['rooms', controller.roomId!]), - ), - title: Text(L10n.of(context)!.tapOnDeviceToVerify), - elevation: 0, + final room = controller.room; + return StreamBuilder( + stream: room.client.onSync.stream.where( + (s) => s.rooms?.join?[room.id] != null || s.deviceLists != null, ), - body: MaxWidthBody( - withScrolling: true, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - title: Text(L10n.of(context)!.deviceVerifyDescription), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), - ), + builder: (context, _) => Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.close_outlined), + onPressed: () => context.go('/rooms/${controller.roomId!}'), + ), + title: Text(L10n.of(context).encryption), + actions: [ + TextButton( + onPressed: () => launchUrlString(AppConfig.encryptionTutorial), + child: Text(L10n.of(context).help), ), - const Divider(height: 1), - StreamBuilder( - stream: room.onUpdate.stream, - builder: (context, snapshot) { - return FutureBuilder>( - future: room.getUserDeviceKeys(), - builder: (BuildContext context, snapshot) { - if (snapshot.hasError) { + ], + ), + body: MaxWidthBody( + child: Column( + mainAxisSize: .min, + children: [ + SwitchListTile( + contentPadding: EdgeInsets.symmetric(horizontal: 16), + title: Text(L10n.of(context).encryptThisChat), + value: room.encrypted, + onChanged: controller.enableEncryption, + ), + Divider(color: theme.dividerColor, height: 1), + if (room.isDirectChat && room.encrypted) ...[ + const SizedBox(height: 16), + ListTile( + title: Text(L10n.of(context).interactiveVerification), + subtitle: Text( + L10n.of(context).interactiveVerificationDescription, + style: TextStyle(fontSize: 11), + ), + ), + Padding( + padding: const EdgeInsets.only( + bottom: 16.0, + left: 16, + right: 16, + ), + child: SizedBox( + width: double.infinity, + child: OutlinedButton.icon( + style: OutlinedButton.styleFrom( + backgroundColor: theme.colorScheme.primaryContainer, + foregroundColor: theme.colorScheme.onPrimaryContainer, + side: BorderSide( + color: theme.colorScheme.onPrimaryContainer, + width: 1, + ), + ), + onPressed: controller.startVerification, + icon: const Icon(Icons.verified_outlined), + label: Text(L10n.of(context).verifyStart), + ), + ), + ), + Divider(color: theme.dividerColor, height: 1), + ], + if (room.encrypted) ...[ + // TODO: Display device keys + SelectionArea( + child: FutureBuilder( + future: room.requestParticipants(), + builder: (context, snapshot) { + final users = snapshot.data; + if (users == null) { return Center( - child: Text(L10n.of(context)!.oopsSomethingWentWrong + - ': ' + - snapshot.error.toString()), + child: CircularProgressIndicator.adaptive(), ); } - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); - } - final deviceKeys = snapshot.data!; - return ListView.builder( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: deviceKeys.length, - itemBuilder: (BuildContext context, int i) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (i == 0 || - deviceKeys[i].userId != - deviceKeys[i - 1].userId) ...{ - const Divider(height: 1, thickness: 1), - PopupMenuButton( - onSelected: (dynamic action) => controller - .onSelected(context, action, deviceKeys[i]), - itemBuilder: (c) { - final items = >[]; - if (room - .client - .userDeviceKeys[deviceKeys[i].userId]! - .verified == - UserVerifiedStatus.unknown) { - items.add(PopupMenuItem( - value: 'verify_user', - child: Text(L10n.of(context)!.verifyUser), - )); - } - return items; - }, - child: ListTile( - leading: Avatar( - mxContent: room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .avatarUrl, - name: room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .calcDisplayname(), - ), - title: Text( - room - .unsafeGetUserFromMemoryOrFallback( - deviceKeys[i].userId) - .calcDisplayname(), - ), - subtitle: Text( - deviceKeys[i].userId, - style: const TextStyle( - fontWeight: FontWeight.w300), - ), - ), - ), - }, - PopupMenuButton( - onSelected: (dynamic action) => controller - .onSelected(context, action, deviceKeys[i]), - itemBuilder: (c) { - final items = >[]; - if (deviceKeys[i].blocked || - !deviceKeys[i].verified) { - items.add(PopupMenuItem( - value: deviceKeys[i].userId == - room.client.userID - ? 'verify' - : 'verify_user', - child: Text(L10n.of(context)!.verifyStart), - )); - } - if (deviceKeys[i].blocked) { - items.add(PopupMenuItem( - value: 'unblock', - child: - Text(L10n.of(context)!.unblockDevice), - )); - } - if (!deviceKeys[i].blocked) { - items.add(PopupMenuItem( - value: 'block', - child: Text(L10n.of(context)!.blockDevice), - )); - } - return items; - }, - child: ListTile( + return Column( + children: users.map((user) { + final userDeviceKeys = + room.client.userDeviceKeys[user.id]; + final masterKey = userDeviceKeys?.masterKey; + final tofuSince = masterKey?.trustOnFirstUseSince; + return Column( + mainAxisSize: .min, + children: [ + ListTile( leading: CircleAvatar( - foregroundColor: Colors.white, - backgroundColor: deviceKeys[i].color, - child: Icon(deviceKeys[i].icon), + child: Text( + (userDeviceKeys?.deviceKeys.length ?? 0) + .toString(), + ), ), - title: Text( - deviceKeys[i].displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, + title: Row( + children: [ + Expanded( + child: Text( + user.calcDisplayname(), + maxLines: 1, + overflow: .ellipsis, + ), + ), + ], ), - subtitle: Row( + subtitle: Column( + crossAxisAlignment: .start, + mainAxisSize: .min, children: [ Text( - deviceKeys[i].deviceId!, - style: const TextStyle( - fontWeight: FontWeight.w300), + user.id, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle( + fontStyle: FontStyle.italic, + ), ), - const Spacer(), Text( - deviceKeys[i].blocked - ? L10n.of(context)!.blocked - : deviceKeys[i].verified - ? L10n.of(context)!.verified - : L10n.of(context)!.unverified, + masterKey == null + ? L10n.of(context).noUserKeyFound + : masterKey.verified == true + ? L10n.of(context).verified + : tofuSince != null + ? L10n.of(context).knownSince( + tofuSince.localizedTime(context), + ) + : L10n.of(context).unverified, style: TextStyle( - fontSize: 14, - color: deviceKeys[i].color, + color: masterKey == null + ? theme.colorScheme.onErrorContainer + : masterKey.verified + ? Colors.green + : tofuSince != null + ? theme.colorScheme.primary + : null, ), ), ], ), + trailing: IconButton( + onPressed: () => + controller.uncollapse(user.id), + icon: Icon( + controller.uncollapsedUserId == user.id + ? Icons.keyboard_arrow_up_outlined + : Icons.keyboard_arrow_down_outlined, + ), + ), ), - ), - ], - ), + if (controller.uncollapsedUserId == user.id && + userDeviceKeys != null) ...[ + ...userDeviceKeys.deviceKeys.values.map(( + device, + ) { + final signedDevice = device + .hasValidSignatureChain( + verifiedOnly: false, + verifiedByTheirMasterKey: true, + ); + return ListTile( + title: Text( + device.verified + ? L10n.of(context).verified + : device.blocked + ? L10n.of(context).blocked + : !signedDevice + ? L10n.of(context).unsignedDevice + : L10n.of(context).signedDevice, + style: TextStyle( + color: device.verified + ? Colors.green + : device.blocked + ? theme.colorScheme.error + : !signedDevice + ? theme.colorScheme.onErrorContainer + : theme.colorScheme.primary, + ), + ), + subtitle: Text( + device.curve25519Key?.beautified ?? + L10n.of(context).noCurve25519KeyFound, + ), + trailing: IconButton( + icon: Icon(Icons.block_outlined), + style: IconButton.styleFrom( + foregroundColor: device.blocked + ? theme.colorScheme.error + : null, + ), + tooltip: device.blocked + ? L10n.of(context).unblockDevice + : L10n.of(context).blockDevice, + + onPressed: () => + controller.toggleBlocked(device), + ), + ); + }), + ], + Divider(color: theme.dividerColor, height: 1), + ], + ); + }).toList(), ); }, - ); - }), - ], + ), + ), + ] else + Padding( + padding: const EdgeInsets.all(16.0), + child: Center( + child: Text( + L10n.of(context).encryptionNotEnabled, + style: const TextStyle(fontStyle: FontStyle.italic), + ), + ), + ), + ], + ), ), ), ); } } - -extension on DeviceKeys { - Color get color => blocked - ? Colors.red - : verified - ? Colors.green - : Colors.orange; -} diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index f2d265f697..4ce939649f 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,56 +1,157 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:receive_sharing_intent/receive_sharing_intent.dart'; -import 'package:snapping_sheet/snapping_sheet.dart'; -import 'package:uni_links/uni_links.dart'; -import 'package:vrouter/vrouter.dart'; +import 'dart:async'; +import 'package:collection/collection.dart'; +import 'package:cross_file/cross_file.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; -import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; -import 'package:fluffychat/utils/famedlysdk_store.dart'; +import 'package:fluffychat/utils/error_reporter.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/utils/show_update_snackbar.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; +import 'package:receive_sharing_intent/receive_sharing_intent.dart'; + import '../../../utils/account_bundles.dart'; -import '../../main.dart'; -import '../../utils/matrix_sdk_extensions.dart/matrix_file_extension.dart'; +import '../../config/setting_keys.dart'; import '../../utils/url_launcher.dart'; import '../../widgets/matrix.dart'; -import '../bootstrap/bootstrap_dialog.dart'; - -enum SelectMode { normal, share, select } -enum PopupMenuAction { - settings, - invite, - newGroup, - newSpace, - setStatus, - archive, +enum ActiveFilter { allChats, unread, groups, messages, tag } + +extension LocalizedActiveFilter on ActiveFilter { + String toLocalizedString(BuildContext context) { + switch (this) { + case ActiveFilter.allChats: + return L10n.of(context).all; + case ActiveFilter.messages: + return L10n.of(context).messages; + case ActiveFilter.unread: + return L10n.of(context).unread; + case ActiveFilter.groups: + return L10n.of(context).groups; + case ActiveFilter.tag: + throw 'Tags should not directly be displayed!'; + } + } } class ChatList extends StatefulWidget { - const ChatList({Key? key}) : super(key: key); + final String? activeChat; + final String? activeSpace; + final bool displayNavigationRail; + + const ChatList({ + super.key, + required this.activeChat, + this.activeSpace, + this.displayNavigationRail = false, + }); @override ChatListController createState() => ChatListController(); } -class ChatListController extends State with TickerProviderStateMixin { +class ChatListController extends State + with TickerProviderStateMixin, RouteAware { StreamSubscription? _intentDataStreamSubscription; StreamSubscription? _intentFileStreamSubscription; - StreamSubscription? _intentUriStreamSubscription; + late ActiveFilter activeFilter; + String? activeTag; + + String? _activeSpaceId; + String? get activeSpaceId => _activeSpaceId; - SpacesEntry? _activeSpacesEntry; + Future setActiveSpace(String spaceId) async { + await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); + + setState(() { + _activeSpaceId = spaceId; + }); + } + + void clearActiveSpace() => setState(() { + _activeSpaceId = null; + }); + + Future onChatTap(Room room) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); + if (room.membership == Membership.invite) { + final joinResult = await showFutureLoadingDialog( + context: context, + future: () async { + final waitForRoom = room.client.waitForRoomInSync( + room.id, + join: true, + ); + await room.join(); + await waitForRoom; + }, + exceptionContext: ExceptionContext.joinRoom, + ); + if (joinResult.error != null) return; + } + if (!mounted) return; + + if (room.membership == Membership.ban) { + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.youHaveBeenBannedFromThisChat)), + ); + return; + } + + if (room.membership == Membership.leave) { + context.go('/rooms/archive/${room.id}'); + return; + } + + if (room.isSpace) { + setActiveSpace(room.id); + return; + } + + context.go('/rooms/${room.id}'); + } + + bool Function(Room) getRoomFilterByActiveFilter(ActiveFilter activeFilter) { + switch (activeFilter) { + case ActiveFilter.allChats: + return (room) => true; + case ActiveFilter.messages: + return (room) => !room.isSpace && room.isDirectChat; + case ActiveFilter.groups: + return (room) => !room.isSpace && !room.isDirectChat; + case ActiveFilter.unread: + return (room) => room.isUnreadOrInvited; + case ActiveFilter.tag: + return (room) => room.tags.keys.contains(activeTag); + } + } + + List get filteredRooms => Matrix.of( + context, + ).client.rooms.where(getRoomFilterByActiveFilter(activeFilter)).toList(); bool isSearchMode = false; Future? publicRoomsResponse; @@ -62,33 +163,39 @@ class ChatListController extends State with TickerProviderStateMixin { bool isSearching = false; static const String _serverStoreNamespace = 'im.fluffychat.search.server'; - void setServer() async { + Future setServer() async { + final matrix = Matrix.of(context); + final l10n = L10n.of(context); final newServer = await showTextInputDialog( - useRootNavigator: false, - title: L10n.of(context)!.changeTheHomeserver, - context: context, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - prefixText: 'https://', - hintText: Matrix.of(context).client.homeserver?.host, - initialText: searchServer, - keyboardType: TextInputType.url, - autocorrect: false) - ]); + useRootNavigator: false, + title: l10n.changeTheHomeserver, + context: context, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + prefixText: 'https://', + hintText: matrix.client.homeserver?.host, + initialText: searchServer, + keyboardType: TextInputType.url, + autocorrect: false, + validator: (server) => + server.contains('.') == true ? null : l10n.invalidServerName, + ); if (newServer == null) return; - Store().setItem(_serverStoreNamespace, newServer.single); + if (!mounted) return; + matrix.store.setString(_serverStoreNamespace, newServer); setState(() { - searchServer = newServer.single; + searchServer = newServer; }); - onSearchEnter(searchController.text); + _coolDown?.cancel(); + _coolDown = Timer(const Duration(milliseconds: 500), _search); } final TextEditingController searchController = TextEditingController(); + final FocusNode searchFocusNode = FocusNode(); - void _search() async { + Future _search() async { final client = Matrix.of(context).client; + final scaffoldMessenger = ScaffoldMessenger.of(context); if (!isSearching) { setState(() { isSearching = true; @@ -96,26 +203,47 @@ class ChatListController extends State with TickerProviderStateMixin { } SearchUserDirectoryResponse? userSearchResult; QueryPublicRoomsResponse? roomSearchResult; + final searchQuery = searchController.text.trim(); try { roomSearchResult = await client.queryPublicRooms( server: searchServer, - filter: PublicRoomQueryFilter(genericSearchTerm: searchController.text), + filter: PublicRoomQueryFilter(genericSearchTerm: searchQuery), limit: 20, ); + + if (searchQuery.isValidMatrixIdStrict() && + searchQuery.sigil == '#' && + roomSearchResult.chunk.any( + (room) => room.canonicalAlias == searchQuery, + ) == + false) { + final response = await client.getRoomIdByAlias(searchQuery); + final roomId = response.roomId; + if (roomId != null) { + roomSearchResult.chunk.add( + PublishedRoomsChunk( + name: searchQuery, + guestCanJoin: false, + numJoinedMembers: 0, + roomId: roomId, + worldReadable: false, + canonicalAlias: searchQuery, + ), + ); + } + } userSearchResult = await client.searchUserDirectory( searchController.text, limit: 20, ); } catch (e, s) { Logs().w('Searching has crashed', e, s); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - e.toLocalizedString(context), - ), - ), + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), ); } + if (!isSearchMode) return; setState(() { isSearching = false; this.roomSearchResult = roomSearchResult; @@ -123,9 +251,9 @@ class ChatListController extends State with TickerProviderStateMixin { }); } - void onSearchEnter(String text) { + void onSearchEnter(String text, {bool globalSearch = true}) { if (text.isEmpty) { - cancelSearch(); + cancelSearch(unfocus: false); return; } @@ -133,492 +261,729 @@ class ChatListController extends State with TickerProviderStateMixin { isSearchMode = true; }); _coolDown?.cancel(); - _coolDown = Timer(const Duration(milliseconds: 500), _search); + if (globalSearch) { + _coolDown = Timer(const Duration(milliseconds: 500), _search); + } } - void cancelSearch() => setState(() { - searchController.clear(); - isSearchMode = false; - roomSearchResult = userSearchResult = null; - isSearching = false; - }); + void openNavrail() { + setState(() { + AppSettings.displayNavigationRail.setItem( + !AppSettings.displayNavigationRail.value, + ); + }); + } - SpacesEntry get activeSpacesEntry { - final id = _activeSpacesEntry; - return (id == null || !id.stillValid(context)) ? defaultSpacesEntry : id; + void startSearch() { + setState(() { + isSearchMode = true; + }); + searchFocusNode.requestFocus(); + _coolDown?.cancel(); + _coolDown = Timer(const Duration(milliseconds: 500), _search); } - BoxConstraints? snappingSheetContainerSize; + void cancelSearch({bool unfocus = true}) { + setState(() { + searchController.clear(); + isSearchMode = false; + roomSearchResult = userSearchResult = null; + isSearching = false; + }); + if (unfocus) searchFocusNode.unfocus(); + } - String? get activeSpaceId => activeSpacesEntry.getSpace(context)?.id; + BoxConstraints? snappingSheetContainerSize; final ScrollController scrollController = ScrollController(); - bool scrolledToTop = true; + final ValueNotifier scrolledToTop = ValueNotifier(true); final StreamController _clientStream = StreamController.broadcast(); - SnappingSheetController snappingSheetController = SnappingSheetController(); - - ScrollController snappingSheetScrollContentController = ScrollController(); - Stream get clientStream => _clientStream.stream; - void addAccountAction() => VRouter.of(context).to('/settings/account'); + void addAccountAction() => context.go('/rooms/settings/account'); void _onScroll() { final newScrolledToTop = scrollController.position.pixels <= 0; - if (newScrolledToTop != scrolledToTop) { - setState(() { - scrolledToTop = newScrolledToTop; - }); + if (newScrolledToTop != scrolledToTop.value) { + scrolledToTop.value = newScrolledToTop; } } - void setActiveSpacesEntry(BuildContext context, SpacesEntry? spaceId) { - Scaffold.of(context).closeDrawer(); - setState(() => _activeSpacesEntry = spaceId); - } - - void editSpace(BuildContext context, String spaceId) async { + Future editSpace(BuildContext context, String spaceId) async { await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); - VRouter.of(context).toSegments(['spaces', spaceId]); + if (!context.mounted) return; + context.push('/rooms/$spaceId/details'); } // Needs to match GroupsSpacesEntry for 'separate group' checking. List get spaces => Matrix.of(context).client.rooms.where((r) => r.isSpace).toList(); - // Note that this could change due to configuration, etc. - // Also be aware that _activeSpacesEntry = null is the expected reset method. - SpacesEntry get defaultSpacesEntry => AppConfig.separateChatTypes - ? DirectChatsSpacesEntry() - : AllRoomsSpacesEntry(); - - List get spacesEntries { - if (AppConfig.separateChatTypes) { - return [ - defaultSpacesEntry, - GroupsSpacesEntry(), - ...spaces.map((space) => SpaceSpacesEntry(space)).toList() - ]; - } - return [ - defaultSpacesEntry, - ...spaces.map((space) => SpaceSpacesEntry(space)).toList() - ]; - } - - final selectedRoomIds = {}; - bool? crossSigningCached; - bool showChatBackupBanner = false; - - void firstRunBootstrapAction() async { - setState(() { - showChatBackupBanner = false; - }); - - await BootstrapDialog( - client: Matrix.of(context).client, - ).show(context); - VRouter.of(context).to('/rooms'); - } - - String? get activeChat => VRouter.of(context).pathParameters['roomid']; - - SelectMode get selectMode => Matrix.of(context).shareContent != null - ? SelectMode.share - : selectedRoomIds.isEmpty - ? SelectMode.normal - : SelectMode.select; + String? get activeChat => widget.activeChat; - void _processIncomingSharedFiles(List files) { + void _processIncomingSharedMedia(List files) { + files.removeWhere( + (file) => file.path.startsWith(AppConfig.deepLinkPrefix) == true, + ); if (files.isEmpty) return; - final file = File(files.first.path.replaceFirst('file://', '')); - - Matrix.of(context).shareContent = { - 'msgtype': 'chat.fluffy.shared_file', - 'file': MatrixFile( - bytes: file.readAsBytesSync(), - name: file.path, - ).detectFileType, - }; - VRouter.of(context).to('/rooms'); - } - - void _processIncomingSharedText(String? text) { - if (text == null) return; - if (text.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || - text.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || - (text.toLowerCase().startsWith(AppConfig.schemePrefix) && - !RegExp(r'\s').hasMatch(text))) { - return _processIncomingUris(text); - } - Matrix.of(context).shareContent = { - 'msgtype': 'm.text', - 'body': text, - }; - VRouter.of(context).to('/rooms'); - } - void _processIncomingUris(String? text) async { - if (text == null) return; - VRouter.of(context).to('/rooms'); - WidgetsBinding.instance.addPostFrameCallback((_) { - UrlLauncher(context, text).openMatrixToUrl(); - }); + showScaffoldDialog( + context: context, + builder: (context) => ShareScaffoldDialog( + items: files.map((file) { + if ({SharedMediaType.text, SharedMediaType.url}.contains(file.type)) { + return TextShareItem(file.path); + } + return FileShareItem( + XFile( + file.path.replaceFirst('file://', ''), + mimeType: file.mimeType, + ), + ); + }).toList(), + ), + ); } void _initReceiveSharingIntent() { if (!PlatformInfos.isMobile) return; // For sharing images coming from outside the app while the app is in the memory - _intentFileStreamSubscription = ReceiveSharingIntent.getMediaStream() - .listen(_processIncomingSharedFiles, onError: print); + _intentFileStreamSubscription = ReceiveSharingIntent.instance + .getMediaStream() + .listen(_processIncomingSharedMedia, onError: print); // For sharing images coming from outside the app while the app is closed - ReceiveSharingIntent.getInitialMedia().then(_processIncomingSharedFiles); - - // For sharing or opening urls/text coming from outside the app while the app is in the memory - _intentDataStreamSubscription = ReceiveSharingIntent.getTextStream() - .listen(_processIncomingSharedText, onError: print); - - // For sharing or opening urls/text coming from outside the app while the app is closed - ReceiveSharingIntent.getInitialText().then(_processIncomingSharedText); + ReceiveSharingIntent.instance.getInitialMedia().then( + _processIncomingSharedMedia, + ); - // For receiving shared Uris - _intentUriStreamSubscription = linkStream.listen(_processIncomingUris); - if (FluffyChatApp.gotInitialLink == false) { - FluffyChatApp.gotInitialLink = true; - getInitialLink().then(_processIncomingUris); + if (PlatformInfos.isAndroid) { + final shortcuts = FlutterShortcuts(); + shortcuts.initialize().then( + (_) => shortcuts.listenAction((action) { + if (!mounted) return; + UrlLauncher(context, action).launchUrl(); + }), + ); } } + StreamSubscription? _onRoomTagUpdate; + @override void initState() { _initReceiveSharingIntent(); + _activeSpaceId = widget.activeSpace; scrollController.addListener(_onScroll); _waitForFirstSync(); - _hackyWebRTCFixForWeb(); + Matrix.of(context).voipPlugin?.context = context; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + searchServer = Matrix.of( + context, + ).store.getString(_serverStoreNamespace); + Matrix.of(context).backgroundPush?.setupPush(); + UpdateNotifier.showUpdateDialog(context); + } - WidgetsBinding.instance.addPostFrameCallback((_) async { - searchServer = await Store().getItem(_serverStoreNamespace); + // Workaround for system UI overlay style not applied on app start + SystemChrome.setSystemUIOverlayStyle( + Theme.of(context).appBarTheme.systemOverlayStyle!, + ); }); - super.initState(); - } - void checkBootstrap() async { - if (!Matrix.of(context).client.encryptionEnabled) return; - await Matrix.of(context).client.accountDataLoading; - await Matrix.of(context).client.userDeviceKeysLoading; - final crossSigning = - await Matrix.of(context).client.encryption?.crossSigning.isCached() ?? - false; - final needsBootstrap = - Matrix.of(context).client.encryption?.crossSigning.enabled == false || - crossSigning == false; - final isUnknownSession = Matrix.of(context).client.isUnknownSession; - if (needsBootstrap || isUnknownSession) { - setState(() { - showChatBackupBanner = true; - }); + _updateRoomTags(); + _onRoomTagUpdate = Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.rooms?.join?.values.any( + (roomUpdate) => + roomUpdate.accountData?.any( + (accountData) => accountData.type == 'm.tag', + ) ?? + false, + ) ?? + false, + ) + .listen(_updateRoomTags); + + if (roomTags.containsKey(AppSettings.chatFilter.value)) { + activeFilter = ActiveFilter.tag; + activeTag = AppSettings.chatFilter.value; + } else { + activeFilter = + ActiveFilter.values.singleWhereOrNull( + (filter) => AppSettings.chatFilter.value == filter.name, + ) ?? + ActiveFilter.allChats; } + + _processPushHelperCrashReport(); + + super.initState(); } @override void dispose() { _intentDataStreamSubscription?.cancel(); _intentFileStreamSubscription?.cancel(); - _intentUriStreamSubscription?.cancel(); + _onRoomTagUpdate?.cancel(); scrollController.removeListener(_onScroll); super.dispose(); } - void toggleSelection(String roomId) { - setState(() => selectedRoomIds.contains(roomId) - ? selectedRoomIds.remove(roomId) - : selectedRoomIds.add(roomId)); - } - - Future toggleUnread() async { - await showFutureLoadingDialog( - context: context, - future: () async { - final markUnread = anySelectedRoomNotMarkedUnread; - final client = Matrix.of(context).client; - for (final roomId in selectedRoomIds) { - final room = client.getRoomById(roomId)!; - if (room.markedUnread == markUnread) continue; - await client.getRoomById(roomId)!.markUnread(markUnread); - } - }, - ); - cancelAction(); - } - - Future toggleFavouriteRoom() async { - await showFutureLoadingDialog( - context: context, - future: () async { - final makeFavorite = anySelectedRoomNotFavorite; - final client = Matrix.of(context).client; - for (final roomId in selectedRoomIds) { - final room = client.getRoomById(roomId)!; - if (room.isFavourite == makeFavorite) continue; - await client.getRoomById(roomId)!.setFavourite(makeFavorite); - } - }, - ); - cancelAction(); + void _processPushHelperCrashReport() { + final store = Matrix.of(context).store; + final report = store.getStringList(AppConfig.pushHelperCrashReportKey); + if (report == null) return; + store.remove(AppConfig.pushHelperCrashReportKey); + ErrorReporter( + context, + 'Push Helper has been crashed', + ).onErrorCallback(report.first, StackTrace.fromString(report.last)); } - Future toggleMuted() async { - await showFutureLoadingDialog( - context: context, - future: () async { - final newState = anySelectedRoomNotMuted - ? PushRuleState.mentionsOnly - : PushRuleState.notify; - final client = Matrix.of(context).client; - for (final roomId in selectedRoomIds) { - final room = client.getRoomById(roomId)!; - if (room.pushRuleState == newState) continue; - await client.getRoomById(roomId)!.setPushRuleState(newState); - } - }, - ); - cancelAction(); - } - - Future archiveAction() async { - final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.ok; - if (!confirmed) return; - await showFutureLoadingDialog( - context: context, - future: () => _archiveSelectedRooms(), + Future chatContextAction( + Room room, + BuildContext posContext, [ + Room? space, + ]) async { + final overlay = + Overlay.of(posContext).context.findRenderObject() as RenderBox; + + final button = posContext.findRenderObject() as RenderBox; + + final position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(const Offset(0, -65), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero) + const Offset(-50, 0), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, ); - setState(() {}); - } - void setStatus() async { - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.setStatus, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.statusExampleMessage, + final spacesWithPowerLevels = room.client.rooms + .where( + (space) => + space.isSpace && + space.canChangeStateEvent(EventTypes.SpaceChild) && + !space.spaceChildren.any((c) => c.roomId == room.id), + ) + .toList(); + + var action = await showMenu( + context: posContext, + position: position, + items: [ + if (space != null) + PopupMenuItem( + value: ChatContextAction.goToSpace, + child: Row( + mainAxisSize: .min, + children: [ + Avatar( + mxContent: space.avatar, + size: Avatar.defaultSize / 2, + name: space.getLocalizedDisplayname(), + ), + const SizedBox(width: 12), + Text( + L10n.of(context).goToSpace(space.getLocalizedDisplayname()), + ), + ], + ), ), - ]); - if (input == null) return; - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.setPresence( - Matrix.of(context).client.userID!, - PresenceType.online, - statusMsg: input.single, + if (room.membership == Membership.join) ...[ + PopupMenuItem( + value: ChatContextAction.mute, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.pushRuleState == PushRuleState.notify + ? Icons.notifications_off_outlined + : Icons.notifications_off, + ), + const SizedBox(width: 12), + Text( + room.pushRuleState == PushRuleState.notify + ? L10n.of(context).muteChat + : L10n.of(context).unmuteChat, + ), + ], + ), + ), + PopupMenuItem( + value: ChatContextAction.markUnread, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.markedUnread + ? Icons.mark_as_unread + : Icons.mark_as_unread_outlined, + ), + const SizedBox(width: 12), + Text( + room.markedUnread + ? L10n.of(context).markAsRead + : L10n.of(context).markAsUnread, + ), + ], + ), + ), + if (!room.isLowPriority) + PopupMenuItem( + value: ChatContextAction.favorite, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined, + ), + const SizedBox(width: 12), + Text( + room.isFavourite + ? L10n.of(context).unpin + : L10n.of(context).pin, + ), + ], + ), + ), + ], + PopupMenuItem( + value: ChatContextAction.leave, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.delete_outlined, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + room.membership == Membership.invite + ? L10n.of(context).delete + : L10n.of(context).leave, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], ), + ), + if (room.membership == Membership.invite) + PopupMenuItem( + value: ChatContextAction.block, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.block_outlined, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).block, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], + ), + ), + if (room.membership == Membership.join) + PopupMenuItem( + value: ChatContextAction.showMore, + child: Row( + mainAxisSize: .min, + children: [ + Icon(Icons.adaptive.more_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).more), + ], + ), + ), + ], ); - } - - Future _archiveSelectedRooms() async { - final client = Matrix.of(context).client; - while (selectedRoomIds.isNotEmpty) { - final roomId = selectedRoomIds.first; - try { - await client.getRoomById(roomId)!.leave(); - } finally { - toggleSelection(roomId); - } + if (!posContext.mounted || !mounted) return; + if (action == ChatContextAction.showMore) { + action = await showMenu( + context: posContext, + position: position, + items: [ + if (!room.isFavourite) + PopupMenuItem( + value: ChatContextAction.lowPriority, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.isLowPriority + ? Icons.low_priority + : Icons.low_priority_outlined, + ), + const SizedBox(width: 12), + Text( + room.isLowPriority + ? L10n.of(context).unsetLowPriority + : L10n.of(context).setLowPriority, + ), + ], + ), + ), + if (activeTag == null) + PopupMenuItem( + value: ChatContextAction.addTag, + child: Row( + mainAxisSize: .min, + children: [ + Icon(Icons.bookmark_add_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).addTag), + ], + ), + ) + else + PopupMenuItem( + value: ChatContextAction.removeTag, + child: Row( + mainAxisSize: .min, + children: [ + Icon(Icons.bookmark_remove_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).removeTag), + ], + ), + ), + if (spacesWithPowerLevels.isNotEmpty) + PopupMenuItem( + value: ChatContextAction.addToSpace, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.group_work_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).addToSpace), + ], + ), + ), + ], + ); } - } - Future addOrRemoveToSpace() async { - final id = activeSpaceId; - if (id != null) { - final consent = await showOkCancelAlertDialog( - context: context, - title: L10n.of(context)!.removeFromSpace, - message: L10n.of(context)!.removeFromSpaceDescription, - okLabel: L10n.of(context)!.remove, - cancelLabel: L10n.of(context)!.cancel, - isDestructiveAction: true, - fullyCapitalizedForMaterial: false, - ); - if (consent != OkCancelResult.ok) return; + if (action == null) return; + if (!mounted) return; - final space = Matrix.of(context).client.getRoomById(id); - final result = await showFutureLoadingDialog( - context: context, - future: () async { - for (final roomId in selectedRoomIds) { - await space!.removeSpaceChild(roomId); - } - }, - ); - if (result.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.chatHasBeenRemovedFromThisSpace), + switch (action) { + case ChatContextAction.goToSpace: + setActiveSpace(space!.id); + return; + case ChatContextAction.favorite: + await showFutureLoadingDialog( + context: context, + future: () => room.setFavourite(!room.isFavourite), + ); + return; + case ChatContextAction.markUnread: + await showFutureLoadingDialog( + context: context, + future: () => room.markUnread(!room.markedUnread), + ); + return; + case ChatContextAction.mute: + await showFutureLoadingDialog( + context: context, + future: () => room.setPushRuleState( + room.pushRuleState == PushRuleState.notify + ? PushRuleState.mentionsOnly + : PushRuleState.notify, ), ); - } - } else { - final selectedSpace = await showConfirmationDialog( + return; + case ChatContextAction.block: + final inviteEvent = room.getState( + EventTypes.RoomMember, + room.client.userID!, + ); + context.go( + '/rooms/settings/security/ignorelist', + extra: inviteEvent?.senderId, + ); + case ChatContextAction.leave: + final confirmed = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).archiveRoomDescription, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ); + if (confirmed == OkCancelResult.cancel) return; + if (!mounted) return; + + await showFutureLoadingDialog(context: context, future: room.leave); + + return; + case ChatContextAction.addToSpace: + final space = await showModalActionPopup( context: context, - title: L10n.of(context)!.addToSpace, - message: L10n.of(context)!.addToSpaceDescription, - fullyCapitalizedForMaterial: false, - actions: Matrix.of(context) - .client - .rooms - .where((r) => r.isSpace) + title: L10n.of(context).space, + actions: spacesWithPowerLevels .map( - (space) => AlertDialogAction( - key: space.id, - label: space.displayname, + (space) => AdaptiveModalAction( + value: space, + label: space.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), ), ) - .toList()); - if (selectedSpace == null) return; - final result = await showFutureLoadingDialog( - context: context, - future: () async { - final space = Matrix.of(context).client.getRoomById(selectedSpace)!; - if (space.canSendDefaultStates) { - for (final roomId in selectedRoomIds) { - await space.setSpaceChild(roomId); - } - } - }, - ); - if (result.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.chatHasBeenAddedToThisSpace), - ), + .toList(), ); - } + if (space == null) return; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => space.setSpaceChild(room.id), + ); + case ChatContextAction.lowPriority: + await showFutureLoadingDialog( + context: context, + future: () => room.setLowPriority(!room.isLowPriority), + ); + return; + case ChatContextAction.addTag: + final existingTags = List.of(roomTags.keys); + existingTags.removeWhere(room.tags.containsKey); + String? tag; + if (existingTags.isNotEmpty) { + tag = await showModalActionPopup( + context: context, + actions: [ + ...existingTags.map((tag) { + final displayTag = tag.replaceFirst('u.', ''); + return AdaptiveModalAction( + label: displayTag, + value: displayTag, + ); + }), + AdaptiveModalAction( + label: L10n.of(context).createNewTag, + value: null, + ), + ], + ); + if (!mounted) return; + } + tag ??= await showTextInputDialog( + context: context, + title: L10n.of(context).addTag, + hintText: L10n.of(context).tagName, + ); + final newTag = tag; + if (!mounted) return; + if (newTag == null) return; + await showFutureLoadingDialog( + context: context, + future: () => room.addTag('u.$newTag'), + ); + return; + case ChatContextAction.removeTag: + await showFutureLoadingDialog( + context: context, + future: () => room.removeTag(activeTag!), + ); + return; + case ChatContextAction.showMore: + throw ('Should not be handled!'); } - setState(() => selectedRoomIds.clear()); } - bool get anySelectedRoomNotMarkedUnread => selectedRoomIds.any( - (roomId) => !Matrix.of(context).client.getRoomById(roomId)!.markedUnread); + Map roomTags = {}; - bool get anySelectedRoomNotFavorite => selectedRoomIds.any( - (roomId) => !Matrix.of(context).client.getRoomById(roomId)!.isFavourite); + void _updateRoomTags([_]) { + roomTags.clear(); + for (final room in Matrix.of(context).client.rooms) { + for (final tag in room.tags.keys) { + if (tag.startsWith('u.')) roomTags[tag] = (roomTags[tag] ?? 0) + 1; + } + } + setState(() { + if (activeTag != null && !roomTags.keys.contains(activeTag)) { + activeTag = null; + activeFilter = ActiveFilter.allChats; + } + }); + } - bool get anySelectedRoomNotMuted => selectedRoomIds.any((roomId) => - Matrix.of(context).client.getRoomById(roomId)!.pushRuleState == - PushRuleState.notify); + Future setStatus() async { + final l10n = L10n.of(context); + final client = Matrix.of(context).client; + final currentPresence = await client.fetchCurrentPresence(client.userID!); + if (!mounted) return; + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: l10n.setStatus, + message: l10n.leaveEmptyToClearStatus, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.statusExampleMessage, + maxLines: 6, + minLines: 1, + maxLength: 255, + initialText: currentPresence.statusMsg, + ); + if (input == null) return; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => client.setPresence( + client.userID!, + PresenceType.online, + statusMsg: input, + ), + ); + } bool waitForFirstSync = false; Future _waitForFirstSync() async { + final router = GoRouter.of(context); final client = Matrix.of(context).client; await client.roomsLoading; await client.accountDataLoading; - if (client.onSync.value == null) { - await client.onSync.stream.first; - } - // Load space members to display DM rooms - final spaceId = activeSpaceId; - if (spaceId != null) { - final space = client.getRoomById(spaceId)!; - final localMembers = space.getParticipants().length; - final actualMembersCount = (space.summary.mInvitedMemberCount ?? 0) + - (space.summary.mJoinedMemberCount ?? 0); - if (localMembers < actualMembersCount) { - await space.requestParticipants(); - } + await client.userDeviceKeysLoading; + if (client.prevBatch == null) { + await client.onSyncStatus.stream.firstWhere( + (status) => status.status == SyncStatus.finished, + ); + + if (!mounted) return; + setState(() { + waitForFirstSync = true; + }); } + if (!mounted) return; setState(() { waitForFirstSync = true; }); - WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap()); - return; + + if (client.userDeviceKeys[client.userID!]?.deviceKeys.values.any( + (device) => !device.verified && !device.blocked, + ) ?? + false) { + late final ScaffoldFeatureController controller; + final theme = Theme.of(context); + controller = ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: const Duration(seconds: 15), + showCloseIcon: true, + backgroundColor: theme.colorScheme.errorContainer, + closeIconColor: theme.colorScheme.onErrorContainer, + content: Text( + L10n.of(context).oneOfYourDevicesIsNotVerified, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + action: SnackBarAction( + onPressed: () { + controller.close(); + router.go('/rooms/settings/devices'); + }, + textColor: theme.colorScheme.onErrorContainer, + label: L10n.of(context).settings, + ), + ), + ); + } } - void cancelAction() { - if (selectMode == SelectMode.share) { - setState(() => Matrix.of(context).shareContent = null); - } else { - setState(() => selectedRoomIds.clear()); + void setActiveFilter(ActiveFilter filter, String? tag) { + if (filter == ActiveFilter.tag && tag == null) { + throw ('Must set a tag when setting filter to tags!'); } + setState(() { + activeTag = tag; + activeFilter = filter; + }); + AppSettings.chatFilter.setItem( + filter == ActiveFilter.tag ? tag! : filter.name, + ); } void setActiveClient(Client client) { - VRouter.of(context).to('/rooms'); + context.go('/rooms'); setState(() { - _activeSpacesEntry = null; - snappingSheetController = SnappingSheetController(); - snappingSheetScrollContentController = ScrollController(); - selectedRoomIds.clear(); + activeFilter = ActiveFilter.allChats; + _activeSpaceId = null; Matrix.of(context).setActiveClient(client); }); _clientStream.add(client); } void setActiveBundle(String bundle) { - VRouter.of(context).to('/rooms'); + context.go('/rooms'); setState(() { - _activeSpacesEntry = null; - selectedRoomIds.clear(); + _activeSpaceId = null; Matrix.of(context).activeBundle = bundle; - if (!Matrix.of(context) - .currentBundle! - .any((client) => client == Matrix.of(context).client)) { - Matrix.of(context) - .setActiveClient(Matrix.of(context).currentBundle!.first); + if (!Matrix.of( + context, + ).currentBundle!.any((client) => client == Matrix.of(context).client)) { + Matrix.of( + context, + ).setActiveClient(Matrix.of(context).currentBundle!.first); } }); } - void editBundlesForAccount(String? userId, String? activeBundle) async { - final client = Matrix.of(context) - .widget - .clients[Matrix.of(context).getClientIndexByMatrixId(userId!)]; - final action = await showConfirmationDialog( + Future editBundlesForAccount( + String? userId, + String? activeBundle, + ) async { + final l10n = L10n.of(context); + final client = Matrix.of( + context, + ).widget.clients[Matrix.of(context).getClientIndexByMatrixId(userId!)]; + final action = await showModalActionPopup( context: context, - title: L10n.of(context)!.editBundlesForAccount, + title: L10n.of(context).editBundlesForAccount, + cancelLabel: L10n.of(context).cancel, actions: [ - AlertDialogAction( - key: EditBundleAction.addToBundle, - label: L10n.of(context)!.addToBundle, + AdaptiveModalAction( + value: EditBundleAction.addToBundle, + label: L10n.of(context).addToBundle, ), if (activeBundle != client.userID) - AlertDialogAction( - key: EditBundleAction.removeFromBundle, - label: L10n.of(context)!.removeFromBundle, + AdaptiveModalAction( + value: EditBundleAction.removeFromBundle, + label: L10n.of(context).removeFromBundle, ), ], ); if (action == null) return; switch (action) { case EditBundleAction.addToBundle: + if (!mounted) return; final bundle = await showTextInputDialog( - context: context, - title: L10n.of(context)!.bundleName, - textFields: [ - DialogTextField(hintText: L10n.of(context)!.bundleName) - ]); - if (bundle == null || bundle.isEmpty || bundle.single.isEmpty) return; + context: context, + title: l10n.bundleName, + hintText: l10n.bundleName, + ); + if (bundle == null || bundle.isEmpty || bundle.isEmpty) return; + if (!mounted) return; await showFutureLoadingDialog( context: context, - future: () => client.setAccountBundle(bundle.single), + future: () => client.setAccountBundle(bundle), ); break; case EditBundleAction.removeFromBundle: + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => client.removeFromAccountBundle(activeBundle!), @@ -632,10 +997,9 @@ class ChatListController extends State with TickerProviderStateMixin { String? get secureActiveBundle { if (Matrix.of(context).activeBundle == null || - !Matrix.of(context) - .accountBundles - .keys - .contains(Matrix.of(context).activeBundle)) { + !Matrix.of( + context, + ).accountBundles.keys.contains(Matrix.of(context).activeBundle)) { return Matrix.of(context).accountBundles.keys.first; } return Matrix.of(context).activeBundle; @@ -650,20 +1014,23 @@ class ChatListController extends State with TickerProviderStateMixin { } @override - Widget build(BuildContext context) { - Matrix.of(context).navigatorContext = context; - return ChatListView(this); - } - - void _hackyWebRTCFixForWeb() { - Matrix.of(context).voipPlugin?.context = context; - } + Widget build(BuildContext context) => ChatListView(this); - expandSpaces() { - snappingSheetController.snapToPosition( - const SnappingPosition.factor(positionFactor: 0.5), - ); - } + Future dehydrate() => Matrix.of(context).dehydrateAction(context); } enum EditBundleAction { addToBundle, removeFromBundle } + +enum ChatContextAction { + goToSpace, + favorite, + lowPriority, + addTag, + removeTag, + markUnread, + mute, + leave, + addToSpace, + block, + showMore, +} diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index ecab95ecff..8610b92531 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -1,432 +1,338 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:animations/animations.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; -import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; -import 'package:fluffychat/pages/chat_list/stories_header.dart'; +import 'package:fluffychat/pages/chat_list/dummy_chat_list_item.dart'; +import 'package:fluffychat/pages/chat_list/search_title.dart'; +import 'package:fluffychat/pages/chat_list/space_view.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/connection_status_header.dart'; -import 'package:fluffychat/widgets/profile_bottom_sheet.dart'; -import 'package:fluffychat/widgets/public_room_bottom_sheet.dart'; -import '../../utils/stream_extension.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../config/themes.dart'; +import '../../widgets/adaptive_dialogs/user_dialog.dart'; import '../../widgets/matrix.dart'; +import 'chat_list_header.dart'; -class ChatListViewBody extends StatefulWidget { +class ChatListViewBody extends StatelessWidget { final ChatListController controller; - const ChatListViewBody(this.controller, {Key? key}) : super(key: key); + const ChatListViewBody(this.controller, {super.key}); @override - State createState() => _ChatListViewBodyState(); -} - -class _ChatListViewBodyState extends State { - // the matrix sync stream - late StreamSubscription _subscription; + Widget build(BuildContext context) { + final theme = Theme.of(context); - // used to check the animation direction - String? _lastUserId; - SpacesEntry? _lastSpace; + final client = Matrix.of(context).client; + final activeSpace = controller.activeSpaceId; + if (activeSpace != null) { + return SpaceView( + key: ValueKey(activeSpace), + spaceId: activeSpace, + onBack: controller.clearActiveSpace, + onChatTab: controller.onChatTap, + activeChat: controller.activeChat, + ); + } + final spaces = client.rooms.where((r) => r.isSpace); + final spaceDelegateCandidates = {}; + for (final space in spaces) { + for (final spaceChild in space.spaceChildren) { + final roomId = spaceChild.roomId; + if (roomId == null) continue; + spaceDelegateCandidates[roomId] = space; + } + } - @override - void initState() { - _subscription = Matrix.of(context) - .client - .onSync - .stream - .where((s) => s.hasRoomUpdate) - .rateLimit(const Duration(seconds: 1)) - .listen((d) => setState(() {})); - super.initState(); - } + final publicRooms = controller.roomSearchResult?.chunk + .where((room) => room.roomType != 'm.space') + .toList(); + final publicSpaces = controller.roomSearchResult?.chunk + .where((room) => room.roomType == 'm.space') + .toList(); + final userSearchResult = controller.userSearchResult; + const dummyChatCount = 4; + final filter = controller.searchController.text.toLowerCase(); + return StreamBuilder( + key: ValueKey(client.userID.toString()), + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final rooms = controller.filteredRooms + .where( + (room) => + !AppSettings.hideRoomsInSpaces.value || + spaceDelegateCandidates[room.id] == null, + ) + .toList(); - @override - Widget build(BuildContext context) { - final reversed = !_animationReversed(); - final roomSearchResult = widget.controller.roomSearchResult; - final userSearchResult = widget.controller.userSearchResult; - Widget child; - if (widget.controller.waitForFirstSync && - Matrix.of(context).client.prevBatch != null) { - final rooms = widget.controller.activeSpacesEntry.getRooms(context); - if (rooms.isEmpty) { - child = Column( - key: const ValueKey(null), - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/private_chat_wallpaper.png', - width: 160, - height: 160, - ), - Center( - child: Text( - L10n.of(context)!.startYourFirstChat, - textAlign: TextAlign.start, - style: const TextStyle( - color: Colors.grey, - fontSize: 16, - ), - ), - ), - const SizedBox(height: 160), - ], - ); - } else { - final displayStoriesHeader = widget.controller.activeSpacesEntry - .shouldShowStoriesHeader(context); - child = ListView.builder( - key: ValueKey(Matrix.of(context).client.userID.toString() + - widget.controller.activeSpaceId.toString() + - widget.controller.activeSpacesEntry.runtimeType.toString()), - controller: widget.controller.scrollController, - // add +1 space below in order to properly scroll below the spaces bar - itemCount: rooms.length + (displayStoriesHeader ? 2 : 1), - itemBuilder: (BuildContext context, int i) { - if (displayStoriesHeader) { - if (i == 0) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - const ConnectionStatusHeader(), - if (roomSearchResult != null) ...[ - _SearchTitle( - title: L10n.of(context)!.publicRooms, - icon: Icons.explore_outlined, - ), - AnimatedContainer( - height: roomSearchResult.chunk.isEmpty ? 0 : 106, - duration: const Duration(milliseconds: 250), - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: roomSearchResult.chunk.length, - itemBuilder: (context, i) => _SearchItem( - title: roomSearchResult.chunk[i].name ?? - roomSearchResult - .chunk[i].canonicalAlias?.localpart ?? - L10n.of(context)!.group, - avatar: roomSearchResult.chunk[i].avatarUrl, - onPressed: () => showModalBottomSheet( - context: context, - builder: (c) => PublicRoomBottomSheet( - roomAlias: - roomSearchResult.chunk[i].canonicalAlias ?? - roomSearchResult.chunk[i].roomId, - outerContext: context, - chunk: roomSearchResult.chunk[i], + return CustomScrollView( + controller: controller.scrollController, + slivers: [ + ChatListHeader(controller: controller), + SliverList( + delegate: SliverChildListDelegate([ + if (controller.isSearchMode) ...[ + SearchTitle( + title: L10n.of(context).publicRooms, + icon: const Icon(Icons.explore_outlined), + ), + PublicRoomsHorizontalList(publicRooms: publicRooms), + SearchTitle( + title: L10n.of(context).publicSpaces, + icon: const Icon(Icons.workspaces_outlined), + ), + PublicRoomsHorizontalList(publicRooms: publicSpaces), + SearchTitle( + title: L10n.of(context).users, + icon: const Icon(Icons.group_outlined), + ), + AnimatedContainer( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: + userSearchResult == null || + userSearchResult.results.isEmpty + ? 0 + : 106, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: userSearchResult == null + ? null + : ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: userSearchResult.results.length, + itemBuilder: (context, i) => _SearchItem( + title: + userSearchResult.results[i].displayName ?? + userSearchResult + .results[i] + .userId + .localpart ?? + L10n.of(context).unknownDevice, + avatar: userSearchResult.results[i].avatarUrl, + onPressed: () => UserDialog.show( + context: context, + profile: userSearchResult.results[i], ), ), ), - ), - ), - ], - if (userSearchResult != null) ...[ - _SearchTitle( - title: L10n.of(context)!.users, - icon: Icons.group_outlined, - ), - AnimatedContainer( - height: userSearchResult.results.isEmpty ? 0 : 106, - duration: const Duration(milliseconds: 250), - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: userSearchResult.results.length, - itemBuilder: (context, i) => _SearchItem( - title: userSearchResult.results[i].displayName ?? - userSearchResult.results[i].userId.localpart ?? - L10n.of(context)!.unknownDevice, - avatar: userSearchResult.results[i].avatarUrl, - onPressed: () => showModalBottomSheet( - context: context, - builder: (c) => ProfileBottomSheet( - userId: userSearchResult.results[i].userId, - outerContext: context, + ), + ], + if (client.rooms.isNotEmpty && !controller.isSearchMode) + Container( + height: 36 + 8 + 8, + padding: EdgeInsets.symmetric(vertical: 8), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 12.0), + shrinkWrap: true, + scrollDirection: Axis.horizontal, + children: [ + ...ActiveFilter.values + .where((filter) => filter != ActiveFilter.tag) + .map( + (filter) => Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4.0, + ), + child: Center( + child: FilterChip( + selected: filter == controller.activeFilter, + onSelected: (_) => controller + .setActiveFilter(filter, null), + label: Text( + filter.toLocalizedString(context), + ), + ), + ), + ), + ), + ...controller.roomTags.entries.map( + (entry) => Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4.0, + ), + child: Center( + child: FilterChip( + selected: entry.key == controller.activeTag, + onSelected: (_) => controller.setActiveFilter( + ActiveFilter.tag, + entry.key, + ), + label: Text(entry.key.replaceFirst('u.', '')), ), ), ), ), - ), - ], - if (widget.controller.isSearchMode) - _SearchTitle( - title: L10n.of(context)!.stories, - icon: Icons.camera_alt_outlined, - ), - StoriesHeader( - filter: widget.controller.searchController.text, + ], ), - AnimatedContainer( - height: !widget.controller.isSearchMode && - widget.controller.showChatBackupBanner - ? 54 - : 0, - duration: const Duration(milliseconds: 300), - clipBehavior: Clip.hardEdge, - curve: Curves.bounceInOut, - decoration: const BoxDecoration(), - child: Material( - color: Theme.of(context).colorScheme.surface, - child: ListTile( - leading: CircleAvatar( - radius: Avatar.defaultSize / 2, - child: - const Icon(Icons.enhanced_encryption_outlined), - backgroundColor: Theme.of(context) - .colorScheme - .secondaryContainer, - foregroundColor: Theme.of(context) - .colorScheme - .onSecondaryContainer, + ), + if (controller.isSearchMode) + SearchTitle( + title: L10n.of(context).chats, + icon: const Icon(Icons.forum_outlined), + ), + if (client.prevBatch != null && + rooms.isEmpty && + !controller.isSearchMode) ...[ + Column( + mainAxisAlignment: .center, + children: [ + Stack( + alignment: Alignment.center, + children: [ + const Column( + mainAxisSize: .min, + children: [ + DummyChatListItem(opacity: 0.5, animate: false), + DummyChatListItem(opacity: 0.3, animate: false), + ], ), - title: Text( - (Matrix.of(context) - .client - .encryption - ?.keyManager - .enabled == - true) - ? L10n.of(context)!.unlockOldMessages - : L10n.of(context)!.enableAutoBackups, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurface, - ), + Icon( + CupertinoIcons.chat_bubble_text_fill, + size: 128, + color: theme.colorScheme.secondary, ), - trailing: const Icon(Icons.chevron_right_outlined), - onTap: widget.controller.firstRunBootstrapAction, - ), + ], ), - ), - if (widget.controller.isSearchMode) - _SearchTitle( - title: L10n.of(context)!.chats, - icon: Icons.chat_outlined, + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + client.rooms.isEmpty + ? L10n.of(context).noChatsFoundHere + : L10n.of(context).noMoreChatsFound, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: theme.colorScheme.secondary, + ), + ), ), - ], - ); - } - i--; - } - if (i >= rooms.length) { - return const ListTile(); - } - if (!rooms[i].displayname.toLowerCase().contains( - widget.controller.searchController.text.toLowerCase())) { - return Container(); - } - return ChatListItem( - rooms[i], - selected: widget.controller.selectedRoomIds.contains(rooms[i].id), - onTap: widget.controller.selectMode == SelectMode.select - ? () => widget.controller.toggleSelection(rooms[i].id) - : null, - onLongPress: () => widget.controller.toggleSelection(rooms[i].id), - activeChat: widget.controller.activeChat == rooms[i].id, - ); - }, - ); - } - } else { - const dummyChatCount = 5; - final titleColor = - Theme.of(context).textTheme.bodyText1!.color!.withAlpha(100); - final subtitleColor = - Theme.of(context).textTheme.bodyText1!.color!.withAlpha(50); - child = ListView.builder( - itemCount: dummyChatCount, - itemBuilder: (context, i) => Opacity( - opacity: (dummyChatCount - i) / dummyChatCount, - child: ListTile( - leading: CircleAvatar( - backgroundColor: titleColor, - child: CircularProgressIndicator( - strokeWidth: 1, - color: Theme.of(context).textTheme.bodyText1!.color, - ), - ), - title: Row( - children: [ - Expanded( - child: Container( - height: 14, - decoration: BoxDecoration( - color: titleColor, - borderRadius: BorderRadius.circular(3), - ), + ], ), - ), - const SizedBox(width: 36), - Container( - height: 14, - width: 14, - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(14), + ], + ]), + ), + if (client.prevBatch == null) + SliverList( + delegate: SliverChildBuilderDelegate( + (context, i) => DummyChatListItem( + opacity: (dummyChatCount - i) / dummyChatCount, + animate: true, ), + childCount: dummyChatCount, ), - const SizedBox(width: 12), - Container( - height: 14, - width: 14, - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(14), - ), + ), + if (client.prevBatch != null) + SliverSafeArea( + top: false, + sliver: SliverList.builder( + itemCount: rooms.length, + itemBuilder: (BuildContext context, int i) { + final room = rooms[i]; + final space = spaceDelegateCandidates[room.id]; + return ChatListItem( + room, + space: space, + key: Key('chat_list_item_${room.id}'), + filter: filter, + onTap: () => controller.onChatTap(room), + onLongPress: (context) => + controller.chatContextAction(room, context, space), + activeChat: controller.activeChat == room.id, + ); + }, ), - ], - ), - subtitle: Container( - decoration: BoxDecoration( - color: subtitleColor, - borderRadius: BorderRadius.circular(3), ), - height: 12, - margin: const EdgeInsets.only(right: 22), - ), - ), - ), - ); - } - return PageTransitionSwitcher( - reverse: reversed, - transitionBuilder: ( - Widget child, - Animation primaryAnimation, - Animation secondaryAnimation, - ) { - return SharedAxisTransition( - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - transitionType: SharedAxisTransitionType.vertical, - fillColor: Theme.of(context).scaffoldBackgroundColor, - child: child, + ], ); }, - child: child, ); } - - @override - void dispose() { - _subscription.cancel(); - super.dispose(); - } - - bool _animationReversed() { - bool reversed; - // in case the matrix id changes, check the indexOf the matrix id - final newClient = Matrix.of(context).client; - if (_lastUserId != newClient.userID) { - reversed = Matrix.of(context) - .currentBundle! - .indexWhere((element) => element!.userID == _lastUserId) < - Matrix.of(context) - .currentBundle! - .indexWhere((element) => element!.userID == newClient.userID); - } - // otherwise, the space changed... - else { - reversed = widget.controller.spacesEntries - .indexWhere((element) => element == _lastSpace) < - widget.controller.spacesEntries.indexWhere( - (element) => element == widget.controller.activeSpacesEntry); - } - _lastUserId = newClient.userID; - _lastSpace = widget.controller.activeSpacesEntry; - return reversed; - } } -class _SearchTitle extends StatelessWidget { - final String title; - final IconData icon; - const _SearchTitle({ - required this.title, - required this.icon, - Key? key, - }) : super(key: key); +class PublicRoomsHorizontalList extends StatelessWidget { + const PublicRoomsHorizontalList({super.key, required this.publicRooms}); + + final List? publicRooms; @override - Widget build(BuildContext context) => Container( - decoration: BoxDecoration( - border: Border.symmetric( - horizontal: BorderSide( - color: Theme.of(context).dividerColor, - width: 1, - )), - color: Theme.of(context).colorScheme.surface, - ), - child: Align( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8, - ), - child: Row( - children: [ - Icon(icon, size: 16), - const SizedBox(width: 16), - Text(title, - textAlign: TextAlign.left, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurface, - fontSize: 12, - fontWeight: FontWeight.bold, - )), - ], + Widget build(BuildContext context) { + final publicRooms = this.publicRooms; + return AnimatedContainer( + clipBehavior: Clip.hardEdge, + decoration: const BoxDecoration(), + height: publicRooms == null || publicRooms.isEmpty ? 0 : 106, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: publicRooms == null + ? null + : ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: publicRooms.length, + itemBuilder: (context, i) => _SearchItem( + title: + publicRooms[i].name ?? + publicRooms[i].canonicalAlias?.localpart ?? + L10n.of(context).group, + avatar: publicRooms[i].avatarUrl, + onPressed: () => showAdaptiveDialog( + context: context, + barrierDismissible: true, + builder: (c) => PublicRoomDialog( + roomAlias: + publicRooms[i].canonicalAlias ?? publicRooms[i].roomId, + chunk: publicRooms[i], + ), + ), + ), ), - ), - ), - ); + ); + } } class _SearchItem extends StatelessWidget { final String title; final Uri? avatar; final void Function() onPressed; + const _SearchItem({ required this.title, this.avatar, required this.onPressed, - Key? key, - }) : super(key: key); + }); @override Widget build(BuildContext context) => InkWell( - onTap: onPressed, - child: SizedBox( - width: 84, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(height: 8), - Avatar( - mxContent: avatar, - name: title, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - title, - maxLines: 2, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 12, - ), - ), - ), - ], + onTap: onPressed, + child: SizedBox( + width: 84, + child: Column( + mainAxisSize: .min, + children: [ + const SizedBox(height: 8), + Avatar(mxContent: avatar, name: title), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + title, + maxLines: 2, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 12), + ), ), - ), - ); + ], + ), + ), + ); } diff --git a/lib/pages/chat_list/chat_list_drawer.dart b/lib/pages/chat_list/chat_list_drawer.dart deleted file mode 100644 index 73242d4b8c..0000000000 --- a/lib/pages/chat_list/chat_list_drawer.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/pages/chat_list/spaces_drawer.dart'; -import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../config/app_config.dart'; - -class ChatListDrawer extends StatelessWidget { - final ChatListController controller; - const ChatListDrawer(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) => Drawer( - child: SafeArea( - child: Column( - children: [ - ListTile( - leading: const CircleAvatar( - radius: Avatar.defaultSize / 2, - backgroundImage: AssetImage('assets/logo.png'), - ), - title: Text(AppConfig.applicationName), - ), - const Divider(thickness: 1), - Expanded( - child: SpacesDrawer( - controller: controller, - ), - ), - const Divider(thickness: 1), - ListTile( - leading: Icon( - Icons.group_add_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.createNewGroup), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/newgroup'); - }, - ), - ListTile( - leading: Icon( - Icons.group_work_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.createNewSpace), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/newspace'); - }, - ), - ListTile( - leading: Icon( - Icons.adaptive.share_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.inviteContact), - onTap: () { - Scaffold.of(context).closeDrawer(); - FluffyShare.share( - L10n.of(context)!.inviteText( - Matrix.of(context).client.userID!, - 'https://matrix.to/#/${Matrix.of(context).client.userID}?client=im.fluffychat'), - context); - }, - ), - ListTile( - leading: Icon( - Icons.settings_outlined, - color: Theme.of(context).colorScheme.onBackground, - ), - title: Text(L10n.of(context)!.settings), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/settings'); - }, - ), - ], - ), - ), - ); -} diff --git a/lib/pages/chat_list/chat_list_header.dart b/lib/pages/chat_list/chat_list_header.dart index a66d78af21..50fb106a08 100644 --- a/lib/pages/chat_list/chat_list_header.dart +++ b/lib/pages/chat_list/chat_list_header.dart @@ -1,150 +1,141 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/client_chooser_button.dart'; -import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/utils/sync_status_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { final ChatListController controller; + final bool globalSearch; - const ChatListHeader({Key? key, required this.controller}) : super(key: key); + const ChatListHeader({ + super.key, + required this.controller, + this.globalSearch = true, + }); @override Widget build(BuildContext context) { - final selectMode = controller.selectMode; + final theme = Theme.of(context); + final client = Matrix.of(context).client; - return AppBar( + return SliverAppBar( + floating: true, + toolbarHeight: 72, + pinned: FluffyThemes.isColumnMode(context), + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, automaticallyImplyLeading: false, - leading: selectMode == SelectMode.normal - ? null - : IconButton( - tooltip: L10n.of(context)!.cancel, - icon: const Icon(Icons.close_outlined), - onPressed: controller.cancelAction, - color: Theme.of(context).colorScheme.primary, - ), - title: selectMode == SelectMode.share - ? Text( - L10n.of(context)!.share, - key: const ValueKey(SelectMode.share), - ) - : selectMode == SelectMode.select - ? Text( - controller.selectedRoomIds.length.toString(), - key: const ValueKey(SelectMode.select), - ) - : SizedBox( - height: 44, - child: TextField( - controller: controller.searchController, - textInputAction: TextInputAction.search, - onChanged: controller.onSearchEnter, - decoration: InputDecoration( - fillColor: Theme.of(context).colorScheme.surfaceVariant, - contentPadding: EdgeInsets.zero, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(90), - borderSide: BorderSide.none, - ), - hintText: controller.activeSpacesEntry.getName(context), - prefixIcon: controller.isSearchMode - ? IconButton( - tooltip: L10n.of(context)!.cancel, - icon: const Icon(Icons.close_outlined), - onPressed: controller.cancelSearch, - color: Theme.of(context).colorScheme.primary, - ) - : IconButton( - onPressed: Scaffold.of(context).openDrawer, - icon: Icon( - Icons.menu, - color: - Theme.of(context).colorScheme.onBackground, - ), + title: StreamBuilder( + stream: client.onSyncStatus.stream, + builder: (context, snapshot) { + final status = + client.onSyncStatus.value ?? + const SyncStatusUpdate(SyncStatus.waitingForResponse); + final hide = + client.onSync.value != null && + status.status != SyncStatus.error && + client.prevBatch != null; + return TextField( + controller: controller.searchController, + focusNode: controller.searchFocusNode, + textInputAction: TextInputAction.search, + onChanged: (text) => + controller.onSearchEnter(text, globalSearch: globalSearch), + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintText: hide + ? L10n.of(context).searchChatsRooms + : status.calcLocalizedString(context), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + + prefixIcon: hide + ? controller.isSearchMode + ? IconButton( + tooltip: L10n.of(context).cancel, + icon: const Icon(Icons.close_outlined), + onPressed: controller.cancelSearch, + color: theme.colorScheme.onPrimaryContainer, + ) + : FluffyThemes.isColumnMode(context) || + controller.spaces.isEmpty + ? IconButton( + tooltip: L10n.of(context).search, + onPressed: controller.startSearch, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ) + : IconButton( + tooltip: L10n.of(context).displayNavigationRail, + onPressed: controller.openNavrail, + icon: Icon( + Icons.menu, + color: theme.colorScheme.onPrimaryContainer, ), - suffixIcon: Row( - mainAxisSize: MainAxisSize.min, - children: controller.isSearchMode - ? [ - if (controller.isSearching) - const CircularProgressIndicator.adaptive( - strokeWidth: 2, - ), - TextButton( - onPressed: controller.setServer, - style: TextButton.styleFrom( - textStyle: const TextStyle(fontSize: 12), - ), - child: Text( - controller.searchServer ?? - Matrix.of(context) - .client - .homeserver! - .host, - maxLines: 2, - ), - ), - ] - : [ - IconButton( - icon: Icon( - Icons.camera_alt_outlined, - color: Theme.of(context) - .colorScheme - .onBackground, - ), - tooltip: L10n.of(context)!.addToStory, - onPressed: () => - VRouter.of(context).to('/stories/create'), - ), - ClientChooserButton(controller), - const SizedBox(width: 12), - ], + ) + : SizedBox( + width: 8, + height: 8, + child: Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + value: status.progress, + ), ), ), - ), - ), - actions: selectMode == SelectMode.share - ? null - : selectMode == SelectMode.select - ? [ - if (controller.spaces.isNotEmpty) - IconButton( - tooltip: L10n.of(context)!.addToSpace, - icon: const Icon(Icons.group_work_outlined), - onPressed: controller.addOrRemoveToSpace, - ), - IconButton( - tooltip: L10n.of(context)!.toggleUnread, - icon: Icon(controller.anySelectedRoomNotMarkedUnread - ? Icons.mark_chat_read_outlined - : Icons.mark_chat_unread_outlined), - onPressed: controller.toggleUnread, - ), - IconButton( - tooltip: L10n.of(context)!.toggleFavorite, - icon: Icon(controller.anySelectedRoomNotFavorite - ? Icons.push_pin_outlined - : Icons.push_pin), - onPressed: controller.toggleFavouriteRoom, - ), - IconButton( - icon: Icon(controller.anySelectedRoomNotMuted - ? Icons.notifications_off_outlined - : Icons.notifications_outlined), - tooltip: L10n.of(context)!.toggleMuted, - onPressed: controller.toggleMuted, - ), - IconButton( - icon: const Icon(Icons.delete_outlined), - tooltip: L10n.of(context)!.archive, - onPressed: controller.archiveAction, - ), - ] - : null, + suffixIcon: controller.isSearchMode && globalSearch + ? controller.isSearching + ? const Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 12, + ), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ) + : TextButton.icon( + onPressed: controller.setServer, + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(99), + ), + textStyle: const TextStyle(fontSize: 12), + ), + icon: const Icon(Icons.edit_outlined, size: 16), + label: Text( + controller.searchServer ?? + Matrix.of(context).client.homeserver!.host, + maxLines: 2, + ), + ) + : SizedBox(width: 0, child: ClientChooserButton(controller)), + ), + ); + }, + ), ); } diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index f7cbded325..55d1d7e2b4 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -1,344 +1,409 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:pedantic/pedantic.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_list/unread_bubble.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/room_status_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../config/themes.dart'; import '../../utils/date_time_extension.dart'; import '../../widgets/avatar.dart'; -import '../../widgets/matrix.dart'; -import '../chat/send_file_dialog.dart'; - -enum ArchivedRoomAction { delete, rejoin } class ChatListItem extends StatelessWidget { final Room room; + final Room? space; final bool activeChat; - final bool selected; - final Function? onForget; - final Function? onTap; - final Function? onLongPress; + final void Function(BuildContext context)? onLongPress; + final void Function()? onForget; + final void Function() onTap; + final String? filter; const ChatListItem( this.room, { this.activeChat = false, - this.selected = false, - this.onTap, + required this.onTap, this.onLongPress, this.onForget, - Key? key, - }) : super(key: key); - - dynamic clickAction(BuildContext context) async { - if (onTap != null) return onTap!(); - if (!activeChat) { - if (room.membership == Membership.invite && - (await showFutureLoadingDialog( - context: context, - future: () async { - final joinedFuture = room.client.onSync.stream - .where((u) => - u.rooms?.join?.containsKey(room.id) ?? false) - .first; - await room.join(); - await joinedFuture; - })) - .error != - null) { - return; - } - - if (room.membership == Membership.ban) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.youHaveBeenBannedFromThisChat), - ), - ); - return; - } - - if (room.membership == Membership.leave) { - final action = await showModalActionSheet( - context: context, - title: L10n.of(context)!.archivedRoom, - message: L10n.of(context)!.thisRoomHasBeenArchived, - actions: [ - SheetAction( - label: L10n.of(context)!.rejoin, - key: ArchivedRoomAction.rejoin, - ), - SheetAction( - label: L10n.of(context)!.delete, - key: ArchivedRoomAction.delete, - isDestructiveAction: true, - ), - ], - ); - if (action != null) { - switch (action) { - case ArchivedRoomAction.delete: - await archiveAction(context); - break; - case ArchivedRoomAction.rejoin: - await showFutureLoadingDialog( - context: context, - future: () => room.join(), - ); - break; - } - } - } - - if (room.membership == Membership.join) { - if (Matrix.of(context).shareContent != null) { - if (Matrix.of(context).shareContent!['msgtype'] == - 'chat.fluffy.shared_file') { - await showDialog( - context: context, - useRootNavigator: false, - builder: (c) => SendFileDialog( - file: Matrix.of(context).shareContent!['file'], - room: room, - ), - ); - } else { - unawaited(room.sendEvent(Matrix.of(context).shareContent!)); - } - Matrix.of(context).shareContent = null; - } - VRouter.of(context).toSegments(['rooms', room.id]); - } - } - } - - Future archiveAction(BuildContext context) async { - { - if ([Membership.leave, Membership.ban].contains(room.membership)) { - final success = await showFutureLoadingDialog( - context: context, - future: () => room.forget(), - ); - if (success.error == null) { - if (onForget != null) onForget!(); - } - return; - } - final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.no, - ); - if (confirmed == OkCancelResult.cancel) return; - await showFutureLoadingDialog( - context: context, future: () => room.leave()); - return; - } - } + this.filter, + this.space, + super.key, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final isMuted = room.pushRuleState != PushRuleState.notify; final typingText = room.getLocalizedTypingText(context); - final ownMessage = - room.lastEvent?.senderId == Matrix.of(context).client.userID; - final unread = room.isUnread || room.membership == Membership.invite; - final unreadBubbleSize = unread || room.hasNewMessages - ? room.notificationCount > 0 - ? 20.0 - : 14.0 - : 0.0; - return Material( - color: selected - ? Theme.of(context).colorScheme.primaryContainer - : activeChat - ? Theme.of(context).colorScheme.secondaryContainer - : Colors.transparent, - child: ListTile( - selected: selected || activeChat, - onLongPress: onLongPress as void Function()?, - leading: selected - ? SizedBox( - width: Avatar.defaultSize, - height: Avatar.defaultSize, - child: Material( - color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.circular(Avatar.defaultSize), - child: const Icon(Icons.check, color: Colors.white), - ), - ) - : Avatar( - mxContent: room.avatar, - name: room.displayname, - onTap: onLongPress as void Function()?, - ), - title: Row( - children: [ - Expanded( - child: Text( - room.getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), - maxLines: 1, - overflow: TextOverflow.ellipsis, - softWrap: false, - style: TextStyle( - fontWeight: FontWeight.bold, - color: unread - ? Theme.of(context).colorScheme.secondary - : Theme.of(context).textTheme.bodyText1!.color, - ), - ), - ), - if (isMuted) - const Padding( - padding: EdgeInsets.only(left: 4.0), - child: Icon( - Icons.notifications_off_outlined, - size: 16, - ), - ), - if (room.isFavourite) - Padding( - padding: EdgeInsets.only( - right: room.notificationCount > 0 ? 4.0 : 0.0), - child: Icon( - Icons.push_pin_outlined, - size: 16, - color: Theme.of(context).colorScheme.secondary, - ), - ), - Padding( - padding: const EdgeInsets.only(left: 4.0), - child: Text( - room.timeCreated.localizedTimeShort(context), - style: TextStyle( - fontSize: 13, - color: unread - ? Theme.of(context).colorScheme.secondary - : Theme.of(context).textTheme.bodyText2!.color, + final lastEvent = room.lastEvent; + final ownMessage = lastEvent?.senderId == room.client.userID; + final directChatMatrixId = room.directChatMatrixID; + final isDirectChat = directChatMatrixId != null; + final hasNotifications = room.notificationCount > 0; + final backgroundColor = activeChat + ? theme.colorScheme.secondaryContainer + : null; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final filter = this.filter; + if (filter != null && !displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } + + final needLastEventSender = + lastEvent != null && + room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; + final space = this.space; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + color: backgroundColor, + child: FutureBuilder( + future: room.name.isEmpty ? room.loadHeroUsers() : null, + builder: (context, _) => HoverBuilder( + builder: (context, listTileHovered) => ListTile( + minVerticalPadding: 16, + contentPadding: const EdgeInsets.symmetric(horizontal: 8), + onLongPress: () => onLongPress?.call(context), + leading: HoverBuilder( + builder: (context, hovered) => AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered ? 1.1 : 1.0, + child: SizedBox( + width: Avatar.defaultSize, + height: Avatar.defaultSize, + child: Stack( + children: [ + if (space != null) + Positioned( + top: 0, + left: 0, + child: Avatar( + shapeBorder: RoundedSuperellipseBorder( + side: BorderSide( + width: 2, + color: + backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius * 0.75, + ), + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius * 0.75, + ), + mxContent: space.avatar, + size: Avatar.defaultSize * 0.75, + name: space.getLocalizedDisplayname(), + onTap: () => onLongPress?.call(context), + ), + ), + Positioned( + bottom: 0, + right: 0, + child: Avatar( + shapeBorder: space == null + ? room.isSpace + ? RoundedSuperellipseBorder( + side: BorderSide( + width: 1, + color: theme.dividerColor, + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius, + ), + ) + : null + : RoundedRectangleBorder( + side: BorderSide( + width: 2, + color: + backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: BorderRadius.circular( + Avatar.defaultSize, + ), + ), + borderRadius: room.isSpace + ? BorderRadius.circular( + AppConfig.spaceBorderRadius, + ) + : null, + mxContent: room.avatar, + size: space != null + ? Avatar.defaultSize * 0.75 + : Avatar.defaultSize, + name: displayname, + presenceUserId: directChatMatrixId, + presenceBackgroundColor: backgroundColor, + onTap: () => onLongPress?.call(context), + ), + ), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () => onLongPress?.call(context), + child: AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: listTileHovered ? 1.0 : 0.0, + child: Material( + color: backgroundColor, + borderRadius: BorderRadius.circular(16), + child: const Icon( + Icons.arrow_drop_down_circle_outlined, + size: 18, + ), + ), + ), + ), + ), + ], + ), + ), ), ), - ), - ], - ), - subtitle: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if (typingText.isEmpty && - ownMessage && - room.lastEvent!.status.isSending) ...[ - const SizedBox( - width: 16, - height: 16, - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ), - const SizedBox(width: 4), - ], - AnimatedContainer( - width: typingText.isEmpty ? 0 : 18, - clipBehavior: Clip.hardEdge, - decoration: const BoxDecoration(), - duration: const Duration(milliseconds: 300), - curve: Curves.bounceInOut, - padding: const EdgeInsets.only(right: 4), - child: Icon( - Icons.edit_outlined, - color: Theme.of(context).colorScheme.secondary, - size: 14, - ), - ), - Expanded( - child: typingText.isNotEmpty - ? Text( - typingText, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - ), + title: Row( + children: [ + Expanded( + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, softWrap: false, - ) - : FutureBuilder( - future: room.lastEvent?.calcLocalizedBody( - MatrixLocals(L10n.of(context)!), - hideReply: true, - hideEdit: true, - plaintextBody: true, - removeMarkdown: true, - withSenderNamePrefix: !room.isDirectChat || - room.directChatMatrixID != - room.lastEvent?.senderId, - ) ?? - Future.value(L10n.of(context)!.emptyChat), - builder: (context, snapshot) { - return Text( - room.membership == Membership.invite - ? L10n.of(context)!.youAreInvitedToThisChat - : snapshot.data ?? - room.lastEvent?.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)!), + ), + ), + if (isMuted) + const Padding( + padding: EdgeInsets.only(left: 4.0), + child: Icon(Icons.notifications_off_outlined, size: 16), + ), + if (room.isLowPriority) + Padding( + padding: EdgeInsets.only( + right: hasNotifications ? 4.0 : 0.0, + ), + child: Icon( + Icons.low_priority, + size: 16, + color: theme.colorScheme.primary, + ), + ), + if (room.isFavourite) + Padding( + padding: EdgeInsets.only( + right: hasNotifications ? 4.0 : 0.0, + ), + child: Icon( + Icons.push_pin, + size: 16, + color: theme.colorScheme.primary, + ), + ), + if (!room.isSpace && room.membership != Membership.invite) + Padding( + padding: const EdgeInsets.only(left: 4.0), + child: Text( + room.latestEventReceivedTime.localizedTimeShort( + context, + ), + style: TextStyle( + fontSize: 11, + fontWeight: room.hasNewMessages + ? FontWeight.bold + : null, + color: room.highlightCount >= 1 + ? theme.colorScheme.error + : room.hasNewMessages + ? theme.colorScheme.primary + : null, + ), + ), + ), + ], + ), + subtitle: Row( + crossAxisAlignment: .start, + mainAxisAlignment: .center, + children: [ + if (typingText.isEmpty && + ownMessage && + room.lastEvent?.status.isSending == true) ...[ + const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + const SizedBox(width: 4), + ], + AnimatedSize( + clipBehavior: Clip.hardEdge, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: typingText.isNotEmpty + ? Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Icon( + Icons.edit_outlined, + color: theme.colorScheme.secondary, + size: 16, + ), + ) + : room.lastEvent?.relationshipType == + RelationshipTypes.thread + ? Container( + decoration: BoxDecoration( + border: Border.all( + color: theme.colorScheme.outline, + ), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + ), + margin: const EdgeInsets.only(right: 4.0), + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.message_outlined, + size: 12, + color: theme.colorScheme.outline, + ), + const SizedBox(width: 4), + Text( + L10n.of(context).thread, + style: TextStyle(fontSize: 11), + ), + ], + ), + ) + : const SizedBox.shrink(), + ), + Expanded( + child: room.isSpace && room.membership == Membership.join + ? Text( + L10n.of( + context, + ).countChats(room.spaceChildren.length), + ) + : typingText.isNotEmpty + ? Text( + typingText, + style: TextStyle(color: theme.colorScheme.primary), + maxLines: 1, + softWrap: false, + ) + : FutureBuilder( + key: ValueKey( + '${lastEvent?.eventId}_${lastEvent?.type}_${lastEvent?.redacted}', + ), + future: needLastEventSender + ? lastEvent.calcLocalizedBody( + MatrixLocals(L10n.of(context)), hideReply: true, hideEdit: true, plaintextBody: true, removeMarkdown: true, - withSenderNamePrefix: !room.isDirectChat || - room.directChatMatrixID != - room.lastEvent?.senderId, - ) ?? - L10n.of(context)!.emptyChat, - softWrap: false, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: unread - ? Theme.of(context).colorScheme.secondary - : Theme.of(context).textTheme.bodyText2!.color, - decoration: room.lastEvent?.redacted == true - ? TextDecoration.lineThrough + withSenderNamePrefix: + (!isDirectChat || + directChatMatrixId != + room.lastEvent?.senderId), + ) : null, + initialData: lastEvent?.calcLocalizedBodyFallback( + MatrixLocals(L10n.of(context)), + hideReply: true, + hideEdit: true, + plaintextBody: true, + removeMarkdown: true, + withSenderNamePrefix: + (!isDirectChat || + directChatMatrixId != + room.lastEvent?.senderId), + ), + builder: (context, snapshot) => Text( + room.membership == Membership.invite + ? room + .getState( + EventTypes.RoomMember, + room.client.userID!, + ) + ?.content + .tryGet('reason') ?? + (isDirectChat + ? L10n.of(context).newChatRequest + : L10n.of(context).inviteGroupChat) + : snapshot.data?.trim().replaceAll( + '\n', + ' ', + ) ?? + L10n.of(context).noMessagesYet, + softWrap: false, + maxLines: room.notificationCount >= 1 ? 2 : 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + decoration: room.lastEvent?.redacted == true + ? TextDecoration.lineThrough + : null, + ), + ), ), - ); - }), - ), - const SizedBox(width: 8), - AnimatedContainer( - duration: const Duration(milliseconds: 300), - curve: Curves.bounceInOut, - padding: const EdgeInsets.symmetric(horizontal: 7), - height: unreadBubbleSize, - width: - room.notificationCount == 0 && !unread && !room.hasNewMessages - ? 0 - : (unreadBubbleSize - 9) * - room.notificationCount.toString().length + - 9, - decoration: BoxDecoration( - color: room.highlightCount > 0 - ? Colors.red - : room.notificationCount > 0 - ? Theme.of(context).primaryColor - : Theme.of(context).primaryColor.withAlpha(100), - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - ), - child: Center( - child: room.notificationCount > 0 - ? Text( - room.notificationCount.toString(), - style: const TextStyle( - color: Colors.white, - fontSize: 13, - ), - ) - : Container(), + ), + const SizedBox(width: 8), + UnreadBubble(room: room), + ], ), + onTap: onTap, + trailing: onForget == null + ? room.membership == Membership.invite + ? IconButton( + tooltip: L10n.of(context).declineInvitation, + icon: const Icon(Icons.delete_forever_outlined), + color: theme.colorScheme.error, + onPressed: () async { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).declineInvitation, + message: L10n.of(context).areYouSure, + okLabel: L10n.of(context).yes, + isDestructive: true, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: room.leave, + ); + }, + ) + : null + : IconButton( + icon: const Icon(Icons.delete_outlined), + onPressed: onForget, + ), ), - ], + ), ), - onTap: () => clickAction(context), ), ); } diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index d7881af1df..0db2f7422d 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -1,70 +1,114 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/pages/chat_list/chat_list_drawer.dart'; -import '../../widgets/matrix.dart'; +import 'package:fluffychat/pages/chat_list/navigation_rail.dart'; +import 'package:fluffychat/pages/chat_list/start_chat_fab.dart'; +import 'package:flutter/material.dart'; + import 'chat_list_body.dart'; -import 'chat_list_header.dart'; class ChatListView extends StatelessWidget { final ChatListController controller; - const ChatListView(this.controller, {Key? key}) : super(key: key); + const ChatListView(this.controller, {super.key}); @override Widget build(BuildContext context) { - return StreamBuilder( - stream: Matrix.of(context).onShareContentChanged.stream, - builder: (_, __) { - final selectMode = controller.selectMode; - return VWidgetGuard( - onSystemPop: (redirector) async { - final selMode = controller.selectMode; - if (selMode != SelectMode.normal) controller.cancelAction(); - if (selMode == SelectMode.select) redirector.stopRedirection(); - }, - child: Scaffold( - appBar: ChatListHeader(controller: controller), - body: ChatListViewBody(controller), - drawer: ChatListDrawer(controller), - floatingActionButton: selectMode == SelectMode.normal - ? KeyBoardShortcuts( - child: FloatingActionButton.extended( - isExtended: controller.scrolledToTop, - backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Theme.of(context).colorScheme.onPrimary, - onPressed: () => - VRouter.of(context).to('/newprivatechat'), - icon: const Icon(CupertinoIcons.chat_bubble), - label: Text(L10n.of(context)!.newChat), + final oneColumnSpacesMode = + !FluffyThemes.isColumnMode(context) && + AppSettings.displayNavigationRail.value; + return PopScope( + canPop: !controller.isSearchMode && controller.activeSpaceId == null, + onPopInvokedWithResult: (pop, _) { + if (pop) return; + if (controller.activeSpaceId != null) { + controller.clearActiveSpace(); + return; + } + if (controller.isSearchMode) { + controller.cancelSearch(); + return; + } + }, + child: Row( + children: [ + Material( + color: Theme.of(context).colorScheme.surface, + child: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: + (FluffyThemes.isColumnMode(context) || + AppSettings.displayNavigationRail.value) + ? SpacesNavigationRail( + activeSpaceId: controller.activeSpaceId, + onGoToChats: controller.clearActiveSpace, + onGoToSpaceId: controller.setActiveSpace, + ) + : SizedBox( + width: 0, + height: MediaQuery.sizeOf(context).height, ), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.keyN - }, - onKeysPressed: () => - VRouter.of(context).to('/newprivatechat'), - helpLabel: L10n.of(context)!.newChat, - ) - : null, + ), ), - ); - }, + if (FluffyThemes.isColumnMode(context) || + AppSettings.displayNavigationRail.value) + if (FluffyThemes.isColumnMode(context)) + Container(width: 1, color: Theme.of(context).dividerColor), + + Expanded( + child: GestureDetector( + onTap: FocusManager.instance.primaryFocus?.unfocus, + excludeFromSemantics: true, + behavior: HitTestBehavior.translucent, + child: Scaffold( + backgroundColor: oneColumnSpacesMode + ? Theme.of(context).colorScheme.surfaceContainer + : null, + body: SafeArea( + top: oneColumnSpacesMode, + bottom: false, + left: false, + right: false, + child: Material( + clipBehavior: oneColumnSpacesMode + ? Clip.hardEdge + : Clip.none, + borderRadius: oneColumnSpacesMode + ? BorderRadius.only( + topLeft: Radius.circular(AppConfig.borderRadius), + ) + : null, + color: oneColumnSpacesMode + ? Theme.of(context).colorScheme.surface + : null, + child: ChatListViewBody(controller), + ), + ), + floatingActionButton: + !controller.isSearchMode && + controller.activeSpaceId == null && + !FluffyThemes.isColumnMode(context) + ? ValueListenableBuilder( + valueListenable: controller.scrolledToTop, + builder: (context, scrolledToTop, _) => StartChatFab( + extended: + scrolledToTop && + !AppSettings.displayNavigationRail.value, + ), + ) + : const SizedBox.shrink(), + ), + ), + ), + ], + ), ); } } - -enum ChatListPopupMenuItemActions { - createGroup, - createSpace, - discover, - setStatus, - inviteContact, - settings, -} diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 6d463830de..de6594cafc 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -1,41 +1,110 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:async/async.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' hide Result; +import 'package:url_launcher/url_launcher_string.dart'; + +import '../../utils/fluffy_share.dart'; import 'chat_list.dart'; class ClientChooserButton extends StatelessWidget { final ChatListController controller; - const ClientChooserButton(this.controller, {Key? key}) : super(key: key); + const ClientChooserButton(this.controller, {super.key}); List> _bundleMenuItems(BuildContext context) { final matrix = Matrix.of(context); final bundles = matrix.accountBundles.keys.toList() - ..sort((a, b) => a!.isValidMatrixId == b!.isValidMatrixId - ? 0 - : a.isValidMatrixId && !b.isValidMatrixId - ? -1 - : 1); + ..sort( + (a, b) => a!.isValidMatrixIdStrict() == b!.isValidMatrixIdStrict() + ? 0 + : a.isValidMatrixIdStrict() && !b.isValidMatrixIdStrict() + ? -1 + : 1, + ); return >[ + PopupMenuItem( + value: SettingsAction.newGroup, + child: Row( + children: [ + const Icon(Icons.group_add_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).createGroup), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.setStatus, + child: Row( + children: [ + const Icon(Icons.edit_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).setStatus), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.invite, + child: Row( + children: [ + Icon(Icons.adaptive.share_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).inviteContact), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.archive, + child: Row( + children: [ + const Icon(Icons.archive_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).archive), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.settings, + child: Row( + children: [ + const Icon(Icons.settings_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).settings), + ], + ), + ), + PopupMenuItem( + value: SettingsAction.support, + child: Row( + children: [ + Icon(Icons.favorite, color: Colors.red), + const SizedBox(width: 18), + Text(L10n.of(context).supportFluffyChat), + ], + ), + ), + const PopupMenuDivider(), for (final bundle in bundles) ...[ if (matrix.accountBundles[bundle]!.length != 1 || matrix.accountBundles[bundle]!.single!.userID != bundle) PopupMenuItem( value: null, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, + crossAxisAlignment: .start, + mainAxisSize: .min, children: [ Text( bundle!, style: TextStyle( - color: Theme.of(context).textTheme.subtitle1!.color, + color: Theme.of(context).textTheme.titleMedium!.color, fontSize: 14, ), ), @@ -44,48 +113,53 @@ class ClientChooserButton extends StatelessWidget { ), ), ...matrix.accountBundles[bundle]! + .whereType() + .where((client) => client.isLogged()) .map( (client) => PopupMenuItem( value: client, - child: FutureBuilder( - future: client!.fetchOwnProfile(), - builder: (context, snapshot) => Row( - children: [ - Avatar( - mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - client.userID!.localpart, - size: 28, - fontSize: 12, - ), - const SizedBox(width: 12), - Expanded( - child: Text( - snapshot.data?.displayName ?? - client.userID!.localpart!, - overflow: TextOverflow.ellipsis, + child: FutureBuilder( + future: client.fetchOwnProfile(), + builder: (context, snapshot) { + final displayname = + snapshot.data?.displayName ?? client.userID!.localpart!; + return Row( + key: ValueKey('switch_account_$displayname'), + children: [ + Avatar( + mxContent: snapshot.data?.avatarUrl, + name: displayname, + size: 32, ), - ), - const SizedBox(width: 12), - IconButton( - icon: const Icon(Icons.edit_outlined), - onPressed: () => controller.editBundlesForAccount( - client.userID, bundle), - ), - ], - ), + const SizedBox(width: 12), + Expanded( + child: Text( + displayname, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 12), + IconButton( + icon: const Icon(Icons.edit_outlined), + onPressed: () => controller.editBundlesForAccount( + client.userID, + bundle, + ), + ), + ], + ); + }, ), ), - ) - .toList(), + ), ], PopupMenuItem( - value: AddAccountAction.addAccount, + value: SettingsAction.addAccount, child: Row( children: [ const Icon(Icons.person_add_outlined), const SizedBox(width: 18), - Text(L10n.of(context)!.addAccount), + Text(L10n.of(context).addAccount), ], ), ), @@ -95,145 +169,75 @@ class ClientChooserButton extends StatelessWidget { @override Widget build(BuildContext context) { final matrix = Matrix.of(context); + final client = Result(() => matrix.client).asValue?.value; - int clientCount = 0; + var clientCount = 0; matrix.accountBundles.forEach((key, value) => clientCount += value.length); - return Center( - child: FutureBuilder( - future: matrix.client.fetchOwnProfile(), - builder: (context, snapshot) => Stack( - alignment: Alignment.center, - children: [ - ...List.generate( - clientCount, - (index) => KeyBoardShortcuts( - child: Container(), - keysToPress: _buildKeyboardShortcut(index + 1), - helpLabel: L10n.of(context)!.switchToAccount(index + 1), - onKeysPressed: () => _handleKeyboardShortcut(matrix, index), - ), - ), - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.tab - }, - helpLabel: L10n.of(context)!.nextAccount, - onKeysPressed: () => _nextAccount(matrix), - ), - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.shiftLeft, - LogicalKeyboardKey.tab - }, - helpLabel: L10n.of(context)!.previousAccount, - onKeysPressed: () => _previousAccount(matrix), + return FutureBuilder( + future: client?.isLogged() == true ? client?.fetchOwnProfile() : null, + builder: (context, snapshot) => Material( + clipBehavior: Clip.hardEdge, + borderRadius: BorderRadius.circular(99), + color: Colors.transparent, + child: PopupMenuButton( + key: Key('accounts_and_settings_buttons'), + tooltip: 'Accounts and settings', + onSelected: (o) => _clientSelected(o, context), + itemBuilder: _bundleMenuItems, + child: Center( + child: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: snapshot.data?.displayName ?? client?.userID?.localpart, + size: 32, ), - PopupMenuButton( - child: Material( - color: Colors.transparent, - borderRadius: BorderRadius.circular(99), - child: Avatar( - mxContent: snapshot.data?.avatarUrl, - name: snapshot.data?.displayName ?? - matrix.client.userID!.localpart, - size: 28, - fontSize: 12, - ), - ), - onSelected: _clientSelected, - itemBuilder: _bundleMenuItems, - ), - ], + ), ), ), ); } - Set? _buildKeyboardShortcut(int index) { - if (index > 0 && index < 10) { - return { - LogicalKeyboardKey.altLeft, - LogicalKeyboardKey(0x00000000030 + index) - }; - } else { - return null; - } - } - - void _clientSelected(Object object) { + Future _clientSelected(Object object, BuildContext context) async { if (object is Client) { controller.setActiveClient(object); } else if (object is String) { controller.setActiveBundle(object); - } else if (object == AddAccountAction.addAccount) { - controller.addAccountAction(); - } - } - - void _handleKeyboardShortcut(MatrixState matrix, int index) { - final bundles = matrix.accountBundles.keys.toList() - ..sort((a, b) => a!.isValidMatrixId == b!.isValidMatrixId - ? 0 - : a.isValidMatrixId && !b.isValidMatrixId - ? -1 - : 1); - // beginning from end if negative - if (index < 0) { - int clientCount = 0; - matrix.accountBundles - .forEach((key, value) => clientCount += value.length); - _handleKeyboardShortcut(matrix, clientCount); - } - for (final bundleName in bundles) { - final bundle = matrix.accountBundles[bundleName]; - if (bundle != null) { - if (index < bundle.length) { - return _clientSelected(bundle[index]!); - } else { - index -= bundle.length; - } + } else if (object is SettingsAction) { + switch (object) { + case SettingsAction.addAccount: + if (!context.mounted) return; + context.go('/rooms/settings/addaccount'); + break; + case SettingsAction.newGroup: + context.go('/rooms/newgroup'); + break; + case SettingsAction.invite: + FluffyShare.shareInviteLink(context); + break; + case SettingsAction.support: + launchUrlString( + 'https://fluffychat.im/faq/#how_can_i_support_fluffychat', + ); + break; + case SettingsAction.settings: + context.go('/rooms/settings'); + break; + case SettingsAction.archive: + context.go('/rooms/archive'); + break; + case SettingsAction.setStatus: + controller.setStatus(); + break; } } - // if index too high, restarting from 0 - _handleKeyboardShortcut(matrix, 0); - } - - int? _shortcutIndexOfClient(MatrixState matrix, Client client) { - int index = 0; - - final bundles = matrix.accountBundles.keys.toList() - ..sort((a, b) => a!.isValidMatrixId == b!.isValidMatrixId - ? 0 - : a.isValidMatrixId && !b.isValidMatrixId - ? -1 - : 1); - for (final bundleName in bundles) { - final bundle = matrix.accountBundles[bundleName]; - if (bundle == null) return null; - if (bundle.contains(client)) { - return index + bundle.indexOf(client); - } else { - index += bundle.length; - } - } - return null; - } - - void _nextAccount(MatrixState matrix) { - final client = matrix.client; - final lastIndex = _shortcutIndexOfClient(matrix, client); - _handleKeyboardShortcut(matrix, lastIndex! + 1); - } - - void _previousAccount(MatrixState matrix) { - final client = matrix.client; - final lastIndex = _shortcutIndexOfClient(matrix, client); - _handleKeyboardShortcut(matrix, lastIndex! - 1); } } -enum AddAccountAction { addAccount } +enum SettingsAction { + addAccount, + newGroup, + setStatus, + invite, + support, + settings, + archive, +} diff --git a/lib/pages/chat_list/dummy_chat_list_item.dart b/lib/pages/chat_list/dummy_chat_list_item.dart new file mode 100644 index 0000000000..72ee8e757c --- /dev/null +++ b/lib/pages/chat_list/dummy_chat_list_item.dart @@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; + +class DummyChatListItem extends StatelessWidget { + final double opacity; + final bool animate; + + const DummyChatListItem({ + required this.opacity, + required this.animate, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final titleColor = theme.textTheme.bodyLarge!.color!.withAlpha(100); + final subtitleColor = theme.textTheme.bodyLarge!.color!.withAlpha(50); + return Opacity( + opacity: opacity, + child: ListTile( + leading: CircleAvatar( + backgroundColor: titleColor, + child: animate + ? CircularProgressIndicator( + strokeWidth: 1, + color: theme.textTheme.bodyLarge!.color, + ) + : const SizedBox.shrink(), + ), + title: Row( + children: [ + Expanded( + child: Container( + height: 14, + decoration: BoxDecoration( + color: titleColor, + borderRadius: BorderRadius.circular(3), + ), + ), + ), + const SizedBox(width: 36), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + const SizedBox(width: 12), + Container( + height: 14, + width: 14, + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(14), + ), + ), + ], + ), + subtitle: Container( + decoration: BoxDecoration( + color: subtitleColor, + borderRadius: BorderRadius.circular(3), + ), + height: 12, + margin: const EdgeInsets.only(right: 22), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/navi_rail_item.dart b/lib/pages/chat_list/navi_rail_item.dart new file mode 100644 index 0000000000..7ff17ad120 --- /dev/null +++ b/lib/pages/chat_list/navi_rail_item.dart @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:badges/badges.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/unread_rooms_badge.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../config/themes.dart'; + +class NaviRailItem extends StatelessWidget { + final String toolTip; + final bool isSelected; + final void Function() onTap; + final Widget icon; + final Widget? selectedIcon; + final bool Function(Room)? unreadBadgeFilter; + + const NaviRailItem({ + required this.toolTip, + required this.isSelected, + required this.onTap, + required this.icon, + this.selectedIcon, + this.unreadBadgeFilter, + super.key, + }); + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final borderRadius = BorderRadius.circular(AppConfig.borderRadius); + final icon = isSelected ? selectedIcon ?? this.icon : this.icon; + final unreadBadgeFilter = this.unreadBadgeFilter; + return HoverBuilder( + builder: (context, hovered) { + return SizedBox( + height: 64, + width: FluffyThemes.navRailWidth, + child: Stack( + children: [ + Positioned( + top: 8, + bottom: 8, + left: 0, + child: AnimatedContainer( + width: isSelected + ? FluffyThemes.isColumnMode(context) + ? 8 + : 4 + : 0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(90), + bottomRight: Radius.circular(90), + ), + ), + ), + ), + Center( + child: AnimatedScale( + scale: hovered ? 1.1 : 1.0, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Material( + borderRadius: borderRadius, + color: isSelected + ? theme.colorScheme.secondaryContainer + : theme.colorScheme.surfaceContainerHighest, + child: Tooltip( + message: toolTip, + child: InkWell( + borderRadius: borderRadius, + onTap: onTap, + child: unreadBadgeFilter == null + ? icon + : UnreadRoomsBadge( + filter: unreadBadgeFilter, + badgePosition: BadgePosition.topEnd( + top: -12, + end: -8, + ), + child: icon, + ), + ), + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/pages/chat_list/navigation_rail.dart b/lib/pages/chat_list/navigation_rail.dart new file mode 100644 index 0000000000..a6491714ee --- /dev/null +++ b/lib/pages/chat_list/navigation_rail.dart @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_list/navi_rail_item.dart'; +import 'package:fluffychat/pages/chat_list/start_chat_fab.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +class SpacesNavigationRail extends StatelessWidget { + final String? activeSpaceId; + final void Function() onGoToChats; + final void Function(String) onGoToSpaceId; + + const SpacesNavigationRail({ + required this.activeSpaceId, + required this.onGoToChats, + required this.onGoToSpaceId, + super.key, + }); + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final coloredMode = !FluffyThemes.isColumnMode(context); + final theme = Theme.of(context); + return Material( + color: coloredMode ? theme.colorScheme.surfaceContainer : null, + child: SafeArea( + child: StreamBuilder( + key: ValueKey(client.userID.toString()), + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final allSpaces = client.rooms + .where((room) => room.isSpace) + .toList(); + + return SizedBox( + width: FluffyThemes.isColumnMode(context) + ? FluffyThemes.navRailWidth + : FluffyThemes.navRailWidth - 8, + child: Column( + children: [ + Expanded( + child: ListView.builder( + padding: EdgeInsets.symmetric(vertical: 4), + scrollDirection: Axis.vertical, + itemCount: allSpaces.length + 2, + itemBuilder: (context, i) { + if (i == 0) { + return NaviRailItem( + isSelected: activeSpaceId == null, + onTap: onGoToChats, + icon: const Padding( + padding: EdgeInsets.all(12.0), + child: Icon(Icons.forum_outlined), + ), + selectedIcon: const Padding( + padding: EdgeInsets.all(12.0), + child: Icon(Icons.forum), + ), + toolTip: L10n.of(context).chats, + unreadBadgeFilter: (room) => true, + ); + } + i--; + if (i == allSpaces.length) { + return NaviRailItem( + isSelected: false, + onTap: () => context.go('/rooms/newspace'), + icon: const Padding( + padding: EdgeInsets.all(12.0), + child: Icon(Icons.add), + ), + toolTip: L10n.of(context).createNewSpace, + ); + } + final space = allSpaces[i]; + final displayname = allSpaces[i] + .getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final spaceChildrenIds = space.spaceChildren + .map((c) => c.roomId) + .toSet(); + return NaviRailItem( + toolTip: displayname, + isSelected: activeSpaceId == space.id, + onTap: () => onGoToSpaceId(allSpaces[i].id), + unreadBadgeFilter: (room) => + spaceChildrenIds.contains(room.id), + icon: Avatar( + mxContent: allSpaces[i].avatar, + name: displayname, + //size: 36, + shapeBorder: RoundedSuperellipseBorder( + side: BorderSide( + width: 1, + color: Theme.of(context).dividerColor, + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius, + ), + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius, + ), + ), + ); + }, + ), + ), + if (FluffyThemes.isColumnMode(context)) + Padding( + padding: const EdgeInsets.all(12.0), + child: StartChatFab(), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/search_title.dart b/lib/pages/chat_list/search_title.dart new file mode 100644 index 0000000000..13d6fe73c0 --- /dev/null +++ b/lib/pages/chat_list/search_title.dart @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; + +class SearchTitle extends StatelessWidget { + final String title; + final Widget icon; + final Widget? trailing; + final void Function()? onTap; + final Color? color; + + const SearchTitle({ + required this.title, + required this.icon, + this.trailing, + this.onTap, + this.color, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Material( + shape: Border( + top: BorderSide(color: theme.dividerColor, width: 1), + bottom: BorderSide(color: theme.dividerColor, width: 1), + ), + color: color ?? theme.colorScheme.surface, + child: InkWell( + onTap: onTap, + splashColor: theme.colorScheme.surface, + child: Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: IconTheme( + data: theme.iconTheme.copyWith(size: 16), + child: Row( + children: [ + icon, + const SizedBox(width: 16), + Text( + title, + textAlign: TextAlign.left, + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + if (trailing != null) + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: trailing, + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart new file mode 100644 index 0000000000..7d6fcb821d --- /dev/null +++ b/lib/pages/chat_list/space_view.dart @@ -0,0 +1,686 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; +import 'dart:convert'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_list/unread_bubble.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/stream_extension.dart'; +import 'package:fluffychat/utils/string_color.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; + +enum SpaceChildAction { + mute, + unmute, + markAsUnread, + markAsRead, + removeFromSpace, + leave, +} + +enum SpaceActions { settings, invite, members, leave } + +class SpaceView extends StatefulWidget { + final String spaceId; + final void Function() onBack; + final void Function(Room room) onChatTab; + final String? activeChat; + + const SpaceView({ + required this.spaceId, + required this.onBack, + required this.onChatTab, + required this.activeChat, + super.key, + }); + + @override + State createState() => _SpaceViewState(); +} + +class _SpaceViewState extends State { + final List _discoveredChildren = []; + final TextEditingController _filterController = TextEditingController(); + String? _nextBatch; + bool _noMoreRooms = false; + bool _isLoading = false; + + StreamSubscription? _childStateSub; + + @override + void initState() { + _loadHierarchy(); + _childStateSub = Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.rooms?.join?[widget.spaceId]?.timeline?.events?.any( + (event) => event.type == EventTypes.SpaceChild, + ) ?? + false, + ) + .listen(_loadHierarchy); + super.initState(); + } + + @override + void dispose() { + _childStateSub?.cancel(); + super.dispose(); + } + + Future _loadHierarchy([_]) async { + final matrix = Matrix.of(context); + final room = matrix.client.getRoomById(widget.spaceId); + if (room == null) return; + + final cacheKey = 'spaces_history_cache${room.id}'; + if (_discoveredChildren.isEmpty) { + final cachedChildren = matrix.store.getStringList(cacheKey); + if (cachedChildren != null) { + try { + _discoveredChildren.addAll( + cachedChildren.map( + (jsonString) => + SpaceRoomsChunk$2.fromJson(jsonDecode(jsonString)), + ), + ); + } catch (e, s) { + Logs().e('Unable to json decode spaces hierarchy cache!', e, s); + matrix.store.remove(cacheKey); + } + } + } + + setState(() { + _isLoading = true; + }); + + try { + final hierarchy = await room.client.getSpaceHierarchy( + widget.spaceId, + suggestedOnly: false, + maxDepth: 2, + from: _nextBatch, + ); + if (!mounted) return; + setState(() { + if (_nextBatch == null) _discoveredChildren.clear(); + _nextBatch = hierarchy.nextBatch; + if (hierarchy.nextBatch == null) { + _noMoreRooms = true; + } + _discoveredChildren.addAll( + hierarchy.rooms.where((room) => room.roomId != widget.spaceId), + ); + _isLoading = false; + }); + + if (_nextBatch == null) { + matrix.store.setStringList( + cacheKey, + _discoveredChildren + .map((child) => jsonEncode(child.toJson())) + .toList(), + ); + } + } catch (e, s) { + Logs().w('Unable to load hierarchy', e, s); + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + setState(() { + _isLoading = false; + }); + } + } + + Future _joinChildRoom(SpaceRoomsChunk$2 item) async { + final client = Matrix.of(context).client; + final space = client.getRoomById(widget.spaceId); + final via = space?.spaceChildren + .firstWhereOrNull((child) => child.roomId == item.roomId) + ?.via; + final roomResult = await showFutureLoadingDialog( + context: context, + future: () async { + final waitForRoom = client.waitForRoomInSync(item.roomId, join: true); + await client.joinRoom(item.roomId, via: via); + await waitForRoom; + return client.getRoomById(item.roomId)!; + }, + ); + final room = roomResult.result; + if (room != null) widget.onChatTab(room); + } + + Future _onSpaceAction(SpaceActions action) async { + final space = Matrix.of(context).client.getRoomById(widget.spaceId); + + switch (action) { + case SpaceActions.settings: + await space?.postLoad(); + if (!mounted) return; + context.push('/rooms/${widget.spaceId}/details'); + break; + case SpaceActions.invite: + await space?.postLoad(); + if (!mounted) return; + context.push('/rooms/${widget.spaceId}/invite'); + break; + case SpaceActions.members: + await space?.postLoad(); + if (!mounted) return; + context.push('/rooms/${widget.spaceId}/details/members'); + break; + case SpaceActions.leave: + final confirmed = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).archiveRoomDescription, + okLabel: L10n.of(context).leave, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, + ); + if (!mounted) return; + if (confirmed != OkCancelResult.ok) return; + + final success = await showFutureLoadingDialog( + context: context, + future: () async => await space?.leave(), + ); + if (!mounted) return; + if (success.error != null) return; + widget.onBack(); + } + } + + Future _showSpaceChildEditMenu( + BuildContext posContext, + String roomId, + ) async { + final client = Matrix.of(context).client; + final space = client.getRoomById(widget.spaceId); + final room = client.getRoomById(roomId); + if (space == null) return; + final overlay = + Overlay.of(posContext).context.findRenderObject() as RenderBox; + + final button = posContext.findRenderObject() as RenderBox; + + final position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(const Offset(0, -65), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero) + const Offset(-50, 0), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, + ); + + final action = await showMenu( + context: posContext, + position: position, + items: [ + if (room != null && room.membership == Membership.join) ...[ + PopupMenuItem( + value: room.pushRuleState == PushRuleState.notify + ? SpaceChildAction.mute + : SpaceChildAction.unmute, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.pushRuleState == PushRuleState.notify + ? Icons.notifications_off_outlined + : Icons.notifications_on_outlined, + ), + const SizedBox(width: 12), + Text( + room.pushRuleState == PushRuleState.notify + ? L10n.of(context).muteChat + : L10n.of(context).unmuteChat, + ), + ], + ), + ), + PopupMenuItem( + value: room.markedUnread + ? SpaceChildAction.markAsRead + : SpaceChildAction.markAsUnread, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.markedUnread + ? Icons.mark_as_unread + : Icons.mark_as_unread_outlined, + ), + const SizedBox(width: 12), + Text( + room.isUnread + ? L10n.of(context).markAsRead + : L10n.of(context).markAsUnread, + ), + ], + ), + ), + PopupMenuItem( + value: SpaceChildAction.leave, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.delete_outlined, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).leave, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], + ), + ), + ], + if (space.canChangeStateEvent(EventTypes.SpaceChild) == true) + PopupMenuItem( + value: SpaceChildAction.removeFromSpace, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.remove, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).removeFromSpace, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], + ), + ), + ], + ); + if (action == null) return; + if (!mounted) return; + switch (action) { + case SpaceChildAction.removeFromSpace: + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).removeFromSpace, + message: L10n.of(context).removeFromSpaceDescription, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + final result = await showFutureLoadingDialog( + context: context, + future: () => space.removeSpaceChild(roomId), + ); + if (result.isError) return; + if (!mounted) return; + _nextBatch = null; + return; + case SpaceChildAction.mute: + await showFutureLoadingDialog( + context: context, + future: () => room!.setPushRuleState(PushRuleState.mentionsOnly), + ); + case SpaceChildAction.unmute: + await showFutureLoadingDialog( + context: context, + future: () => room!.setPushRuleState(PushRuleState.notify), + ); + case SpaceChildAction.markAsUnread: + await showFutureLoadingDialog( + context: context, + future: () => room!.markUnread(true), + ); + case SpaceChildAction.markAsRead: + await showFutureLoadingDialog( + context: context, + future: () => room!.markUnread(false), + ); + case SpaceChildAction.leave: + await showFutureLoadingDialog( + context: context, + future: () => room!.leave(), + ); + } + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final room = Matrix.of(context).client.getRoomById(widget.spaceId); + final displayname = + room?.getLocalizedDisplayname() ?? L10n.of(context).nothingFound; + const avatarSize = Avatar.defaultSize / 1.5; + final isAdmin = room?.canChangeStateEvent(EventTypes.SpaceChild) == true; + return Scaffold( + appBar: AppBar( + leading: + FluffyThemes.isColumnMode(context) || + AppSettings.displayNavigationRail.value + ? null + : Center(child: CloseButton(onPressed: widget.onBack)), + automaticallyImplyLeading: false, + titleSpacing: + FluffyThemes.isColumnMode(context) || + AppSettings.displayNavigationRail.value + ? null + : 0, + title: ListTile( + contentPadding: EdgeInsets.zero, + leading: Avatar( + size: avatarSize, + mxContent: room?.avatar, + name: displayname, + shapeBorder: RoundedSuperellipseBorder( + side: BorderSide(width: 1, color: theme.dividerColor), + borderRadius: BorderRadius.circular(AppConfig.spaceBorderRadius), + ), + borderRadius: BorderRadius.circular(AppConfig.spaceBorderRadius), + ), + title: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + actions: [ + if (isAdmin) + IconButton( + icon: Icon(Icons.add_outlined), + tooltip: L10n.of(context).addChatOrSubSpace, + onPressed: () => + context.go('/rooms/newgroup?space_id=${widget.spaceId}'), + ), + PopupMenuButton( + useRootNavigator: true, + onSelected: _onSpaceAction, + itemBuilder: (context) => [ + PopupMenuItem( + value: SpaceActions.settings, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.settings_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).settings), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.invite, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.person_add_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).invite), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.members, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.group_outlined), + const SizedBox(width: 12), + Text( + L10n.of(context).countParticipants( + room?.summary.mJoinedMemberCount ?? 1, + ), + ), + ], + ), + ), + PopupMenuItem( + value: SpaceActions.leave, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.delete_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).leave), + ], + ), + ), + ], + ), + ], + ), + body: room == null + ? const Center(child: Icon(Icons.search_outlined, size: 80)) + : StreamBuilder( + stream: room.client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, snapshot) { + final filter = _filterController.text.trim().toLowerCase(); + return CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: TextField( + controller: _filterController, + onChanged: (_) => setState(() {}), + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: IconButton( + onPressed: () {}, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + SliverList.builder( + itemCount: _discoveredChildren.length + 1, + itemBuilder: (context, i) { + if (i == _discoveredChildren.length) { + if (_noMoreRooms) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 2.0, + ), + child: TextButton( + onPressed: _isLoading ? null : _loadHierarchy, + child: _isLoading + ? const CircularProgressIndicator.adaptive() + : Text(L10n.of(context).loadMore), + ), + ); + } + final item = _discoveredChildren[i]; + var joinedRoom = room.client.getRoomById(item.roomId); + final displayname = + item.name ?? + item.canonicalAlias ?? + joinedRoom?.getLocalizedDisplayname() ?? + L10n.of(context).emptyChat; + final avatarUrl = item.avatarUrl ?? joinedRoom?.avatar; + if (!displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } + if (joinedRoom?.membership == Membership.leave) { + joinedRoom = null; + } + + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 1, + ), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + clipBehavior: Clip.hardEdge, + color: + joinedRoom != null && + widget.activeChat == joinedRoom.id + ? theme.colorScheme.secondaryContainer + : Colors.transparent, + child: HoverBuilder( + builder: (context, hovered) => ListTile( + visualDensity: const VisualDensity( + vertical: -0.5, + ), + contentPadding: EdgeInsets.only( + left: 8, + right: joinedRoom == null ? 0 : 8, + ), + onTap: joinedRoom != null + ? () => widget.onChatTab(joinedRoom!) + : null, + onLongPress: joinedRoom != null + ? () => _showSpaceChildEditMenu( + context, + item.roomId, + ) + : null, + leading: hovered + ? SizedBox.square( + dimension: avatarSize, + child: IconButton( + splashRadius: avatarSize, + iconSize: 14, + style: IconButton.styleFrom( + foregroundColor: theme + .colorScheme + .onTertiaryContainer, + backgroundColor: theme + .colorScheme + .tertiaryContainer, + ), + onPressed: + isAdmin || joinedRoom != null + ? () => _showSpaceChildEditMenu( + context, + item.roomId, + ) + : null, + icon: const Icon(Icons.edit_outlined), + ), + ) + : Avatar( + size: avatarSize, + mxContent: avatarUrl, + name: '#', + backgroundColor: + theme.colorScheme.surfaceContainer, + textColor: + item.name?.darkColor ?? + theme.colorScheme.onSurface, + shapeBorder: item.roomType == 'm.space' + ? RoundedSuperellipseBorder( + side: BorderSide( + color: theme + .colorScheme + .surfaceContainerHighest, + ), + borderRadius: + BorderRadius.circular( + AppConfig.borderRadius / + 4, + ), + ) + : null, + borderRadius: item.roomType == 'm.space' + ? BorderRadius.circular( + AppConfig.borderRadius / 4, + ) + : null, + ), + title: Row( + children: [ + Expanded( + child: Opacity( + opacity: joinedRoom == null ? 0.5 : 1, + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ), + if (joinedRoom != null && + joinedRoom.pushRuleState != + PushRuleState.notify) + const Padding( + padding: EdgeInsets.only(left: 4.0), + child: Icon( + Icons.notifications_off_outlined, + size: 16, + ), + ), + if (joinedRoom != null) + UnreadBubble(room: joinedRoom) + else + TextButton( + onPressed: () => _joinChildRoom(item), + child: Text(L10n.of(context).join), + ), + ], + ), + ), + ), + ), + ); + }, + ), + const SliverPadding(padding: EdgeInsets.only(top: 32)), + ], + ); + }, + ), + ); + } +} diff --git a/lib/pages/chat_list/spaces_drawer.dart b/lib/pages/chat_list/spaces_drawer.dart deleted file mode 100644 index c9e5d6be38..0000000000 --- a/lib/pages/chat_list/spaces_drawer.dart +++ /dev/null @@ -1,96 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'chat_list.dart'; - -class SpacesDrawer extends StatelessWidget { - final ChatListController controller; - - const SpacesDrawer({Key? key, required this.controller}) : super(key: key); - - @override - Widget build(BuildContext context) { - final currentIndex = controller.spacesEntries.indexWhere((space) => - controller.activeSpacesEntry.runtimeType == space.runtimeType && - (controller.activeSpaceId == space.getSpace(context)?.id)); - - final Map spaceHierarchy = - Map.fromEntries(controller.spacesEntries.map((e) => MapEntry(e, null))); - - // TODO(TheOeWithTheBraid): wait for space hierarchy https://gitlab.com/famedly/company/frontend/libraries/matrix_api_lite/-/merge_requests/58 - - return ListView.builder( - itemCount: spaceHierarchy.length + 1, - itemBuilder: (context, i) { - if (i == spaceHierarchy.length) { - return ListTile( - leading: CircleAvatar( - radius: Avatar.defaultSize / 2, - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.onSecondary, - child: const Icon( - Icons.archive_outlined, - ), - ), - title: Text(L10n.of(context)!.archive), - onTap: () { - Scaffold.of(context).closeDrawer(); - VRouter.of(context).to('/archive'); - }, - ); - } - final space = spaceHierarchy.keys.toList()[i]; - final room = space.getSpace(context); - final active = currentIndex == i; - return ListTile( - selected: active, - leading: room == null - ? CircleAvatar( - child: space.getIcon(active), - radius: Avatar.defaultSize / 2, - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.onSecondary, - ) - : Avatar( - mxContent: room.avatar, - name: space.getName(context), - ), - title: Text( - space.getName(context), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - subtitle: room?.topic.isEmpty ?? true - ? null - : Tooltip( - message: room!.topic, - child: Text( - room.topic.replaceAll('\n', ' '), - softWrap: false, - overflow: TextOverflow.fade, - ), - ), - onTap: () => controller.setActiveSpacesEntry( - context, - space, - ), - trailing: room != null - ? SizedBox( - width: 32, - child: IconButton( - splashRadius: 24, - icon: const Icon(Icons.edit_outlined), - tooltip: L10n.of(context)!.edit, - onPressed: () => controller.editSpace(context, room.id), - ), - ) - : const Icon(Icons.arrow_forward_ios_outlined), - ); - }, - ); - } -} diff --git a/lib/pages/chat_list/spaces_entry.dart b/lib/pages/chat_list/spaces_entry.dart deleted file mode 100644 index b9e064c2fa..0000000000 --- a/lib/pages/chat_list/spaces_entry.dart +++ /dev/null @@ -1,214 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import '../../widgets/matrix.dart'; - -// This is not necessarily a Space, but an abstract categorization of a room. -// More to the point, it's a selectable entry that *could* be a Space. -// Note that view code is in spaces_bottom_bar.dart because of type-specific UI. -// So only really generic functions (so far, anything ChatList cares about) go here. -// If getRoom returns something non-null, then it gets the avatar and such of a Space. -// Otherwise it gets to look like All Rooms. Future work impending. -abstract class SpacesEntry { - const SpacesEntry(); - - // Gets the (translated) name of this entry. - String getName(BuildContext context); - // Gets an icon for this entry (avoided if a space is given) - Icon getIcon(bool active) => active - ? const Icon(CupertinoIcons.chat_bubble_2_fill) - : const Icon(CupertinoIcons.chat_bubble_2); - // If this is a specific Room, returns the space Room for various purposes. - Room? getSpace(BuildContext context) => null; - // Gets a list of rooms - this is done as part of _ChatListViewBodyState to get the full list of rooms visible from this SpacesEntry. - List getRooms(BuildContext context); - // Checks that this entry is still valid. - bool stillValid(BuildContext context) => true; - // Returns true if the Stories header should be shown. - bool shouldShowStoriesHeader(BuildContext context) => false; -} - -// Common room validity checks -bool _roomCheckCommon(Room room, BuildContext context) { - if (room.isSpace && room.membership == Membership.join && !room.isUnread) { - return false; - } - if (room.getState(EventTypes.RoomCreate)?.content.tryGet('type') == - ClientStoriesExtension.storiesRoomType) { - return false; - } - return true; -} - -bool _roomInsideSpace(Room room, Room space) { - if (space.spaceChildren.any((child) => child.roomId == room.id)) { - return true; - } - if (room.spaceParents.any((parent) => parent.roomId == space.id)) { - return true; - } - return false; -} - -// "All rooms" entry. -class AllRoomsSpacesEntry extends SpacesEntry { - static final AllRoomsSpacesEntry _value = AllRoomsSpacesEntry._(); - AllRoomsSpacesEntry._(); - factory AllRoomsSpacesEntry() { - return _value; - } - - @override - String getName(BuildContext context) => L10n.of(context)!.allChats; - - @override - List getRooms(BuildContext context) { - return Matrix.of(context) - .client - .rooms - .where((room) => _roomCheckCommon(room, context)) - .toList(); - } - - @override - bool shouldShowStoriesHeader(BuildContext context) => true; - - @override - bool operator ==(Object other) { - return runtimeType == other.runtimeType; - } - - @override - int get hashCode => runtimeType.hashCode; -} - -// "Direct Chats" entry. -class DirectChatsSpacesEntry extends SpacesEntry { - static final DirectChatsSpacesEntry _value = DirectChatsSpacesEntry._(); - DirectChatsSpacesEntry._(); - factory DirectChatsSpacesEntry() { - return _value; - } - - @override - String getName(BuildContext context) => L10n.of(context)!.directChats; - - @override - List getRooms(BuildContext context) { - return Matrix.of(context) - .client - .rooms - .where((room) => room.isDirectChat && _roomCheckCommon(room, context)) - .toList(); - } - - @override - bool shouldShowStoriesHeader(BuildContext context) => true; - - @override - bool operator ==(Object other) { - return runtimeType == other.runtimeType; - } - - @override - int get hashCode => runtimeType.hashCode; -} - -// "Groups" entry. -class GroupsSpacesEntry extends SpacesEntry { - static final GroupsSpacesEntry _value = GroupsSpacesEntry._(); - GroupsSpacesEntry._(); - factory GroupsSpacesEntry() { - return _value; - } - - @override - String getName(BuildContext context) => L10n.of(context)!.groups; - - @override - Icon getIcon(bool active) => - active ? const Icon(Icons.group) : const Icon(Icons.group_outlined); - - @override - List getRooms(BuildContext context) { - final rooms = Matrix.of(context).client.rooms; - // Needs to match ChatList's definition of a space. - final spaces = rooms.where((room) => room.isSpace).toList(); - return rooms - .where((room) => - (!room.isDirectChat) && - _roomCheckCommon(room, context) && - separatedGroup(room, spaces)) - .toList(); - } - - bool separatedGroup(Room room, List spaces) { - return !spaces.any((space) => _roomInsideSpace(room, space)); - } - - @override - bool operator ==(Object other) { - return runtimeType == other.runtimeType; - } - - @override - int get hashCode => runtimeType.hashCode; -} - -// All rooms associated with a specific space. -class SpaceSpacesEntry extends SpacesEntry { - final Room space; - const SpaceSpacesEntry(this.space); - - @override - String getName(BuildContext context) => space.displayname; - - @override - Room? getSpace(BuildContext context) => space; - - @override - List getRooms(BuildContext context) { - return Matrix.of(context) - .client - .rooms - .where((room) => roomCheck(room, context)) - .toList(); - } - - bool roomCheck(Room room, BuildContext context) { - if (!_roomCheckCommon(room, context)) { - return false; - } - if (_roomInsideSpace(room, space)) { - return true; - } - if (AppConfig.showDirectChatsInSpaces) { - if (room.isDirectChat && - room.summary.mHeroes != null && - room.summary.mHeroes!.any((userId) { - final user = space.getState(EventTypes.RoomMember, userId)?.asUser; - return user != null && user.membership == Membership.join; - })) { - return true; - } - } - return false; - } - - @override - bool stillValid(BuildContext context) => - Matrix.of(context).client.getRoomById(space.id) != null; - - @override - bool operator ==(Object other) { - return hashCode == other.hashCode; - } - - @override - int get hashCode => space.id.hashCode; -} diff --git a/lib/pages/chat_list/start_chat_fab.dart b/lib/pages/chat_list/start_chat_fab.dart new file mode 100644 index 0000000000..3803d1516c --- /dev/null +++ b/lib/pages/chat_list/start_chat_fab.dart @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class StartChatFab extends StatelessWidget { + final bool extended; + const StartChatFab({this.extended = false, super.key}); + + @override + Widget build(BuildContext context) { + return FloatingActionButton.extended( + heroTag: 'start_chat_fab', + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + onPressed: () => context.go('/rooms/newprivatechat'), + extendedIconLabelSpacing: extended ? 10 : 0, + extendedPadding: extended + ? null + : const EdgeInsets.symmetric(horizontal: 16), + label: AnimatedSize( + alignment: Alignment.centerLeft, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: extended ? Text(L10n.of(context).newChat) : SizedBox.shrink(), + ), + icon: const Icon(Icons.edit_square), + ); + } +} diff --git a/lib/pages/chat_list/stories_header.dart b/lib/pages/chat_list/stories_header.dart deleted file mode 100644 index 8ef8556ed1..0000000000 --- a/lib/pages/chat_list/stories_header.dart +++ /dev/null @@ -1,309 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:collection/collection.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -enum ContextualRoomAction { - mute, - unmute, - leave, -} - -class StoriesHeader extends StatelessWidget { - final String filter; - const StoriesHeader({required this.filter, Key? key}) : super(key: key); - - void _addToStoryAction(BuildContext context) => - VRouter.of(context).to('/stories/create'); - - void _goToStoryAction(BuildContext context, String roomId) async { - final room = Matrix.of(context).client.getRoomById(roomId); - if (room == null) return; - if (room.membership != Membership.join) { - final result = await showFutureLoadingDialog( - context: context, - future: room.join, - ); - if (result.error != null) return; - } - VRouter.of(context).toSegments(['stories', roomId]); - } - - void _contextualActions(BuildContext context, Room room) async { - final action = await showModalActionSheet( - cancelLabel: L10n.of(context)!.cancel, - context: context, - actions: [ - if (room.pushRuleState != PushRuleState.notify) - SheetAction( - label: L10n.of(context)!.unmuteChat, - key: ContextualRoomAction.unmute, - icon: Icons.notifications_outlined, - ) - else - SheetAction( - label: L10n.of(context)!.muteChat, - key: ContextualRoomAction.mute, - icon: Icons.notifications_off_outlined, - ), - SheetAction( - label: L10n.of(context)!.unsubscribeStories, - key: ContextualRoomAction.leave, - icon: Icons.unsubscribe_outlined, - isDestructiveAction: true, - ), - ], - ); - if (action == null) return; - switch (action) { - case ContextualRoomAction.mute: - await showFutureLoadingDialog( - context: context, - future: () => room.setPushRuleState(PushRuleState.dontNotify), - ); - break; - case ContextualRoomAction.unmute: - await showFutureLoadingDialog( - context: context, - future: () => room.setPushRuleState(PushRuleState.notify), - ); - break; - case ContextualRoomAction.leave: - await showFutureLoadingDialog( - context: context, - future: () => room.leave(), - ); - break; - } - } - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - return StreamBuilder( - stream: Matrix.of(context).onShareContentChanged.stream, - builder: (context, _) => StreamBuilder( - stream: client.onSync.stream - .where((syncUpdate) => syncUpdate.hasRoomUpdate), - builder: (context, snapshot) { - if (Matrix.of(context).shareContent != null) { - return ListTile( - leading: CircleAvatar( - radius: Avatar.defaultSize / 2, - backgroundColor: Theme.of(context).colorScheme.surface, - foregroundColor: Theme.of(context).textTheme.bodyText1?.color, - child: const Icon(Icons.camera_alt_outlined), - ), - title: Text(L10n.of(context)!.addToStory), - onTap: () => _addToStoryAction(context), - ); - } - if (client.storiesRooms.isEmpty || - !client.storiesRooms.any((room) => room.displayname - .toLowerCase() - .contains(filter.toLowerCase()))) { - return Container(); - } - final ownStoryRoom = client.storiesRooms - .firstWhereOrNull((r) => r.creatorId == client.userID); - final stories = [ - if (ownStoryRoom != null) ownStoryRoom, - ...client.storiesRooms..remove(ownStoryRoom), - ]; - return SizedBox( - height: 98, - child: ListView.builder( - padding: const EdgeInsets.symmetric(horizontal: 12), - scrollDirection: Axis.horizontal, - itemCount: stories.length, - itemBuilder: (context, i) { - final room = stories[i]; - return FutureBuilder( - future: room.getCreatorProfile(), - builder: (context, snapshot) { - final userId = room.creatorId; - final displayname = snapshot.data?.displayName ?? - userId?.localpart ?? - 'Unknown'; - final avatarUrl = snapshot.data?.avatarUrl; - if (!displayname - .toLowerCase() - .contains(filter.toLowerCase())) { - return Container(); - } - return _StoryButton( - profile: Profile( - displayName: displayname, - avatarUrl: avatarUrl, - userId: userId ?? 'Unknown', - ), - heroTag: 'stories_${room.id}', - hasPosts: room.hasPosts || room == ownStoryRoom, - showEditFab: userId == client.userID, - unread: room.membership == Membership.invite || - (room.hasNewMessages && room.hasPosts), - onPressed: () => _goToStoryAction(context, room.id), - onLongPressed: () => - _contextualActions(context, room), - ); - }); - }, - ), - ); - }), - ); - } -} - -extension on Room { - Future getCreatorProfile() => - client.getProfileFromUserId(getState(EventTypes.RoomCreate)!.senderId); - - bool get hasPosts { - if (membership == Membership.invite) return true; - final lastEvent = this.lastEvent; - if (lastEvent == null) return false; - if (lastEvent.type != EventTypes.Message) return false; - if (DateTime.now().difference(lastEvent.originServerTs).inHours > - ClientStoriesExtension.lifeTimeInHours) { - return false; - } - return true; - } -} - -class _StoryButton extends StatelessWidget { - final Profile profile; - final bool showEditFab; - final bool unread; - final bool hasPosts; - final void Function() onPressed; - final void Function()? onLongPressed; - final String heroTag; - - const _StoryButton({ - required this.profile, - required this.onPressed, - required this.heroTag, - this.showEditFab = false, - this.hasPosts = true, - this.unread = false, - this.onLongPressed, - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 78, - child: InkWell( - borderRadius: BorderRadius.circular(7), - onTap: onPressed, - onLongPress: onLongPressed, - child: Opacity( - opacity: hasPosts ? 1 : 0.4, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Column( - children: [ - const SizedBox(height: 8), - Material( - borderRadius: BorderRadius.circular(Avatar.defaultSize), - child: Container( - padding: const EdgeInsets.all(3), - decoration: BoxDecoration( - gradient: unread - ? const LinearGradient( - colors: [ - Colors.red, - Colors.purple, - Colors.orange, - ], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ) - : null, - color: unread - ? null - : Theme.of(context).colorScheme.surfaceVariant, - borderRadius: BorderRadius.circular(Avatar.defaultSize), - ), - child: Stack( - children: [ - Material( - color: Theme.of(context).colorScheme.surface, - borderRadius: - BorderRadius.circular(Avatar.defaultSize), - child: Padding( - padding: const EdgeInsets.all(2.0), - child: CircleAvatar( - radius: 30, - backgroundColor: - Theme.of(context).colorScheme.surface, - foregroundColor: - Theme.of(context).textTheme.bodyText1?.color, - child: Hero( - tag: heroTag, - child: Avatar( - mxContent: profile.avatarUrl, - name: profile.displayName, - size: 100, - fontSize: 24, - ), - ), - ), - ), - ), - if (showEditFab) - Positioned( - right: 0, - bottom: 0, - child: SizedBox( - width: 24, - height: 24, - child: FloatingActionButton.small( - heroTag: null, - onPressed: () => - VRouter.of(context).to('/stories/create'), - child: const Icon( - Icons.add_outlined, - size: 16, - ), - ), - ), - ), - ], - ), - ), - ), - Center( - child: Text( - profile.displayName ?? '', - maxLines: 1, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12, - fontWeight: unread ? FontWeight.bold : null, - ), - ), - ), - ], - ), - ), - ), - ), - ); - } -} - -extension on Room { - String? get creatorId => getState(EventTypes.RoomCreate)?.senderId; -} diff --git a/lib/pages/chat_list/unread_bubble.dart b/lib/pages/chat_list/unread_bubble.dart new file mode 100644 index 0000000000..74aeef4b83 --- /dev/null +++ b/lib/pages/chat_list/unread_bubble.dart @@ -0,0 +1,59 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class UnreadBubble extends StatelessWidget { + final Room room; + const UnreadBubble({required this.room, super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final unread = room.isUnread; + final hasNotifications = room.notificationCount > 0; + final unreadBubbleSize = unread || room.hasNewMessages + ? room.notificationCount > 0 + ? 20.0 + : 14.0 + : 0.0; + return AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 7), + height: unreadBubbleSize, + width: !hasNotifications && !unread && !room.hasNewMessages + ? 0 + : (unreadBubbleSize - 9) * room.notificationCount.toString().length + + 9, + decoration: BoxDecoration( + color: room.highlightCount > 0 + ? theme.colorScheme.error + : hasNotifications || room.markedUnread + ? theme.colorScheme.primary + : theme.colorScheme.primaryContainer, + borderRadius: BorderRadius.circular(unreadBubbleSize), + ), + child: hasNotifications || room.markedUnread + ? Text( + room.notificationCount.toString(), + style: TextStyle( + color: room.highlightCount > 0 + ? theme.colorScheme.onError + : hasNotifications + ? theme.colorScheme.onPrimary + : theme.colorScheme.onPrimaryContainer, + fontSize: 13, + fontWeight: FontWeight.w500, + ), + textAlign: .center, + ) + : const SizedBox.shrink(), + ); + } +} diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart new file mode 100644 index 0000000000..6c8ae00d90 --- /dev/null +++ b/lib/pages/chat_members/chat_members.dart @@ -0,0 +1,119 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; +import 'chat_members_view.dart'; + +class ChatMembersPage extends StatefulWidget { + final String roomId; + + const ChatMembersPage({required this.roomId, super.key}); + + @override + State createState() => ChatMembersController(); +} + +class ChatMembersController extends State { + List? members; + List? filteredMembers; + Object? error; + Membership membershipFilter = Membership.join; + + final TextEditingController filterController = TextEditingController(); + + void setMembershipFilter(Membership membership) { + membershipFilter = membership; + setFilter(); + } + + Future setFilter([_]) async { + final filter = filterController.text.toLowerCase().trim(); + + final members = this.members + ?.where((member) => member.membership == membershipFilter) + .toList(); + + if (filter.isEmpty) { + setState(() { + filteredMembers = members + ?..sort((b, a) => a.powerLevel.level.compareTo(b.powerLevel.level)); + }); + return; + } + setState(() { + filteredMembers = + members + ?.where( + (user) => + user.displayName?.toLowerCase().contains(filter) ?? + user.id.toLowerCase().contains(filter), + ) + .toList() + ?..sort((b, a) => a.powerLevel.level.compareTo(b.powerLevel.level)); + }); + } + + Future refreshMembers([_]) async { + Logs().d('Load room members from', widget.roomId); + try { + setState(() { + error = null; + }); + final participants = await Matrix.of(context).client + .getRoomById(widget.roomId) + ?.requestParticipants( + [...Membership.values]..remove(Membership.leave), + ); + + if (!mounted) return; + + setState(() { + members = participants; + }); + setFilter(); + } catch (e, s) { + Logs().d( + 'Unable to request participants. Try again in 3 seconds...', + e, + s, + ); + setState(() { + error = e; + }); + } + } + + StreamSubscription? _updateSub; + + @override + void initState() { + super.initState(); + refreshMembers(); + + _updateSub = Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.rooms?.join?[widget.roomId]?.timeline?.events?.any( + (state) => state.type == EventTypes.RoomMember, + ) ?? + false, + ) + .listen(refreshMembers); + } + + @override + void dispose() { + _updateSub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ChatMembersView(this); +} diff --git a/lib/pages/chat_members/chat_members_view.dart b/lib/pages/chat_members/chat_members_view.dart new file mode 100644 index 0000000000..6e36ba3a88 --- /dev/null +++ b/lib/pages/chat_members/chat_members_view.dart @@ -0,0 +1,191 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/layouts/max_width_body.dart'; +import '../../widgets/matrix.dart'; +import '../chat_details/participant_list_item.dart'; +import 'chat_members.dart'; + +class ChatMembersView extends StatelessWidget { + final ChatMembersController controller; + + const ChatMembersView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = Matrix.of( + context, + ).client.getRoomById(controller.widget.roomId); + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final members = controller.filteredMembers; + + final roomCount = + (room.summary.mJoinedMemberCount ?? 0) + + (room.summary.mInvitedMemberCount ?? 0); + + final error = controller.error; + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).countParticipants(roomCount)), + actions: [ + if (room.canInvite) + IconButton( + onPressed: () => context.go('/rooms/${room.id}/invite'), + icon: const Icon(Icons.person_add_outlined), + ), + ], + ), + body: MaxWidthBody( + withScrolling: false, + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: error != null + ? Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: .min, + children: [ + const Icon(Icons.error_outline), + Text(error.toLocalizedString(context)), + const SizedBox(height: 8), + OutlinedButton.icon( + onPressed: controller.refreshMembers, + icon: const Icon(Icons.refresh_outlined), + label: Text(L10n.of(context).tryAgain), + ), + ], + ), + ), + ) + : members == null + ? const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(), + ), + ) + : ListView.builder( + shrinkWrap: true, + itemCount: members.length + 1, + itemBuilder: (context, i) { + if (i == 0) { + final availableFilters = Membership.values + .where( + (membership) => + controller.members?.any( + (member) => member.membership == membership, + ) ?? + false, + ) + .toList(); + availableFilters.sort( + (a, b) => a == Membership.join ? -1 : 1, + ); + return Column( + mainAxisSize: .min, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + controller: controller.filterController, + onChanged: controller.setFilter, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + prefixIcon: const Icon(Icons.search_outlined), + hintText: L10n.of(context).search, + ), + ), + ), + if (availableFilters.length > 1) + SizedBox( + height: 64, + child: ListView.builder( + padding: const EdgeInsets.all(12.0), + scrollDirection: Axis.horizontal, + itemCount: availableFilters.length, + itemBuilder: (context, i) => Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4.0, + ), + child: FilterChip( + label: Text(switch (availableFilters[i]) { + Membership.ban => L10n.of(context).banned, + Membership.invite => + L10n.of(context).countInvited( + room.summary.mInvitedMemberCount ?? + controller.members + ?.where( + (member) => + member.membership == + Membership.invite, + ) + .length ?? + 0, + ), + Membership.join => + L10n.of(context).countParticipants( + room.summary.mJoinedMemberCount ?? + controller.members + ?.where( + (member) => + member.membership == + Membership.join, + ) + .length ?? + 0, + ), + Membership.knock => L10n.of( + context, + ).knocking, + Membership.leave => L10n.of( + context, + ).leftTheChat, + }), + selected: + controller.membershipFilter == + availableFilters[i], + onSelected: (_) => controller + .setMembershipFilter(availableFilters[i]), + ), + ), + ), + ), + ], + ); + } + i--; + return ParticipantListItem(members[i]); + }, + ), + ), + ); + } +} diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index 372edc5f44..cb81bfc207 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -1,19 +1,19 @@ -import 'dart:developer'; - -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatPermissionsSettings extends StatefulWidget { - const ChatPermissionsSettings({Key? key}) : super(key: key); + const ChatPermissionsSettings({super.key}); @override ChatPermissionsSettingsController createState() => @@ -21,21 +21,30 @@ class ChatPermissionsSettings extends StatefulWidget { } class ChatPermissionsSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; - void editPowerLevel(BuildContext context, String key, int currentLevel, - {String? category}) async { + String? get roomId => GoRouterState.of(context).pathParameters['roomid']; + Future editPowerLevel( + BuildContext context, + String key, + int currentLevel, { + int? newLevel, + String? category, + }) async { final room = Matrix.of(context).client.getRoomById(roomId!)!; if (!room.canSendEvent(EventTypes.RoomPowerLevels)) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.noPermission))); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(L10n.of(context).noPermission))); return; } - final newLevel = - await PermissionSliderDialog(initialPermission: currentLevel) - .show(context); + newLevel ??= await showPermissionChooser( + context, + currentLevel: currentLevel, + ); if (newLevel == null) return; + if (!context.mounted) return; final content = Map.from( - room.getState(EventTypes.RoomPowerLevels)!.content); + room.getState(EventTypes.RoomPowerLevels)!.content, + ); if (category != null) { if (!content.containsKey(category)) { content[category] = {}; @@ -44,7 +53,6 @@ class ChatPermissionsSettingsController extends State { } else { content[key] = newLevel; } - inspect(content); await showFutureLoadingDialog( context: context, future: () => room.client.setRoomStateWithKey( @@ -57,44 +65,13 @@ class ChatPermissionsSettingsController extends State { } Stream get onChanged => Matrix.of(context).client.onSync.stream.where( - (e) => - (e.rooms?.join?.containsKey(roomId) ?? false) && - (e.rooms!.join![roomId!]?.timeline?.events - ?.any((s) => s.type == EventTypes.RoomPowerLevels) ?? - false), - ); - - void updateRoomAction(Capabilities capabilities) async { - final room = Matrix.of(context).client.getRoomById(roomId!)!; - final String roomVersion = - room.getState(EventTypes.RoomCreate)!.content['room_version'] ?? '1'; - final newVersion = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.replaceRoomWithNewerVersion, - actions: capabilities.mRoomVersions!.available.entries - .where((r) => r.key != roomVersion) - .map((version) => AlertDialogAction( - key: version.key, - label: - '${version.key} (${version.value.toString().split('.').last})')) - .toList(), - ); - if (newVersion == null || - OkCancelResult.cancel == - await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - title: L10n.of(context)!.areYouSure, - )) { - return; - } - await showFutureLoadingDialog( - context: context, - future: () => room.client.upgradeRoom(roomId!, newVersion), - ).then((_) => VRouter.of(context).pop()); - } + (e) => + (e.rooms?.join?.containsKey(roomId) ?? false) && + (e.rooms!.join![roomId!]?.timeline?.events?.any( + (s) => s.type == EventTypes.RoomPowerLevels, + ) ?? + false), + ); @override Widget build(BuildContext context) => ChatPermissionsSettingsView(this); diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart index 645d235887..9fdae473fe 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart @@ -1,35 +1,31 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; import 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class ChatPermissionsSettingsView extends StatelessWidget { final ChatPermissionsSettingsController controller; - const ChatPermissionsSettingsView(this.controller, {Key? key}) - : super(key: key); + const ChatPermissionsSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( appBar: AppBar( - leading: VRouter.of(context).path.startsWith('/spaces/') - ? null - : IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => VRouter.of(context) - .toSegments(['rooms', controller.roomId!]), - ), - title: Text(L10n.of(context)!.editChatPermissions), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).chatPermissions), ), body: MaxWidthBody( - withScrolling: true, child: StreamBuilder( stream: controller.onChanged, builder: (context, _) { @@ -38,95 +34,108 @@ class ChatPermissionsSettingsView extends StatelessWidget { ? null : Matrix.of(context).client.getRoomById(roomId); if (room == null) { - return Center(child: Text(L10n.of(context)!.noRoomsFound)); + return Center(child: Text(L10n.of(context).noRoomsFound)); } - final powerLevelsContent = Map.from( - room.getState(EventTypes.RoomPowerLevels)!.content); + final powerLevelsContent = Map.from( + room.getState(EventTypes.RoomPowerLevels)?.content ?? {}, + ); final powerLevels = Map.from(powerLevelsContent) ..removeWhere((k, v) => v is! int); - final eventsPowerLevels = - Map.from(powerLevelsContent['events'] ?? {}) - ..removeWhere((k, v) => v is! int); + final eventsPowerLevels = Map.from( + powerLevelsContent.tryGetMap('events') ?? {}, + )..removeWhere((k, v) => v is! int); return Column( children: [ + ListTile( + leading: const Icon(Icons.info_outlined), + subtitle: Text(L10n.of(context).chatPermissionsDescription), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).chatPermissions, + style: TextStyle( + color: theme.colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - for (var entry in powerLevels.entries) + for (final entry in powerLevels.entries) PermissionsListTile( permissionKey: entry.key, permission: entry.value, - onTap: () => controller.editPowerLevel( - context, entry.key, entry.value), + onChanged: (level) => controller.editPowerLevel( + context, + entry.key, + entry.value, + newLevel: level, + ), + canEdit: room.canChangePowerLevel, ), - const Divider(thickness: 1), + Divider(color: theme.dividerColor), ListTile( title: Text( - L10n.of(context)!.notifications, + L10n.of(context).notifications, style: TextStyle( - color: Theme.of(context).primaryColor, + color: theme.colorScheme.primary, fontWeight: FontWeight.bold, ), ), ), - Builder(builder: (context) { - const key = 'rooms'; - final int value = powerLevelsContent - .containsKey('notifications') - ? powerLevelsContent['notifications']['rooms'] ?? 0 - : 0; - return PermissionsListTile( - permissionKey: key, - permission: value, - category: 'notifications', - onTap: () => controller.editPowerLevel( - context, key, value, - category: 'notifications'), - ); - }), - const Divider(thickness: 1), + Builder( + builder: (context) { + const key = 'rooms'; + final value = + powerLevelsContent.containsKey('notifications') + ? powerLevelsContent + .tryGetMap( + 'notifications', + ) + ?.tryGet('rooms') ?? + 0 + : 0; + return PermissionsListTile( + permissionKey: key, + permission: value, + category: 'notifications', + canEdit: room.canChangePowerLevel, + onChanged: (level) => controller.editPowerLevel( + context, + key, + value, + newLevel: level, + category: 'notifications', + ), + ); + }, + ), + Divider(color: theme.dividerColor), ListTile( title: Text( - L10n.of(context)!.configureChat, + L10n.of(context).configureChat, style: TextStyle( - color: Theme.of(context).primaryColor, + color: theme.colorScheme.primary, fontWeight: FontWeight.bold, ), ), ), - for (var entry in eventsPowerLevels.entries) + for (final entry in eventsPowerLevels.entries) PermissionsListTile( permissionKey: entry.key, category: 'events', - permission: entry.value, - onTap: () => controller.editPowerLevel( - context, entry.key, entry.value, - category: 'events'), - ), - if (room.canSendEvent(EventTypes.RoomTombstone)) ...{ - const Divider(thickness: 1), - FutureBuilder( - future: room.client.getCapabilities(), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); - } - final String roomVersion = room - .getState(EventTypes.RoomCreate)! - .content['room_version'] ?? - '1'; - - return ListTile( - title: Text( - '${L10n.of(context)!.roomVersion}: $roomVersion'), - onTap: () => - controller.updateRoomAction(snapshot.data!), - ); - }, + permission: entry.value ?? 0, + canEdit: room.canChangePowerLevel, + onChanged: (level) => controller.editPowerLevel( + context, + entry.key, + entry.value ?? 0, + newLevel: level, + category: 'events', + ), ), - }, ], ), ], diff --git a/lib/pages/chat_permissions_settings/permission_list_tile.dart b/lib/pages/chat_permissions_settings/permission_list_tile.dart index f16a40d8a0..5631170988 100644 --- a/lib/pages/chat_permissions_settings/permission_list_tile.dart +++ b/lib/pages/chat_permissions_settings/permission_list_tile.dart @@ -1,63 +1,72 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; class PermissionsListTile extends StatelessWidget { final String permissionKey; final int permission; final String? category; - final void Function()? onTap; + final void Function(int? level)? onChanged; + final bool canEdit; const PermissionsListTile({ - Key? key, + super.key, required this.permissionKey, required this.permission, this.category, - this.onTap, - }) : super(key: key); + required this.onChanged, + required this.canEdit, + }); String getLocalizedPowerLevelString(BuildContext context) { if (category == null) { switch (permissionKey) { case 'users_default': - return L10n.of(context)!.defaultPermissionLevel; + return L10n.of(context).defaultPermissionLevel; case 'events_default': - return L10n.of(context)!.sendMessages; + return L10n.of(context).sendMessages; case 'state_default': - return L10n.of(context)!.configureChat; + return L10n.of(context).changeGeneralChatSettings; case 'ban': - return L10n.of(context)!.banFromChat; + return L10n.of(context).banFromChat; case 'kick': - return L10n.of(context)!.kickFromChat; + return L10n.of(context).kickFromChat; case 'redact': - return L10n.of(context)!.deleteMessage; + return L10n.of(context).deleteMessage; case 'invite': - return L10n.of(context)!.inviteContact; + return L10n.of(context).inviteOtherUsers; } } else if (category == 'notifications') { switch (permissionKey) { case 'rooms': - return L10n.of(context)!.notifications; + return L10n.of(context).sendRoomNotifications; } } else if (category == 'events') { switch (permissionKey) { case EventTypes.RoomName: - return L10n.of(context)!.changeTheNameOfTheGroup; + return L10n.of(context).changeTheNameOfTheGroup; + case EventTypes.RoomTopic: + return L10n.of(context).changeTheDescriptionOfTheGroup; case EventTypes.RoomPowerLevels: - return L10n.of(context)!.editChatPermissions; + return L10n.of(context).changeTheChatPermissions; case EventTypes.HistoryVisibility: - return L10n.of(context)!.visibilityOfTheChatHistory; + return L10n.of(context).changeTheVisibilityOfChatHistory; case EventTypes.RoomCanonicalAlias: - return L10n.of(context)!.setInvitationLink; + return L10n.of(context).changeTheCanonicalRoomAlias; case EventTypes.RoomAvatar: - return L10n.of(context)!.editRoomAvatar; + return L10n.of(context).editRoomAvatar; case EventTypes.RoomTombstone: - return L10n.of(context)!.replaceRoomWithNewerVersion; + return L10n.of(context).replaceRoomWithNewerVersion; case EventTypes.Encryption: - return L10n.of(context)!.enableEncryption; + return L10n.of(context).enableEncryption; case 'm.room.server_acl': - return L10n.of(context)!.editBlockedServers; + return L10n.of(context).editBlockedServers; } } return permissionKey; @@ -65,40 +74,54 @@ class PermissionsListTile extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final color = permission >= 100 + ? Colors.orangeAccent + : permission >= 50 + ? Colors.blueAccent + : Colors.greenAccent; return ListTile( - onTap: onTap, - leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: const Icon(Icons.edit_attributes_outlined), + title: Text( + getLocalizedPowerLevelString(context), + style: theme.textTheme.titleSmall, ), - title: Text(getLocalizedPowerLevelString(context)), - subtitle: Row( - children: [ - Container( - padding: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: Theme.of(context).secondaryHeaderColor, - borderRadius: BorderRadius.circular(8), + trailing: Material( + color: color.withAlpha(32), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: DropdownButton( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + underline: const SizedBox.shrink(), + onChanged: canEdit ? onChanged : null, + value: permission, + items: [ + DropdownMenuItem( + value: permission < 50 ? permission : 0, + child: Text( + L10n.of(context).userLevel(permission < 50 ? permission : 0), + ), + ), + DropdownMenuItem( + value: permission < 100 && permission >= 50 ? permission : 50, + child: Text( + L10n.of(context).moderatorLevel( + permission < 100 && permission >= 50 ? permission : 50, + ), + ), ), - child: Center( - child: Text(permission.toString()), + DropdownMenuItem( + value: permission >= 100 ? permission : 100, + child: Text( + L10n.of( + context, + ).adminLevel(permission >= 100 ? permission : 100), + ), ), - ), - const SizedBox(width: 8), - Text(permission.toLocalizedPowerLevelString(context)), - ], + DropdownMenuItem(value: null, child: Text(L10n.of(context).custom)), + ], + ), ), ); } } - -extension on int { - String toLocalizedPowerLevelString(BuildContext context) { - return this == 100 - ? L10n.of(context)!.admin - : this >= 50 - ? L10n.of(context)!.moderator - : L10n.of(context)!.participant; - } -} diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart new file mode 100644 index 0000000000..e0bc810205 --- /dev/null +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -0,0 +1,112 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_search/search_footer.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class ChatSearchFilesTab extends StatelessWidget { + final Room room; + final List events; + final void Function() onStartSearch; + final bool endReached, isLoading; + final DateTime? searchedUntil; + + const ChatSearchFilesTab({ + required this.room, + required this.events, + required this.onStartSearch, + required this.endReached, + required this.isLoading, + super.key, + required this.searchedUntil, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return SelectionArea( + child: ListView.builder( + padding: const EdgeInsets.all(8.0), + itemCount: events.length + 1, + itemBuilder: (context, i) { + if (i == events.length) { + return SearchFooter( + searchedUntil: searchedUntil, + endReached: endReached, + isLoading: isLoading, + onStartSearch: onStartSearch, + ); + } + final event = events[i]; + final filename = + event.content.tryGet('filename') ?? + event.content.tryGet('body') ?? + L10n.of(context).unknownEvent('File'); + final filetype = (filename.contains('.') + ? filename.split('.').last.toUpperCase() + : event.content + .tryGetMap('info') + ?.tryGet('mimetype') + ?.toUpperCase() ?? + 'UNKNOWN'); + final sizeString = event.sizeString; + final prevEvent = i > 0 ? events[i - 1] : null; + final sameEnvironment = + prevEvent != null && + prevEvent.originServerTs.sameEnvironment(event.originServerTs); + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!sameEnvironment) ...[ + Row( + children: [ + Expanded( + child: Container(height: 1, color: theme.dividerColor), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + event.originServerTs.localizedTime(context), + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Container(height: 1, color: theme.dividerColor), + ), + ], + ), + const SizedBox(height: 4), + ], + Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.onInverseSurface, + clipBehavior: Clip.hardEdge, + child: ListTile( + leading: const Icon(Icons.file_present_outlined), + title: Text( + filename, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text('$sizeString | $filetype'), + onTap: () => event.saveFile(context), + ), + ), + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/chat_search/chat_search_images_tab.dart b/lib/pages/chat_search/chat_search_images_tab.dart new file mode 100644 index 0000000000..ff8ed41ea4 --- /dev/null +++ b/lib/pages/chat_search/chat_search_images_tab.dart @@ -0,0 +1,129 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/pages/chat/events/video_player.dart'; +import 'package:fluffychat/pages/chat_search/search_footer.dart'; +import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:matrix/matrix.dart'; + +class ChatSearchImagesTab extends StatelessWidget { + final Room room; + final List events; + final void Function() onStartSearch; + final bool endReached, isLoading; + final DateTime? searchedUntil; + + const ChatSearchImagesTab({ + required this.room, + required this.events, + required this.onStartSearch, + required this.endReached, + required this.isLoading, + super.key, + required this.searchedUntil, + }); + + @override + Widget build(BuildContext context) { + final borderRadius = BorderRadius.circular(AppConfig.borderRadius / 2); + final theme = Theme.of(context); + + final eventsByMonth = >{}; + for (final event in events) { + final month = DateTime( + event.originServerTs.year, + event.originServerTs.month, + ); + eventsByMonth[month] ??= []; + eventsByMonth[month]!.add(event); + } + final eventsByMonthList = eventsByMonth.entries.toList(); + + const padding = 8.0; + + return ListView.builder( + itemCount: eventsByMonth.length + 1, + itemBuilder: (context, i) { + if (i == eventsByMonth.length) { + return SearchFooter( + searchedUntil: searchedUntil, + endReached: endReached, + isLoading: isLoading, + onStartSearch: onStartSearch, + ); + } + + final monthEvents = eventsByMonthList[i].value; + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 4), + Row( + children: [ + Expanded( + child: Container(height: 1, color: theme.dividerColor), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + DateFormat.yMMMM( + Localizations.localeOf(context).languageCode, + ).format(eventsByMonthList[i].key), + style: theme.textTheme.labelSmall, + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Container(height: 1, color: theme.dividerColor), + ), + ], + ), + GridView.count( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + mainAxisSpacing: padding, + crossAxisSpacing: padding, + clipBehavior: Clip.hardEdge, + padding: const EdgeInsets.all(padding), + crossAxisCount: 3, + children: monthEvents.map((event) { + if (event.messageType == MessageTypes.Video) { + return Material( + clipBehavior: Clip.hardEdge, + borderRadius: borderRadius, + child: EventVideoPlayer(event), + ); + } + return InkWell( + onTap: () => showDialog( + context: context, + builder: (_) => ImageViewer(event, outerContext: context), + ), + borderRadius: borderRadius, + child: Material( + clipBehavior: Clip.hardEdge, + borderRadius: borderRadius, + child: MxcImage( + event: event, + width: 128, + height: 128, + fit: BoxFit.cover, + animated: true, + isThumbnail: true, + ), + ), + ); + }).toList(), + ), + ], + ); + }, + ); + } +} diff --git a/lib/pages/chat_search/chat_search_message_tab.dart b/lib/pages/chat_search/chat_search_message_tab.dart new file mode 100644 index 0000000000..8c91c6b1bb --- /dev/null +++ b/lib/pages/chat_search/chat_search_message_tab.dart @@ -0,0 +1,147 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_search/search_footer.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +class ChatSearchMessageTab extends StatelessWidget { + final String searchQuery; + final Room room; + final List events; + final void Function() onStartSearch; + final bool endReached, isLoading; + final DateTime? searchedUntil; + + const ChatSearchMessageTab({ + required this.searchQuery, + required this.room, + required this.onStartSearch, + required this.events, + required this.searchedUntil, + required this.endReached, + required this.isLoading, + super.key, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if (events.isEmpty && searchQuery.isEmpty) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.search_outlined, size: 64), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32.0), + child: Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + ), + textAlign: TextAlign.center, + ), + ), + ], + ); + } + + return SelectionArea( + child: ListView.separated( + itemCount: events.length + 1, + separatorBuilder: (context, _) => + Divider(color: theme.dividerColor, height: 1), + itemBuilder: (context, i) { + if (i == events.length) { + return SearchFooter( + searchedUntil: searchedUntil, + endReached: endReached, + isLoading: isLoading, + onStartSearch: onStartSearch, + ); + } + final event = events[i]; + final sender = event.senderFromMemoryOrFallback; + final displayname = sender.calcDisplayname( + i18n: MatrixLocals(L10n.of(context)), + ); + return _MessageSearchResultListTile( + sender: sender, + displayname: displayname, + event: event, + room: room, + ); + }, + ), + ); + } +} + +class _MessageSearchResultListTile extends StatelessWidget { + const _MessageSearchResultListTile({ + required this.sender, + required this.displayname, + required this.event, + required this.room, + }); + + final User sender; + final String displayname; + final Event event; + final Room room; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return ListTile( + title: Row( + children: [ + Avatar(mxContent: sender.avatarUrl, name: displayname, size: 16), + const SizedBox(width: 8), + Text(displayname), + Expanded( + child: Text( + ' | ${event.originServerTs.localizedTimeShort(context)}', + style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + subtitle: Linkify( + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + text: event + .calcLocalizedBodyFallback( + plaintextBody: true, + removeMarkdown: true, + MatrixLocals(L10n.of(context)), + ) + .trim(), + maxLines: 7, + overflow: TextOverflow.ellipsis, + ), + trailing: IconButton( + icon: const Icon(Icons.chevron_right_outlined), + onPressed: () => context.go( + '/${Uri(pathSegments: ['rooms', room.id], queryParameters: {'event': event.eventId})}', + ), + ), + ); + } +} diff --git a/lib/pages/chat_search/chat_search_page.dart b/lib/pages/chat_search/chat_search_page.dart new file mode 100644 index 0000000000..19dd532258 --- /dev/null +++ b/lib/pages/chat_search/chat_search_page.dart @@ -0,0 +1,141 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/pages/chat_search/chat_search_view.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class ChatSearchPage extends StatefulWidget { + final String roomId; + const ChatSearchPage({required this.roomId, super.key}); + + @override + ChatSearchController createState() => ChatSearchController(); +} + +class ChatSearchController extends State + with SingleTickerProviderStateMixin { + Room? get room => Matrix.of(context).client.getRoomById(widget.roomId); + + final TextEditingController searchController = TextEditingController(); + late final TabController tabController; + + final List messages = []; + final List images = []; + final List files = []; + String? messagesNextBatch, imagesNextBatch, filesNextBatch; + bool messagesEndReached = false; + bool imagesEndReached = false; + bool filesEndReached = false; + bool isLoading = false; + DateTime? searchedUntil; + + void restartSearch() { + setState(() { + messages.clear(); + images.clear(); + files.clear(); + messagesNextBatch = imagesNextBatch = filesNextBatch = searchedUntil = + null; + messagesEndReached = imagesEndReached = filesEndReached = false; + }); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + startSearch(); + }); + } + + Future startSearch() async { + switch (tabController.index) { + case 0: + final searchQuery = searchController.text.trim(); + if (searchQuery.isEmpty) return; + setState(() { + isLoading = true; + }); + final result = await room!.searchEvents( + searchTerm: searchController.text.trim(), + nextBatch: messagesNextBatch, + ); + setState(() { + isLoading = false; + messages.addAll(result.events); + messagesNextBatch = result.nextBatch; + messagesEndReached = result.nextBatch == null; + searchedUntil = result.searchedUntil; + }); + return; + case 1: + setState(() { + isLoading = true; + }); + final result = await room!.searchEvents( + searchFunc: (event) => { + MessageTypes.Image, + MessageTypes.Video, + }.contains(event.messageType), + nextBatch: imagesNextBatch, + ); + setState(() { + isLoading = false; + images.addAll(result.events); + imagesNextBatch = result.nextBatch; + imagesEndReached = result.nextBatch == null; + searchedUntil = result.searchedUntil; + }); + return; + case 2: + setState(() { + isLoading = true; + }); + final result = await room!.searchEvents( + searchFunc: (event) => + event.messageType == MessageTypes.File || + (event.messageType == MessageTypes.Audio && + !event.content.containsKey('org.matrix.msc3245.voice')), + nextBatch: filesNextBatch, + ); + setState(() { + isLoading = false; + files.addAll(result.events); + filesNextBatch = result.nextBatch; + filesEndReached = result.nextBatch == null; + searchedUntil = result.searchedUntil; + }); + return; + default: + return; + } + } + + void _onTabChanged() { + switch (tabController.index) { + case 1: + case 2: + startSearch(); + break; + case 0: + default: + restartSearch(); + break; + } + } + + @override + void initState() { + super.initState(); + tabController = TabController(initialIndex: 0, length: 3, vsync: this); + tabController.addListener(_onTabChanged); + } + + @override + void dispose() { + tabController.removeListener(_onTabChanged); + super.dispose(); + } + + @override + Widget build(BuildContext context) => ChatSearchView(this); +} diff --git a/lib/pages/chat_search/chat_search_view.dart b/lib/pages/chat_search/chat_search_view.dart new file mode 100644 index 0000000000..e90a4ecfc0 --- /dev/null +++ b/lib/pages/chat_search/chat_search_view.dart @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_images_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart'; +import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; + +class ChatSearchView extends StatelessWidget { + final ChatSearchController controller; + + const ChatSearchView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final room = controller.room; + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ), + ); + } + + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: const Center(child: BackButton()), + titleSpacing: 0, + title: Text( + L10n.of(context).searchIn( + room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + ), + ), + ), + body: MaxWidthBody( + withScrolling: false, + child: Column( + children: [ + if (FluffyThemes.isThreeColumnMode(context)) + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: TextField( + controller: controller.searchController, + onSubmitted: (_) => controller.restartSearch(), + autofocus: true, + enabled: controller.tabController.index == 0, + decoration: InputDecoration( + hintText: L10n.of(context).search, + prefixIcon: const Icon(Icons.search_outlined), + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + ), + ), + ), + TabBar( + controller: controller.tabController, + tabs: [ + Tab(child: Text(L10n.of(context).messages)), + Tab(child: Text(L10n.of(context).gallery)), + Tab(child: Text(L10n.of(context).files)), + ], + ), + Expanded( + child: TabBarView( + controller: controller.tabController, + children: [ + ChatSearchMessageTab( + searchQuery: controller.searchController.text, + room: room, + onStartSearch: controller.startSearch, + events: controller.messages, + endReached: controller.messagesEndReached, + isLoading: controller.isLoading, + searchedUntil: controller.searchedUntil, + ), + ChatSearchImagesTab( + room: room, + onStartSearch: controller.startSearch, + events: controller.images, + endReached: controller.imagesEndReached, + isLoading: controller.isLoading, + searchedUntil: controller.searchedUntil, + ), + ChatSearchFilesTab( + room: room, + onStartSearch: controller.startSearch, + events: controller.files, + endReached: controller.filesEndReached, + isLoading: controller.isLoading, + searchedUntil: controller.searchedUntil, + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/chat_search/search_footer.dart b/lib/pages/chat_search/search_footer.dart new file mode 100644 index 0000000000..932334e6b4 --- /dev/null +++ b/lib/pages/chat_search/search_footer.dart @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:flutter/material.dart'; + +class SearchFooter extends StatelessWidget { + final DateTime? searchedUntil; + final bool endReached, isLoading; + final void Function() onStartSearch; + + const SearchFooter({ + super.key, + required this.searchedUntil, + required this.endReached, + required this.isLoading, + required this.onStartSearch, + }); + + @override + Widget build(BuildContext context) { + if (endReached) { + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text(L10n.of(context).noMoreResultsFound), + ), + ); + } + final theme = Theme.of(context); + final searchedUntil = this.searchedUntil; + return Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: .min, + children: [ + if (searchedUntil != null) + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Text( + L10n.of( + context, + ).chatSearchedUntil(searchedUntil.localizedTime(context)), + style: TextStyle(fontSize: 10.5), + ), + ), + TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: theme.colorScheme.onSecondaryContainer, + ), + onPressed: isLoading ? null : onStartSearch, + icon: isLoading + ? SizedBox.square( + dimension: 18, + child: const CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ) + : const Icon(Icons.arrow_downward_outlined), + label: Text(L10n.of(context).searchMore), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/connect/connect_page.dart b/lib/pages/connect/connect_page.dart deleted file mode 100644 index 01086becd3..0000000000 --- a/lib/pages/connect/connect_page.dart +++ /dev/null @@ -1,191 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_web_auth/flutter_web_auth.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pages/connect/connect_page_view.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class ConnectPage extends StatefulWidget { - const ConnectPage({Key? key}) : super(key: key); - - @override - State createState() => ConnectPageController(); -} - -class ConnectPageController extends State { - final TextEditingController usernameController = TextEditingController(); - String? signupError; - bool loading = false; - - void pickAvatar() async { - final source = !PlatformInfos.isMobile - ? ImageSource.gallery - : await showModalActionSheet( - context: context, - title: L10n.of(context)!.changeYourAvatar, - actions: [ - SheetAction( - key: ImageSource.camera, - label: L10n.of(context)!.openCamera, - isDefaultAction: true, - icon: Icons.camera_alt_outlined, - ), - SheetAction( - key: ImageSource.gallery, - label: L10n.of(context)!.openGallery, - icon: Icons.photo_outlined, - ), - ], - ); - if (source == null) return; - final picked = await ImagePicker().pickImage( - source: source, - imageQuality: 50, - maxWidth: 512, - maxHeight: 512, - ); - setState(() { - Matrix.of(context).loginAvatar = picked; - }); - } - - void signUp() async { - usernameController.text = usernameController.text.trim(); - final localpart = - usernameController.text.toLowerCase().replaceAll(' ', '_'); - if (localpart.isEmpty) { - setState(() { - signupError = L10n.of(context)!.pleaseChooseAUsername; - }); - return; - } - - setState(() { - signupError = null; - loading = true; - }); - - try { - try { - await Matrix.of(context).getLoginClient().register(username: localpart); - } on MatrixException catch (e) { - if (!e.requireAdditionalAuthentication) rethrow; - } - setState(() { - loading = false; - }); - Matrix.of(context).loginUsername = usernameController.text; - VRouter.of(context).to('signup'); - } catch (e, s) { - Logs().d('Sign up failed', e, s); - setState(() { - signupError = e.toLocalizedString(context); - loading = false; - }); - } - } - - bool _supportsFlow(String flowType) => - Matrix.of(context) - .loginHomeserverSummary - ?.loginFlows - .any((flow) => flow.type == flowType) ?? - false; - - bool get supportsSso => - (PlatformInfos.isMobile || - PlatformInfos.isWeb || - PlatformInfos.isMacOS) && - _supportsFlow('m.login.sso'); - - bool get supportsLogin => _supportsFlow('m.login.password'); - - void login() => VRouter.of(context).to('login'); - - Map? _rawLoginTypes; - - List? get identityProviders { - final loginTypes = _rawLoginTypes; - if (loginTypes == null) return null; - final rawProviders = loginTypes.tryGetList('flows')!.singleWhere((flow) => - flow['type'] == AuthenticationTypes.sso)['identity_providers']; - final list = (rawProviders as List) - .map((json) => IdentityProvider.fromJson(json)) - .toList(); - if (PlatformInfos.isCupertinoStyle) { - list.sort((a, b) => a.brand == 'apple' ? -1 : 1); - } - return list; - } - - void ssoLoginAction(String id) async { - final redirectUrl = kIsWeb - ? html.window.origin! + '/web/auth.html' - : AppConfig.appOpenUrlScheme.toLowerCase() + '://login'; - final url = - '${Matrix.of(context).getLoginClient().homeserver?.toString()}/_matrix/client/r0/login/sso/redirect/${Uri.encodeComponent(id)}?redirectUrl=${Uri.encodeQueryComponent(redirectUrl)}'; - final urlScheme = Uri.parse(redirectUrl).scheme; - final result = await FlutterWebAuth.authenticate( - url: url, - callbackUrlScheme: urlScheme, - ); - final token = Uri.parse(result).queryParameters['loginToken']; - if (token?.isEmpty ?? false) return; - - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).getLoginClient().login( - LoginType.mLoginToken, - token: token, - initialDeviceDisplayName: PlatformInfos.clientName, - ), - ); - } - - @override - void initState() { - super.initState(); - if (supportsSso) { - Matrix.of(context) - .getLoginClient() - .request( - RequestType.GET, - '/client/r0/login', - ) - .then((loginTypes) => setState(() { - _rawLoginTypes = loginTypes; - })); - } - } - - @override - Widget build(BuildContext context) => ConnectPageView(this); -} - -class IdentityProvider { - final String? id; - final String? name; - final String? icon; - final String? brand; - - IdentityProvider({this.id, this.name, this.icon, this.brand}); - - factory IdentityProvider.fromJson(Map json) => - IdentityProvider( - id: json['id'], - name: json['name'], - icon: json['icon'], - brand: json['brand'], - ); -} diff --git a/lib/pages/connect/connect_page_view.dart b/lib/pages/connect/connect_page_view.dart deleted file mode 100644 index 2695726e14..0000000000 --- a/lib/pages/connect/connect_page_view.dart +++ /dev/null @@ -1,176 +0,0 @@ -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/pages/connect/connect_page.dart'; -import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'sso_button.dart'; - -class ConnectPageView extends StatelessWidget { - final ConnectPageController controller; - const ConnectPageView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final avatar = Matrix.of(context).loginAvatar; - final identityProviders = controller.identityProviders; - return LoginScaffold( - appBar: AppBar( - automaticallyImplyLeading: !controller.loading, - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - centerTitle: true, - title: Text( - Matrix.of(context).getLoginClient().homeserver?.host ?? '', - style: const TextStyle(color: Colors.white), - ), - ), - body: ListView( - children: [ - if (Matrix.of(context).loginRegistrationSupported ?? false) ...[ - Padding( - padding: const EdgeInsets.all(16.0), - child: Center( - child: Stack( - children: [ - Material( - borderRadius: BorderRadius.circular(64), - elevation: 10, - color: Colors.transparent, - clipBehavior: Clip.hardEdge, - child: CircleAvatar( - radius: 64, - backgroundColor: Colors.white.withAlpha(200), - child: avatar == null - ? const Icon( - Icons.person_outlined, - color: Colors.black, - size: 64, - ) - : FutureBuilder( - future: avatar.readAsBytes(), - builder: (context, snapshot) { - final bytes = snapshot.data; - if (bytes == null) { - return const CircularProgressIndicator - .adaptive(); - } - return Image.memory( - bytes, - fit: BoxFit.cover, - width: 128, - height: 128, - ); - }, - ), - ), - ), - Positioned( - bottom: 0, - right: 0, - child: FloatingActionButton( - mini: true, - onPressed: controller.pickAvatar, - backgroundColor: Colors.white, - foregroundColor: Colors.black, - child: const Icon(Icons.camera_alt_outlined), - ), - ), - ], - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - controller: controller.usernameController, - onSubmitted: (_) => controller.signUp(), - decoration: InputDecoration( - prefixIcon: const Icon(Icons.account_box_outlined), - hintText: L10n.of(context)!.chooseAUsername, - errorText: controller.signupError, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Hero( - tag: 'loginButton', - child: ElevatedButton( - onPressed: controller.loading ? () {} : controller.signUp, - child: controller.loading - ? const LinearProgressIndicator() - : Text(L10n.of(context)!.signUp), - ), - ), - ), - Row( - children: [ - const Expanded(child: Divider(color: Colors.white)), - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - L10n.of(context)!.or, - style: const TextStyle(color: Colors.white), - ), - ), - const Expanded(child: Divider(color: Colors.white)), - ], - ), - ], - if (controller.supportsSso) - identityProviders == null - ? const SizedBox( - height: 74, - child: Center( - child: CircularProgressIndicator.adaptive( - backgroundColor: Colors.white, - )), - ) - : Center( - child: identityProviders.length == 1 - ? Padding( - padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - onPressed: () => controller - .ssoLoginAction(identityProviders.single.id!), - child: Text(identityProviders.single.name ?? - identityProviders.single.brand ?? - L10n.of(context)!.loginWithOneClick), - ), - ) - : Wrap( - children: [ - for (final identityProvider in identityProviders) - SsoButton( - onPressed: () => controller - .ssoLoginAction(identityProvider.id!), - identityProvider: identityProvider, - ), - ].toList(), - ), - ), - if (controller.supportsLogin) - Padding( - padding: const EdgeInsets.all(16.0), - child: Hero( - tag: 'signinButton', - child: ElevatedButton( - onPressed: controller.loading ? () {} : controller.login, - child: Text(L10n.of(context)!.login), - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/pages/connect/sso_button.dart b/lib/pages/connect/sso_button.dart deleted file mode 100644 index 1a099da2ea..0000000000 --- a/lib/pages/connect/sso_button.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pages/connect/connect_page.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class SsoButton extends StatelessWidget { - final IdentityProvider identityProvider; - final void Function()? onPressed; - const SsoButton({ - Key? key, - required this.identityProvider, - this.onPressed, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onPressed, - borderRadius: BorderRadius.circular(7), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 6.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Material( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - clipBehavior: Clip.hardEdge, - child: Padding( - padding: const EdgeInsets.all(4.0), - child: identityProvider.icon == null - ? const Icon(Icons.web_outlined) - : CachedNetworkImage( - imageUrl: Uri.parse(identityProvider.icon!) - .getDownloadLink( - Matrix.of(context).getLoginClient()) - .toString(), - width: 32, - height: 32, - ), - ), - ), - const SizedBox(height: 8), - Text( - identityProvider.name ?? - identityProvider.brand ?? - L10n.of(context)!.singlesignon, - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index 294e2ed338..0791b10177 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -1,18 +1,25 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:adaptive_dialog/adaptive_dialog.dart'; +import 'package:async/async.dart' show Result; import 'package:collection/collection.dart' show IterableExtension; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/encryption/utils/key_verification.dart'; -import 'package:matrix/matrix.dart'; - +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/device_settings/device_settings_view.dart'; import 'package:fluffychat/pages/key_verification/key_verification_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart' hide Result; +import 'package:url_launcher/url_launcher_string.dart'; + import '../../widgets/matrix.dart'; class DevicesSettings extends StatefulWidget { - const DevicesSettings({Key? key}) : super(key: key); + const DevicesSettings({super.key}); @override DevicesSettingsController createState() => DevicesSettingsController(); @@ -28,85 +35,116 @@ class DevicesSettingsController extends State { void reload() => setState(() => devices = null); - bool loadingDeletingDevices = false; - String? errorDeletingDevices; + bool? chatBackupEnabled; - void removeDevicesAction(List devices) async { + @override + void initState() { + _checkChatBackup(); + super.initState(); + } + + Future _checkChatBackup() async { + final client = Matrix.of(context).client; + final state = await client.getCryptoIdentityState(); + if (!mounted) return; + setState(() { + chatBackupEnabled = state.initialized && !state.connected; + }); + } + + Future removeDevicesAction(List devices) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); + final client = Matrix.of(context).client; + + final wellKnown = await Result.capture(client.getWellknown()); + final accountManageUrl = wellKnown.asValue?.value.additionalProperties + .tryGetMap('org.matrix.msc2965.authentication') + ?.tryGet('account'); + if (accountManageUrl != null) { + launchUrlString(accountManageUrl, mode: LaunchMode.inAppBrowserView); + return; + } + if (!mounted) return; if (await showOkCancelAlertDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, + title: l10n.areYouSure, + okLabel: l10n.remove, + cancelLabel: l10n.cancel, + message: l10n.removeDevicesDescription, + isDestructive: true, ) == - OkCancelResult.cancel) return; - final matrix = Matrix.of(context); + OkCancelResult.cancel) { + return; + } + if (!mounted) return; final deviceIds = []; for (final userDevice in devices) { deviceIds.add(userDevice.deviceId); } - try { - setState(() { - loadingDeletingDevices = true; - errorDeletingDevices = null; - }); - await matrix.client.uiaRequestBackground( - (auth) => matrix.client.deleteDevices( - deviceIds, - auth: auth, - ), - ); - reload(); - } catch (e, s) { - Logs().v('Error while deleting devices', e, s); - setState(() => errorDeletingDevices = e.toString()); - } finally { - setState(() => loadingDeletingDevices = false); - } + await showFutureLoadingDialog( + context: context, + delay: false, + future: () => matrix.client.uiaRequestBackground( + (auth) => matrix.client.deleteDevices(deviceIds, auth: auth), + ), + ); + reload(); } - void renameDeviceAction(Device device) async { + Future renameDeviceAction(Device device) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final displayName = await showTextInputDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.changeDeviceName, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: device.displayName, - ) - ], + title: l10n.changeDeviceName, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: device.displayName, ); if (displayName == null) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context) - .client - .updateDevice(device.deviceId, displayName: displayName.single), + future: () => + matrix.client.updateDevice(device.deviceId, displayName: displayName), ); if (success.error == null) { reload(); } } - void verifyDeviceAction(Device device) async { - final req = Matrix.of(context) + Future verifyDeviceAction(Device device) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.verifyOtherDevice, + message: l10n.verifyOtherDeviceDescription, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + final req = await matrix .client - .userDeviceKeys[Matrix.of(context).client.userID!]! + .userDeviceKeys[matrix.client.userID!]! .deviceKeys[device.deviceId]! .startVerification(); req.onUpdate = () { - if ({KeyVerificationState.error, KeyVerificationState.done} - .contains(req.state)) { + if ({ + KeyVerificationState.error, + KeyVerificationState.done, + }.contains(req.state)) { setState(() {}); } }; + if (!mounted) return; await KeyVerificationDialog(request: req).show(context); } - void blockDeviceAction(Device device) async { + Future blockDeviceAction(Device device) async { final key = Matrix.of(context) .client .userDeviceKeys[Matrix.of(context).client.userID!]! @@ -118,7 +156,7 @@ class DevicesSettingsController extends State { setState(() {}); } - void unblockDeviceAction(Device device) async { + Future unblockDeviceAction(Device device) async { final key = Matrix.of(context) .client .userDeviceKeys[Matrix.of(context).client.userID!]! @@ -130,9 +168,7 @@ class DevicesSettingsController extends State { bool _isOwnDevice(Device userDevice) => userDevice.deviceId == Matrix.of(context).client.deviceID; - Device? get thisDevice => devices!.firstWhereOrNull( - _isOwnDevice, - ); + Device? get thisDevice => devices!.firstWhereOrNull(_isOwnDevice); List get notThisDevice => List.from(devices!) ..removeWhere(_isOwnDevice) diff --git a/lib/pages/device_settings/device_settings_view.dart b/lib/pages/device_settings/device_settings_view.dart index 5ac489fbb0..68d3a8fa32 100644 --- a/lib/pages/device_settings/device_settings_view.dart +++ b/lib/pages/device_settings/device_settings_view.dart @@ -1,31 +1,38 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/device_settings/device_settings.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; + import 'user_device_list_item.dart'; class DevicesSettingsView extends StatelessWidget { final DevicesSettingsController controller; - const DevicesSettingsView(this.controller, {Key? key}) : super(key: key); + const DevicesSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.devices), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text(L10n.of(context).devices), ), body: MaxWidthBody( child: FutureBuilder( future: controller.loadUserDevices(context), builder: (BuildContext context, snapshot) { + final theme = Theme.of(context); if (snapshot.hasError) { return Center( child: Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ const Icon(Icons.error_outlined), Text(snapshot.error.toString()), @@ -35,16 +42,48 @@ class DevicesSettingsView extends StatelessWidget { } if (!snapshot.hasData || controller.devices == null) { return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2)); + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); } return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), itemCount: controller.notThisDevice.length + 1, itemBuilder: (BuildContext context, int i) { if (i == 0) { return Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - if (controller.thisDevice != null) + if (controller.chatBackupEnabled == false) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: ListTile( + leading: const CircleAvatar( + child: Icon(Icons.info_outlined), + ), + subtitle: Text( + L10n.of( + context, + ).noticeChatBackupDeviceVerification, + ), + ), + ), + if (controller.thisDevice != null) ...[ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + alignment: Alignment.centerLeft, + child: Text( + L10n.of(context).thisDevice, + style: TextStyle( + fontWeight: FontWeight.bold, + color: theme.colorScheme.primary, + ), + textAlign: TextAlign.left, + ), + ), UserDeviceListItem( controller.thisDevice!, rename: controller.renameDeviceAction, @@ -53,24 +92,40 @@ class DevicesSettingsView extends StatelessWidget { block: controller.blockDeviceAction, unblock: controller.unblockDeviceAction, ), - const Divider(height: 1), + ], if (controller.notThisDevice.isNotEmpty) - ListTile( - title: Text( - controller.errorDeletingDevices ?? - L10n.of(context)!.removeAllOtherDevices, - style: const TextStyle(color: Colors.red), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: SizedBox( + width: double.infinity, + child: TextButton.icon( + label: Text( + L10n.of(context).removeAllOtherDevices, + ), + style: TextButton.styleFrom( + iconColor: theme.colorScheme.onErrorContainer, + foregroundColor: + theme.colorScheme.onErrorContainer, + backgroundColor: + theme.colorScheme.errorContainer, + ), + icon: const Icon(Icons.delete_outline), + onPressed: () => controller.removeDevicesAction( + controller.notThisDevice, + ), + ), + ), + ) + else + Center( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text(L10n.of(context).noOtherDevicesFound), ), - trailing: controller.loadingDeletingDevices - ? const CircularProgressIndicator.adaptive( - strokeWidth: 2) - : const Icon(Icons.delete_outline), - onTap: controller.loadingDeletingDevices - ? null - : () => controller.removeDevicesAction( - controller.notThisDevice), ), - const Divider(height: 1), ], ); } diff --git a/lib/pages/device_settings/user_device_list_item.dart b/lib/pages/device_settings/user_device_list_item.dart index e65dc6db04..2c578b51a6 100644 --- a/lib/pages/device_settings/user_device_list_item.dart +++ b/lib/pages/device_settings/user_device_list_item.dart @@ -1,20 +1,19 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import '../../utils/date_time_extension.dart'; -import '../../utils/matrix_sdk_extensions.dart/device_extension.dart'; +import '../../utils/matrix_sdk_extensions/device_extension.dart'; import '../../widgets/matrix.dart'; -enum UserDeviceListItemAction { - rename, - remove, - verify, - block, - unblock, -} +enum UserDeviceListItemAction { rename, remove, verify, block, unblock } class UserDeviceListItem extends StatelessWidget { final Device userDevice; @@ -31,112 +30,124 @@ class UserDeviceListItem extends StatelessWidget { required this.verify, required this.block, required this.unblock, - Key? key, - }) : super(key: key); + super.key, + }); @override Widget build(BuildContext context) { - final keys = Matrix.of(context) - .client + final client = Matrix.of(context).client; + final keys = client .userDeviceKeys[Matrix.of(context).client.userID] ?.deviceKeys[userDevice.deviceId]; + final isOwnDevice = userDevice.deviceId == client.deviceID; - return ListTile( - onTap: () async { - final action = await showModalActionSheet( - context: context, - title: '${userDevice.displayName} (${userDevice.deviceId})', - actions: [ - SheetAction( - key: UserDeviceListItemAction.rename, - label: L10n.of(context)!.changeDeviceName, - ), - if (keys != null) ...{ - SheetAction( - key: UserDeviceListItemAction.verify, - label: L10n.of(context)!.verifyStart, - ), - if (!keys.blocked) - SheetAction( - key: UserDeviceListItemAction.block, - label: L10n.of(context)!.blockDevice, - isDestructiveAction: true, - ), - if (keys.blocked) - SheetAction( - key: UserDeviceListItemAction.unblock, - label: L10n.of(context)!.unblockDevice, - isDestructiveAction: true, + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + clipBehavior: Clip.hardEdge, + child: ListTile( + onTap: () async { + final action = await showModalActionPopup( + context: context, + title: '${userDevice.displayName} (${userDevice.deviceId})', + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + value: UserDeviceListItemAction.rename, + icon: const Icon(Icons.edit_outlined), + label: L10n.of(context).changeDeviceName, ), - }, - SheetAction( - key: UserDeviceListItemAction.remove, - label: L10n.of(context)!.delete, - isDestructiveAction: true, - ), - ], - ); - if (action == null) return; - switch (action) { - case UserDeviceListItemAction.rename: - rename(userDevice); - break; - case UserDeviceListItemAction.remove: - remove(userDevice); - break; - case UserDeviceListItemAction.verify: - verify(userDevice); - break; - case UserDeviceListItemAction.block: - block(userDevice); - break; - case UserDeviceListItemAction.unblock: - unblock(userDevice); - break; - } - }, - leading: CircleAvatar( - foregroundColor: Colors.white, - backgroundColor: keys == null - ? Colors.grey[700] - : keys.blocked + if (!isOwnDevice && keys != null) ...{ + AdaptiveModalAction( + value: UserDeviceListItemAction.verify, + icon: const Icon(Icons.verified_outlined), + label: L10n.of(context).verifyStart, + ), + if (!keys.blocked) + AdaptiveModalAction( + value: UserDeviceListItemAction.block, + icon: const Icon(Icons.block_outlined), + label: L10n.of(context).blockDevice, + isDestructive: true, + ), + if (keys.blocked) + AdaptiveModalAction( + value: UserDeviceListItemAction.unblock, + icon: const Icon(Icons.block), + label: L10n.of(context).unblockDevice, + isDestructive: true, + ), + }, + if (!isOwnDevice) + AdaptiveModalAction( + value: UserDeviceListItemAction.remove, + icon: const Icon(Icons.delete_outlined), + label: L10n.of(context).delete, + isDestructive: true, + ), + ], + ); + if (action == null) return; + switch (action) { + case UserDeviceListItemAction.rename: + rename(userDevice); + break; + case UserDeviceListItemAction.remove: + remove(userDevice); + break; + case UserDeviceListItemAction.verify: + verify(userDevice); + break; + case UserDeviceListItemAction.block: + block(userDevice); + break; + case UserDeviceListItemAction.unblock: + unblock(userDevice); + break; + } + }, + leading: CircleAvatar( + foregroundColor: Colors.white, + backgroundColor: keys == null + ? Colors.grey[700] + : keys.blocked ? Colors.red : keys.verified - ? Colors.green - : Colors.orange, - child: Icon(userDevice.icon), - ), - title: Row( - children: [ - Expanded( - child: Text( - userDevice.displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, + ? Colors.green + : Colors.orange, + child: Icon(userDevice.icon), + ), + title: Text( + userDevice.displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + L10n.of(context).lastActiveAgo( + DateTime.fromMillisecondsSinceEpoch( + userDevice.lastSeenTs ?? 0, + ).localizedTimeShort(context), ), + style: const TextStyle(fontWeight: FontWeight.w300), ), - if (keys != null) - Text( - keys.blocked - ? L10n.of(context)!.blocked - : keys.verified - ? L10n.of(context)!.verified - : L10n.of(context)!.unverified, - style: TextStyle( - color: keys.blocked - ? Colors.red - : keys.verified + trailing: keys == null + ? null + : Text( + keys.blocked + ? L10n.of(context).blocked + : keys.verified + ? L10n.of(context).verified + : L10n.of(context).unverified, + style: TextStyle( + color: keys.blocked + ? Colors.red + : keys.verified ? Colors.green : Colors.orange, - ), - ), - ], - ), - subtitle: Text( - L10n.of(context)!.lastActiveAgo( - DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs ?? 0) - .localizedTimeShort(context)), - style: const TextStyle(fontWeight: FontWeight.w300), + ), + ), + ), ), ); } diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index 212324ca9d..4ccf1989c1 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -1,41 +1,34 @@ -/* - * Famedly - * Copyright (C) 2019, 2020, 2021 Famedly GmbH - * - * 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, either version 3 of the - * License, or (at your option) any later version. - * - * 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 . - */ +// Copyright (C) 2019-2021 Famedly GmbH +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'dart:async'; import 'dart:math'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/voip/video_renderer.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' hide VideoRenderer; import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; -import 'package:pedantic/pedantic.dart'; -import 'package:wakelock/wakelock.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/avatar.dart'; import 'pip/pip_view.dart'; class _StreamView extends StatelessWidget { - const _StreamView(this.wrappedStream, - {Key? key, this.mainView = false, required this.matrixClient}) - : super(key: key); + const _StreamView( + this.wrappedStream, { + this.mainView = false, + required this.matrixClient, + }); final WrappedMediaStream wrappedStream; final Client matrixClient; @@ -64,43 +57,41 @@ class _StreamView extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - decoration: const BoxDecoration( - color: Colors.black54, - ), - child: Stack( - alignment: Alignment.center, - children: [ - if (videoMuted) - Container( - color: Colors.transparent, - ), - if (!videoMuted) - RTCVideoView( - // yes, it must explicitly be casted even though I do not feel - // comfortable with it... - wrappedStream.renderer as RTCVideoRenderer, - mirror: mirrored, - objectFit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, - ), - if (videoMuted) - Positioned( - child: Avatar( + decoration: const BoxDecoration(color: Colors.black54), + child: Stack( + alignment: Alignment.center, + children: [ + VideoRenderer( + wrappedStream, + mirror: mirrored, + fit: RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, + ), + if (videoMuted) ...[ + Container(color: Colors.black54), + Positioned( + child: Avatar( mxContent: avatarUrl, name: displayName, size: mainView ? 96 : 48, client: matrixClient, // textSize: mainView ? 36 : 24, // matrixClient: matrixClient, - )), - if (!isScreenSharing) - Positioned( - left: 4.0, - bottom: 4.0, - child: Icon(audioMuted ? Icons.mic_off : Icons.mic, - color: Colors.white, size: 18.0), - ) + ), + ), ], - )); + if (!isScreenSharing) + Positioned( + left: 4.0, + bottom: 4.0, + child: Icon( + audioMuted ? Icons.mic_off : Icons.mic, + color: Colors.white, + size: 18.0, + ), + ), + ], + ), + ); } } @@ -111,67 +102,63 @@ class Calling extends StatefulWidget { final CallSession call; final Client client; - const Calling( - {required this.context, - required this.call, - required this.client, - required this.callId, - this.onClear, - Key? key}) - : super(key: key); + const Calling({ + required this.context, + required this.call, + required this.client, + required this.callId, + this.onClear, + super.key, + }); @override - _MyCallingPage createState() => _MyCallingPage(); + MyCallingPage createState() => MyCallingPage(); } -class _MyCallingPage extends State { - Room? get room => call?.room; +class MyCallingPage extends State { + Room? get room => call.room; - String get displayName => call?.displayName ?? ''; + String get displayName => + call.room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context))); String get callId => widget.callId; - CallSession? get call => widget.call; + CallSession get call => widget.call; MediaStream? get localStream { - if (call != null && call!.localUserMediaStream != null) { - return call!.localUserMediaStream!.stream!; + if (call.localUserMediaStream != null) { + return call.localUserMediaStream!.stream!; } return null; } MediaStream? get remoteStream { - if (call != null && call!.getRemoteStreams.isNotEmpty) { - return call!.getRemoteStreams[0].stream!; + if (call.getRemoteStreams.isNotEmpty) { + return call.getRemoteStreams.first.stream!; } return null; } - bool get speakerOn => call?.speakerOn ?? false; - - bool get isMicrophoneMuted => call?.isMicrophoneMuted ?? false; - - bool get isLocalVideoMuted => call?.isLocalVideoMuted ?? false; + bool get isMicrophoneMuted => call.isMicrophoneMuted; - bool get isScreensharingEnabled => call?.screensharingEnabled ?? false; + bool get isLocalVideoMuted => call.isLocalVideoMuted; - bool get isRemoteOnHold => call?.remoteOnHold ?? false; + bool get isScreensharingEnabled => call.screensharingEnabled; - bool get voiceonly => call == null || call?.type == CallType.kVoice; + bool get isRemoteOnHold => call.remoteOnHold; - bool get connecting => call?.state == CallState.kConnecting; + bool get voiceonly => call.type == CallType.kVoice; - bool get connected => call?.state == CallState.kConnected; + bool get connecting => call.state == CallState.kConnecting; - bool get mirrored => call?.facingMode == 'user'; + bool get connected => call.state == CallState.kConnected; - List get streams => call?.streams ?? []; double? _localVideoHeight; double? _localVideoWidth; EdgeInsetsGeometry? _localVideoMargin; CallState? _state; - void _playCallSound() async { + Future _playCallSound() async { const path = 'assets/sounds/call.ogg'; if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isMacOS) { final player = AudioPlayer(); @@ -189,21 +176,18 @@ class _MyCallingPage extends State { _playCallSound(); } - void initialize() async { + void initialize() { final call = this.call; - if (call == null) return; - call.onCallStateChanged.stream.listen(_handleCallState); call.onCallEventChanged.stream.listen((event) { - if (event == CallEvent.kFeedsChanged) { - setState(() { - call.tryRemoveStopedStreams(); - }); - } else if (event == CallEvent.kLocalHoldUnhold || - event == CallEvent.kRemoteHoldUnhold) { + if (event == CallStateChange.kFeedsChanged) { + setState(call.tryRemoveStopedStreams); + } else if (event == CallStateChange.kLocalHoldUnhold || + event == CallStateChange.kRemoteHoldUnhold) { setState(() {}); Logs().i( - 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}'); + 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}', + ); } }); _state = call.state; @@ -211,19 +195,16 @@ class _MyCallingPage extends State { if (call.type == CallType.kVideo) { try { // Enable wakelock (keep screen on) - unawaited(Wakelock.enable()); + unawaited(WakelockPlus.enable()); } catch (_) {} } } void cleanUp() { - Timer( - const Duration(seconds: 2), - () => widget.onClear?.call(), - ); - if (call?.type == CallType.kVideo) { + Timer(const Duration(seconds: 2), () => widget.onClear?.call()); + if (call.type == CallType.kVideo) { try { - unawaited(Wakelock.disable()); + unawaited(WakelockPlus.disable()); } catch (_) {} } } @@ -231,25 +212,31 @@ class _MyCallingPage extends State { @override void dispose() { super.dispose(); - call?.cleanUp.call(); + call.cleanUp.call(); } void _resizeLocalVideo(Orientation orientation) { final shortSide = min( - MediaQuery.of(context).size.width, MediaQuery.of(context).size.height); + MediaQuery.sizeOf(widget.context).width, + MediaQuery.sizeOf(widget.context).height, + ); _localVideoMargin = remoteStream != null ? const EdgeInsets.only(top: 20.0, right: 20.0) : EdgeInsets.zero; _localVideoWidth = remoteStream != null ? shortSide / 3 - : MediaQuery.of(context).size.width; + : MediaQuery.sizeOf(widget.context).width; _localVideoHeight = remoteStream != null ? shortSide / 4 - : MediaQuery.of(context).size.height; + : MediaQuery.sizeOf(widget.context).height; } void _handleCallState(CallState state) { - Logs().v('CallingPage::handleCallState: ${state.toString()}'); + Logs().v('CallingPage::handleCallState: $state'); + if ({CallState.kConnected, CallState.kEnded}.contains(state)) { + HapticFeedback.heavyImpact(); + } + if (mounted) { setState(() { _state = state; @@ -260,53 +247,73 @@ class _MyCallingPage extends State { void _answerCall() { setState(() { - call?.answer(); + call.answer(); }); } void _hangUp() { setState(() { - if (call != null && (call?.isRinging ?? false)) { - call?.reject(); + if (call.isRinging) { + call.reject(); } else { - call?.hangup(); + call.hangup(reason: CallErrorCode.userHangup); } }); } void _muteMic() { setState(() { - call?.setMicrophoneMuted(!call!.isMicrophoneMuted); + call.setMicrophoneMuted(!call.isMicrophoneMuted); }); } void _screenSharing() { + if (PlatformInfos.isAndroid) { + if (!call.screensharingEnabled) { + FlutterForegroundTask.init( + androidNotificationOptions: AndroidNotificationOptions( + channelId: 'notification_channel_id', + channelName: 'Foreground Notification', + channelDescription: L10n.of( + widget.context, + ).foregroundServiceRunning, + ), + iosNotificationOptions: const IOSNotificationOptions(), + foregroundTaskOptions: ForegroundTaskOptions( + eventAction: ForegroundTaskEventAction.nothing(), + ), + ); + FlutterForegroundTask.startService( + notificationTitle: L10n.of(widget.context).screenSharingTitle, + notificationText: L10n.of(widget.context).screenSharingDetail, + ); + } else { + FlutterForegroundTask.stopService(); + } + } + setState(() { - call?.setScreensharingEnabled(!call!.screensharingEnabled); + call.setScreensharingEnabled(!call.screensharingEnabled); }); } void _remoteOnHold() { setState(() { - call?.setRemoteOnHold(!call!.remoteOnHold); + call.setRemoteOnHold(!call.remoteOnHold); }); } void _muteCamera() { setState(() { - call?.setLocalVideoMuted(!call!.isLocalVideoMuted); + call.setLocalVideoMuted(!call.isLocalVideoMuted); }); } - void _switchCamera() async { - if (call!.localUserMediaStream != null) { + Future _switchCamera() async { + if (call.localUserMediaStream != null) { await Helper.switchCamera( - call!.localUserMediaStream!.stream!.getVideoTracks()[0]); - if (PlatformInfos.isMobile) { - call!.facingMode == 'user' - ? call!.facingMode = 'environment' - : call!.facingMode = 'user'; - } + call.localUserMediaStream!.stream!.getVideoTracks().first, + ); } setState(() {}); } @@ -319,246 +326,248 @@ class _MyCallingPage extends State { } */ - List _buildActionButtons(bool isFloating) { - if (isFloating || call == null) { - return []; - } - - final switchCameraButton = FloatingActionButton( - heroTag: 'switchCamera', - onPressed: _switchCamera, - backgroundColor: Colors.black45, - child: const Icon(Icons.switch_camera), - ); - /* - var switchSpeakerButton = FloatingActionButton( - heroTag: 'switchSpeaker', - child: Icon(_speakerOn ? Icons.volume_up : Icons.volume_off), - onPressed: _switchSpeaker, - foregroundColor: Colors.black54, - backgroundColor: Theme.of(context).backgroundColor, - ); - */ - final hangupButton = FloatingActionButton( - heroTag: 'hangup', - onPressed: _hangUp, - tooltip: 'Hangup', - backgroundColor: _state == CallState.kEnded ? Colors.black45 : Colors.red, - child: const Icon(Icons.call_end), - ); - - final answerButton = FloatingActionButton( - heroTag: 'answer', - onPressed: _answerCall, - tooltip: 'Answer', - backgroundColor: Colors.green, - child: const Icon(Icons.phone), - ); - - final muteMicButton = FloatingActionButton( - heroTag: 'muteMic', - onPressed: _muteMic, - foregroundColor: isMicrophoneMuted ? Colors.black26 : Colors.white, - backgroundColor: isMicrophoneMuted ? Colors.white : Colors.black45, - child: Icon(isMicrophoneMuted ? Icons.mic_off : Icons.mic), - ); - - final screenSharingButton = FloatingActionButton( - heroTag: 'screenSharing', - onPressed: _screenSharing, - foregroundColor: isScreensharingEnabled ? Colors.black26 : Colors.white, - backgroundColor: isScreensharingEnabled ? Colors.white : Colors.black45, - child: const Icon(Icons.desktop_mac), - ); - - final holdButton = FloatingActionButton( - heroTag: 'hold', - onPressed: _remoteOnHold, - foregroundColor: isRemoteOnHold ? Colors.black26 : Colors.white, - backgroundColor: isRemoteOnHold ? Colors.white : Colors.black45, - child: const Icon(Icons.pause), - ); - - final muteCameraButton = FloatingActionButton( - heroTag: 'muteCam', - onPressed: _muteCamera, - foregroundColor: isLocalVideoMuted ? Colors.black26 : Colors.white, - backgroundColor: isLocalVideoMuted ? Colors.white : Colors.black45, - child: Icon(isLocalVideoMuted ? Icons.videocam_off : Icons.videocam), - ); - - switch (_state) { - case CallState.kRinging: - case CallState.kInviteSent: - case CallState.kCreateAnswer: - case CallState.kConnecting: - return call!.isOutgoing - ? [hangupButton] - : [answerButton, hangupButton]; - case CallState.kConnected: - return [ - muteMicButton, - //switchSpeakerButton, - if (!voiceonly && !kIsWeb) switchCameraButton, - if (!voiceonly) muteCameraButton, - if (PlatformInfos.isMobile || PlatformInfos.isWeb) - screenSharingButton, - holdButton, - hangupButton, - ]; - case CallState.kEnded: - return [ - hangupButton, - ]; - case CallState.kFledgling: - // TODO: Handle this case. - break; - case CallState.kWaitLocalMedia: - // TODO: Handle this case. - break; - case CallState.kCreateOffer: - // TODO: Handle this case. - break; - case null: - // TODO: Handle this case. - break; - } - return []; - } - - List _buildContent(Orientation orientation, bool isFloating) { - final stackWidgets = []; - - final call = this.call; - if (call == null || call.callHasEnded) { - return stackWidgets; - } - - if (call.localHold || call.remoteOnHold) { - var title = ''; - if (call.localHold) { - title = '${call.displayName} held the call.'; - } else if (call.remoteOnHold) { - title = 'You held the call.'; - } - stackWidgets.add(Center( - child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon( - Icons.pause, - size: 48.0, - color: Colors.white, - ), - Text( - title, - style: const TextStyle( - color: Colors.white, - fontSize: 24.0, - ), - ) - ]), - )); - return stackWidgets; - } - - var primaryStream = call.remoteScreenSharingStream ?? - call.localScreenSharingStream ?? - call.remoteUserMediaStream ?? - call.localUserMediaStream; - - if (!connected) { - primaryStream = call.localUserMediaStream; - } - - if (primaryStream != null) { - stackWidgets.add(Center( - child: _StreamView(primaryStream, - mainView: true, matrixClient: widget.client), - )); - } - - if (isFloating || !connected) { - return stackWidgets; - } - - _resizeLocalVideo(orientation); - - if (call.getRemoteStreams.isEmpty) { - return stackWidgets; - } - - final secondaryStreamViews = []; - - if (call.remoteScreenSharingStream != null) { - final remoteUserMediaStream = call.remoteUserMediaStream; - secondaryStreamViews.add(SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(remoteUserMediaStream!, matrixClient: widget.client), - )); - secondaryStreamViews.add(const SizedBox(height: 10)); - } - - final localStream = - call.localUserMediaStream ?? call.localScreenSharingStream; - if (localStream != null && !isFloating) { - secondaryStreamViews.add(SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(localStream, matrixClient: widget.client), - )); - secondaryStreamViews.add(const SizedBox(height: 10)); - } - - if (call.localScreenSharingStream != null && !isFloating) { - secondaryStreamViews.add(SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(call.remoteUserMediaStream!, - matrixClient: widget.client), - )); - secondaryStreamViews.add(const SizedBox(height: 10)); - } - - if (secondaryStreamViews.isNotEmpty) { - stackWidgets.add(Container( - padding: const EdgeInsets.fromLTRB(0, 20, 0, 120), - alignment: Alignment.bottomRight, - child: Container( - width: _localVideoWidth, - margin: _localVideoMargin, - child: Column( - children: secondaryStreamViews, - ), - ), - )); - } - - return stackWidgets; - } - @override Widget build(BuildContext context) { - return PIPView(builder: (context, isFloating) { - return Scaffold( + return PIPView( + builder: (context, isFloating) { + // Build action buttons + final switchCameraButton = IconButton( + onPressed: _switchCamera, + icon: const Icon(Icons.switch_camera), + ); + final hangupButton = IconButton( + onPressed: _hangUp, + tooltip: 'Hangup', + style: IconButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.error, + ), + icon: const Icon(Icons.call_end), + ); + final answerButton = IconButton( + onPressed: _answerCall, + tooltip: 'Answer', + icon: const Icon(Icons.phone), + ); + final muteMicButton = IconButton( + onPressed: _muteMic, + icon: Icon(isMicrophoneMuted ? Icons.mic_off : Icons.mic), + ); + final screenSharingButton = IconButton( + onPressed: _screenSharing, + icon: Icon( + isScreensharingEnabled + ? Icons.desktop_mac + : Icons.desktop_mac_outlined, + ), + ); + final holdButton = IconButton( + onPressed: _remoteOnHold, + icon: Icon(Icons.pause), + ); + final muteCameraButton = IconButton( + onPressed: _muteCamera, + icon: Icon(isLocalVideoMuted ? Icons.videocam_off : Icons.videocam), + ); + + late final List actionButtons; + if (!isFloating) { + switch (_state) { + case CallState.kRinging: + case CallState.kInviteSent: + case CallState.kCreateAnswer: + case CallState.kConnecting: + actionButtons = call.isOutgoing + ? [hangupButton] + : [answerButton, hangupButton]; + break; + case CallState.kConnected: + actionButtons = [ + muteMicButton, + if (!voiceonly && !kIsWeb) switchCameraButton, + if (!voiceonly) muteCameraButton, + if (PlatformInfos.isMobile || PlatformInfos.isWeb) + screenSharingButton, + holdButton, + hangupButton, + ]; + break; + case CallState.kEnded: + actionButtons = [hangupButton]; + break; + case CallState.kFledgling: + case CallState.kWaitLocalMedia: + case CallState.kCreateOffer: + case CallState.kEnding: + case null: + actionButtons = []; + break; + } + } else { + actionButtons = []; + } + + return Scaffold( + extendBodyBehindAppBar: true, resizeToAvoidBottomInset: !isFloating, floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, - floatingActionButton: SizedBox( - width: 320.0, - height: 150.0, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: _buildActionButtons(isFloating))), + floatingActionButton: IconButtonTheme( + data: IconButtonThemeData( + style: IconButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.inverseSurface, + foregroundColor: Theme.of(context).colorScheme.onInverseSurface, + ), + ), + child: Row( + mainAxisAlignment: .spaceEvenly, + children: actionButtons, + ), + ), body: OrientationBuilder( - builder: (BuildContext context, Orientation orientation) { - return Container( - decoration: const BoxDecoration( - color: Colors.black87, - ), - child: Stack(children: [ - ..._buildContent(orientation, isFloating), - if (!isFloating) - Positioned( + builder: (BuildContext context, Orientation orientation) { + final stackWidgets = []; + + final callHasEnded = call.callHasEnded; + if (!callHasEnded) { + if (call.localHold || call.remoteOnHold) { + var title = ''; + if (call.localHold) { + title = + '${call.room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)))} held the call.'; + } else if (call.remoteOnHold) { + title = 'You held the call.'; + } + stackWidgets.add( + Center( + child: Column( + mainAxisAlignment: .center, + children: [ + const Icon( + Icons.pause, + size: 48.0, + color: Colors.white, + ), + Text( + title, + style: const TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + ], + ), + ), + ); + } else { + final primaryStream = + call.remoteScreenSharingStream ?? + call.localScreenSharingStream ?? + call.remoteUserMediaStream; + + if (primaryStream != null) { + stackWidgets.add( + Center( + child: _StreamView( + primaryStream, + mainView: true, + matrixClient: widget.client, + ), + ), + ); + } else { + stackWidgets.add( + Center( + child: Avatar( + size: 80, + name: call.remoteUser?.calcDisplayname(), + mxContent: call.remoteUser?.avatarUrl, + ), + ), + ); + } + + if (!isFloating && connected) { + _resizeLocalVideo(orientation); + + if (call.getRemoteStreams.isNotEmpty) { + final secondaryStreamViews = []; + + if (call.remoteScreenSharingStream != null) { + final remoteUserMediaStream = + call.remoteUserMediaStream; + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + remoteUserMediaStream!, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + final localStream = + call.localUserMediaStream ?? + call.localScreenSharingStream; + if (localStream != null && !isFloating) { + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + localStream, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + if (call.localScreenSharingStream != null && + !isFloating) { + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + call.remoteUserMediaStream!, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + if (secondaryStreamViews.isNotEmpty) { + stackWidgets.add( + Container( + padding: const EdgeInsets.only( + top: 20, + bottom: 120, + ), + alignment: Alignment.bottomRight, + child: Container( + width: _localVideoWidth, + margin: _localVideoMargin, + child: Column(children: secondaryStreamViews), + ), + ), + ); + } + } + } + } + } + + return Container( + decoration: const BoxDecoration(color: Colors.black87), + child: Stack( + children: [ + ...stackWidgets, + if (!isFloating) + Positioned( top: 24.0, left: 24.0, child: IconButton( @@ -567,9 +576,15 @@ class _MyCallingPage extends State { onPressed: () { PIPView.of(context)?.setFloating(true); }, - )) - ])); - })); - }); + ), + ), + ], + ), + ); + }, + ), + ); + }, + ); } } diff --git a/lib/pages/dialer/pip/constants.dart b/lib/pages/dialer/pip/constants.dart deleted file mode 100644 index 5dfbd72dbb..0000000000 --- a/lib/pages/dialer/pip/constants.dart +++ /dev/null @@ -1 +0,0 @@ -const defaultAnimationDuration = Duration(milliseconds: 200); diff --git a/lib/pages/dialer/pip/dismiss_keyboard.dart b/lib/pages/dialer/pip/dismiss_keyboard.dart index c9ca3180fb..9dfb43c622 100644 --- a/lib/pages/dialer/pip/dismiss_keyboard.dart +++ b/lib/pages/dialer/pip/dismiss_keyboard.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter/material.dart'; void dismissKeyboard(BuildContext context) { diff --git a/lib/pages/dialer/pip/pip_view.dart b/lib/pages/dialer/pip/pip_view.dart index 15a1753955..577b94ddaa 100644 --- a/lib/pages/dialer/pip/pip_view.dart +++ b/lib/pages/dialer/pip/pip_view.dart @@ -1,6 +1,11 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; import 'package:flutter/material.dart'; -import 'constants.dart'; import 'dismiss_keyboard.dart'; class PIPView extends StatefulWidget { @@ -9,19 +14,16 @@ class PIPView extends StatefulWidget { final double? floatingHeight; final bool avoidKeyboard; - final Widget Function( - BuildContext context, - bool isFloating, - ) builder; + final Widget Function(BuildContext context, bool isFloating) builder; const PIPView({ - Key? key, + super.key, required this.builder, this.initialCorner = PIPViewCorner.topRight, this.floatingWidth, this.floatingHeight, this.avoidKeyboard = true, - }) : super(key: key); + }); @override PIPViewState createState() => PIPViewState(); @@ -45,11 +47,11 @@ class PIPViewState extends State with TickerProviderStateMixin { super.initState(); _corner = widget.initialCorner; _toggleFloatingAnimationController = AnimationController( - duration: defaultAnimationDuration, + duration: FluffyThemes.animationDuration, vsync: this, ); _dragAnimationController = AnimationController( - duration: defaultAnimationDuration, + duration: FluffyThemes.animationDuration, vsync: this, ); } @@ -95,10 +97,7 @@ class PIPViewState extends State with TickerProviderStateMixin { void _onPanUpdate(DragUpdateDetails details) { if (!_isDragging) return; setState(() { - _dragOffset = _dragOffset.translate( - details.delta.dx, - details.delta.dy, - ); + _dragOffset = _dragOffset.translate(details.delta.dx, details.delta.dy); }); } @@ -138,10 +137,9 @@ class PIPViewState extends State with TickerProviderStateMixin { @override Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - var windowPadding = mediaQuery.padding; + var windowPadding = MediaQuery.paddingOf(context); if (widget.avoidKeyboard) { - windowPadding += mediaQuery.viewInsets; + windowPadding += MediaQuery.viewInsetsOf(context); } final isFloating = _floating; @@ -183,9 +181,7 @@ class PIPViewState extends State with TickerProviderStateMixin { _dragAnimationController, ]), builder: (context, child) { - final animationCurve = CurveTween( - curve: Curves.easeInOutQuad, - ); + final animationCurve = CurveTween(curve: Curves.easeInOutQuad); final dragAnimationValue = animationCurve.transform( _dragAnimationController.value, ); @@ -198,9 +194,11 @@ class PIPViewState extends State with TickerProviderStateMixin { : Tween( begin: _dragOffset, end: calculatedOffset, - ).transform(_dragAnimationController.isAnimating - ? dragAnimationValue - : toggleFloatingAnimationValue); + ).transform( + _dragAnimationController.isAnimating + ? dragAnimationValue + : toggleFloatingAnimationValue, + ); final borderRadius = Tween( begin: 0, end: 10, @@ -264,21 +262,13 @@ class PIPViewState extends State with TickerProviderStateMixin { } } -enum PIPViewCorner { - topLeft, - topRight, - bottomLeft, - bottomRight, -} +enum PIPViewCorner { topLeft, topRight, bottomLeft, bottomRight } class _CornerDistance { final PIPViewCorner corner; final double distance; - _CornerDistance({ - required this.corner, - required this.distance, - }); + _CornerDistance({required this.corner, required this.distance}); } PIPViewCorner _calculateNearestCorner({ @@ -287,15 +277,9 @@ PIPViewCorner _calculateNearestCorner({ }) { _CornerDistance calculateDistance(PIPViewCorner corner) { final distance = offsets[corner]! - .translate( - -offset.dx, - -offset.dy, - ) + .translate(-offset.dx, -offset.dy) .distanceSquared; - return _CornerDistance( - corner: corner, - distance: distance, - ); + return _CornerDistance(corner: corner, distance: distance); } final distances = PIPViewCorner.values.map(calculateDistance).toList(); @@ -328,8 +312,6 @@ Map _calculateOffsets({ return Offset(left, bottom); case PIPViewCorner.bottomRight: return Offset(right, bottom); - default: - throw Exception('Not implemented.'); } } diff --git a/lib/pages/homeserver_picker/homeserver_bottom_sheet.dart b/lib/pages/homeserver_picker/homeserver_bottom_sheet.dart deleted file mode 100644 index 316d1cf258..0000000000 --- a/lib/pages/homeserver_picker/homeserver_bottom_sheet.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix_homeserver_recommendations/matrix_homeserver_recommendations.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class HomeserverBottomSheet extends StatelessWidget { - final HomeserverBenchmarkResult homeserver; - const HomeserverBottomSheet({required this.homeserver, Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final responseTime = homeserver.responseTime; - final description = homeserver.homeserver.description; - final rules = homeserver.homeserver.rules; - final privacy = homeserver.homeserver.privacyPolicy; - final registration = homeserver.homeserver.registration; - final jurisdiction = homeserver.homeserver.jurisdiction; - final homeserverSoftware = homeserver.homeserver.homeserverSoftware; - return Scaffold( - appBar: AppBar( - title: Text(homeserver.homeserver.baseUrl.host), - ), - body: ListView(children: [ - if (description != null && description.isNotEmpty) - ListTile( - leading: const Icon(Icons.info_outlined), - title: Text(description), - ), - if (jurisdiction != null && jurisdiction.isNotEmpty) - ListTile( - leading: const Icon(Icons.location_city_outlined), - title: Text(jurisdiction), - ), - if (homeserverSoftware != null && homeserverSoftware.isNotEmpty) - ListTile( - leading: const Icon(Icons.domain_outlined), - title: Text(homeserverSoftware), - ), - ListTile( - onTap: () => launch(homeserver.homeserver.baseUrl.toString()), - leading: const Icon(Icons.link_outlined), - title: Text(homeserver.homeserver.baseUrl.toString()), - ), - if (registration != null) - ListTile( - onTap: () => launch(registration.toString()), - leading: const Icon(Icons.person_add_outlined), - title: Text(registration.toString()), - ), - if (rules != null) - ListTile( - onTap: () => launch(rules.toString()), - leading: const Icon(Icons.visibility_outlined), - title: Text(rules.toString()), - ), - if (privacy != null) - ListTile( - onTap: () => launch(privacy.toString()), - leading: const Icon(Icons.shield_outlined), - title: Text(privacy.toString()), - ), - if (responseTime != null) - ListTile( - leading: const Icon(Icons.timer_outlined), - title: Text('${responseTime.inMilliseconds}ms'), - ), - ]), - ); - } -} diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart deleted file mode 100644 index c1f7876d46..0000000000 --- a/lib/pages/homeserver_picker/homeserver_picker.dart +++ /dev/null @@ -1,150 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:matrix_homeserver_recommendations/matrix_homeserver_recommendations.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/pages/homeserver_picker/homeserver_bottom_sheet.dart'; -import 'package:fluffychat/pages/homeserver_picker/homeserver_picker_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/localized_exception_extension.dart'; - -class HomeserverPicker extends StatefulWidget { - const HomeserverPicker({Key? key}) : super(key: key); - - @override - HomeserverPickerController createState() => HomeserverPickerController(); -} - -class HomeserverPickerController extends State { - bool isLoading = false; - final TextEditingController homeserverController = TextEditingController( - text: AppConfig.defaultHomeserver, - ); - final FocusNode homeserverFocusNode = FocusNode(); - String? error; - List? benchmarkResults; - bool displayServerList = false; - - bool get loadingHomeservers => - AppConfig.allowOtherHomeservers && benchmarkResults == null; - String searchTerm = ''; - - void _updateFocus() { - if (benchmarkResults == null) _loadHomeserverList(); - if (homeserverFocusNode.hasFocus) { - setState(() { - displayServerList = true; - }); - } - } - - void showServerInfo(HomeserverBenchmarkResult server) => showModalBottomSheet( - context: context, - builder: (_) => HomeserverBottomSheet( - homeserver: server, - ), - ); - - void onChanged(String text) => setState(() { - searchTerm = text; - }); - - List get filteredHomeservers => benchmarkResults! - .where((element) => - element.homeserver.baseUrl.host.contains(searchTerm) || - (element.homeserver.description?.contains(searchTerm) ?? false)) - .toList(); - - void _loadHomeserverList() async { - try { - final homeserverList = await JoinmatrixOrgParser().fetchHomeservers(); - final benchmark = await HomeserverListProvider.benchmarkHomeserver( - homeserverList, - timeout: const Duration(seconds: 10), - ); - setState(() { - benchmarkResults = benchmark; - }); - } catch (e, s) { - Logs().e('Homeserver benchmark failed', e, s); - benchmarkResults = []; - } - } - - void setServer(String server) => setState(() { - homeserverController.text = server; - searchTerm = ''; - homeserverFocusNode.unfocus(); - displayServerList = false; - }); - - /// Starts an analysis of the given homeserver. It uses the current domain and - /// makes sure that it is prefixed with https. Then it searches for the - /// well-known information and forwards to the login page depending on the - /// login type. - Future checkHomeserverAction() async { - setState(() { - homeserverFocusNode.unfocus(); - error = null; - isLoading = true; - searchTerm = ''; - displayServerList = false; - }); - - try { - homeserverController.text = - homeserverController.text.trim().toLowerCase().replaceAll(' ', '-'); - var homeserver = Uri.parse(homeserverController.text); - if (homeserver.scheme.isEmpty) { - homeserver = Uri.https(homeserverController.text, ''); - } - final matrix = Matrix.of(context); - matrix.loginHomeserverSummary = - await matrix.getLoginClient().checkHomeserver(homeserver); - final ssoSupported = matrix.loginHomeserverSummary!.loginFlows - .any((flow) => flow.type == 'm.login.sso'); - - try { - await Matrix.of(context).getLoginClient().register(); - matrix.loginRegistrationSupported = true; - } on MatrixException catch (e) { - matrix.loginRegistrationSupported = e.requireAdditionalAuthentication; - } - - if (!ssoSupported && matrix.loginRegistrationSupported == false) { - // Server does not support SSO or registration. We can skip to login page: - VRouter.of(context).to('login'); - } else { - VRouter.of(context).to('connect'); - } - } catch (e) { - setState(() => error = (e).toLocalizedString(context)); - } finally { - if (mounted) { - setState(() => isLoading = false); - } - } - } - - @override - void dispose() { - homeserverFocusNode.removeListener(_updateFocus); - super.dispose(); - } - - @override - void initState() { - homeserverFocusNode.addListener(_updateFocus); - super.initState(); - } - - @override - Widget build(BuildContext context) { - Matrix.of(context).navigatorContext = context; - return HomeserverPickerView(this); - } -} diff --git a/lib/pages/homeserver_picker/homeserver_picker_view.dart b/lib/pages/homeserver_picker/homeserver_picker_view.dart deleted file mode 100644 index 23938723f4..0000000000 --- a/lib/pages/homeserver_picker/homeserver_picker_view.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; -import 'homeserver_picker.dart'; - -class HomeserverPickerView extends StatelessWidget { - final HomeserverPickerController controller; - - const HomeserverPickerView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final benchmarkResults = controller.benchmarkResults; - return LoginScaffold( - appBar: VRouter.of(context).path == '/home' - ? null - : AppBar(title: Text(L10n.of(context)!.addAccount)), - body: SafeArea( - child: Column( - children: [ - Expanded( - child: ListView( - children: [ - Container( - alignment: Alignment.center, - height: 256, - child: Image.asset('assets/info-logo.png'), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - focusNode: controller.homeserverFocusNode, - controller: controller.homeserverController, - onChanged: controller.onChanged, - decoration: InputDecoration( - prefixText: '${L10n.of(context)!.homeserver}: ', - hintText: L10n.of(context)!.enterYourHomeserver, - suffixIcon: const Icon(Icons.search), - errorText: controller.error, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - readOnly: !AppConfig.allowOtherHomeservers, - onSubmitted: (_) => controller.checkHomeserverAction(), - autocorrect: false, - ), - ), - if (controller.displayServerList) - Padding( - padding: const EdgeInsets.all(16.0), - child: Material( - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), - color: Colors.white.withAlpha(200), - clipBehavior: Clip.hardEdge, - child: benchmarkResults == null - ? const Center( - child: Padding( - padding: EdgeInsets.all(16.0), - child: CircularProgressIndicator.adaptive(), - )) - : Column( - children: controller.filteredHomeservers - .map( - (server) => ListTile( - trailing: IconButton( - icon: const Icon( - Icons.info_outlined, - color: Colors.black, - ), - onPressed: () => - controller.showServerInfo(server), - ), - onTap: () => controller.setServer( - server.homeserver.baseUrl.host), - title: Text( - server.homeserver.baseUrl.host, - style: const TextStyle( - color: Colors.black), - ), - subtitle: Text( - server.homeserver.description ?? '', - style: TextStyle( - color: Colors.grey.shade700), - ), - ), - ) - .toList(), - ), - ), - ), - Wrap( - alignment: WrapAlignment.center, - children: [ - TextButton( - onPressed: () => launch(AppConfig.privacyUrl), - child: Text( - L10n.of(context)!.privacy, - style: const TextStyle( - decoration: TextDecoration.underline, - color: Colors.white, - ), - ), - ), - TextButton( - onPressed: () => PlatformInfos.showDialog(context), - child: Text( - L10n.of(context)!.about, - style: const TextStyle( - decoration: TextDecoration.underline, - color: Colors.white, - ), - ), - ), - ], - ), - ], - ), - ), - Container( - padding: const EdgeInsets.all(16), - width: double.infinity, - child: Hero( - tag: 'loginButton', - child: ElevatedButton( - onPressed: controller.isLoading - ? null - : controller.checkHomeserverAction, - child: controller.isLoading - ? const LinearProgressIndicator() - : Text(L10n.of(context)!.connect), - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index 241ec06493..a41aaa8842 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -1,35 +1,114 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/image_viewer/image_viewer_view.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/event_extension.dart'; +import 'package:fluffychat/utils/show_scaffold_dialog.dart'; +import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; + +import '../../utils/matrix_sdk_extensions/event_extension.dart'; class ImageViewer extends StatefulWidget { final Event event; - final void Function()? onLoaded; + final Timeline? timeline; + final BuildContext outerContext; - const ImageViewer(this.event, {Key? key, this.onLoaded}) : super(key: key); + const ImageViewer( + this.event, { + required this.outerContext, + this.timeline, + super.key, + }); @override ImageViewerController createState() => ImageViewerController(); } class ImageViewerController extends State { - /// Forward this image to another room. - void forwardAction() { - Matrix.of(context).shareContent = widget.event.content; - VRouter.of(context).to('/rooms'); + final FocusNode focusNode = FocusNode(); + + @override + void initState() { + super.initState(); + allEvents = + widget.timeline?.events + .where( + (event) => { + MessageTypes.Image, + MessageTypes.Sticker, + if (PlatformInfos.supportsVideoPlayer) MessageTypes.Video, + }.contains(event.messageType), + ) + .toList() + .reversed + .toList() ?? + [widget.event]; + var index = allEvents.indexWhere( + (event) => event.eventId == widget.event.eventId, + ); + if (index < 0) index = 0; + pageController = PageController(initialPage: index); + } + + late final PageController pageController; + + late final List allEvents; + + void onKeyEvent(KeyEvent event) { + switch (event.logicalKey) { + case LogicalKeyboardKey.arrowUp: + if (canGoBack) prevImage(); + break; + case LogicalKeyboardKey.arrowDown: + if (canGoNext) nextImage(); + break; + } + } + + Future prevImage() async { + await pageController.previousPage( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + ); + if (!mounted) return; + setState(() {}); + } + + Future nextImage() async { + await pageController.nextPage( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + ); + if (!mounted) return; + setState(() {}); } + int get _index => pageController.page?.toInt() ?? 0; + + Event get currentEvent => allEvents[_index]; + + bool get canGoNext => _index < allEvents.length - 1; + + bool get canGoBack => _index > 0; + + /// Forward this image to another room. + void forwardAction() => showScaffoldDialog( + context: context, + builder: (context) => + ShareScaffoldDialog(items: [ContentShareItem(currentEvent.content)]), + ); + /// Save this file with a system call. - void saveFileAction() => widget.event.saveFile(context); + void saveFileAction(BuildContext context) => currentEvent.saveFile(context); /// Save this file with a system call. - void shareFileAction() => widget.event.shareFile(context); + void shareFileAction(BuildContext context) => currentEvent.shareFile(context); static const maxScaleFactor = 1.5; @@ -37,7 +116,7 @@ class ImageViewerController extends State { void onInteractionEnds(ScaleEndDetails endDetails) { if (PlatformInfos.usesTouchscreen == false) { if (endDetails.velocity.pixelsPerSecond.dy > - MediaQuery.of(context).size.height * maxScaleFactor) { + MediaQuery.sizeOf(context).height * maxScaleFactor) { Navigator.of(context, rootNavigator: false).pop(); } } diff --git a/lib/pages/image_viewer/image_viewer_view.dart b/lib/pages/image_viewer/image_viewer_view.dart index 94e29e9b8b..defc9a4662 100644 --- a/lib/pages/image_viewer/image_viewer_view.dart +++ b/lib/pages/image_viewer/image_viewer_view.dart @@ -1,67 +1,159 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:fluffychat/pages/chat/events/image_bubble.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/image_viewer/video_player.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'image_viewer.dart'; class ImageViewerView extends StatelessWidget { final ImageViewerController controller; - const ImageViewerView(this.controller, {Key? key}) : super(key: key); + const ImageViewerView(this.controller, {super.key}); @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.black, - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context).pop, - color: Colors.white, - tooltip: L10n.of(context)!.close, - ), - backgroundColor: const Color(0x44000000), - actions: [ - IconButton( - icon: const Icon(Icons.reply_outlined), - onPressed: controller.forwardAction, + final iconButtonStyle = IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(200), + foregroundColor: Colors.white, + ); + return GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: iconButtonStyle, + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, color: Colors.white, - tooltip: L10n.of(context)!.share, + tooltip: L10n.of(context).close, ), - if (!PlatformInfos.isIOS) + backgroundColor: Colors.transparent, + actions: [ IconButton( - icon: const Icon(Icons.download_outlined), - onPressed: controller.saveFileAction, + style: iconButtonStyle, + icon: const Icon(Icons.reply_outlined), + onPressed: controller.forwardAction, color: Colors.white, - tooltip: L10n.of(context)!.downloadFile, + tooltip: L10n.of(context).share, ), - if (PlatformInfos.isMobile) + const SizedBox(width: 8), IconButton( - onPressed: controller.shareFileAction, - tooltip: L10n.of(context)!.share, + style: iconButtonStyle, + icon: const Icon(Icons.download_outlined), + onPressed: () => controller.saveFileAction(context), color: Colors.white, - icon: Icon(Icons.adaptive.share_outlined), - ) - ], - ), - body: InteractiveViewer( - minScale: 1.0, - maxScale: 10.0, - onInteractionEnd: controller.onInteractionEnds, - child: Center( - child: ImageBubble( - controller.widget.event, - tapToView: false, - onLoaded: controller.widget.onLoaded, - fit: BoxFit.contain, - backgroundColor: Colors.black, - maxSize: false, - thumbnailOnly: false, - animated: true, + tooltip: L10n.of(context).downloadFile, + ), + const SizedBox(width: 8), + if (PlatformInfos.isMobile) + // Use builder context to correctly position the share dialog on iPad + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Builder( + builder: (context) => IconButton( + style: iconButtonStyle, + onPressed: () => controller.shareFileAction(context), + tooltip: L10n.of(context).share, + color: Colors.white, + icon: Icon(Icons.adaptive.share_outlined), + ), + ), + ), + ], + ), + body: HoverBuilder( + builder: (context, hovered) => Stack( + children: [ + KeyboardListener( + focusNode: controller.focusNode, + onKeyEvent: controller.onKeyEvent, + child: PageView.builder( + scrollDirection: Axis.vertical, + controller: controller.pageController, + itemCount: controller.allEvents.length, + itemBuilder: (context, i) { + final event = controller.allEvents[i]; + switch (event.messageType) { + case MessageTypes.Video: + return Padding( + padding: const EdgeInsets.only(top: 52.0), + child: Center( + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: EventVideoPlayer(event), + ), + ), + ); + case MessageTypes.Image: + case MessageTypes.Sticker: + default: + return InteractiveViewer( + minScale: 1.0, + maxScale: 10.0, + onInteractionEnd: controller.onInteractionEnds, + child: Center( + child: Hero( + tag: event.eventId, + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: MxcImage( + key: ValueKey(event.eventId), + event: event, + fit: BoxFit.contain, + isThumbnail: false, + animated: true, + ), + ), + ), + ), + ); + } + }, + ), + ), + if (hovered) + Align( + alignment: Alignment.centerRight, + child: Column( + mainAxisSize: .min, + children: [ + if (controller.canGoBack) + Padding( + padding: const EdgeInsets.all(12.0), + child: IconButton( + style: iconButtonStyle, + tooltip: L10n.of(context).previous, + icon: const Icon(Icons.arrow_upward_outlined), + onPressed: controller.prevImage, + ), + ), + if (controller.canGoNext) + Padding( + padding: const EdgeInsets.all(12.0), + child: IconButton( + style: iconButtonStyle, + tooltip: L10n.of(context).next, + icon: const Icon(Icons.arrow_downward_outlined), + onPressed: controller.nextImage, + ), + ), + ], + ), + ), + ], ), ), ), diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart new file mode 100644 index 0000000000..33bb42678f --- /dev/null +++ b/lib/pages/image_viewer/video_player.dart @@ -0,0 +1,190 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:io'; + +import 'package:chewie/chewie.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/blur_hash.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:video_player/video_player.dart'; + +import '../../../utils/error_reporter.dart'; +import '../../widgets/mxc_image.dart'; + +class EventVideoPlayer extends StatefulWidget { + final Event event; + + const EventVideoPlayer(this.event, {super.key}); + + @override + EventVideoPlayerState createState() => EventVideoPlayerState(); +} + +class EventVideoPlayerState extends State { + ChewieController? _chewieController; + VideoPlayerController? _videoPlayerController; + + double? _downloadProgress; + + // The video_player package only doesn't support Windows and Linux. + final _supportsVideoPlayer = + !PlatformInfos.isWindows && !PlatformInfos.isLinux; + + Future _downloadAction() async { + if (!_supportsVideoPlayer) { + widget.event.saveFile(context); + return; + } + + try { + final fileSize = widget.event.content + .tryGetMap('info') + ?.tryGet('size'); + final videoFile = await widget.event.downloadAndDecryptAttachment( + onDownloadProgress: fileSize == null + ? null + : (progress) { + final progressPercentage = progress / fileSize; + setState(() { + _downloadProgress = progressPercentage < 1 + ? progressPercentage + : null; + }); + }, + ); + + // Dispose the controllers if we already have them. + _disposeControllers(); + late VideoPlayerController videoPlayerController; + + // Create the VideoPlayerController from the contents of videoFile. + if (kIsWeb) { + videoPlayerController = VideoPlayerController.networkUrl( + Uri.dataFromBytes(videoFile.bytes, mimeType: videoFile.mimeType), + ); + } else { + final tempDir = await getTemporaryDirectory(); + final fileName = Uri.encodeComponent( + widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, + ); + final file = File('${tempDir.path}/${fileName}_${videoFile.name}'); + if (await file.exists() == false) { + await file.writeAsBytes(videoFile.bytes); + } + videoPlayerController = VideoPlayerController.file(file); + } + _videoPlayerController = videoPlayerController; + + await videoPlayerController.initialize(); + + // Create a ChewieController on top. + setState(() { + _chewieController = ChewieController( + videoPlayerController: videoPlayerController, + showControlsOnInitialize: false, + autoPlay: true, + autoInitialize: true, + looping: true, + aspectRatio: _videoPlayerController?.value.aspectRatio, + ); + }); + } on IOException catch (e) { + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } catch (e, s) { + if (!mounted) return; + ErrorReporter(context, 'Unable to play video').onErrorCallback(e, s); + } + } + + void _disposeControllers() { + _chewieController?.dispose(); + _videoPlayerController?.dispose(); + _chewieController = null; + _videoPlayerController = null; + } + + @override + void dispose() { + _disposeControllers(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _downloadAction(); + }); + } + + static const String fallbackBlurHash = 'L5H2EC=PM+yV0g-mq.wG9c010J}I'; + + @override + Widget build(BuildContext context) { + final hasThumbnail = widget.event.hasThumbnail; + final blurHash = + (widget.event.infoMap as Map).tryGet( + 'xyz.amorgan.blurhash', + ) ?? + fallbackBlurHash; + final infoMap = widget.event.content.tryGetMap('info'); + final videoWidth = infoMap?.tryGet('w') ?? 400; + final videoHeight = infoMap?.tryGet('h') ?? 300; + final height = MediaQuery.sizeOf(context).height - 52; + final width = videoWidth * (height / videoHeight); + + final chewieController = _chewieController; + return chewieController != null + ? Center( + child: SizedBox( + width: width, + height: height, + child: Chewie(controller: chewieController), + ), + ) + : Stack( + children: [ + Center( + child: Hero( + tag: widget.event.eventId, + child: hasThumbnail + ? MxcImage( + event: widget.event, + isThumbnail: true, + width: width, + height: height, + fit: BoxFit.cover, + placeholder: (context) => BlurHash( + blurhash: blurHash, + width: width, + height: height, + fit: BoxFit.cover, + ), + ) + : BlurHash( + blurhash: blurHash, + width: width, + height: height, + ), + ), + ), + Center( + child: CircularProgressIndicator.adaptive( + value: _downloadProgress, + ), + ), + ], + ); + } +} diff --git a/lib/pages/intro/flows/restore_backup_flow.dart b/lib/pages/intro/flows/restore_backup_flow.dart new file mode 100644 index 0000000000..9277a491d3 --- /dev/null +++ b/lib/pages/intro/flows/restore_backup_flow.dart @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; + +Future restoreBackupFlow(BuildContext context) async { + final matrix = Matrix.of(context); + final picked = await selectFiles(context); + final file = picked.firstOrNull; + if (file == null) return; + + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: () async { + final client = await matrix.getLoginClient(); + await client.importDump(String.fromCharCodes(await file.readAsBytes())); + matrix.initMatrix(); + }, + ); +} diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart new file mode 100644 index 0000000000..537a2ed755 --- /dev/null +++ b/lib/pages/intro/intro_page.dart @@ -0,0 +1,191 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class IntroPage extends StatelessWidget { + final bool isLoading, hasPresetHomeserver; + final String? loggingInToHomeserver, welcomeText; + final VoidCallback login; + + const IntroPage({ + required this.isLoading, + required this.loggingInToHomeserver, + super.key, + required this.hasPresetHomeserver, + required this.welcomeText, + required this.login, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final addMultiAccount = Matrix.of( + context, + ).widget.clients.any((client) => client.isLogged()); + final loggingInToHomeserver = this.loggingInToHomeserver; + + return LoginScaffold( + appBar: AppBar( + centerTitle: true, + title: addMultiAccount + ? Text(L10n.of(context).addAccount) + : Text(AppSettings.applicationName.value), + actions: [ + PopupMenuButton( + useRootNavigator: true, + itemBuilder: (_) => [ + PopupMenuItem( + onTap: isLoading ? null : () => restoreBackupFlow(context), + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.import_export_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).hydrate), + ], + ), + ), + PopupMenuItem( + onTap: () => launchUrlString(AppSettings.privacyPolicy.value), + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.privacy_tip_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).privacy), + ], + ), + ), + PopupMenuItem( + onTap: () => PlatformInfos.showDialog(context), + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.info_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).about), + ], + ), + ), + ], + ), + ], + ), + body: isLoading + ? Center( + child: Column( + mainAxisAlignment: .center, + children: [ + CircularProgressIndicator.adaptive(), + if (loggingInToHomeserver != null) + Text(L10n.of(context).logInTo(loggingInToHomeserver)), + ], + ), + ) + : LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Column( + children: [ + Container( + alignment: Alignment.center, + padding: const EdgeInsets.all(32.0), + child: Hero( + tag: 'info-logo', + child: ClipRRect( + borderRadius: BorderRadius.circular(128), + child: Image.asset( + './assets/logo/mini/logo_mini.png', + width: 128, + height: 128, + ), + ), + ), + ), + Text( + L10n.of(context).appSubtitle, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20), + ), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Text( + L10n.of(context).appDescription, + textAlign: TextAlign.center, + ), + ), + const Spacer(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .stretch, + children: [ + if (!hasPresetHomeserver) + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + theme.colorScheme.secondary, + foregroundColor: + theme.colorScheme.onSecondary, + ), + onPressed: () => context.go( + '${GoRouterState.of(context).uri.path}/sign_up', + ), + child: Text( + L10n.of(context).createNewAccount, + ), + ), + SizedBox(height: 16), + ElevatedButton( + onPressed: login, + child: Text(L10n.of(context).signIn), + ), + + if (!hasPresetHomeserver) + TextButton( + onPressed: () async { + final client = await Matrix.of( + context, + ).getLoginClient(); + if (!context.mounted) return; + context.go( + '${GoRouterState.of(context).uri.path}/login', + extra: client, + ); + }, + child: Text( + L10n.of(context).loginWithMatrixId, + ), + ), + ], + ), + ), + const SizedBox(height: 36), + ], + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart new file mode 100644 index 0000000000..ea41f1df81 --- /dev/null +++ b/lib/pages/intro/intro_page_presenter.dart @@ -0,0 +1,128 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/pages/intro/intro_page.dart'; +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; +import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; +import 'package:matrix/msc_extensions/msc_2964_oidc_login_flow/msc_2964_oidc_login_flow.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/universal_html.dart' as web; + +class IntroPagePresenter extends StatefulWidget { + const IntroPagePresenter({super.key}); + + @override + State createState() => _IntroPagePresenterState(); +} + +class _IntroPagePresenterState extends State { + bool isLoading = kIsWeb; + String? loggingInToHomeserver; + + @override + void initState() { + super.initState(); + + if (kIsWeb) _finishOidcLogin(); + } + + Future _finishOidcLogin() async { + final store = await SharedPreferences.getInstance(); + final storedHomeserverString = store.getString( + OidcSessionJsonExtension.homeserverStoreKey, + ); + final homeserverUrl = storedHomeserverString == null + ? null + : Uri.tryParse(storedHomeserverString); + + final oidcSessionString = store.getString( + OidcSessionJsonExtension.storeKey, + ); + final session = oidcSessionString == null + ? null + : OidcSessionJsonExtension.fromJson(jsonDecode(oidcSessionString)); + + await store.remove(OidcSessionJsonExtension.storeKey); + await store.remove(OidcSessionJsonExtension.homeserverStoreKey); + if (!mounted) return; + + if (homeserverUrl == null || session == null) { + setState(() { + isLoading = false; + }); + + return; + } + setState(() { + loggingInToHomeserver = homeserverUrl.origin; + }); + + try { + final returnUrl = Uri.parse(web.window.location.href); + final queryParameters = returnUrl.hasFragment + ? Uri.parse(returnUrl.fragment).queryParameters + : returnUrl.queryParameters; + final code = queryParameters['code'] as String; + final state = queryParameters['state'] as String; + + final client = await Matrix.of(context).getLoginClient(); + await client.checkHomeserver(homeserverUrl); + await client.oidcLogin(session: session, code: code, state: state); + if (!mounted) return; + context.go('/backup'); + } catch (e, s) { + Logs().w('Unable to login via OIDC', e, s); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + } + + void _login() { + final presetHomeserver = AppSettings.presetHomeserver.value; + if (presetHomeserver.isEmpty) { + context.go('${GoRouterState.of(context).uri.path}/sign_in'); + return; + } + + connectToHomeserverFlow( + PublicHomeserverData(name: presetHomeserver), + context, + (snapshot) {}, + false, + ); + } + + @override + Widget build(BuildContext context) { + return IntroPage( + isLoading: isLoading, + loggingInToHomeserver: loggingInToHomeserver, + hasPresetHomeserver: AppSettings.presetHomeserver.value.isNotEmpty, + welcomeText: AppSettings.welcomeText.value.isEmpty + ? null + : AppSettings.welcomeText.value, + login: _login, + ); + } +} diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index cba0dd8f59..d08d19f3f7 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -1,19 +1,22 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/localized_exception_extension.dart'; class InvitationSelection extends StatefulWidget { - const InvitationSelection({Key? key}) : super(key: key); + final String roomId; + const InvitationSelection({super.key, required this.roomId}); @override InvitationSelectionController createState() => @@ -27,59 +30,60 @@ class InvitationSelectionController extends State { List foundProfiles = []; Timer? coolDown; - String? get roomId => VRouter.of(context).pathParameters['roomid']; + String? get roomId => widget.roomId; Future> getContacts(BuildContext context) async { final client = Matrix.of(context).client; final room = client.getRoomById(roomId!)!; - final participants = await room.requestParticipants(); + + final participants = (room.summary.mJoinedMemberCount ?? 0) > 100 + ? room.getParticipants() + : await room.requestParticipants(); participants.removeWhere( (u) => ![Membership.join, Membership.invite].contains(u.membership), ); - final participantsIds = participants.map((p) => p.stateKey).toList(); final contacts = client.rooms .where((r) => r.isDirectChat) .map((r) => r.unsafeGetUserFromMemoryOrFallback(r.directChatMatrixID!)) - .toList() - ..removeWhere((u) => participantsIds.contains(u.stateKey)); + .toList(); contacts.sort( (a, b) => a.calcDisplayname().toLowerCase().compareTo( - b.calcDisplayname().toLowerCase(), - ), + b.calcDisplayname().toLowerCase(), + ), ); return contacts; } - void inviteAction(BuildContext context, String id) async { + Future inviteAction( + BuildContext context, + String id, + String displayname, + ) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final room = Matrix.of(context).client.getRoomById(roomId!)!; - if (OkCancelResult.ok != - await showOkCancelAlertDialog( - context: context, - title: L10n.of(context)!.inviteContactToGroup(room.displayname), - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - )) { - return; - } + final success = await showFutureLoadingDialog( context: context, future: () => room.invite(id), ); if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(L10n.of(context)!.contactHasBeenInvitedToTheGroup))); + if (!context.mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.contactHasBeenInvitedToTheGroup)), + ); } } - void searchUserWithCoolDown(String text) async { + void searchUserWithCoolDown(String text) { coolDown?.cancel(); coolDown = Timer( - const Duration(seconds: 1), + const Duration(milliseconds: 500), () => searchUser(context, text), ); } - void searchUser(BuildContext context, String text) async { + Future searchUser(BuildContext context, String text) async { coolDown?.cancel(); if (text.isEmpty) { setState(() => foundProfiles = []); @@ -93,29 +97,24 @@ class InvitationSelectionController extends State { try { response = await matrix.client.searchUserDirectory(text, limit: 10); } catch (e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text((e).toLocalizedString(context)))); + if (!context.mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text((e).toLocalizedString(context)))); return; } finally { setState(() => loading = false); } setState(() { foundProfiles = List.from(response.results); - if (text.isValidMatrixId && + if (text.isValidMatrixIdStrict() && foundProfiles.indexWhere((profile) => text == profile.userId) == -1) { - setState(() => foundProfiles = [ - Profile.fromJson({'user_id': text}), - ]); + setState( + () => foundProfiles = [ + Profile.fromJson({'user_id': text}), + ], + ); } - final participants = Matrix.of(context) - .client - .getRoomById(roomId!)! - .getParticipants() - .where((user) => - [Membership.join, Membership.invite].contains(user.membership)) - .toList(); - foundProfiles.removeWhere((profile) => - participants.indexWhere((u) => u.id == profile.userId) != -1); }); } diff --git a/lib/pages/invitation_selection/invitation_selection_view.dart b/lib/pages/invitation_selection/invitation_selection_view.dart index 910ad9c182..f9fffdcd13 100644 --- a/lib/pages/invitation_selection/invitation_selection_view.dart +++ b/lib/pages/invitation_selection/invitation_selection_view.dart @@ -1,98 +1,203 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/adaptive_dialogs/user_dialog.dart'; class InvitationSelectionView extends StatelessWidget { final InvitationSelectionController controller; - const InvitationSelectionView(this.controller, {Key? key}) : super(key: key); + const InvitationSelectionView(this.controller, {super.key}); @override Widget build(BuildContext context) { - final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; - final groupName = room.name.isEmpty ? L10n.of(context)!.group : room.name; + final room = Matrix.of( + context, + ).client.getRoomById(controller.widget.roomId); + if (room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + + final groupName = room.name.isEmpty ? L10n.of(context).group : room.name; + final theme = Theme.of(context); return Scaffold( appBar: AppBar( - leading: VRouter.of(context).path.startsWith('/spaces/') - ? null - : IconButton( - icon: const Icon(Icons.close_outlined), - onPressed: () => VRouter.of(context) - .toSegments(['rooms', controller.roomId!]), - ), + leading: const Center(child: BackButton()), titleSpacing: 0, - title: TextField( - autofocus: true, - decoration: InputDecoration( - hintText: L10n.of(context)!.inviteContactToGroup(groupName), - suffixIconConstraints: const BoxConstraints( - maxWidth: 48, - maxHeight: 48, - minWidth: 48, - ), - suffixIcon: controller.loading - ? const CircularProgressIndicator.adaptive() - : const Icon(Icons.search_outlined), - contentPadding: const EdgeInsets.symmetric(horizontal: 16), - ), - onChanged: controller.searchUserWithCoolDown, - ), + title: Text(L10n.of(context).inviteContact), ), body: MaxWidthBody( - withScrolling: true, - child: controller.foundProfiles.isNotEmpty - ? ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: controller.foundProfiles.length, - itemBuilder: (BuildContext context, int i) => ListTile( - leading: Avatar( - mxContent: controller.foundProfiles[i].avatarUrl, - name: controller.foundProfiles[i].displayName ?? - controller.foundProfiles[i].userId, + innerPadding: const EdgeInsets.symmetric(vertical: 8), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), ), - title: Text( - controller.foundProfiles[i].displayName ?? - controller.foundProfiles[i].userId.localpart!, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, ), - subtitle: Text(controller.foundProfiles[i].userId), - onTap: () => controller.inviteAction( - context, controller.foundProfiles[i].userId), + hintText: L10n.of(context).inviteContactToGroup(groupName), + prefixIcon: controller.loading + ? const Padding( + padding: EdgeInsets.symmetric( + vertical: 10.0, + horizontal: 12, + ), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ), + ) + : const Icon(Icons.search_outlined), ), - ) - : FutureBuilder>( - future: controller.getContacts(context), - builder: (BuildContext context, snapshot) { - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2), - ); - } - final contacts = snapshot.data!; - return ListView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: contacts.length, - itemBuilder: (BuildContext context, int i) => ListTile( - leading: Avatar( - mxContent: contacts[i].avatarUrl, - name: contacts[i].calcDisplayname(), - ), - title: Text(contacts[i].calcDisplayname()), - subtitle: Text(contacts[i].id), - onTap: () => - controller.inviteAction(context, contacts[i].id), - ), - ); - }, + onChanged: controller.searchUserWithCoolDown, ), + ), + StreamBuilder( + stream: room.client.onRoomState.stream.where( + (update) => update.roomId == room.id, + ), + builder: (context, snapshot) { + final participants = room + .getParticipants() + .map((user) => user.id) + .toSet(); + return controller.foundProfiles.isNotEmpty + ? ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: controller.foundProfiles.length, + itemBuilder: (BuildContext context, int i) => + _InviteContactListTile( + profile: controller.foundProfiles[i], + isMember: participants.contains( + controller.foundProfiles[i].userId, + ), + onTap: () => controller.inviteAction( + context, + controller.foundProfiles[i].userId, + controller.foundProfiles[i].displayName ?? + controller + .foundProfiles[i] + .userId + .localpart ?? + L10n.of(context).user, + ), + ), + ) + : FutureBuilder>( + future: controller.getContacts(context), + builder: (BuildContext context, snapshot) { + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); + } + final contacts = snapshot.data!; + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: contacts.length, + itemBuilder: (BuildContext context, int i) => + _InviteContactListTile( + user: contacts[i], + profile: Profile( + avatarUrl: contacts[i].avatarUrl, + displayName: + contacts[i].displayName ?? + contacts[i].id.localpart ?? + L10n.of(context).user, + userId: contacts[i].id, + ), + isMember: participants.contains( + contacts[i].id, + ), + onTap: () => controller.inviteAction( + context, + contacts[i].id, + contacts[i].displayName ?? + contacts[i].id.localpart ?? + L10n.of(context).user, + ), + ), + ); + }, + ); + }, + ), + ], + ), + ), + ); + } +} + +class _InviteContactListTile extends StatelessWidget { + final Profile profile; + final User? user; + final bool isMember; + final void Function() onTap; + + const _InviteContactListTile({ + required this.profile, + this.user, + required this.isMember, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final l10n = L10n.of(context); + + return ListTile( + leading: Avatar( + mxContent: profile.avatarUrl, + name: profile.displayName, + presenceUserId: profile.userId, + onTap: () => UserDialog.show(context: context, profile: profile), + ), + title: Text( + profile.displayName ?? profile.userId.localpart ?? l10n.user, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + profile.userId, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: theme.colorScheme.secondary), + ), + trailing: TextButton( + onPressed: isMember ? null : onTap, + child: Text(isMember ? l10n.participant : l10n.invite), ), ); } diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index d9213178d6..bd1751d0be 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -1,48 +1,37 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:convert'; import 'dart:ui'; -import 'package:flutter/cupertino.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import '../../utils/beautify_string_extension.dart'; -import '../../widgets/adaptive_flat_button.dart'; - class KeyVerificationDialog extends StatefulWidget { - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - barrierDismissible: true, - builder: (context) => this, - useRootNavigator: false, - ) - : showDialog( - context: context, - barrierDismissible: true, - builder: (context) => this, - useRootNavigator: false, - ); + Future show(BuildContext context) => showAdaptiveDialog( + context: context, + builder: (context) => this, + barrierDismissible: false, + ); final KeyVerification request; - const KeyVerificationDialog({ - Key? key, - required this.request, - }) : super(key: key); + const KeyVerificationDialog({super.key, required this.request}); @override - _KeyVerificationPageState createState() => _KeyVerificationPageState(); + KeyVerificationPageState createState() => KeyVerificationPageState(); } -class _KeyVerificationPageState extends State { +class KeyVerificationPageState extends State { void Function()? originalOnUpdate; late final List sasEmoji; @@ -68,8 +57,10 @@ class _KeyVerificationPageState extends State { void dispose() { widget.request.onUpdate = originalOnUpdate; // don't want to get updates anymore - if (![KeyVerificationState.error, KeyVerificationState.done] - .contains(widget.request.state)) { + if (![ + KeyVerificationState.error, + KeyVerificationState.done, + ].contains(widget.request.state)) { widget.request.cancel('m.user'); } super.dispose(); @@ -81,33 +72,38 @@ class _KeyVerificationPageState extends State { if (input.isEmpty) return; final valid = await showFutureLoadingDialog( - context: context, - future: () async { - // make sure the loading spinner shows before we test the keys - await Future.delayed(const Duration(milliseconds: 100)); - var valid = false; - try { - await widget.request.openSSSS(keyOrPassphrase: input); - valid = true; - } catch (_) { - valid = false; - } - return valid; - }); + context: context, + future: () async { + // make sure the loading spinner shows before we test the keys + await Future.delayed(const Duration(milliseconds: 100)); + var valid = false; + try { + await widget.request.openSSSS(keyOrPassphrase: input); + valid = true; + } catch (_) { + valid = false; + } + return valid; + }, + ); if (valid.error != null) { + if (!mounted) return; await showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.incorrectPassphraseOrKey, + title: L10n.of(context).incorrectPassphraseOrKey, ); } } @override Widget build(BuildContext context) { + final theme = Theme.of(context); + User? user; - final directChatId = - widget.request.client.getDirectChatFromUserId(widget.request.userId); + final directChatId = widget.request.client.getDirectChatFromUserId( + widget.request.userId, + ); if (directChatId != null) { user = widget.request.client .getRoomById(directChatId)! @@ -115,21 +111,27 @@ class _KeyVerificationPageState extends State { } final displayName = user?.calcDisplayname() ?? widget.request.userId.localpart!; - var title = Text(L10n.of(context)!.verifyTitle); + var title = Text(L10n.of(context).verifyTitle); Widget body; final buttons = []; + switch (widget.request.state) { + case KeyVerificationState.showQRSuccess: + case KeyVerificationState.confirmQRScan: + throw 'Not implemented'; case KeyVerificationState.askSSSS: // prompt the user for their ssss passphrase / key final textEditingController = TextEditingController(); String input; body = Container( - margin: const EdgeInsets.only(left: 8.0, right: 8.0), + margin: const EdgeInsets.symmetric(horizontal: 8.0), child: Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - Text(L10n.of(context)!.askSSSSSign, - style: const TextStyle(fontSize: 20)), + Text( + L10n.of(context).askSSSSSign, + style: const TextStyle(fontSize: 20), + ), Container(height: 10), TextField( controller: textEditingController, @@ -143,229 +145,206 @@ class _KeyVerificationPageState extends State { maxLines: 1, obscureText: true, decoration: InputDecoration( - hintText: L10n.of(context)!.passphraseOrKey, - prefixStyle: TextStyle(color: Theme.of(context).primaryColor), - suffixStyle: TextStyle(color: Theme.of(context).primaryColor), + hintText: L10n.of(context).passphraseOrKey, + prefixStyle: TextStyle(color: theme.colorScheme.primary), + suffixStyle: TextStyle(color: theme.colorScheme.primary), border: const OutlineInputBorder(), ), ), ], ), ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.submit, - onPressed: () => checkInput(textEditingController.text), - )); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.skip, - onPressed: () => widget.request.openSSSS(skip: true), - )); + buttons.add( + AdaptiveDialogAction( + child: Text(L10n.of(context).submit), + onPressed: () => checkInput(textEditingController.text), + ), + ); + buttons.add( + AdaptiveDialogAction( + child: Text(L10n.of(context).skip), + onPressed: () => widget.request.openSSSS(skip: true), + ), + ); break; case KeyVerificationState.askAccept: - title = Text(L10n.of(context)!.newVerificationRequest); + title = Text(L10n.of(context).newVerificationRequest); body = Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - Row(children: [ - if (!PlatformInfos.isCupertinoStyle) - Avatar(mxContent: user?.avatarUrl, name: displayName), - const SizedBox(width: 12), - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: PlatformInfos.isCupertinoStyle - ? CrossAxisAlignment.center - : CrossAxisAlignment.start, - children: [ - Text( - displayName, - style: const TextStyle(fontSize: 16), - ), - Text( - '${widget.request.userId} - ${widget.request.deviceId}', - style: const TextStyle( - fontWeight: FontWeight.w300, - fontSize: 14, - ), - ), - ], - ), - ), - ]), const SizedBox(height: 16), - Image.asset('assets/verification.png', fit: BoxFit.contain), + Avatar( + mxContent: user?.avatarUrl, + name: displayName, + size: Avatar.defaultSize * 2, + ), const SizedBox(height: 16), - Text( - L10n.of(context)!.askVerificationRequest(displayName), - ) + Text(L10n.of(context).askVerificationRequest(displayName)), ], ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.reject, - textColor: Colors.red, - onPressed: () => widget.request - .rejectVerification() - .then((_) => Navigator.of(context, rootNavigator: false).pop()), - )); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.accept, - onPressed: () => widget.request.acceptVerification(), - )); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.rejectVerification().then((_) { + if (!context.mounted) return; + Navigator.of(context, rootNavigator: false).pop(false); + }), + child: Text( + L10n.of(context).reject, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.acceptVerification(), + child: Text(L10n.of(context).accept), + ), + ); break; + case KeyVerificationState.askChoice: case KeyVerificationState.waitingAccept: - body = Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset('assets/verification.png', fit: BoxFit.contain), - const SizedBox(height: 16), - const CircularProgressIndicator.adaptive(strokeWidth: 2), - const SizedBox(height: 16), - Text( - L10n.of(context)!.waitingPartnerAcceptRequest, - textAlign: TextAlign.center, - ), - ], + body = Center( + child: Column( + children: [ + const SizedBox(height: 16), + Stack( + alignment: Alignment.center, + children: [ + Avatar(mxContent: user?.avatarUrl, name: displayName), + const SizedBox( + width: Avatar.defaultSize + 2, + height: Avatar.defaultSize + 2, + child: CircularProgressIndicator(strokeWidth: 2), + ), + ], + ), + const SizedBox(height: 16), + Text( + L10n.of(context).waitingPartnerAcceptRequest, + textAlign: TextAlign.center, + ), + ], + ), + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.cancel(), + child: Text(L10n.of(context).cancel), + ), ); - final key = widget.request.client.userDeviceKeys[widget.request.userId] - ?.deviceKeys[widget.request.deviceId]; - if (key != null) { - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.verifyManual, - onPressed: () async { - final result = await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.verifyManual, - message: key.ed25519Key?.beautified ?? 'Key not found', - ); - if (result == OkCancelResult.ok) { - await key.setVerified(true); - } - await widget.request.cancel(); - Navigator.of(context, rootNavigator: false).pop(); - }, - )); - } break; case KeyVerificationState.askSas: TextSpan compareWidget; // maybe add a button to switch between the two and only determine default // view for if "emoji" is a present sasType or not? - String compareText; + if (widget.request.sasTypes.contains('emoji')) { - compareText = L10n.of(context)!.compareEmojiMatch; + title = Text( + L10n.of(context).compareEmojiMatch, + maxLines: 1, + style: const TextStyle(fontSize: 16), + ); compareWidget = TextSpan( children: widget.request.sasEmojis .map((e) => WidgetSpan(child: _Emoji(e, sasEmoji))) .toList(), ); } else { - compareText = L10n.of(context)!.compareNumbersMatch; + title = Text(L10n.of(context).compareNumbersMatch); final numbers = widget.request.sasNumbers; - final numbstr = '${numbers[0]}-${numbers[1]}-${numbers[2]}'; - compareWidget = - TextSpan(text: numbstr, style: const TextStyle(fontSize: 40)); + final numbstr = '${numbers.first}-${numbers[1]}-${numbers[2]}'; + compareWidget = TextSpan( + text: numbstr, + style: const TextStyle(fontSize: 40), + ); } body = Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - Center( - child: Text( - compareText, - style: const TextStyle(fontSize: 16), - textAlign: TextAlign.center, - ), - ), - const SizedBox(height: 10), - Text.rich( - compareWidget, - textAlign: TextAlign.center, - ), + Text.rich(compareWidget, textAlign: TextAlign.center), ], ); - buttons.add(AdaptiveFlatButton( - textColor: Colors.red, - label: L10n.of(context)!.theyDontMatch, - onPressed: () => widget.request.rejectSas(), - )); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.theyMatch, - onPressed: () => widget.request.acceptSas(), - )); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.rejectSas(), + child: Text( + L10n.of(context).theyDontMatch, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ); + buttons.add( + AdaptiveDialogAction( + onPressed: () => widget.request.acceptSas(), + child: Text(L10n.of(context).theyMatch), + ), + ); break; case KeyVerificationState.waitingSas: final acceptText = widget.request.sasTypes.contains('emoji') - ? L10n.of(context)!.waitingPartnerEmoji - : L10n.of(context)!.waitingPartnerNumbers; + ? L10n.of(context).waitingPartnerEmoji + : L10n.of(context).waitingPartnerNumbers; body = Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ + const SizedBox(height: 16), const CircularProgressIndicator.adaptive(strokeWidth: 2), - const SizedBox(height: 10), - Text( - acceptText, - textAlign: TextAlign.center, - ), + const SizedBox(height: 16), + Text(acceptText, textAlign: TextAlign.center), ], ); break; case KeyVerificationState.done: - body = Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon(Icons.check_circle_outlined, - color: Colors.green, size: 200.0), - const SizedBox(height: 10), - Text( - L10n.of(context)!.verifySuccess, - textAlign: TextAlign.center, - ), - ], + title = Text(L10n.of(context).verifySuccess); + body = const Padding( + padding: EdgeInsets.all(16.0), + child: Icon( + Icons.verified_outlined, + color: Colors.green, + size: 128.0, + ), + ); + buttons.add( + AdaptiveDialogAction( + child: Text(L10n.of(context).close), + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(true), + ), ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), - )); break; case KeyVerificationState.error: + title = const Text(''); body = Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ - const Icon(Icons.cancel, color: Colors.red, size: 200.0), - const SizedBox(height: 10), + const SizedBox(height: 16), + Icon(Icons.cancel, color: theme.colorScheme.error, size: 64.0), + const SizedBox(height: 16), + // TODO: Add better error UI to user Text( 'Error ${widget.request.canceledCode}: ${widget.request.canceledReason}', textAlign: TextAlign.center, ), ], ); - buttons.add(AdaptiveFlatButton( - label: L10n.of(context)!.close, - onPressed: () => Navigator.of(context, rootNavigator: false).pop(), - )); + buttons.add( + AdaptiveDialogAction( + child: Text(L10n.of(context).close), + onPressed: () => + Navigator.of(context, rootNavigator: false).pop(false), + ), + ); break; } - final content = SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(height: 16), - body, - ], - ), - ); - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: content, - actions: buttons, - ); - } - return AlertDialog( + + return AlertDialog.adaptive( title: title, - content: content, + content: SizedBox( + height: 256, + width: 256, + child: ListView(children: [body]), + ), actions: buttons, ); } @@ -384,9 +363,10 @@ class _Emoji extends StatelessWidget { return emoji.name; } final translations = Map.from( - sasEmoji[emoji.number]['translated_descriptions']); + sasEmoji[emoji.number]['translated_descriptions'], + ); translations['en'] = emoji.name; - for (final locale in window.locales) { + for (final locale in PlatformDispatcher.instance.locales) { final wantLocaleParts = locale.toString().split('_'); final wantLanguage = wantLocaleParts.removeAt(0); for (final haveLocale in translations.keys) { @@ -405,10 +385,13 @@ class _Emoji extends StatelessWidget { @override Widget build(BuildContext context) { return Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ Text(emoji.emoji, style: const TextStyle(fontSize: 50)), - Text(getLocalizedName()), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: Text(getLocalizedName()), + ), const SizedBox(height: 10, width: 5), ], ); diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 530fccafc2..1ee96e3c5b 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -1,19 +1,26 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:email_validator/email_validator.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/platform_infos.dart'; import 'login_view.dart'; class Login extends StatefulWidget { - const Login({Key? key}) : super(key: key); + final Client client; + const Login({required this.client, super.key}); @override LoginController createState() => LoginController(); @@ -27,17 +34,18 @@ class LoginController extends State { bool loading = false; bool showPassword = false; - void toggleShowPassword() => setState(() => showPassword = !showPassword); + void toggleShowPassword() => + setState(() => showPassword = !loading && !showPassword); - void login([_]) async { + Future login() async { final matrix = Matrix.of(context); if (usernameController.text.isEmpty) { - setState(() => usernameError = L10n.of(context)!.pleaseEnterYourUsername); + setState(() => usernameError = L10n.of(context).pleaseEnterYourUsername); } else { setState(() => usernameError = null); } if (passwordController.text.isEmpty) { - setState(() => passwordError = L10n.of(context)!.pleaseEnterYourPassword); + setState(() => passwordError = L10n.of(context).pleaseEnterYourPassword); } else { setState(() => passwordError = null); } @@ -47,6 +55,9 @@ class LoginController extends State { } setState(() => loading = true); + + _coolDown?.cancel(); + try { final username = usernameController.text; AuthenticationIdentifier identifier; @@ -63,15 +74,21 @@ class LoginController extends State { } else { identifier = AuthenticationUserIdentifier(user: username); } - await matrix.getLoginClient().login(LoginType.mLoginPassword, - identifier: identifier, - // To stay compatible with older server versions - // ignore: deprecated_member_use - user: identifier.type == AuthenticationIdentifierTypes.userId - ? username - : null, - password: passwordController.text, - initialDeviceDisplayName: PlatformInfos.clientName); + final client = await matrix.getLoginClient(); + await client.login( + LoginType.mLoginPassword, + identifier: identifier, + // To stay compatible with older server versions + // ignore: deprecated_member_use + user: identifier.type == AuthenticationIdentifierTypes.userId + ? username + : null, + password: passwordController.text, + initialDeviceDisplayName: PlatformInfos.appDisplayName, + ); + if (mounted) { + context.go('/backup'); + } } on MatrixException catch (exception) { setState(() => passwordError = exception.errorMessage); return setState(() => loading = false); @@ -85,7 +102,7 @@ class LoginController extends State { Timer? _coolDown; - void checkWellKnownWithCoolDown(String userId) async { + void checkWellKnownWithCoolDown(String userId) { _coolDown?.cancel(); _coolDown = Timer( const Duration(seconds: 1), @@ -93,17 +110,16 @@ class LoginController extends State { ); } - void _checkWellKnown(String userId) async { - setState(() => usernameError = null); - if (!userId.isValidMatrixId) return; + Future _checkWellKnown(String userId) async { + if (mounted) setState(() => usernameError = null); + if (!userId.isValidMatrixIdStrict()) return; + final oldHomeserver = widget.client.homeserver; try { - final oldHomeserver = Matrix.of(context).getLoginClient().homeserver; var newDomain = Uri.https(userId.domain!, ''); - Matrix.of(context).getLoginClient().homeserver = newDomain; + widget.client.homeserver = newDomain; DiscoveryInformation? wellKnownInformation; try { - wellKnownInformation = - await Matrix.of(context).getLoginClient().getWellknown(); + wellKnownInformation = await widget.client.getWellknown(); if (wellKnownInformation.mHomeserver.baseUrl.toString().isNotEmpty) { newDomain = wellKnownInformation.mHomeserver.baseUrl; } @@ -111,105 +127,106 @@ class LoginController extends State { // do nothing, newDomain is already set to a reasonable fallback } if (newDomain != oldHomeserver) { - await showFutureLoadingDialog( - context: context, - // do nothing if we error, we'll handle it below - future: () => Matrix.of(context) - .getLoginClient() - .checkHomeserver(newDomain) - .catchError((e) {}), - ); - if (Matrix.of(context).getLoginClient().homeserver == null) { - Matrix.of(context).getLoginClient().homeserver = oldHomeserver; + await widget.client.checkHomeserver(newDomain); + + if (widget.client.homeserver == null) { + widget.client.homeserver = oldHomeserver; // okay, the server we checked does not appear to be a matrix server Logs().v( - '$newDomain is not running a homeserver, asking to use $oldHomeserver'); + '$newDomain is not running a homeserver, asking to use $oldHomeserver', + ); + if (!mounted) return; + final l10n = L10n.of(context); final dialogResult = await showOkCancelAlertDialog( context: context, useRootNavigator: false, - message: - L10n.of(context)!.noMatrixServer(newDomain, oldHomeserver!), - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, + title: l10n.noMatrixServer( + newDomain.toString(), + oldHomeserver.toString(), + ), + okLabel: l10n.ok, + cancelLabel: l10n.cancel, ); + if (!mounted) return; if (dialogResult == OkCancelResult.ok) { - setState(() => usernameError = null); + if (mounted) setState(() => usernameError = null); } else { Navigator.of(context, rootNavigator: false).pop(); return; } } - setState(() => usernameError = null); + usernameError = null; + if (mounted) setState(() {}); } else { - setState(() => - Matrix.of(context).getLoginClient().homeserver = oldHomeserver); + widget.client.homeserver = oldHomeserver; + if (mounted) { + setState(() {}); + } } } catch (e) { - setState(() => usernameError = e.toString()); + widget.client.homeserver = oldHomeserver; + if (!mounted) return; + usernameError = e.toLocalizedString(context); + if (mounted) setState(() {}); } } - void passwordForgotten() async { + Future passwordForgotten() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.passwordForgotten, - message: L10n.of(context)!.enterAnEmailAddress, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - fullyCapitalizedForMaterial: false, - textFields: [ - DialogTextField( - initialText: - usernameController.text.isEmail ? usernameController.text : '', - hintText: L10n.of(context)!.enterAnEmailAddress, - keyboardType: TextInputType.emailAddress, - ), - ], + title: l10n.passwordForgotten, + message: l10n.enterAnEmailAddress, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + initialText: usernameController.text.isEmail + ? usernameController.text + : '', + hintText: l10n.enterAnEmailAddress, + keyboardType: TextInputType.emailAddress, ); if (input == null) return; + if (!mounted) return; final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); final response = await showFutureLoadingDialog( context: context, - future: () => - Matrix.of(context).getLoginClient().requestTokenToResetPasswordEmail( - clientSecret, - input.single, - sendAttempt++, - ), + future: () => widget.client.requestTokenToResetPasswordEmail( + clientSecret, + input, + sendAttempt++, + ), ); if (response.error != null) return; + if (!mounted) return; final password = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.passwordForgotten, - message: L10n.of(context)!.chooseAStrongPassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - fullyCapitalizedForMaterial: false, - textFields: [ - const DialogTextField( - hintText: '******', - obscureText: true, - minLines: 1, - maxLines: 1, - ), - ], + title: l10n.passwordForgotten, + message: l10n.chooseAStrongPassword, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: '******', + obscureText: true, + minLines: 1, + maxLines: 1, ); if (password == null) return; + if (!mounted) return; final ok = await showOkAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.weSentYouAnEmail, - message: L10n.of(context)!.pleaseClickOnLink, - okLabel: L10n.of(context)!.iHaveClickedOnLink, - fullyCapitalizedForMaterial: false, + title: l10n.weSentYouAnEmail, + message: l10n.pleaseClickOnLink, + okLabel: l10n.iHaveClickedOnLink, ); if (ok != OkCancelResult.ok) return; + if (!mounted) return; final data = { - 'new_password': password.single, + 'new_password': password, 'logout_devices': false, - "auth": AuthenticationThreePidCreds( + 'auth': AuthenticationThreePidCreds( type: AuthenticationTypes.emailIdentity, threepidCreds: ThreepidCreds( sid: response.result!.sid, @@ -219,17 +236,19 @@ class LoginController extends State { }; final success = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).getLoginClient().request( - RequestType.POST, - '/client/r0/account/password', - data: data, - ), + future: () => widget.client.request( + RequestType.POST, + '/client/v3/account/password', + data: data, + ), ); + if (!mounted) return; if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.passwordHasBeenChanged))); - usernameController.text = input.single; - passwordController.text = password.single; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.passwordHasBeenChanged)), + ); + usernameController.text = input; + passwordController.text = password; login(); } } @@ -241,8 +260,12 @@ class LoginController extends State { } extension on String { - static final RegExp _phoneRegex = - RegExp(r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'); - bool get isEmail => EmailValidator.validate(this); + static final RegExp _phoneRegex = RegExp( + r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$', + ); + static final RegExp _emailRegex = RegExp(r'(.+)@(.+)\.(.+)'); + + bool get isEmail => _emailRegex.hasMatch(this); + bool get isPhoneNumber => _phoneRegex.hasMatch(this); } diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart index b74ac9f819..5b822afacf 100644 --- a/lib/pages/login/login_view.dart +++ b/lib/pages/login/login_view.dart @@ -1,133 +1,144 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; -import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; + import 'login.dart'; class LoginView extends StatelessWidget { final LoginController controller; - const LoginView(this.controller, {Key? key}) : super(key: key); + const LoginView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final homeserver = controller.widget.client.homeserver + ?.toString() + .replaceFirst('https://', ''); + final title = homeserver == null + ? L10n.of(context).loginWithMatrixId + : L10n.of(context).logInTo(homeserver); + return LoginScaffold( appBar: AppBar( + leading: controller.loading ? null : const Center(child: BackButton()), automaticallyImplyLeading: !controller.loading, - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - centerTitle: true, - title: Text( - L10n.of(context)!.logInTo(Matrix.of(context) - .getLoginClient() - .homeserver - .toString() - .replaceFirst('https://', '')), - style: const TextStyle(color: Colors.white), - ), + titleSpacing: !controller.loading ? 0 : null, + title: Text(title), ), - body: Builder(builder: (context) { - return AutofillGroup( - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - readOnly: controller.loading, - autocorrect: false, - autofocus: true, - onChanged: controller.checkWellKnownWithCoolDown, - controller: controller.usernameController, - textInputAction: TextInputAction.next, - keyboardType: TextInputType.emailAddress, - autofillHints: - controller.loading ? null : [AutofillHints.username], - decoration: InputDecoration( - prefixIcon: const Icon(Icons.account_box_outlined), - errorText: controller.usernameError, - hintText: L10n.of(context)!.emailOrUsername, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), + body: Builder( + builder: (context) { + return AutofillGroup( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + children: [ + Center( + child: Hero( + tag: 'info-logo', + child: ClipRRect( + borderRadius: BorderRadius.circular(128), + child: Image.asset( + './assets/logo/mini/logo_mini.png', + width: 128, + height: 128, + ), + ), + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextField( + readOnly: controller.loading, + autocorrect: false, + autofocus: true, + onChanged: controller.checkWellKnownWithCoolDown, + controller: controller.usernameController, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.emailAddress, + autofillHints: controller.loading + ? null + : [AutofillHints.username], + decoration: InputDecoration( + prefixIcon: const Icon(Icons.account_box_outlined), + errorText: controller.usernameError, + errorStyle: const TextStyle(color: Colors.orange), + hintText: '@username:domain', + labelText: L10n.of(context).matrixId, + ), ), ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextField( - readOnly: controller.loading, - autocorrect: false, - autofillHints: - controller.loading ? null : [AutofillHints.password], - controller: controller.passwordController, - textInputAction: TextInputAction.next, - obscureText: !controller.showPassword, - onSubmitted: controller.login, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.lock_outlined), - errorText: controller.passwordError, - suffixIcon: IconButton( - tooltip: L10n.of(context)!.showPassword, - icon: Icon( - controller.showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined, - color: Colors.black, + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextField( + readOnly: controller.loading, + autocorrect: false, + autofillHints: controller.loading + ? null + : [AutofillHints.password], + controller: controller.passwordController, + textInputAction: TextInputAction.go, + obscureText: !controller.showPassword, + onSubmitted: (_) => controller.login(), + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outlined), + errorText: controller.passwordError, + errorStyle: const TextStyle(color: Colors.orange), + suffixIcon: IconButton( + onPressed: controller.toggleShowPassword, + icon: Icon( + controller.showPassword + ? Icons.visibility_off_outlined + : Icons.visibility_outlined, + color: Colors.black, + ), ), - onPressed: controller.toggleShowPassword, + hintText: '******', + labelText: L10n.of(context).password, ), - hintText: L10n.of(context)!.password, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), ), ), - ), - Hero( - tag: 'signinButton', - child: Padding( - padding: const EdgeInsets.all(16), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), child: ElevatedButton( - onPressed: controller.loading - ? null - : () => controller.login(context), + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: controller.loading ? null : controller.login, child: controller.loading ? const LinearProgressIndicator() - : Text(L10n.of(context)!.login), + : Text(L10n.of(context).login), ), ), - ), - Row( - children: [ - const Expanded(child: Divider(color: Colors.white)), + const SizedBox(height: 16), + if (homeserver != null) Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - L10n.of(context)!.or, - style: const TextStyle(color: Colors.white), + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: TextButton( + onPressed: controller.loading + ? () {} + : controller.passwordForgotten, + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.error, + ), + child: Text(L10n.of(context).passwordForgotten), ), ), - const Expanded(child: Divider(color: Colors.white)), - ], - ), - Padding( - padding: const EdgeInsets.all(16), - child: ElevatedButton( - onPressed: - controller.loading ? () {} : controller.passwordForgotten, - style: ElevatedButton.styleFrom(onPrimary: Colors.red), - child: Text(L10n.of(context)!.passwordForgotten), - ), - ), - ], - ), - ); - }), + const SizedBox(height: 16), + ], + ), + ); + }, + ), ); } } diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index d5ae96376a..a90c6273dc 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -1,44 +1,185 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart' as sdk; -import 'package:vrouter/vrouter.dart'; +import 'dart:typed_data'; +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_group/new_group_view.dart'; +import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; class NewGroup extends StatefulWidget { - const NewGroup({Key? key}) : super(key: key); + final CreateGroupType createGroupType; + final String? spaceId; + const NewGroup({ + this.createGroupType = CreateGroupType.group, + this.spaceId, + super.key, + }); @override NewGroupController createState() => NewGroupController(); } class NewGroupController extends State { - TextEditingController controller = TextEditingController(); + TextEditingController nameController = TextEditingController(); + bool publicGroup = false; + bool groupCanBeFound = false; + + Uint8List? avatar; + + Uri? avatarUrl; + + Object? error; + + bool loading = false; + + CreateGroupType get createGroupType => + _createGroupType ?? widget.createGroupType; - void setPublicGroup(bool b) => setState(() => publicGroup = b); + CreateGroupType? _createGroupType; - void submitAction([_]) async { + void setCreateGroupType(Set b) => + setState(() => _createGroupType = b.single); + + void setPublicGroup(bool b) => + setState(() => publicGroup = groupCanBeFound = b); + + void setGroupCanBeFound(bool b) => setState(() => groupCanBeFound = b); + + Future selectPhoto() async { + final photo = await selectFiles( + context, + type: FileType.image, + allowMultiple: false, + ); + final bytes = await photo.singleOrNull?.readAsBytes(); + + setState(() { + avatarUrl = null; + avatar = bytes; + }); + } + + Future _createGroup() async { + if (!mounted) return; final client = Matrix.of(context).client; - final roomID = await showFutureLoadingDialog( - context: context, - future: () async { - final roomId = await client.createGroupChat( - preset: publicGroup - ? sdk.CreateRoomPreset.publicChat - : sdk.CreateRoomPreset.privateChat, - groupName: controller.text.isNotEmpty ? controller.text : null, - ); - return roomId; - }, + + final roomId = await client.createGroupChat( + visibility: groupCanBeFound + ? sdk.Visibility.public + : sdk.Visibility.private, + preset: publicGroup + ? sdk.CreateRoomPreset.publicChat + : sdk.CreateRoomPreset.privateChat, + groupName: nameController.text.isNotEmpty ? nameController.text : null, + initialState: [ + if (avatar != null) + sdk.StateEvent( + type: sdk.EventTypes.RoomAvatar, + content: {'url': avatarUrl.toString()}, + ), + ], + ); + await _addToSpace(roomId); + if (!mounted) return; + + context.go('/rooms/$roomId/invite'); + } + + Future _createSpace() async { + if (!mounted) return; + final spaceId = await Matrix.of(context).client.createRoom( + preset: publicGroup + ? sdk.CreateRoomPreset.publicChat + : sdk.CreateRoomPreset.privateChat, + creationContent: {'type': RoomCreationTypes.mSpace}, + visibility: publicGroup ? sdk.Visibility.public : null, + roomAliasName: publicGroup + ? nameController.text.trim().toLowerCase().replaceAll(' ', '_') + : null, + name: nameController.text.trim(), + powerLevelContentOverride: {'events_default': 100}, + initialState: [ + if (avatar != null) + sdk.StateEvent( + type: sdk.EventTypes.RoomAvatar, + content: {'url': avatarUrl.toString()}, + ), + ], ); - if (roomID.error == null) { - VRouter.of(context).toSegments(['rooms', roomID.result!, 'invite']); + await _addToSpace(spaceId); + if (!mounted) return; + context.pop(spaceId); + } + + Future _addToSpace(String roomId) async { + final spaceId = widget.spaceId; + if (spaceId != null) { + final activeSpace = Matrix.of(context).client.getRoomById(spaceId); + if (activeSpace == null) { + throw Exception('Can not add group to space: Space not found $spaceId'); + } + await activeSpace.postLoad(); + await activeSpace.setSpaceChild(roomId); + } + } + + Future submitAction([_]) async { + final client = Matrix.of(context).client; + + try { + if (nameController.text.trim().isEmpty && + createGroupType == CreateGroupType.space) { + setState(() => error = L10n.of(context).pleaseFillOut); + return; + } + + setState(() { + loading = true; + error = null; + }); + + final avatar = this.avatar; + avatarUrl ??= avatar == null ? null : await client.uploadContent(avatar); + + if (!mounted) return; + + switch (createGroupType) { + case CreateGroupType.group: + await _createGroup(); + case CreateGroupType.space: + await _createSpace(); + } + } catch (e, s) { + sdk.Logs().d('Unable to create group', e, s); + setState(() { + error = e; + loading = false; + }); } } + @override + void initState() { + final spaceId = widget.spaceId; + if (spaceId != null) { + final space = Matrix.of(context).client.getRoomById(spaceId); + publicGroup = space?.joinRules == JoinRules.public; + } + super.initState(); + } + @override Widget build(BuildContext context) => NewGroupView(this); } + +enum CreateGroupType { group, space } diff --git a/lib/pages/new_group/new_group_view.dart b/lib/pages/new_group/new_group_view.dart index 628ab9399b..10d57b3710 100644 --- a/lib/pages/new_group/new_group_view.dart +++ b/lib/pages/new_group/new_group_view.dart @@ -1,54 +1,199 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; class NewGroupView extends StatelessWidget { final NewGroupController controller; - const NewGroupView(this.controller, {Key? key}) : super(key: key); + const NewGroupView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final avatar = controller.avatar; + final error = controller.error; return Scaffold( appBar: AppBar( - title: Text(L10n.of(context)!.createNewGroup), + leading: Center( + child: BackButton( + onPressed: controller.loading ? null : Navigator.of(context).pop, + ), + ), + title: Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).newSpace + : L10n.of(context).createGroup, + ), ), body: MaxWidthBody( child: Column( - mainAxisSize: MainAxisSize.min, + mainAxisSize: .min, children: [ Padding( - padding: const EdgeInsets.all(12.0), + padding: const EdgeInsets.all(16.0), + child: SegmentedButton( + selected: {controller.createGroupType}, + onSelectionChanged: controller.setCreateGroupType, + segments: [ + ButtonSegment( + value: CreateGroupType.group, + label: Text(L10n.of(context).group), + ), + ButtonSegment( + value: CreateGroupType.space, + label: Text(L10n.of(context).space), + ), + ], + ), + ), + const SizedBox(height: 16), + InkWell( + borderRadius: BorderRadius.circular(90), + onTap: controller.loading ? null : controller.selectPhoto, + child: CircleAvatar( + radius: Avatar.defaultSize, + child: avatar == null + ? const Icon(Icons.add_a_photo_outlined) + : ClipRRect( + borderRadius: BorderRadius.circular(90), + child: Image.memory( + avatar, + width: Avatar.defaultSize * 2, + height: Avatar.defaultSize * 2, + fit: BoxFit.cover, + ), + ), + ), + ), + const SizedBox(height: 32), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), child: TextField( - controller: controller.controller, autofocus: true, + controller: controller.nameController, autocorrect: false, - textInputAction: TextInputAction.go, - onSubmitted: controller.submitAction, + readOnly: controller.loading, decoration: InputDecoration( - labelText: L10n.of(context)!.optionalGroupName, - prefixIcon: const Icon(Icons.people_outlined), - hintText: L10n.of(context)!.enterAGroupName), + prefixIcon: const Icon(Icons.people_outlined), + labelText: controller.createGroupType == CreateGroupType.space + ? L10n.of(context).spaceName + : L10n.of(context).groupName, + ), ), ), + const SizedBox(height: 16), SwitchListTile.adaptive( - title: Text(L10n.of(context)!.groupIsPublic), + contentPadding: const EdgeInsets.symmetric(horizontal: 32), + secondary: const Icon(Icons.public_outlined), + title: Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).spaceIsPublic + : L10n.of(context).groupIsPublic, + ), value: controller.publicGroup, - onChanged: controller.setPublicGroup, + onChanged: controller.loading ? null : controller.setPublicGroup, + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.publicGroup + ? SwitchListTile.adaptive( + contentPadding: const EdgeInsets.symmetric( + horizontal: 32, + ), + secondary: const Icon(Icons.search_outlined), + title: Text(L10n.of(context).groupCanBeFoundViaSearch), + value: controller.groupCanBeFound, + onChanged: controller.loading + ? null + : controller.setGroupCanBeFound, + ) + : const SizedBox.shrink(), ), - Expanded( - child: Image.asset('assets/private_chat_wallpaper.png'), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.createGroupType == CreateGroupType.space + ? const SizedBox.shrink() + : SwitchListTile.adaptive( + contentPadding: const EdgeInsets.symmetric( + horizontal: 32, + ), + secondary: Icon( + Icons.lock_outlined, + color: theme.colorScheme.onSurface, + ), + title: Text( + L10n.of(context).enableEncryption, + style: TextStyle(color: theme.colorScheme.onSurface), + ), + value: !controller.publicGroup, + onChanged: null, + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: controller.createGroupType == CreateGroupType.space + ? ListTile( + contentPadding: const EdgeInsets.symmetric( + horizontal: 32, + ), + trailing: const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Icon(Icons.info_outlined), + ), + subtitle: Text(L10n.of(context).newSpaceDescription), + ) + : const SizedBox.shrink(), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: controller.loading + ? null + : controller.submitAction, + child: controller.loading + ? const LinearProgressIndicator() + : Text( + controller.createGroupType == CreateGroupType.space + ? L10n.of(context).createNewSpace + : L10n.of(context).createGroupAndInviteUsers, + ), + ), + ), + ), + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: error == null + ? const SizedBox.shrink() + : ListTile( + leading: Icon( + Icons.warning_outlined, + color: theme.colorScheme.error, + ), + title: Text( + error.toLocalizedString(context), + style: TextStyle(color: theme.colorScheme.error), + ), + ), ), ], ), ), - floatingActionButton: FloatingActionButton( - onPressed: controller.submitAction, - child: const Icon(Icons.arrow_forward_outlined), - ), ); } } diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart index 0a2a7be147..3689e1090f 100644 --- a/lib/pages/new_private_chat/new_private_chat.dart +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -1,19 +1,28 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; +import 'dart:async'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart'; import 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart'; +import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; + +import '../../widgets/adaptive_dialogs/user_dialog.dart'; class NewPrivateChat extends StatefulWidget { - const NewPrivateChat({Key? key}) : super(key: key); + final String? deeplink; + const NewPrivateChat({super.key, required this.deeplink}); @override NewPrivateChatController createState() => NewPrivateChatController(); @@ -22,89 +31,97 @@ class NewPrivateChat extends StatefulWidget { class NewPrivateChatController extends State { final TextEditingController controller = TextEditingController(); final FocusNode textFieldFocus = FocusNode(); - final formKey = GlobalKey(); - bool loading = false; - - bool _hideFab = false; - - // remove leading matrix.to from text field in order to simplify pasting - final List removeMatrixToFormatters = [ - FilteringTextInputFormatter.deny(NewPrivateChatController.prefix), - FilteringTextInputFormatter.deny(NewPrivateChatController.prefixNoProtocol), - ]; - bool get hideFab => _hideFab; + Future>? searchResponse; - static const Set supportedSigils = {'@', '!', '#'}; + Timer? _searchCoolDown; - static const String prefix = 'https://matrix.to/#/'; - static const String prefixNoProtocol = 'matrix.to/#/'; - - void setHideFab() { - if (textFieldFocus.hasFocus != _hideFab) { - setState(() => _hideFab = textFieldFocus.hasFocus); - } - } + static const Duration _coolDown = Duration(milliseconds: 500); @override void initState() { super.initState(); - textFieldFocus.addListener(setHideFab); - } - @override - void dispose() { - textFieldFocus.removeListener(setHideFab); - super.dispose(); + final deeplink = widget.deeplink; + if (deeplink != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + UrlLauncher(context, deeplink).openMatrixToUrl(); + }); + } } - void submitAction([_]) async { - controller.text = controller.text.trim(); - if (!formKey.currentState!.validate()) return; - UrlLauncher(context, '$prefix${controller.text}').openMatrixToUrl(); + Future searchUsers([String? input]) async { + final searchTerm = input ?? controller.text; + if (searchTerm.isEmpty) { + _searchCoolDown?.cancel(); + setState(() { + searchResponse = _searchCoolDown = null; + }); + return; + } + + _searchCoolDown?.cancel(); + _searchCoolDown = Timer(_coolDown, () { + setState(() { + searchResponse = _searchUser(searchTerm); + }); + }); } - String? validateForm(String? value) { - if (value!.isEmpty) { - return L10n.of(context)!.pleaseEnterAMatrixIdentifier; - } - if (!controller.text.isValidMatrixId || - !supportedSigils.contains(controller.text.sigil)) { - return L10n.of(context)!.makeSureTheIdentifierIsValid; - } - if (controller.text == Matrix.of(context).client.userID) { - return L10n.of(context)!.youCannotInviteYourself; + Future> _searchUser(String searchTerm) async { + final result = await Matrix.of( + context, + ).client.searchUserDirectory(searchTerm); + final profiles = result.results; + + if (searchTerm.isValidMatrixIdStrict() && + searchTerm.sigil == '@' && + !profiles.any((profile) => profile.userId == searchTerm)) { + profiles.add(Profile(userId: searchTerm)); } - return null; + + return profiles; } - void inviteAction() => FluffyShare.share( - 'https://matrix.to/#/${Matrix.of(context).client.userID}', - context, - ); + void inviteAction() => FluffyShare.shareInviteLink(context); - void openScannerAction() async { + Future openScannerAction() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; - if ((info.version.sdkInt ?? 16) < 21) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - L10n.of(context)!.unsupportedAndroidVersionLong, - ), - ), + if (!mounted) return; + if (info.version.sdkInt < 21) { + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.unsupportedAndroidVersionLong)), ); return; } } - await showModalBottomSheet( + if (!mounted) return; + await showAdaptiveBottomSheet( context: context, - useRootNavigator: false, - //useSafeArea: false, - builder: (_) => const QrScannerModal(), + builder: (_) => QrScannerModal( + onScan: (link) => UrlLauncher(context, link).openMatrixToUrl(), + ), ); } + Future copyUserId() async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + final l10n = L10n.of(context); + await Clipboard.setData( + ClipboardData(text: Matrix.of(context).client.userID!), + ); + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.copiedToClipboard)), + ); + } + + void openUserModal(Profile profile) => + UserDialog.show(context: context, profile: profile); + @override Widget build(BuildContext context) => NewPrivateChatView(this); } diff --git a/lib/pages/new_private_chat/new_private_chat_view.dart b/lib/pages/new_private_chat/new_private_chat_view.dart index 671dfc6545..ac1270cece 100644 --- a/lib/pages/new_private_chat/new_private_chat_view.dart +++ b/lib/pages/new_private_chat/new_private_chat_view.dart @@ -1,114 +1,300 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:qr_flutter/qr_flutter.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; + +import '../../widgets/qr_code_viewer.dart'; class NewPrivateChatView extends StatelessWidget { final NewPrivateChatController controller; - const NewPrivateChatView(this.controller, {Key? key}) : super(key: key); - - static const double _qrCodePadding = 8; + const NewPrivateChatView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + + final searchResponse = controller.searchResponse; + final userId = Matrix.of(context).client.userID!; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.newChat), - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + scrolledUnderElevation: 0, + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).newChat), + backgroundColor: theme.scaffoldBackgroundColor, actions: [ TextButton( - onPressed: () => VRouter.of(context).to('/newgroup'), - child: Text( - L10n.of(context)!.createNewGroup, - style: TextStyle(color: Theme.of(context).colorScheme.secondary), - ), - ) + onPressed: UrlLauncher( + context, + AppConfig.startChatTutorial, + ).launchUrl, + child: Text(L10n.of(context).help), + ), ], ), body: MaxWidthBody( - withScrolling: true, + withScrolling: false, + innerPadding: const EdgeInsets.symmetric(vertical: 8), child: Column( children: [ - Container( - margin: const EdgeInsets.all(_qrCodePadding), - alignment: Alignment.center, - padding: const EdgeInsets.all(_qrCodePadding * 2), - child: InkWell( - onTap: controller.inviteAction, - borderRadius: BorderRadius.circular(12), - child: Material( - borderRadius: BorderRadius.circular(12), - elevation: 6, - color: Colors.white, - shadowColor: const Color(0x44000000), - clipBehavior: Clip.hardEdge, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - QrImage( - data: - 'https://matrix.to/#/${Matrix.of(context).client.userID}', - version: QrVersions.auto, - size: min(MediaQuery.of(context).size.width - 16, 200), - ), - Image.asset('assets/share.png', width: 48, height: 48), - ], + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 8.0, + ), + child: TextField( + controller: controller.controller, + onChanged: controller.searchUsers, + decoration: InputDecoration( + hintText: L10n.of(context).searchForUsers, + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, ), + prefixIcon: searchResponse == null + ? const Icon(Icons.search_outlined) + : FutureBuilder( + future: searchResponse, + builder: (context, snapshot) { + if (snapshot.connectionState != + ConnectionState.done) { + return const Padding( + padding: EdgeInsets.all(10.0), + child: SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive( + strokeWidth: 1, + ), + ), + ); + } + return const Icon(Icons.search_outlined); + }, + ), + suffixIcon: controller.controller.text.isEmpty + ? null + : IconButton( + icon: const Icon(Icons.clear_outlined), + onPressed: () { + controller.controller.clear(); + controller.searchUsers(); + }, + ), ), ), ), - ListTile( - subtitle: Text( - L10n.of(context)!.createNewChatExplaination, - textAlign: TextAlign.center, - ), - ), - Padding( - padding: const EdgeInsets.all(12), - child: Form( - key: controller.formKey, - child: TextFormField( - controller: controller.controller, - autocorrect: false, - autofocus: !PlatformInfos.isMobile, - textInputAction: TextInputAction.go, - focusNode: controller.textFieldFocus, - onFieldSubmitted: controller.submitAction, - validator: controller.validateForm, - inputFormatters: controller.removeMatrixToFormatters, - decoration: InputDecoration( - labelText: L10n.of(context)!.typeInInviteLinkManually, - hintText: '@username', - prefixText: NewPrivateChatController.prefixNoProtocol, - suffixIcon: IconButton( - icon: const Icon(Icons.send_outlined), - onPressed: controller.submitAction, - ), - ), - ), + Expanded( + child: AnimatedSwitcher( + duration: FluffyThemes.animationDuration, + child: searchResponse == null + ? ListView( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 18.0, + ), + child: SelectableText.rich( + TextSpan( + children: [ + TextSpan( + text: L10n.of(context).yourGlobalUserIdIs, + ), + TextSpan( + text: Matrix.of(context).client.userID, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ), + ], + ), + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: 12, + ), + ), + ), + const SizedBox(height: 8), + ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.secondaryContainer, + foregroundColor: + theme.colorScheme.onSecondaryContainer, + child: Icon(Icons.adaptive.share_outlined), + ), + title: Text(L10n.of(context).shareInviteLink), + onTap: controller.inviteAction, + ), + ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.tertiaryContainer, + foregroundColor: + theme.colorScheme.onTertiaryContainer, + child: const Icon(Icons.group_add_outlined), + ), + title: Text(L10n.of(context).createGroup), + onTap: () => context.go('/rooms/newgroup'), + ), + if (PlatformInfos.isMobile) + ListTile( + leading: CircleAvatar( + backgroundColor: + theme.colorScheme.primaryContainer, + foregroundColor: + theme.colorScheme.onPrimaryContainer, + child: const Icon( + Icons.qr_code_scanner_outlined, + ), + ), + title: Text(L10n.of(context).scanQrCode), + onTap: controller.openScannerAction, + ), + Center( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 64.0, + vertical: 24.0, + ), + child: Material( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + side: BorderSide( + width: 3, + color: theme.colorScheme.primary, + ), + ), + color: Colors.transparent, + clipBehavior: Clip.hardEdge, + child: InkWell( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + onTap: () => + showQrCodeViewer(context, userId), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 200, + ), + child: PrettyQrView.data( + data: 'https://matrix.to/#/$userId', + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 1, + color: theme.colorScheme.primary, + ), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ) + : FutureBuilder( + future: searchResponse, + builder: (context, snapshot) { + final result = snapshot.data; + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: .center, + children: [ + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.error, + ), + ), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: controller.searchUsers, + icon: const Icon(Icons.refresh_outlined), + label: Text(L10n.of(context).tryAgain), + ), + ], + ); + } + if (result == null) { + return const Center( + child: CircularProgressIndicator.adaptive(), + ); + } + if (result.isEmpty) { + return Column( + mainAxisAlignment: .center, + children: [ + const Icon(Icons.search_outlined, size: 86), + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + L10n.of(context).noUsersFoundWithQuery( + controller.controller.text, + ), + style: TextStyle( + color: theme.colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + ), + ], + ); + } + return ListView.builder( + itemCount: result.length, + itemBuilder: (context, i) { + final contact = result[i]; + final displayname = + contact.displayName ?? + contact.userId.localpart ?? + contact.userId; + return ListTile( + leading: Avatar( + name: displayname, + mxContent: contact.avatarUrl, + presenceUserId: contact.userId, + ), + title: Text(displayname), + subtitle: Text(contact.userId), + onTap: () => controller.openUserModal(contact), + ); + }, + ); + }, + ), ), ), ], ), ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, - floatingActionButton: PlatformInfos.isMobile && !controller.hideFab - ? FloatingActionButton.extended( - onPressed: controller.openScannerAction, - label: Text(L10n.of(context)!.scanQrCode), - icon: const Icon(Icons.camera_alt_outlined), - ) - : null, ); } } diff --git a/lib/pages/new_private_chat/qr_scanner_modal.dart b/lib/pages/new_private_chat/qr_scanner_modal.dart index 7368914193..4f740d331c 100644 --- a/lib/pages/new_private_chat/qr_scanner_modal.dart +++ b/lib/pages/new_private_chat/qr_scanner_modal.dart @@ -1,21 +1,24 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; import 'dart:io'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:qr_code_scanner/qr_code_scanner.dart'; - -import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart'; class QrScannerModal extends StatefulWidget { - const QrScannerModal({Key? key}) : super(key: key); + final void Function(String) onScan; + const QrScannerModal({required this.onScan, super.key}); @override - _QrScannerModalState createState() => _QrScannerModalState(); + QrScannerModalState createState() => QrScannerModalState(); } -class _QrScannerModalState extends State { +class QrScannerModalState extends State { final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); QRViewController? controller; @@ -36,9 +39,9 @@ class _QrScannerModalState extends State { leading: IconButton( icon: const Icon(Icons.close_outlined), onPressed: Navigator.of(context).pop, - tooltip: L10n.of(context)!.close, + tooltip: L10n.of(context).close, ), - title: Text(L10n.of(context)!.scanQrCode), + title: Text(L10n.of(context).scanQrCode), ), body: Stack( children: [ @@ -46,7 +49,7 @@ class _QrScannerModalState extends State { key: qrKey, onQRViewCreated: _onQRViewCreated, overlay: QrScannerOverlayShape( - borderColor: Theme.of(context).primaryColor, + borderColor: Theme.of(context).colorScheme.primary, borderRadius: 10, borderLength: 30, borderWidth: 8, @@ -68,14 +71,10 @@ class _QrScannerModalState extends State { late StreamSubscription sub; sub = controller.scannedDataStream.listen((scanData) { sub.cancel(); + if (!mounted) return; Navigator.of(context).pop(); - UrlLauncher(context, scanData.code).openMatrixToUrl(); + final data = scanData.code; + if (data != null) widget.onScan(data); }); } - - @override - void dispose() { - controller?.dispose(); - super.dispose(); - } } diff --git a/lib/pages/new_space/new_space.dart b/lib/pages/new_space/new_space.dart deleted file mode 100644 index 062b633604..0000000000 --- a/lib/pages/new_space/new_space.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart' as sdk; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/new_space/new_space_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class NewSpace extends StatefulWidget { - const NewSpace({Key? key}) : super(key: key); - - @override - NewSpaceController createState() => NewSpaceController(); -} - -class NewSpaceController extends State { - TextEditingController controller = TextEditingController(); - bool publicGroup = false; - - void setPublicGroup(bool b) => setState(() => publicGroup = b); - - void submitAction([_]) async { - final matrix = Matrix.of(context); - final roomID = await showFutureLoadingDialog( - context: context, - future: () => matrix.client.createRoom( - preset: publicGroup - ? sdk.CreateRoomPreset.publicChat - : sdk.CreateRoomPreset.privateChat, - creationContent: {'type': RoomCreationTypes.mSpace}, - visibility: publicGroup ? sdk.Visibility.public : null, - roomAliasName: publicGroup && controller.text.isNotEmpty - ? controller.text.trim().toLowerCase().replaceAll(' ', '_') - : null, - name: controller.text.isNotEmpty ? controller.text : null, - ), - ); - if (roomID.error == null) { - VRouter.of(context).toSegments(['rooms', roomID.result!, 'details']); - } - } - - @override - Widget build(BuildContext context) => NewSpaceView(this); -} diff --git a/lib/pages/new_space/new_space_view.dart b/lib/pages/new_space/new_space_view.dart deleted file mode 100644 index 7bbbd1a1f1..0000000000 --- a/lib/pages/new_space/new_space_view.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'new_space.dart'; - -class NewSpaceView extends StatelessWidget { - final NewSpaceController controller; - - const NewSpaceView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.createNewSpace), - ), - body: MaxWidthBody( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.all(12.0), - child: TextField( - controller: controller.controller, - autofocus: true, - autocorrect: false, - textInputAction: TextInputAction.go, - onSubmitted: controller.submitAction, - decoration: InputDecoration( - labelText: L10n.of(context)!.spaceName, - prefixIcon: const Icon(Icons.people_outlined), - hintText: L10n.of(context)!.enterASpacepName), - ), - ), - SwitchListTile.adaptive( - title: Text(L10n.of(context)!.spaceIsPublic), - value: controller.publicGroup, - onChanged: controller.setPublicGroup, - ), - Expanded( - child: Image.asset('assets/private_chat_wallpaper.png'), - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: controller.submitAction, - child: const Icon(Icons.arrow_forward_outlined), - ), - ); - } -} diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 098756d4a3..c8909eef32 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -1,70 +1,130 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; +import 'package:collection/collection.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import '../../widgets/matrix.dart'; import 'settings_view.dart'; class Settings extends StatefulWidget { - const Settings({Key? key}) : super(key: key); + const Settings({super.key}); @override SettingsController createState() => SettingsController(); } class SettingsController extends State { - Future? crossSigningCachedFuture; - bool? crossSigningCached; - Future? megolmBackupCachedFuture; - bool? megolmBackupCached; - Future? profileFuture; - Profile? profile; + Future? profileFuture; bool profileUpdated = false; void updateProfile() => setState(() { - profileUpdated = true; - profile = profileFuture = null; - }); + profileUpdated = true; + profileFuture = null; + }); + + Future setDisplaynameAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); + final profile = await profileFuture; + if (!mounted) return; + final input = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: l10n.editDisplayname, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + initialText: profile?.displayName ?? matrix.client.userID!.localpart, + ); + if (input == null) return; + if (!mounted) return; + final success = await showFutureLoadingDialog( + context: context, + future: () => matrix.client.setProfileField( + matrix.client.userID!, + 'displayname', + {'displayname': input}, + ), + ); + if (success.error == null) { + updateProfile(); + } + } + + Future logoutAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); + final consent = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: l10n.areYouSureYouWantToLogout, + message: l10n.noBackupWarning, + isDestructive: cryptoIdentityConnected == false, + okLabel: l10n.logout, + cancelLabel: l10n.cancel, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => matrix.client.logout(), + ); + if (!mounted) return; + context.go('/'); + } - void setAvatarAction() async { + Future setAvatarAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); + final profile = await profileFuture; + if (!mounted) return; final actions = [ if (PlatformInfos.isMobile) - SheetAction( - key: AvatarAction.camera, - label: L10n.of(context)!.openCamera, + AdaptiveModalAction( + value: AvatarAction.camera, + label: l10n.openCamera, isDefaultAction: true, - icon: Icons.camera_alt_outlined, + icon: const Icon(Icons.camera_alt_outlined), ), - SheetAction( - key: AvatarAction.file, - label: L10n.of(context)!.openGallery, - icon: Icons.photo_outlined, + AdaptiveModalAction( + value: AvatarAction.file, + label: l10n.openGallery, + icon: const Icon(Icons.photo_outlined), ), if (profile?.avatarUrl != null) - SheetAction( - key: AvatarAction.remove, - label: L10n.of(context)!.removeYourAvatar, - isDestructiveAction: true, - icon: Icons.delete_outlined, + AdaptiveModalAction( + value: AvatarAction.remove, + label: l10n.removeYourAvatar, + isDestructive: true, + icon: const Icon(Icons.delete_outlined), ), ]; final action = actions.length == 1 - ? actions.single.key - : await showModalActionSheet( + ? actions.single.value + : await showModalActionPopup( context: context, - title: L10n.of(context)!.changeYourAvatar, + title: l10n.changeYourAvatar, + cancelLabel: l10n.cancel, actions: actions, ); if (action == null) return; - final matrix = Matrix.of(context); + if (!mounted) return; if (action == AvatarAction.remove) { final success = await showFutureLoadingDialog( context: context, @@ -84,19 +144,18 @@ class SettingsController extends State { imageQuality: 50, ); if (result == null) return; - file = MatrixFile( - bytes: await result.readAsBytes(), - name: result.path, - ); + file = MatrixFile(bytes: await result.readAsBytes(), name: result.path); } else { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; + if (!mounted) return; + final result = await selectFiles(context, type: FileType.image); + final pickedFile = result.firstOrNull; + if (pickedFile == null) return; file = MatrixFile( - bytes: result.toUint8List(), - name: result.fileName!, + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, ); } + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, future: () => matrix.client.setAvatar(file), @@ -107,30 +166,54 @@ class SettingsController extends State { } @override - Widget build(BuildContext context) { + void initState() { + WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap()); + + super.initState(); + } + + Future checkBootstrap() async { final client = Matrix.of(context).client; - profileFuture ??= client - .getProfileFromUserId( - client.userID!, - cache: !profileUpdated, - getFromRooms: !profileUpdated, - ) - .then((p) { - if (mounted) setState(() => profile = p); - return p; + if (!client.encryptionEnabled) return; + if (!client.isLogged()) return; + await client.accountDataLoading; + await client.userDeviceKeysLoading; + if (client.prevBatch == null) { + await client.onSync.stream.first; + } + + final state = await client.getCryptoIdentityState(); + if (!mounted) return; + setState(() { + cryptoIdentityConnected = state.initialized && state.connected; }); - if (client.encryption != null) { - crossSigningCachedFuture ??= - client.encryption?.crossSigning.isCached().then((c) { - if (mounted) setState(() => crossSigningCached = c); - return c; - }); - megolmBackupCachedFuture ??= - client.encryption?.keyManager.isCached().then((c) { - if (mounted) setState(() => megolmBackupCached = c); - return c; - }); + } + + bool? cryptoIdentityConnected; + + Future firstRunBootstrapAction([_]) async { + if (cryptoIdentityConnected == true) { + final action = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).chatBackup, + message: L10n.of(context).onlineKeyBackupEnabled, + okLabel: L10n.of(context).resetRecoveryKey, + cancelLabel: L10n.of(context).close, + isDestructive: true, + ); + if (action != OkCancelResult.ok) return; + if (!mounted) return; + await context.push('/backup?reset=true'); + return; } + await context.push('/backup'); + checkBootstrap(); + } + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + profileFuture ??= client.getProfileFromUserId(client.userID!); return SettingsView(this); } } diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index 242c247c8a..029e7bc5a8 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -1,94 +1,227 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:async/async.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' hide Result; import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import '../../config/app_config.dart'; -import '../../widgets/content_banner.dart'; +import '../../widgets/mxc_image_viewer.dart'; import 'settings.dart'; class SettingsView extends StatelessWidget { final SettingsController controller; - const SettingsView(this.controller, {Key? key}) : super(key: key); + const SettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final activeRoute = GoRouter.of( + context, + ).routeInformationProvider.value.uri.path; + return Scaffold( - body: NestedScrollView( - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) => - [ - SliverAppBar( - expandedHeight: 300.0, - floating: true, - pinned: true, - title: Text(L10n.of(context)!.settings), - backgroundColor: Theme.of(context).appBarTheme.backgroundColor, - flexibleSpace: FlexibleSpaceBar( - background: ContentBanner( - mxContent: controller.profile?.avatarUrl, - onEdit: controller.setAvatarAction, - defaultIcon: Icons.account_circle_outlined, - ), + appBar: AppBar( + title: Text(L10n.of(context).settings), + leading: Center( + child: BackButton(onPressed: () => context.go('/rooms')), + ), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: ListView( + key: const Key('SettingsListViewContent'), + children: [ + FutureBuilder( + future: controller.profileFuture, + builder: (context, snapshot) { + final profile = snapshot.data; + final avatar = profile?.avatarUrl; + final mxid = + Matrix.of(context).client.userID ?? L10n.of(context).user; + final displayname = + profile?.displayName ?? mxid.localpart ?? mxid; + return Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( + children: [ + Avatar( + mxContent: avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + if (profile != null) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + elevation: 2, + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon(Icons.camera_alt_outlined), + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: .center, + crossAxisAlignment: .start, + children: [ + TextButton.icon( + onPressed: controller.setDisplaynameAction, + icon: const Icon(Icons.edit_outlined, size: 16), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + iconColor: theme.colorScheme.onSurface, + ), + label: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 18), + ), + ), + TextButton.icon( + onPressed: () => FluffyShare.share(mxid, context), + icon: const Icon(Icons.copy_outlined, size: 14), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.secondary, + iconColor: theme.colorScheme.secondary, + ), + label: Text( + mxid, + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), + ), + ), + ], + ), + ), + ], + ); + }, ), - ), - ], - body: ListTileTheme( - iconColor: Theme.of(context).colorScheme.onBackground, - child: ListView( - children: [ - ListTile( - leading: const Icon(Icons.format_paint_outlined), - title: Text(L10n.of(context)!.changeTheme), - onTap: () => VRouter.of(context).to('/settings/style'), - ), - const Divider(thickness: 1), - ListTile( - leading: const Icon(Icons.notifications_outlined), - title: Text(L10n.of(context)!.notifications), - onTap: () => VRouter.of(context).to('/settings/notifications'), - ), - ListTile( - leading: const Icon(Icons.devices_outlined), - title: Text(L10n.of(context)!.devices), - onTap: () => VRouter.of(context).to('/settings/devices'), - ), - ListTile( - leading: const Icon(Icons.chat_bubble_outline_outlined), - title: Text(L10n.of(context)!.chat), - onTap: () => VRouter.of(context).to('/settings/chat'), - ), - ListTile( - leading: const Icon(Icons.account_circle_outlined), - title: Text(L10n.of(context)!.account), - onTap: () => VRouter.of(context).to('/settings/account'), - ), - ListTile( - leading: const Icon(Icons.shield_outlined), - title: Text(L10n.of(context)!.security), - onTap: () => VRouter.of(context).to('/settings/security'), - ), - const Divider(thickness: 1), - ListTile( - leading: const Icon(Icons.help_outline_outlined), - title: Text(L10n.of(context)!.help), - onTap: () => launch(AppConfig.supportUrl), - ), - ListTile( - leading: const Icon(Icons.shield_sharp), - title: Text(L10n.of(context)!.privacy), - onTap: () => launch(AppConfig.privacyUrl), - ), - ListTile( - leading: const Icon(Icons.info_outline_rounded), - title: Text(L10n.of(context)!.about), - onTap: () => PlatformInfos.showDialog(context), + FutureBuilder( + future: Result.capture( + Matrix.of(context).client.getAuthMetadata(), + ).then((result) => result.asValue?.value), + builder: (context, snapshot) { + final accountManageUrl = snapshot.data?.accountManagementUri; + if (accountManageUrl == null) { + return const SizedBox.shrink(); + } + return ListTile( + leading: const Icon(Icons.account_circle_outlined), + title: Text(L10n.of(context).manageAccount), + trailing: const Icon(Icons.open_in_new_outlined), + onTap: () => launchUrl( + accountManageUrl, + mode: LaunchMode.inAppBrowserView, + ), + ); + }, + ), + Divider(color: theme.dividerColor), + SwitchListTile.adaptive( + controlAffinity: ListTileControlAffinity.trailing, + value: controller.cryptoIdentityConnected == true, + secondary: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + onChanged: controller.firstRunBootstrapAction, + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.format_paint_outlined), + title: Text(L10n.of(context).changeTheme), + tileColor: activeRoute.startsWith('/rooms/settings/style') + ? theme.colorScheme.surfaceContainerHigh + : null, + onTap: () => context.go('/rooms/settings/style'), + ), + ListTile( + leading: const Icon(Icons.notifications_outlined), + title: Text(L10n.of(context).notifications), + tileColor: activeRoute.startsWith('/rooms/settings/notifications') + ? theme.colorScheme.surfaceContainerHigh + : null, + onTap: () => context.go('/rooms/settings/notifications'), + ), + ListTile( + leading: const Icon(Icons.devices_outlined), + title: Text(L10n.of(context).devices), + onTap: () => context.go('/rooms/settings/devices'), + tileColor: activeRoute.startsWith('/rooms/settings/devices') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.forum_outlined), + title: Text(L10n.of(context).chat), + onTap: () => context.go('/rooms/settings/chat'), + tileColor: activeRoute.startsWith('/rooms/settings/chat') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.shield_outlined), + title: Text(L10n.of(context).security), + onTap: () => context.go('/rooms/settings/security'), + tileColor: activeRoute.startsWith('/rooms/settings/security') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.dns_outlined), + title: Text( + L10n.of(context).aboutHomeserver( + Matrix.of(context).client.userID?.domain ?? 'homeserver', + ), ), - ], - ), + onTap: () => context.go('/rooms/settings/homeserver'), + tileColor: activeRoute.startsWith('/rooms/settings/homeserver') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.privacy_tip_outlined), + title: Text(L10n.of(context).privacy), + onTap: () => launchUrlString(AppSettings.privacyPolicy.value), + ), + ListTile( + leading: const Icon(Icons.info_outline_rounded), + title: Text(L10n.of(context).about), + onTap: () => PlatformInfos.showDialog(context), + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.logout_outlined), + title: Text(L10n.of(context).logout), + onTap: controller.logoutAction, + ), + ], ), ), ); diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart index 56a7a8d0af..4c10e51ffe 100644 --- a/lib/pages/settings_3pid/settings_3pid.dart +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -1,65 +1,72 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/widgets/matrix.dart'; import 'settings_3pid_view.dart'; class Settings3Pid extends StatefulWidget { static int sendAttempt = 0; - const Settings3Pid({Key? key}) : super(key: key); + const Settings3Pid({super.key}); @override Settings3PidController createState() => Settings3PidController(); } class Settings3PidController extends State { - void add3PidAction() async { + Future add3PidAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.enterAnEmailAddress, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.enterAnEmailAddress, - keyboardType: TextInputType.emailAddress, - ), - ], + title: l10n.enterAnEmailAddress, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.enterAnEmailAddress, + keyboardType: TextInputType.emailAddress, ); if (input == null) return; + if (!mounted) return; final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); final response = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.requestTokenToRegisterEmail( - clientSecret, - input.single, - Settings3Pid.sendAttempt++, - ), + future: () => matrix.client.requestTokenToRegisterEmail( + clientSecret, + input, + Settings3Pid.sendAttempt++, + ), ); if (response.error != null) return; + if (!mounted) return; final ok = await showOkAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.weSentYouAnEmail, - message: L10n.of(context)!.pleaseClickOnLink, - okLabel: L10n.of(context)!.iHaveClickedOnLink, + title: l10n.weSentYouAnEmail, + message: l10n.pleaseClickOnLink, + okLabel: l10n.iHaveClickedOnLink, ); if (ok != OkCancelResult.ok) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.uiaRequestBackground( - (auth) => Matrix.of(context).client.add3PID( - clientSecret, - response.result!.sid, - auth: auth, - ), - ), + delay: false, + future: () => matrix.client.uiaRequestBackground( + (auth) => matrix.client.add3PID( + clientSecret, + response.result!.sid, + auth: auth, + ), + ), ); if (success.error != null) return; setState(() => request = null); @@ -67,23 +74,27 @@ class Settings3PidController extends State { Future?>? request; - void delete3Pid(ThirdPartyIdentifier identifier) async { + Future delete3Pid(ThirdPartyIdentifier identifier) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.cancel, ) != OkCancelResult.ok) { return; } + if (!mounted) return; final success = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.delete3pidFromAccount( - identifier.address, - identifier.medium, - )); + context: context, + future: () => matrix.client.delete3pidFromAccount( + identifier.address, + identifier.medium, + ), + ); if (success.error != null) return; setState(() => request = null); } diff --git a/lib/pages/settings_3pid/settings_3pid_view.dart b/lib/pages/settings_3pid/settings_3pid_view.dart index 07ed7a4c6e..627a2ed7a0 100644 --- a/lib/pages/settings_3pid/settings_3pid_view.dart +++ b/lib/pages/settings_3pid/settings_3pid_view.dart @@ -1,93 +1,106 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_3pid/settings_3pid.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class Settings3PidView extends StatelessWidget { final Settings3PidController controller; - const Settings3PidView(this.controller, {Key? key}) : super(key: key); + const Settings3PidView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + controller.request ??= Matrix.of(context).client.getAccount3PIDs(); return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.passwordRecovery), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).passwordRecovery), actions: [ IconButton( icon: const Icon(Icons.add_outlined), onPressed: controller.add3PidAction, - tooltip: L10n.of(context)!.addEmail, - ) + tooltip: L10n.of(context).addEmail, + ), ], ), body: MaxWidthBody( + withScrolling: false, child: FutureBuilder?>( future: controller.request, - builder: (BuildContext context, - AsyncSnapshot?> snapshot) { - if (snapshot.hasError) { - return Center( - child: Text( - snapshot.error.toString(), - textAlign: TextAlign.center, - ), - ); - } - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator.adaptive(strokeWidth: 2)); - } - final identifier = snapshot.data!; - return Column( - children: [ - ListTile( - leading: CircleAvatar( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - foregroundColor: - identifier.isEmpty ? Colors.orange : Colors.grey, - child: Icon( - identifier.isEmpty - ? Icons.warning_outlined - : Icons.info_outlined, + builder: + ( + BuildContext context, + AsyncSnapshot?> snapshot, + ) { + if (snapshot.hasError) { + return Center( + child: Text( + snapshot.error.toString(), + textAlign: TextAlign.center, ), - ), - title: Text( - identifier.isEmpty - ? L10n.of(context)!.noPasswordRecoveryDescription - : L10n.of(context)! - .withTheseAddressesRecoveryDescription, - ), - ), - const Divider(height: 1), - Expanded( - child: ListView.builder( - itemCount: identifier.length, - itemBuilder: (BuildContext context, int i) => ListTile( + ); + } + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + final identifier = snapshot.data!; + return Column( + children: [ + ListTile( leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: Icon(identifier[i].iconData)), - title: Text(identifier[i].address), - trailing: IconButton( - tooltip: L10n.of(context)!.delete, - icon: const Icon(Icons.delete_forever_outlined), - color: Colors.red, - onPressed: () => controller.delete3Pid(identifier[i]), + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: identifier.isEmpty + ? Colors.orange + : Colors.grey, + child: Icon( + identifier.isEmpty + ? Icons.warning_outlined + : Icons.info_outlined, + ), + ), + title: Text( + identifier.isEmpty + ? L10n.of(context).noPasswordRecoveryDescription + : L10n.of( + context, + ).withTheseAddressesRecoveryDescription, + ), + ), + const Divider(), + Expanded( + child: ListView.builder( + itemCount: identifier.length, + itemBuilder: (BuildContext context, int i) => ListTile( + leading: CircleAvatar( + backgroundColor: theme.scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: Icon(identifier[i].iconData), + ), + title: Text(identifier[i].address), + trailing: IconButton( + tooltip: L10n.of(context).delete, + icon: const Icon(Icons.delete_forever_outlined), + color: Colors.red, + onPressed: () => + controller.delete3Pid(identifier[i]), + ), + ), ), ), - ), - ), - ], - ); - }, + ], + ); + }, ), ), ); diff --git a/lib/pages/settings_account/settings_account.dart b/lib/pages/settings_account/settings_account.dart deleted file mode 100644 index 3bf2fa5d91..0000000000 --- a/lib/pages/settings_account/settings_account.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/settings_account/settings_account_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class SettingsAccount extends StatefulWidget { - const SettingsAccount({Key? key}) : super(key: key); - - @override - SettingsAccountController createState() => SettingsAccountController(); -} - -class SettingsAccountController extends State { - Future? profileFuture; - Profile? profile; - bool profileUpdated = false; - - void updateProfile() => setState(() { - profileUpdated = true; - profile = profileFuture = null; - }); - - void setDisplaynameAction() async { - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.editDisplayname, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - initialText: profile?.displayName ?? - Matrix.of(context).client.userID!.localpart, - ) - ], - ); - if (input == null) return; - final matrix = Matrix.of(context); - final success = await showFutureLoadingDialog( - context: context, - future: () => - matrix.client.setDisplayName(matrix.client.userID!, input.single), - ); - if (success.error == null) { - updateProfile(); - } - } - - void logoutAction() async { - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSureYouWantToLogout, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.cancel) { - return; - } - final matrix = Matrix.of(context); - await showFutureLoadingDialog( - context: context, - future: () => matrix.client.logout(), - ); - } - - void deleteAccountAction() async { - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.warning, - message: L10n.of(context)!.deactivateAccountWarning, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.cancel) { - return; - } - if (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) == - OkCancelResult.cancel) { - return; - } - final input = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.pleaseEnterYourPassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - const DialogTextField( - obscureText: true, - hintText: '******', - minLines: 1, - maxLines: 1, - ) - ], - ); - if (input == null) return; - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.deactivateAccount( - auth: AuthenticationPassword( - password: input.single, - identifier: AuthenticationUserIdentifier( - user: Matrix.of(context).client.userID!), - ), - ), - ); - } - - void addAccountAction() => VRouter.of(context).to('add'); - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - profileFuture ??= client - .getProfileFromUserId( - client.userID!, - cache: !profileUpdated, - getFromRooms: !profileUpdated, - ) - .then((p) { - if (mounted) setState(() => profile = p); - return p; - }); - return SettingsAccountView(this); - } -} diff --git a/lib/pages/settings_account/settings_account_view.dart b/lib/pages/settings_account/settings_account_view.dart deleted file mode 100644 index 267bc07cfd..0000000000 --- a/lib/pages/settings_account/settings_account_view.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/utils/fluffy_share.dart'; -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'settings_account.dart'; - -class SettingsAccountView extends StatelessWidget { - final SettingsAccountController controller; - const SettingsAccountView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text(L10n.of(context)!.account)), - body: ListTileTheme( - iconColor: Theme.of(context).textTheme.bodyText1!.color, - child: MaxWidthBody( - withScrolling: true, - child: Column( - children: [ - ListTile( - title: Text(L10n.of(context)!.yourUserId), - subtitle: Text(Matrix.of(context).client.userID!), - trailing: const Icon(Icons.copy_outlined), - onTap: () => FluffyShare.share( - Matrix.of(context).client.userID!, - context, - ), - ), - ListTile( - trailing: const Icon(Icons.edit_outlined), - title: Text(L10n.of(context)!.editDisplayname), - subtitle: Text(controller.profile?.displayName ?? - Matrix.of(context).client.userID!.localpart!), - onTap: controller.setDisplaynameAction, - ), - const Divider(height: 1), - ListTile( - trailing: const Icon(Icons.person_add_outlined), - title: Text(L10n.of(context)!.addAccount), - subtitle: Text(L10n.of(context)!.enableMultiAccounts), - onTap: controller.addAccountAction, - ), - ListTile( - trailing: const Icon(Icons.exit_to_app_outlined), - title: Text(L10n.of(context)!.logout), - onTap: controller.logoutAction, - ), - const Divider(height: 1), - ListTile( - trailing: const Icon(Icons.delete_outlined), - title: Text( - L10n.of(context)!.deleteAccount, - style: const TextStyle(color: Colors.red), - ), - onTap: controller.deleteAccountAction, - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/pages/settings_chat/settings_chat.dart b/lib/pages/settings_chat/settings_chat.dart index b25941669b..c5f91c06d1 100644 --- a/lib/pages/settings_chat/settings_chat.dart +++ b/lib/pages/settings_chat/settings_chat.dart @@ -1,9 +1,14 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter/material.dart'; import 'settings_chat_view.dart'; class SettingsChat extends StatefulWidget { - const SettingsChat({Key? key}) : super(key: key); + const SettingsChat({super.key}); @override SettingsChatController createState() => SettingsChatController(); diff --git a/lib/pages/settings_chat/settings_chat_view.dart b/lib/pages/settings_chat/settings_chat_view.dart index ed6ea93d7b..895d894878 100644 --- a/lib/pages/settings_chat/settings_chat_view.dart +++ b/lib/pages/settings_chat/settings_chat_view.dart @@ -1,93 +1,110 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + import 'settings_chat.dart'; class SettingsChatView extends StatelessWidget { final SettingsChatController controller; - const SettingsChatView(this.controller, {Key? key}) : super(key: key); + const SettingsChatView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( - appBar: AppBar(title: Text(L10n.of(context)!.chat)), + appBar: AppBar( + title: Text(L10n.of(context).chat), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + ), body: ListTileTheme( - iconColor: Theme.of(context).textTheme.bodyText1!.color, + iconColor: theme.textTheme.bodyLarge!.color, child: MaxWidthBody( - withScrolling: true, child: Column( children: [ SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.renderRichContent, - onChanged: (b) => AppConfig.renderHtml = b, - storeKey: SettingKeys.renderHtml, - defaultValue: AppConfig.renderHtml, + title: L10n.of(context).formattedMessages, + subtitle: L10n.of(context).formattedMessagesDescription, + setting: AppSettings.renderHtml, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).hideRedactedMessages, + subtitle: L10n.of(context).hideRedactedMessagesBody, + setting: AppSettings.hideRedactedEvents, ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.hideRedactedEvents, - onChanged: (b) => AppConfig.hideRedactedEvents = b, - storeKey: SettingKeys.hideRedactedEvents, - defaultValue: AppConfig.hideRedactedEvents, + title: L10n.of(context).hideRoomsInSpaces, + setting: AppSettings.hideRoomsInSpaces, ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.hideUnknownEvents, - onChanged: (b) => AppConfig.hideUnknownEvents = b, - storeKey: SettingKeys.hideUnknownEvents, - defaultValue: AppConfig.hideUnknownEvents, + title: L10n.of(context).hideInvalidOrUnknownMessageFormats, + setting: AppSettings.hideUnknownEvents, ), if (PlatformInfos.isMobile) SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.autoplayImages, - onChanged: (b) => AppConfig.autoplayImages = b, - storeKey: SettingKeys.autoplayImages, - defaultValue: AppConfig.autoplayImages, + title: L10n.of(context).autoplayImages, + setting: AppSettings.autoplayImages, ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.sendOnEnter, - onChanged: (b) => AppConfig.sendOnEnter = b, - storeKey: SettingKeys.sendOnEnter, - defaultValue: AppConfig.sendOnEnter, + title: L10n.of(context).sendOnEnter, + setting: AppSettings.sendOnEnter, ), - if (Matrix.of(context).webrtcIsSupported) - SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.experimentalVideoCalls, - onChanged: (b) { - AppConfig.experimentalVoip = b; - Matrix.of(context).createVoipPlugin(); - return; - }, - storeKey: SettingKeys.experimentalVoip, - defaultValue: AppConfig.experimentalVoip, + SettingsSwitchListTile.adaptive( + title: L10n.of(context).swipeRightToLeftToReply, + setting: AppSettings.swipeRightToLeftToReply, + ), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).showThumbnailsInTimeline, + setting: AppSettings.showThumbnailsInTimeline, + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).customEmojisAndStickers, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), ), - const Divider(height: 1), + ), ListTile( - title: Text(L10n.of(context)!.emoteSettings), - onTap: () => VRouter.of(context).to('emotes'), + title: Text(L10n.of(context).customEmojisAndStickers), + subtitle: Text(L10n.of(context).customEmojisAndStickersBody), + onTap: () => context.go('/rooms/settings/chat/emotes'), trailing: const Padding( padding: EdgeInsets.all(16.0), - child: Icon(Icons.insert_emoticon_outlined), + child: Icon(Icons.chevron_right_outlined), ), ), - const Divider(height: 1), - SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.showDirectChatsInSpaces, - onChanged: (b) => AppConfig.showDirectChatsInSpaces = b, - storeKey: SettingKeys.showDirectChatsInSpaces, - defaultValue: AppConfig.showDirectChatsInSpaces, + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).calls, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), ), SettingsSwitchListTile.adaptive( - title: L10n.of(context)!.separateChatTypes, - onChanged: (b) => AppConfig.separateChatTypes = b, - storeKey: SettingKeys.separateChatTypes, - defaultValue: AppConfig.separateChatTypes, + title: L10n.of(context).experimentalVideoCalls, + onChanged: (b) { + Matrix.of(context).createVoipPlugin(); + return; + }, + setting: AppSettings.experimentalVoip, ), ], ), diff --git a/lib/pages/settings_emotes/import_archive_dialog.dart b/lib/pages/settings_emotes/import_archive_dialog.dart new file mode 100644 index 0000000000..0044efc6da --- /dev/null +++ b/lib/pages/settings_emotes/import_archive_dialog.dart @@ -0,0 +1,351 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; + +import 'package:archive/archive.dart'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; + +class ImportEmoteArchiveDialog extends StatefulWidget { + final EmotesSettingsController controller; + final Archive archive; + + const ImportEmoteArchiveDialog({ + super.key, + required this.controller, + required this.archive, + }); + + @override + State createState() => + _ImportEmoteArchiveDialogState(); +} + +class _ImportEmoteArchiveDialogState extends State { + Map _importMap = {}; + + bool _loading = false; + + double _progress = 0; + + @override + void initState() { + _importFileMap(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(L10n.of(context).importEmojis), + content: _loading + ? Center(child: CircularProgressIndicator(value: _progress)) + : SingleChildScrollView( + child: Wrap( + alignment: WrapAlignment.spaceEvenly, + crossAxisAlignment: WrapCrossAlignment.center, + runSpacing: 8, + spacing: 8, + children: _importMap.entries + .map( + (e) => _EmojiImportPreview( + key: ValueKey(e.key.name), + entry: e, + onNameChanged: (name) => _importMap[e.key] = name, + onRemove: () => + setState(() => _importMap.remove(e.key)), + ), + ) + .toList(), + ), + ), + actions: [ + TextButton( + onPressed: _loading ? null : Navigator.of(context).pop, + child: Text(L10n.of(context).cancel), + ), + TextButton( + onPressed: _loading + ? null + : _importMap.isNotEmpty + ? _addEmotePack + : null, + child: Text(L10n.of(context).importNow), + ), + ], + ); + } + + void _importFileMap() { + _importMap = Map.fromEntries( + widget.archive.files + .where((e) => e.isFile) + .map((e) => MapEntry(e, e.name.emoteNameFromPath)) + .sorted((a, b) => a.value.compareTo(b.value)), + ); + } + + Future _addEmotePack() async { + final matrix = Matrix.of(context); + setState(() { + _loading = true; + _progress = 0; + }); + final imports = _importMap; + final successfulUploads = {}; + + // check for duplicates first + + final skipKeys = []; + + for (final entry in imports.entries) { + final imageCode = entry.value; + + if (widget.controller.pack!.images.containsKey(imageCode)) { + final completer = Completer(); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + final result = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context).emoteExists, + message: imageCode, + cancelLabel: L10n.of(context).replace, + okLabel: L10n.of(context).skip, + ); + completer.complete(result); + }); + + final result = await completer.future; + if (result == OkCancelResult.ok) { + skipKeys.add(entry.key); + } + } + } + + for (final key in skipKeys) { + imports.remove(key); + } + + for (final entry in imports.entries) { + setState(() { + _progress += 1 / imports.length; + }); + final file = entry.key; + final imageCode = entry.value; + + try { + var mxcFile = MatrixImageFile(bytes: file.content, name: file.name); + + final thumbnail = (await mxcFile.generateThumbnail( + nativeImplementations: ClientManager.nativeImplementations, + )); + if (thumbnail == null) { + Logs().w('Unable to create thumbnail'); + } else { + mxcFile = thumbnail; + } + final uri = await matrix.client.uploadContent( + mxcFile.bytes, + filename: mxcFile.name, + contentType: mxcFile.mimeType, + ); + + final info = {...mxcFile.info}; + + // normalize width / height to 256, required for stickers + if (info['w'] is int && info['h'] is int) { + final ratio = info['w'] / info['h']; + if (info['w'] > info['h']) { + info['w'] = 256; + info['h'] = (256.0 / ratio).round(); + } else { + info['h'] = 256; + info['w'] = (ratio * 256.0).round(); + } + } + widget.controller.pack!.images[imageCode] = + ImagePackImageContent.fromJson({ + 'url': uri.toString(), + 'info': info, + }); + successfulUploads.add(file.name); + } catch (e) { + Logs().d('Could not upload emote $imageCode'); + } + } + + if (!mounted) return; + await widget.controller.save(context); + _importMap.removeWhere( + (key, value) => successfulUploads.contains(key.name), + ); + + _loading = false; + _progress = 0; + + // in case we have unhandled / duplicated emotes left, don't pop + if (mounted) setState(() {}); + if (_importMap.isEmpty) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => Navigator.of(context).pop(), + ); + } + } +} + +class _EmojiImportPreview extends StatefulWidget { + final MapEntry entry; + final ValueChanged onNameChanged; + final VoidCallback onRemove; + + const _EmojiImportPreview({ + super.key, + required this.entry, + required this.onNameChanged, + required this.onRemove, + }); + + @override + State<_EmojiImportPreview> createState() => _EmojiImportPreviewState(); +} + +class _EmojiImportPreviewState extends State<_EmojiImportPreview> { + final hasErrorNotifier = ValueNotifier(false); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + // TODO: support Lottie here as well ... + final controller = TextEditingController(text: widget.entry.value); + + return Stack( + alignment: Alignment.topRight, + children: [ + IconButton( + onPressed: widget.onRemove, + icon: const Icon(Icons.remove_circle), + tooltip: L10n.of(context).remove, + ), + ValueListenableBuilder( + valueListenable: hasErrorNotifier, + builder: (context, hasError, child) { + if (hasError) return _ImageFileError(name: widget.entry.key.name); + + return Column( + mainAxisSize: .min, + mainAxisAlignment: .center, + crossAxisAlignment: .center, + children: [ + Image.memory( + widget.entry.key.content, + height: 64, + width: 64, + errorBuilder: (context, e, s) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => _setRenderError(), + ); + + return _ImageFileError(name: widget.entry.key.name); + }, + ), + SizedBox( + width: 128, + child: TextField( + controller: controller, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp(r'^[-\w]+$')), + ], + autocorrect: false, + minLines: 1, + maxLines: 1, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + border: const OutlineInputBorder(), + prefixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + suffixStyle: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + onChanged: widget.onNameChanged, + onSubmitted: widget.onNameChanged, + ), + ), + ], + ); + }, + ), + ], + ); + } + + void _setRenderError() { + hasErrorNotifier.value = true; + widget.onRemove.call(); + } +} + +class _ImageFileError extends StatelessWidget { + final String name; + + const _ImageFileError({required this.name}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return SizedBox.square( + dimension: 64, + child: Tooltip( + message: name, + child: Column( + mainAxisAlignment: .start, + mainAxisSize: .min, + crossAxisAlignment: .center, + children: [ + const Icon(Icons.error), + Text( + L10n.of(context).notAnImage, + textAlign: TextAlign.center, + style: theme.textTheme.labelSmall, + ), + ], + ), + ), + ); + } +} + +extension on String { + /// normalizes a file path into its name only replacing any special character + /// [^-\w] with an underscore and removing the extension + /// + /// Used to compute emote name proposal based on file name + String get emoteNameFromPath { + // ... removing leading path + return split(RegExp(r'[/\\]')).last + // ... removing file extension + .split('.') + .first + // ... lowering + .toLowerCase() + // ... replacing unexpected characters + .replaceAll(RegExp(r'[^-\w]'), '_'); + } +} diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 708edfa7e9..949cca58bf 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -1,47 +1,88 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:archive/archive.dart' + if (dart.library.io) 'package:archive/archive_io.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' hide Client; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; import '../../widgets/matrix.dart'; +import 'import_archive_dialog.dart'; import 'settings_emotes_view.dart'; class EmotesSettings extends StatefulWidget { - const EmotesSettings({Key? key}) : super(key: key); + final String? roomId; + const EmotesSettings({required this.roomId, super.key}); @override EmotesSettingsController createState() => EmotesSettingsController(); } class EmotesSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; - Room? get room => - roomId != null ? Matrix.of(context).client.getRoomById(roomId!) : null; - String? get stateKey => VRouter.of(context).pathParameters['state_key']; + late final Room? room; + + String? stateKey; + + List? get packKeys { + final room = this.room; + if (room == null) return null; + final keys = room.states['im.ponies.room_emotes']?.keys.toList() ?? []; + keys.sort(); + return keys; + } + + @override + void initState() { + super.initState(); + room = widget.roomId != null + ? Matrix.of(context).client.getRoomById(widget.roomId!) + : null; + setStateKey(packKeys?.firstOrNull, reset: false); + } + + void setStateKey(String? key, {reset = true}) { + stateKey = key; + + final event = key == null + ? null + : room?.getState('im.ponies.room_emotes', key); + final eventPack = event?.content.tryGetMap('pack'); + packDisplayNameController.text = + eventPack?.tryGet('display_name') ?? ''; + packAttributionController.text = + eventPack?.tryGet('attribution') ?? ''; + if (reset) resetAction(); + } bool showSave = false; - TextEditingController newImageCodeController = TextEditingController(); - ValueNotifier newImageController = - ValueNotifier(null); ImagePackContent _getPack() { final client = Matrix.of(context).client; - final event = (room != null + final event = + (room != null ? room!.getState('im.ponies.room_emotes', stateKey ?? '') : client.accountData['im.ponies.user_emotes']) ?? - BasicEvent( - type: 'm.dummy', - content: {}, - ); + BasicEvent(type: 'm.dummy', content: {}); // make sure we work on a *copy* of the event return BasicEvent.fromJson(event.toJson()).parsedImagePackContent; } ImagePackContent? _pack; + ImagePackContent? get pack { if (_pack != null) { return _pack; @@ -50,23 +91,30 @@ class EmotesSettingsController extends State { return _pack; } - Future _save(BuildContext context) async { + Future save(BuildContext context) async { if (readonly) { return; } final client = Matrix.of(context).client; - if (room != null) { - await showFutureLoadingDialog( - context: context, - future: () => client.setRoomStateWithKey( - room!.id, 'im.ponies.room_emotes', stateKey ?? '', pack!.toJson()), - ); - } else { - await showFutureLoadingDialog( - context: context, - future: () => client.setAccountData( - client.userID!, 'im.ponies.user_emotes', pack!.toJson()), - ); + final result = await showFutureLoadingDialog( + context: context, + future: () => room != null + ? client.setRoomStateWithKey( + room!.id, + 'im.ponies.room_emotes', + stateKey ?? '', + pack!.toJson(), + ) + : client.setAccountData( + client.userID!, + 'im.ponies.user_emotes', + pack!.toJson(), + ), + ); + if (!result.isError) { + setState(() { + showSave = false; + }); } } @@ -75,7 +123,8 @@ class EmotesSettingsController extends State { return; } final client = Matrix.of(context).client; - final content = client.accountData['im.ponies.emote_rooms']?.content ?? + final content = + client.accountData['im.ponies.emote_rooms']?.content ?? {}; if (active) { if (content['rooms'] is! Map) { @@ -94,29 +143,72 @@ class EmotesSettingsController extends State { await showFutureLoadingDialog( context: context, future: () => client.setAccountData( - client.userID!, 'im.ponies.emote_rooms', content), + client.userID!, + 'im.ponies.emote_rooms', + content, + ), ); setState(() {}); } + final TextEditingController packDisplayNameController = + TextEditingController(); + + final TextEditingController packAttributionController = + TextEditingController(); + void removeImageAction(String oldImageCode) => setState(() { - pack!.images.remove(oldImageCode); - showSave = true; - }); + pack!.images.remove(oldImageCode); + showSave = true; + }); + + void toggleUsage(String imageCode, ImagePackUsage usage) { + setState(() { + final usages = pack!.images[imageCode]!.usage ??= List.from( + ImagePackUsage.values, + ); + if (!usages.remove(usage)) usages.add(usage); + showSave = true; + }); + } + + void submitDisplaynameAction() { + if (readonly) return; + packDisplayNameController.text = packDisplayNameController.text.trim(); + final input = packDisplayNameController.text; + + setState(() { + pack!.pack.displayName = input; + showSave = true; + }); + } + + void submitAttributionAction() { + if (readonly) return; + packAttributionController.text = packAttributionController.text.trim(); + final input = packAttributionController.text; + + setState(() { + pack!.pack.attribution = input; + showSave = true; + }); + } void submitImageAction( String oldImageCode, - String imageCode, ImagePackImageContent image, TextEditingController controller, ) { + controller.text = controller.text.trim().replaceAll(' ', '-'); + final imageCode = controller.text; + if (imageCode == oldImageCode) return; if (pack!.images.keys.any((k) => k == imageCode && k != oldImageCode)) { controller.text = oldImageCode; showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteExists, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteExists, + okLabel: L10n.of(context).ok, ); return; } @@ -125,8 +217,8 @@ class EmotesSettingsController extends State { showOkAlertDialog( useRootNavigator: false, context: context, - message: L10n.of(context)!.emoteInvalid, - okLabel: L10n.of(context)!.ok, + title: L10n.of(context).emoteInvalid, + okLabel: L10n.of(context).ok, ); return; } @@ -139,112 +231,185 @@ class EmotesSettingsController extends State { bool isGloballyActive(Client? client) => room != null && - client!.accountData['im.ponies.emote_rooms']?.content is Map && - client.accountData['im.ponies.emote_rooms']!.content['rooms'] is Map && - client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] - is Map && - client.accountData['im.ponies.emote_rooms']!.content['rooms'][room!.id] - [stateKey ?? ''] is Map; + client!.accountData['im.ponies.emote_rooms']?.content + .tryGetMap('rooms') + ?.tryGetMap(room!.id) + ?.tryGetMap(stateKey ?? '') != + null; bool get readonly => - room == null ? false : !(room!.canSendEvent('im.ponies.room_emotes')); + room != null && + room?.canChangeStateEvent('im.ponies.room_emotes') == false; - void saveAction() async { - await _save(context); + void resetAction() { setState(() { + _pack = _getPack(); showSave = false; }); } - void addImageAction() async { - if (newImageCodeController.text.isEmpty || - newImageController.value == null) { - await showOkAlertDialog( - useRootNavigator: false, - context: context, - message: L10n.of(context)!.emoteWarnNeedToPick, - okLabel: L10n.of(context)!.ok, - ); - return; - } - final imageCode = newImageCodeController.text; - if (pack!.images.containsKey(imageCode)) { - await showOkAlertDialog( - useRootNavigator: false, - context: context, - message: L10n.of(context)!.emoteExists, - okLabel: L10n.of(context)!.ok, - ); - return; - } - if (!RegExp(r'^[-\w]+$').hasMatch(imageCode)) { - await showOkAlertDialog( - useRootNavigator: false, - context: context, - message: L10n.of(context)!.emoteInvalid, - okLabel: L10n.of(context)!.ok, + Future createImagePack() async { + final room = this.room; + if (room == null) throw Exception('Cannot create image pack without room'); + + final input = await showTextInputDialog( + context: context, + title: L10n.of(context).newStickerPack, + hintText: L10n.of(context).name, + okLabel: L10n.of(context).create, + ); + final name = input?.trim(); + if (name == null || name.isEmpty) return; + if (!mounted) return; + + final keyName = name.toLowerCase().replaceAll(' ', '_'); + + if (packKeys?.contains(name) ?? false) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(L10n.of(context).stickerPackNameAlreadyExists)), ); return; } - pack!.images[imageCode] = newImageController.value!; - await _save(context); + + await showFutureLoadingDialog( + context: context, + future: () => room.client.setRoomStateWithKey( + room.id, + 'im.ponies.room_emotes', + keyName, + { + 'images': {}, + 'pack': {'display_name': name}, + }, + ), + ); + if (!mounted) return; + setState(() {}); + await room.client.oneShotSync(); + if (!mounted) return; + setState(() {}); + } + + Future saveAction() async { + await save(context); setState(() { - newImageCodeController.text = ''; - newImageController.value = null; showSave = false; }); } - void imagePickerAction( - ValueNotifier controller) async { - final result = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - if (result.fileName == null) return; - var file = MatrixImageFile( - bytes: result.toUint8List(), - name: result.fileName!, + Future createStickers() async { + final matrix = Matrix.of(context); + final pickedFiles = await selectFiles( + context, + type: FileType.image, + allowMultiple: true, ); - try { - file = (await file.generateThumbnail( - compute: Matrix.of(context).client.runInBackground, - ))!; - } catch (_) { - // do nothing - } - final uploadResp = await showFutureLoadingDialog( + if (pickedFiles.isEmpty) return; + if (!mounted) return; + + await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.uploadContent( + futureWithProgress: (setProgress) async { + for (final (i, pickedFile) in pickedFiles.indexed) { + setProgress(i / pickedFiles.length); + var file = MatrixImageFile( + bytes: await pickedFile.readAsBytes(), + name: pickedFile.name, + ); + file = + await file.generateThumbnail( + nativeImplementations: ClientManager.nativeImplementations, + ) ?? + file; + final uri = await matrix.client.uploadContent( file.bytes, filename: file.name, contentType: file.mimeType, - ), - ); - if (uploadResp.error == null) { - setState(() { - final info = { - ...file.info, - }; - // normalize width / height to 256, required for stickers - if (info['w'] is int && info['h'] is int) { - final ratio = info['w'] / info['h']; - if (info['w'] > info['h']) { - info['w'] = 256; - info['h'] = (256.0 / ratio).round(); - } else { - info['h'] = 256; - info['w'] = (ratio * 256.0).round(); - } + ); + + setState(() { + final info = {...file.info}; + // normalize width / height to 256, required for stickers + if (info['w'] is int && info['h'] is int) { + final ratio = info['w'] / info['h']; + if (info['w'] > info['h']) { + info['w'] = 256; + info['h'] = (256.0 / ratio).round(); + } else { + info['h'] = 256; + info['w'] = (ratio * 256.0).round(); + } + } + final imageCode = pickedFile.name.split('.').first; + pack!.images[imageCode] = ImagePackImageContent.fromJson( + {'url': uri.toString(), 'info': info}, + ); + }); } - controller.value = ImagePackImageContent.fromJson({ - 'url': uploadResp.result.toString(), - 'info': info, - }); - }); - } + }, + ); + + setState(() { + showSave = true; + }); } @override Widget build(BuildContext context) { return EmotesSettingsView(this); } + + Future importEmojiZip() async { + final result = await selectFiles(context, type: FileType.any); + + if (result.isEmpty) return; + + final buffer = InputMemoryStream(await result.single.readAsBytes()); + + final archive = ZipDecoder().decodeStream(buffer); + if (!mounted) return; + + await showDialog( + context: context, + // breaks [Matrix.of] calls otherwise + useRootNavigator: false, + builder: (context) => + ImportEmoteArchiveDialog(controller: this, archive: archive), + ); + setState(() {}); + } + + Future exportAsZip() async { + final client = Matrix.of(context).client; + + final result = await showFutureLoadingDialog( + context: context, + future: () async { + final pack = _getPack(); + final archive = Archive(); + for (final entry in pack.images.entries) { + final emote = entry.value; + final name = entry.key; + final url = await emote.url.getDownloadUri(client); + final response = await get( + url, + headers: {'authorization': 'Bearer ${client.accessToken}'}, + ); + + archive.addFile( + ArchiveFile(name, response.bodyBytes.length, response.bodyBytes), + ); + } + final fileName = + '${pack.pack.displayName ?? client.userID?.localpart ?? 'emotes'}.zip'; + final output = ZipEncoder().encode(archive); + + return MatrixFile(name: fileName, bytes: Uint8List.fromList(output)); + }, + ); + final file = result.result; + if (file == null) return; + if (!mounted) return; + file.save(context); + } } diff --git a/lib/pages/settings_emotes/settings_emotes_view.dart b/lib/pages/settings_emotes/settings_emotes_view.dart index 9307faad63..f6f05c8fe3 100644 --- a/lib/pages/settings_emotes/settings_emotes_view.dart +++ b/lib/pages/settings_emotes/settings_emotes_view.dart @@ -1,207 +1,352 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/mxc_image_viewer.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import '../../widgets/matrix.dart'; import 'settings_emotes.dart'; +enum PopupMenuEmojiActions { import, export } + class EmotesSettingsView extends StatelessWidget { final EmotesSettingsController controller; - const EmotesSettingsView(this.controller, {Key? key}) : super(key: key); + const EmotesSettingsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + if (controller.widget.roomId != null && controller.room == null) { + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).oopsSomethingWentWrong)), + body: Center( + child: Text(L10n.of(context).youAreNoLongerParticipatingInThisChat), + ), + ); + } + final theme = Theme.of(context); + final client = Matrix.of(context).client; final imageKeys = controller.pack!.images.keys.toList(); + final packKeys = controller.packKeys; + if (packKeys != null && packKeys.isEmpty) { + packKeys.add(''); + } + final attributionUrl = Uri.tryParse( + controller.packAttributionController.text, + ); + return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.emoteSettings), - ), - floatingActionButton: controller.showSave - ? FloatingActionButton( - onPressed: controller.saveAction, - child: const Icon(Icons.save_outlined, color: Colors.white), + leading: controller.showSave + ? TextButton( + onPressed: controller.resetAction, + child: Text(L10n.of(context).cancel), + ) + : null, + title: Text(L10n.of(context).customEmojisAndStickers), + actions: [ + if (controller.showSave) + Padding( + padding: const EdgeInsets.only(right: 16.0), + child: TextButton( + onPressed: () => controller.save(context), + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + child: Text(L10n.of(context).saveChanges), + ), ) - : null, + else + PopupMenuButton( + useRootNavigator: true, + onSelected: (value) { + switch (value) { + case PopupMenuEmojiActions.export: + controller.exportAsZip(); + break; + case PopupMenuEmojiActions.import: + controller.importEmojiZip(); + break; + } + }, + itemBuilder: (context) => [ + if (!controller.readonly) + PopupMenuItem( + value: PopupMenuEmojiActions.import, + child: Text(L10n.of(context).importFromZipFile), + ), + if (imageKeys.isNotEmpty) + PopupMenuItem( + value: PopupMenuEmojiActions.export, + child: Text(L10n.of(context).exportEmotePack), + ), + ], + ), + ], + bottom: packKeys == null + ? null + : PreferredSize( + preferredSize: const Size.fromHeight(48), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: SizedBox( + height: 40, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: packKeys.length + 1, + itemBuilder: (context, i) { + if (i == 0) { + if (controller.readonly) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 4.0, + ), + child: FilterChip( + label: const Icon(Icons.add_outlined, size: 20), + onSelected: controller.showSave + ? null + : (_) => controller.createImagePack(), + ), + ); + } + i--; + final key = packKeys[i]; + final event = controller.room?.getState( + 'im.ponies.room_emotes', + packKeys[i], + ); + + final eventPack = event?.content + .tryGetMap('pack'); + final packName = + eventPack?.tryGet('display_name') ?? + eventPack?.tryGet('name') ?? + (key.isNotEmpty ? key : 'Default'); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), + child: FilterChip( + label: Text(packName), + selected: + controller.stateKey == key || + (controller.stateKey == null && key.isEmpty), + onSelected: controller.showSave + ? null + : (_) => controller.setStateKey(key), + ), + ); + }, + ), + ), + ), + ), + ), body: MaxWidthBody( child: Column( + mainAxisSize: .min, + crossAxisAlignment: .stretch, children: [ - if (!controller.readonly) - Container( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - ), - child: ListTile( - leading: Container( - width: 180.0, - height: 38, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(10)), - color: Theme.of(context).secondaryHeaderColor, - ), - child: TextField( - controller: controller.newImageCodeController, - autocorrect: false, - minLines: 1, - maxLines: 1, - decoration: InputDecoration( - hintText: L10n.of(context)!.emoteShortcode, - prefixText: ': ', - suffixText: ':', - prefixStyle: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - suffixStyle: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - border: InputBorder.none, - ), - ), + if (controller.room != null) ...[ + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + maxLength: 256, + controller: controller.packDisplayNameController, + readOnly: controller.readonly, + onSubmitted: (_) => controller.submitDisplaynameAction(), + decoration: InputDecoration( + counter: const SizedBox.shrink(), + hintText: controller.stateKey, + labelText: L10n.of(context).stickerPackName, ), - title: _ImagePicker( - controller: controller.newImageController, - onPressed: controller.imagePickerAction, - ), - trailing: InkWell( - onTap: controller.addImageAction, - child: const Icon( - Icons.add_outlined, - color: Colors.green, - size: 32.0, - ), + ), + ), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + maxLength: 256, + controller: controller.packAttributionController, + readOnly: controller.readonly, + keyboardType: TextInputType.url, + onSubmitted: (_) => controller.submitAttributionAction(), + decoration: InputDecoration( + counter: const SizedBox.shrink(), + labelText: L10n.of(context).attribution, + suffixIcon: attributionUrl == null + ? null + : IconButton( + icon: const Icon(Icons.link_outlined), + onPressed: () => UrlLauncher( + context, + attributionUrl.toString(), + ).launchUrl(), + ), ), ), ), - if (controller.room != null) + ], + if (!controller.readonly) ...[ + Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton.icon( + onPressed: controller.createStickers, + icon: const Icon(Icons.upload_outlined), + label: Text(L10n.of(context).createSticker), + ), + ), + const Divider(), + ], + if (controller.room != null && imageKeys.isNotEmpty) SwitchListTile.adaptive( - title: Text(L10n.of(context)!.enableEmotesGlobally), + title: Text(L10n.of(context).enableEmotesGlobally), value: controller.isGloballyActive(client), onChanged: controller.setIsGloballyActive, ), - if (!controller.readonly || controller.room != null) - Divider( - height: 2, - thickness: 2, - color: Theme.of(context).primaryColor, - ), - Expanded( - child: imageKeys.isEmpty - ? Center( - child: Padding( - padding: const EdgeInsets.all(16), - child: Text( - L10n.of(context)!.noEmotesFound, - style: const TextStyle(fontSize: 20), - ), + imageKeys.isEmpty + ? Center( + child: Padding( + padding: const EdgeInsets.all(16), + child: Text( + L10n.of(context).noEmotesFound, + style: const TextStyle(fontSize: 20), ), - ) - : ListView.separated( - separatorBuilder: (BuildContext context, int i) => - Container(), - itemCount: imageKeys.length + 1, - itemBuilder: (BuildContext context, int i) { - if (i >= imageKeys.length) { - return Container(height: 70); - } - final imageCode = imageKeys[i]; - final image = controller.pack!.images[imageCode]!; - final textEditingController = TextEditingController(); - textEditingController.text = imageCode; - final useShortCuts = - (PlatformInfos.isWeb || PlatformInfos.isDesktop); - return ListTile( - leading: Container( - width: 180.0, - height: 38, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration( - borderRadius: - const BorderRadius.all(Radius.circular(10)), - color: Theme.of(context).secondaryHeaderColor, - ), - child: Shortcuts( - shortcuts: !useShortCuts - ? {} - : { - LogicalKeySet(LogicalKeyboardKey.enter): - SubmitLineIntent(), - }, - child: Actions( - actions: !useShortCuts + ), + ) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, int i) => + const SizedBox.shrink(), + itemCount: imageKeys.length, + itemBuilder: (BuildContext context, int i) { + final imageCode = imageKeys[i]; + final image = controller.pack!.images[imageCode]!; + final textEditingController = TextEditingController(); + textEditingController.text = imageCode; + final useShortCuts = + (PlatformInfos.isWeb || PlatformInfos.isDesktop); + return ListTile( + title: Row( + children: [ + Expanded( + child: Shortcuts( + shortcuts: !useShortCuts ? {} : { - SubmitLineIntent: - CallbackAction(onInvoke: (i) { - controller.submitImageAction( - imageCode, - textEditingController.text, - image, - textEditingController, - ); - return null; - }), + LogicalKeySet(LogicalKeyboardKey.enter): + SubmitLineIntent(), }, - child: TextField( - readOnly: controller.readonly, - controller: textEditingController, - autocorrect: false, - minLines: 1, - maxLines: 1, - decoration: InputDecoration( - hintText: L10n.of(context)!.emoteShortcode, - prefixText: ': ', - suffixText: ':', - prefixStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold, - ), - suffixStyle: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold, + child: Actions( + actions: !useShortCuts + ? {} + : { + SubmitLineIntent: CallbackAction( + onInvoke: (i) { + controller.submitImageAction( + imageCode, + image, + textEditingController, + ); + return null; + }, + ), + }, + child: TextField( + readOnly: controller.readonly, + controller: textEditingController, + autocorrect: false, + minLines: 1, + maxLines: 1, + maxLength: 128, + decoration: InputDecoration( + hintText: L10n.of(context).emoteShortcode, + prefixText: ': ', + suffixText: ':', + counter: const SizedBox.shrink(), + filled: false, + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors.transparent, + ), + ), ), - border: InputBorder.none, - ), - onSubmitted: (s) => - controller.submitImageAction( - imageCode, - s, - image, - textEditingController, + onSubmitted: (s) => + controller.submitImageAction( + imageCode, + image, + textEditingController, + ), ), ), ), ), - ), - title: _EmoteImage(image.url), - trailing: controller.readonly - ? null - : InkWell( - onTap: () => - controller.removeImageAction(imageCode), - child: const Icon( - Icons.delete_outlined, - color: Colors.red, - size: 32.0, + if (!controller.readonly) + PopupMenuButton( + onSelected: (usage) => + controller.toggleUsage(imageCode, usage), + itemBuilder: (context) => [ + PopupMenuItem( + value: ImagePackUsage.sticker, + child: Row( + mainAxisSize: .min, + children: [ + if (image.usage?.contains( + ImagePackUsage.sticker, + ) ?? + true) + const Icon(Icons.check_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).useAsSticker), + ], + ), ), - ), - ); - }, - ), - ), + PopupMenuItem( + value: ImagePackUsage.emoticon, + child: Row( + mainAxisSize: .min, + children: [ + if (image.usage?.contains( + ImagePackUsage.emoticon, + ) ?? + true) + const Icon(Icons.check_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).useAsEmoji), + ], + ), + ), + ], + icon: const Icon(Icons.edit_outlined), + ), + ], + ), + leading: _EmoteImage(image.url), + trailing: controller.readonly + ? null + : IconButton( + tooltip: L10n.of(context).delete, + onPressed: () => + controller.removeImageAction(imageCode), + icon: const Icon(Icons.delete_outlined), + ), + ); + }, + ), ], ), ), @@ -211,50 +356,29 @@ class EmotesSettingsView extends StatelessWidget { class _EmoteImage extends StatelessWidget { final Uri mxc; + const _EmoteImage(this.mxc); @override Widget build(BuildContext context) { - const size = 38.0; - final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; - final url = mxc.getThumbnail( - Matrix.of(context).client, - width: size * devicePixelRatio, - height: size * devicePixelRatio, - method: ThumbnailMethod.scale, - ); - return CachedNetworkImage( - imageUrl: url.toString(), - fit: BoxFit.contain, - width: size, - height: size, + const size = 44.0; + final key = 'sticker_preview_$mxc'; + return InkWell( + borderRadius: BorderRadius.circular(4), + onTap: () => + showDialog(context: context, builder: (_) => MxcImageViewer(mxc)), + child: MxcImage( + key: ValueKey(key), + cacheKey: key, + uri: mxc, + fit: BoxFit.contain, + width: size, + height: size, + isThumbnail: true, + animated: true, + ), ); } } -class _ImagePicker extends StatefulWidget { - final ValueNotifier controller; - - final void Function(ValueNotifier) onPressed; - - const _ImagePicker({required this.controller, required this.onPressed}); - - @override - _ImagePickerState createState() => _ImagePickerState(); -} - -class _ImagePickerState extends State<_ImagePicker> { - @override - Widget build(BuildContext context) { - if (widget.controller.value == null) { - return ElevatedButton( - onPressed: () => widget.onPressed(widget.controller), - child: Text(L10n.of(context)!.pickImage), - ); - } else { - return _EmoteImage(widget.controller.value!.url); - } - } -} - class SubmitLineIntent extends Intent {} diff --git a/lib/pages/settings_homeserver/settings_homeserver.dart b/lib/pages/settings_homeserver/settings_homeserver.dart new file mode 100644 index 0000000000..345e3e0a85 --- /dev/null +++ b/lib/pages/settings_homeserver/settings_homeserver.dart @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import 'package:http/http.dart' as http; +import 'package:matrix/matrix.dart'; + +import '../../widgets/matrix.dart'; +import 'settings_homeserver_view.dart'; + +class SettingsHomeserver extends StatefulWidget { + const SettingsHomeserver({super.key}); + + @override + SettingsHomeserverController createState() => SettingsHomeserverController(); +} + +class SettingsHomeserverController extends State { + Future<({String name, String version, Uri federationBaseUrl})> + fetchServerInfo() async { + final client = Matrix.of(context).client; + final domain = client.userID!.domain!; + final httpClient = client.httpClient; + var federationBaseUrl = Uri(host: domain, port: 8448, scheme: 'https'); + try { + final serverWellKnownResult = await httpClient.get( + Uri.https(domain, '/.well-known/matrix/server'), + ); + final serverWellKnown = jsonDecode(serverWellKnownResult.body); + federationBaseUrl = Uri.https(serverWellKnown['m.server']); + } catch (e, s) { + Logs().w( + 'Unable to fetch federation base uri. Use $federationBaseUrl', + e, + s, + ); + } + + final serverVersionResult = await http.get( + federationBaseUrl.resolveUri(Uri(path: '/_matrix/federation/v1/version')), + ); + final { + 'server': {'name': String name, 'version': String version}, + } = Map>.from( + jsonDecode(serverVersionResult.body), + ); + + return (name: name, version: version, federationBaseUrl: federationBaseUrl); + } + + @override + Widget build(BuildContext context) => SettingsHomeserverView(this); +} diff --git a/lib/pages/settings_homeserver/settings_homeserver_view.dart b/lib/pages/settings_homeserver/settings_homeserver_view.dart new file mode 100644 index 0000000000..1372c2d601 --- /dev/null +++ b/lib/pages/settings_homeserver/settings_homeserver_view.dart @@ -0,0 +1,298 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +import '../../widgets/matrix.dart'; +import 'settings_homeserver.dart'; + +class SettingsHomeserverView extends StatelessWidget { + final SettingsHomeserverController controller; + + const SettingsHomeserverView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final client = Matrix.of(context).client; + + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text( + L10n.of( + context, + ).aboutHomeserver(client.userID?.domain ?? 'Homeserver'), + ), + ), + body: MaxWidthBody( + withScrolling: true, + child: SelectionArea( + child: Column( + mainAxisSize: .min, + children: [ + ListTile( + title: Text( + L10n.of(context).serverInformation, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + FutureBuilder( + future: client.getWellknownSupport(), + builder: (context, snapshot) { + final error = snapshot.error; + final data = snapshot.data; + if (error != null) { + return ListTile( + leading: const Icon(Icons.error_outlined), + title: Text( + error.toLocalizedString( + context, + ExceptionContext.checkServerSupportInfo, + ), + style: const TextStyle(fontSize: 14), + ), + ); + } + if (data == null) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + final supportPage = data.supportPage; + final contacts = data.contacts; + if (supportPage == null && contacts == null) { + return ListTile( + leading: const Icon(Icons.error_outlined), + title: Text( + L10n.of(context).noContactInformationProvided, + style: const TextStyle(fontSize: 14), + ), + ); + } + return Column( + mainAxisSize: .min, + children: [ + if (supportPage != null) + ListTile( + title: Text(L10n.of(context).supportPage), + subtitle: Text(supportPage.toString()), + ), + if (contacts != null) + ...contacts.map((contact) { + return ListTile( + title: Text( + contact.role.localizedString(L10n.of(context)), + ), + subtitle: Column( + mainAxisSize: .min, + children: [ + if (contact.emailAddress != null) + TextButton( + onPressed: () {}, + child: Text(contact.emailAddress!), + ), + if (contact.matrixId != null) + TextButton( + onPressed: () {}, + child: Text(contact.matrixId!), + ), + ], + ), + ); + }), + ], + ); + }, + ), + FutureBuilder( + future: controller.fetchServerInfo(), + builder: (context, snapshot) { + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: .center, + children: [ + Icon( + Icons.error_outlined, + color: theme.colorScheme.error, + ), + const SizedBox(height: 12), + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle(color: theme.colorScheme.error), + ), + ], + ); + } + final data = snapshot.data; + if (data == null) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + return Column( + mainAxisSize: .min, + children: [ + ListTile( + title: Text(L10n.of(context).name), + subtitle: Text(data.name), + ), + ListTile( + title: Text(L10n.of(context).version), + subtitle: Text(data.version), + ), + ListTile( + title: Text(L10n.of(context).federationBaseUrl), + subtitle: Linkify( + text: data.federationBaseUrl.toString(), + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + ], + ); + }, + ), + Divider(color: theme.dividerColor), + FutureBuilder( + future: client.getWellknown(), + builder: (context, snapshot) { + final error = snapshot.error; + if (error != null) { + return Column( + mainAxisAlignment: .center, + children: [ + Icon( + Icons.error_outlined, + color: theme.colorScheme.error, + ), + const SizedBox(height: 12), + Text( + error.toLocalizedString(context), + textAlign: TextAlign.center, + style: TextStyle(color: theme.colorScheme.error), + ), + ], + ); + } + final wellKnown = snapshot.data; + if (wellKnown == null) { + return const Center( + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } + final identityServer = wellKnown.mIdentityServer; + return Column( + mainAxisSize: .min, + children: [ + ListTile( + title: Text( + L10n.of(context).clientWellKnownInformation, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + ListTile( + title: Text(L10n.of(context).baseUrl), + subtitle: Linkify( + text: wellKnown.mHomeserver.baseUrl.toString(), + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + if (identityServer != null) + ListTile( + title: Text(L10n.of(context).identityServer), + subtitle: Linkify( + text: identityServer.baseUrl.toString(), + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + ...wellKnown.additionalProperties.entries.map( + (entry) => ListTile( + title: Text(entry.key), + subtitle: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: Text( + const JsonEncoder.withIndent( + ' ', + ).convert(entry.value), + style: TextStyle( + color: theme.colorScheme.onSurface, + ), + ), + ), + ), + ), + ), + ], + ); + }, + ), + ], + ), + ), + ), + ); + } +} + +extension on Role { + String localizedString(L10n l10n) { + switch (this) { + case Role.mRoleAdmin: + return l10n.contactServerAdmin; + case Role.mRoleSecurity: + return l10n.contactServerSecurity; + } + } +} diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart index cf0713aa9f..91a7a311bd 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -1,6 +1,12 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; import '../../widgets/matrix.dart'; import 'settings_ignore_list_view.dart'; @@ -8,7 +14,7 @@ import 'settings_ignore_list_view.dart'; class SettingsIgnoreList extends StatefulWidget { final String? initialUserId; - const SettingsIgnoreList({Key? key, this.initialUserId}) : super(key: key); + const SettingsIgnoreList({super.key, this.initialUserId}); @override SettingsIgnoreListController createState() => SettingsIgnoreListController(); @@ -20,19 +26,33 @@ class SettingsIgnoreListController extends State { @override void initState() { super.initState(); - if (widget.initialUserId != null) { - controller.text = widget.initialUserId!.replaceAll('@', ''); + final initialUserId = widget.initialUserId; + if (initialUserId != null) { + controller.text = initialUserId; } } + String? errorText; + void ignoreUser(BuildContext context) { - if (controller.text.isEmpty) return; - final userId = '@${controller.text}'; + final userId = controller.text.trim(); + if (userId.isEmpty) return; + if (!userId.isValidMatrixIdStrict() || userId.sigil != '@') { + setState(() { + errorText = L10n.of(context).invalidInput; + }); + return; + } + setState(() { + errorText = null; + }); + final client = Matrix.of(context).client; showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.ignoreUser(userId), + future: () => client.ignoreUser(userId), ); + setState(() {}); controller.clear(); } diff --git a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart index 05d97f0da8..b9a3af94fc 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart @@ -1,93 +1,99 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; + import '../../widgets/matrix.dart'; import 'settings_ignore_list.dart'; class SettingsIgnoreListView extends StatelessWidget { final SettingsIgnoreListController controller; - const SettingsIgnoreListView(this.controller, {Key? key}) : super(key: key); + const SettingsIgnoreListView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final client = Matrix.of(context).client; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.ignoredUsers), + leading: const Center(child: BackButton()), + title: Text(L10n.of(context).blockedUsers), ), body: MaxWidthBody( - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - controller: controller.controller, - autocorrect: false, - textInputAction: TextInputAction.done, - onSubmitted: (_) => controller.ignoreUser(context), - decoration: InputDecoration( - border: const OutlineInputBorder(), - hintText: 'bad_guy:domain.abc', - prefixText: '@', - labelText: L10n.of(context)!.ignoreUsername, - suffixIcon: IconButton( - tooltip: L10n.of(context)!.ignore, - icon: const Icon(Icons.done_outlined), - onPressed: () => controller.ignoreUser(context), + withScrolling: false, + child: StreamBuilder( + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.ignored_user_list', + ) ?? + false, + ), + builder: (context, asyncSnapshot) { + if (client.prevBatch == null) { + return const Center(child: CircularProgressIndicator.adaptive()); + } + return Column( + mainAxisSize: .min, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: .min, + children: [ + TextField( + controller: controller.controller, + autocorrect: false, + textInputAction: TextInputAction.done, + onSubmitted: (_) => controller.ignoreUser(context), + decoration: InputDecoration( + errorText: controller.errorText, + hintText: '@bad_guy:domain.abc', + floatingLabelBehavior: FloatingLabelBehavior.always, + labelText: L10n.of(context).blockUsername, + suffixIcon: IconButton( + tooltip: L10n.of(context).block, + icon: const Icon(Icons.add), + onPressed: () => controller.ignoreUser(context), + ), + ), ), - ), - ), - const SizedBox(height: 16), - Text( - L10n.of(context)!.ignoreListDescription, - style: const TextStyle(color: Colors.orange), + const SizedBox(height: 16), + Text( + L10n.of(context).blockListDescription, + style: const TextStyle(color: Colors.orange), + ), + ], ), - ], - ), - ), - const Divider(height: 1), - Expanded( - child: StreamBuilder( - stream: client.onAccountData.stream - .where((a) => a.type == 'm.ignored_user_list'), - builder: (context, snapshot) { - return ListView.builder( - itemCount: client.ignoredUsers.length, - itemBuilder: (c, i) => FutureBuilder( - future: - client.getProfileFromUserId(client.ignoredUsers[i]), - builder: (c, s) => ListTile( - leading: Avatar( - mxContent: s.data?.avatarUrl ?? Uri.parse(''), - name: s.data?.displayName ?? client.ignoredUsers[i], - ), - title: Text( - s.data?.displayName ?? client.ignoredUsers[i]), - trailing: IconButton( - tooltip: L10n.of(context)!.delete, - icon: const Icon(Icons.delete_forever_outlined), - onPressed: () => showFutureLoadingDialog( - context: context, - future: () => - client.unignoreUser(client.ignoredUsers[i]), - ), - ), + ), + Divider(color: theme.dividerColor), + Expanded( + child: ListView.builder( + itemCount: client.ignoredUsers.length, + itemBuilder: (c, i) => ListTile( + title: Text(client.ignoredUsers[i]), + trailing: IconButton( + tooltip: L10n.of(context).delete, + icon: const Icon(Icons.delete_outlined), + onPressed: () => showFutureLoadingDialog( + context: context, + future: () => + client.unignoreUser(client.ignoredUsers[i]), ), ), - ); - }), - ), - ], + ), + ), + ), + ], + ); + }, ), ), ); diff --git a/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart b/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart deleted file mode 100644 index ff15116f28..0000000000 --- a/lib/pages/settings_multiple_emotes/settings_multiple_emotes.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:vrouter/vrouter.dart'; - -import 'settings_multiple_emotes_view.dart'; - -class MultipleEmotesSettings extends StatefulWidget { - const MultipleEmotesSettings({Key? key}) : super(key: key); - - @override - MultipleEmotesSettingsController createState() => - MultipleEmotesSettingsController(); -} - -class MultipleEmotesSettingsController extends State { - String? get roomId => VRouter.of(context).pathParameters['roomid']; - @override - Widget build(BuildContext context) => MultipleEmotesSettingsView(this); -} diff --git a/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart b/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart deleted file mode 100644 index 45652f4564..0000000000 --- a/lib/pages/settings_multiple_emotes/settings_multiple_emotes_view.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/settings_multiple_emotes/settings_multiple_emotes.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class MultipleEmotesSettingsView extends StatelessWidget { - final MultipleEmotesSettingsController controller; - - const MultipleEmotesSettingsView(this.controller, {Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final room = Matrix.of(context).client.getRoomById(controller.roomId!)!; - return Scaffold( - appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.emotePacks), - ), - body: StreamBuilder( - stream: room.onUpdate.stream, - builder: (context, snapshot) { - final Map packs = - room.states['im.ponies.room_emotes'] ?? {}; - if (!packs.containsKey('')) { - packs[''] = null; - } - final keys = packs.keys.toList(); - keys.sort(); - return ListView.separated( - separatorBuilder: (BuildContext context, int i) => Container(), - itemCount: keys.length, - itemBuilder: (BuildContext context, int i) { - final event = packs[keys[i]]; - String? packName = - keys[i].isNotEmpty ? keys[i] : 'Default Pack'; - if (event != null && event.content['pack'] is Map) { - if (event.content['pack']['displayname'] is String) { - packName = event.content['pack']['displayname']; - } else if (event.content['pack']['name'] is String) { - packName = event.content['pack']['name']; - } - } - return ListTile( - title: Text(packName!), - onTap: () async { - VRouter.of(context).toSegments( - ['rooms', room.id, 'details', 'emotes', keys[i]]); - }, - ); - }); - }, - ), - ); - } -} diff --git a/lib/pages/settings_notifications/push_rule_extensions.dart b/lib/pages/settings_notifications/push_rule_extensions.dart new file mode 100644 index 0000000000..bbc9f1c184 --- /dev/null +++ b/lib/pages/settings_notifications/push_rule_extensions.dart @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; + +extension PushRuleExtension on PushRule { + String getPushRuleName(L10n l10n) { + switch (ruleId) { + case '.m.rule.contains_user_name': + return l10n.notificationRuleContainsUserName; + case '.m.rule.master': + return l10n.notificationRuleMaster; + case '.m.rule.suppress_notices': + return l10n.notificationRuleSuppressNotices; + case '.m.rule.invite_for_me': + return l10n.notificationRuleInviteForMe; + case '.m.rule.member_event': + return l10n.notificationRuleMemberEvent; + case '.m.rule.is_user_mention': + return l10n.notificationRuleIsUserMention; + case '.m.rule.contains_display_name': + return l10n.notificationRuleContainsDisplayName; + case '.m.rule.is_room_mention': + return l10n.notificationRuleIsRoomMention; + case '.m.rule.roomnotif': + return l10n.notificationRuleRoomnotif; + case '.m.rule.tombstone': + return l10n.notificationRuleTombstone; + case '.m.rule.reaction': + return l10n.notificationRuleReaction; + case '.m.rule.room_server_acl': + return l10n.notificationRuleRoomServerAcl; + case '.m.rule.suppress_edits': + return l10n.notificationRuleSuppressEdits; + case '.m.rule.call': + return l10n.notificationRuleCall; + case '.m.rule.encrypted_room_one_to_one': + return l10n.notificationRuleEncryptedRoomOneToOne; + case '.m.rule.room_one_to_one': + return l10n.notificationRuleRoomOneToOne; + case '.m.rule.message': + return l10n.notificationRuleMessage; + case '.m.rule.encrypted': + return l10n.notificationRuleEncrypted; + case '.m.rule.room.server_acl': + return l10n.notificationRuleServerAcl; + case '.im.vector.jitsi': + return l10n.notificationRuleJitsi; + default: + return ruleId.split('.').last.replaceAll('_', ' ').capitalize(); + } + } + + String getPushRuleDescription(L10n l10n) { + switch (ruleId) { + case '.m.rule.contains_user_name': + return l10n.notificationRuleContainsUserNameDescription; + case '.m.rule.master': + return l10n.notificationRuleMasterDescription; + case '.m.rule.suppress_notices': + return l10n.notificationRuleSuppressNoticesDescription; + case '.m.rule.invite_for_me': + return l10n.notificationRuleInviteForMeDescription; + case '.m.rule.member_event': + return l10n.notificationRuleMemberEventDescription; + case '.m.rule.is_user_mention': + return l10n.notificationRuleIsUserMentionDescription; + case '.m.rule.contains_display_name': + return l10n.notificationRuleContainsDisplayNameDescription; + case '.m.rule.is_room_mention': + return l10n.notificationRuleIsRoomMentionDescription; + case '.m.rule.roomnotif': + return l10n.notificationRuleRoomnotifDescription; + case '.m.rule.tombstone': + return l10n.notificationRuleTombstoneDescription; + case '.m.rule.reaction': + return l10n.notificationRuleReactionDescription; + case '.m.rule.room_server_acl': + return l10n.notificationRuleRoomServerAclDescription; + case '.m.rule.suppress_edits': + return l10n.notificationRuleSuppressEditsDescription; + case '.m.rule.call': + return l10n.notificationRuleCallDescription; + case '.m.rule.encrypted_room_one_to_one': + return l10n.notificationRuleEncryptedRoomOneToOneDescription; + case '.m.rule.room_one_to_one': + return l10n.notificationRuleRoomOneToOneDescription; + case '.m.rule.message': + return l10n.notificationRuleMessageDescription; + case '.m.rule.encrypted': + return l10n.notificationRuleEncryptedDescription; + case '.m.rule.room.server_acl': + return l10n.notificationRuleServerAclDescription; + case '.im.vector.jitsi': + return l10n.notificationRuleJitsiDescription; + default: + return l10n.unknownPushRule(ruleId); + } + } +} + +extension PushRuleKindLocal on PushRuleKind { + String localized(L10n l10n) { + switch (this) { + case PushRuleKind.content: + return l10n.contentNotificationSettings; + case PushRuleKind.override: + return l10n.generalNotificationSettings; + case PushRuleKind.room: + return l10n.roomNotificationSettings; + case PushRuleKind.sender: + return l10n.userSpecificNotificationSettings; + case PushRuleKind.underride: + return l10n.otherNotificationSettings; + } + } +} + +extension on String { + String capitalize() { + return '${this[0].toUpperCase()}${substring(1).toLowerCase()}'; + } +} diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart index 828152a3fb..9ab83eb279 100644 --- a/lib/pages/settings_notifications/settings_notifications.dart +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -1,54 +1,26 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; -import 'package:collection/collection.dart' show IterableExtension; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import '../../widgets/matrix.dart'; import 'settings_notifications_view.dart'; -class NotificationSettingsItem { - final PushRuleKind type; - final String key; - final String Function(BuildContext) title; - const NotificationSettingsItem(this.type, this.key, this.title); - static List items = [ - NotificationSettingsItem( - PushRuleKind.underride, - '.m.rule.room_one_to_one', - (c) => L10n.of(c)!.directChats, - ), - NotificationSettingsItem( - PushRuleKind.override, - '.m.rule.contains_display_name', - (c) => L10n.of(c)!.containsDisplayName, - ), - NotificationSettingsItem( - PushRuleKind.content, - '.m.rule.contains_user_name', - (c) => L10n.of(c)!.containsUserName, - ), - NotificationSettingsItem( - PushRuleKind.override, - '.m.rule.invite_for_me', - (c) => L10n.of(c)!.inviteForMe, - ), - NotificationSettingsItem( - PushRuleKind.override, - '.m.rule.member_event', - (c) => L10n.of(c)!.memberChanges, - ), - NotificationSettingsItem( - PushRuleKind.override, - '.m.rule.suppress_notices', - (c) => L10n.of(c)!.botMessages, - ), - ]; -} - class SettingsNotifications extends StatefulWidget { - const SettingsNotifications({Key? key}) : super(key: key); + const SettingsNotifications({super.key}); @override SettingsNotificationsController createState() => @@ -56,44 +28,169 @@ class SettingsNotifications extends StatefulWidget { } class SettingsNotificationsController extends State { - bool? getNotificationSetting(NotificationSettingsItem item) { - final pushRules = Matrix.of(context).client.globalPushRules; - switch (item.type) { - case PushRuleKind.content: - return pushRules!.content - ?.singleWhereOrNull((r) => r.ruleId == item.key) - ?.enabled; - case PushRuleKind.override: - return pushRules!.override - ?.singleWhereOrNull((r) => r.ruleId == item.key) - ?.enabled; - case PushRuleKind.room: - return pushRules!.room - ?.singleWhereOrNull((r) => r.ruleId == item.key) - ?.enabled; - case PushRuleKind.sender: - return pushRules!.sender - ?.singleWhereOrNull((r) => r.ruleId == item.key) - ?.enabled; - case PushRuleKind.underride: - return pushRules!.underride - ?.singleWhereOrNull((r) => r.ruleId == item.key) - ?.enabled; + bool isLoading = false; + + Future onPusherTap(Pusher pusher) async { + final delete = await showModalActionPopup( + context: context, + title: pusher.deviceDisplayName, + message: '${pusher.appDisplayName} (${pusher.appId})', + cancelLabel: L10n.of(context).cancel, + actions: [ + AdaptiveModalAction( + label: L10n.of(context).delete, + isDestructive: true, + value: true, + ), + ], + ); + if (delete != true) return; + if (!mounted) return; + + final success = await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.deletePusher( + PusherId(appId: pusher.appId, pushkey: pusher.pushkey), + ), + ); + + if (success.error != null) return; + + setState(() { + pusherFuture = null; + }); + } + + Future?>? pusherFuture; + + Future togglePushRule(PushRuleKind kind, PushRule pushRule) async { + setState(() { + isLoading = true; + }); + try { + final updateFromSync = Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) + .first; + await Matrix.of( + context, + ).client.setPushRuleEnabled(kind, pushRule.ruleId, !pushRule.enabled); + await updateFromSync; + } catch (e, s) { + Logs().w('Unable to toggle push rule', e, s); + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } } } - void setNotificationSetting(NotificationSettingsItem item, bool enabled) { - showFutureLoadingDialog( + Future editPushRule(PushRule rule, PushRuleKind kind) async { + final theme = Theme.of(context); + final action = await showAdaptiveDialog( context: context, - future: () => Matrix.of(context).client.setPushRuleEnabled( - 'global', - item.type, - item.key, - enabled, + builder: (context) => ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: AlertDialog.adaptive( + title: Text(rule.getPushRuleName(L10n.of(context))), + content: Padding( + padding: const EdgeInsets.only(top: 16.0), + child: Material( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: theme.colorScheme.surfaceContainer, + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + scrollDirection: Axis.horizontal, + child: SelectableText( + prettyJson(rule.toJson()), + style: TextStyle(color: theme.colorScheme.onSurface), + ), + ), + ), ), + actions: [ + AdaptiveDialogAction( + onPressed: Navigator.of(context).pop, + child: Text(L10n.of(context).close), + ), + if (!rule.ruleId.startsWith('.m.')) + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(PushRuleDialogAction.delete), + child: Text( + L10n.of(context).delete, + style: TextStyle(color: theme.colorScheme.error), + ), + ), + ], + ), + ), ); + if (action == null) return; + if (!mounted) return; + switch (action) { + case PushRuleDialogAction.delete: + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).deletePushRuleCanNotBeUndone, + okLabel: L10n.of(context).delete, + isDestructive: true, + ); + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + setState(() { + isLoading = true; + }); + try { + final updateFromSync = Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) + .first; + await Matrix.of(context).client.deletePushRule(kind, rule.ruleId); + await updateFromSync; + } catch (e, s) { + Logs().w('Unable to delete push rule', e, s); + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + return; + } } @override Widget build(BuildContext context) => SettingsNotificationsView(this); } + +enum PushRuleDialogAction { delete } + +String prettyJson(Map json) { + const decoder = JsonDecoder(); + const encoder = JsonEncoder.withIndent(' '); + final object = decoder.convert(jsonEncode(json)); + return encoder.convert(object); +} diff --git a/lib/pages/settings_notifications/settings_notifications_view.dart b/lib/pages/settings_notifications/settings_notifications_view.dart index c01d822070..7fac63f7fe 100644 --- a/lib/pages/settings_notifications/settings_notifications_view.dart +++ b/lib/pages/settings_notifications/settings_notifications_view.dart @@ -1,10 +1,19 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; +import 'package:fluffychat/utils/push_helper.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import '../../utils/localized_exception_extension.dart'; import '../../widgets/matrix.dart'; import 'settings_notifications.dart'; @@ -12,72 +21,128 @@ import 'settings_notifications.dart'; class SettingsNotificationsView extends StatelessWidget { final SettingsNotificationsController controller; - const SettingsNotificationsView(this.controller, {Key? key}) - : super(key: key); + const SettingsNotificationsView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final pushRules = Matrix.of(context).client.globalPushRules; + final pushCategories = [ + if (pushRules?.override?.isNotEmpty ?? false) + (rules: pushRules?.override ?? [], kind: PushRuleKind.override), + if (pushRules?.content?.isNotEmpty ?? false) + (rules: pushRules?.content ?? [], kind: PushRuleKind.content), + if (pushRules?.sender?.isNotEmpty ?? false) + (rules: pushRules?.sender ?? [], kind: PushRuleKind.sender), + if (pushRules?.underride?.isNotEmpty ?? false) + (rules: pushRules?.underride ?? [], kind: PushRuleKind.underride), + ]; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.notifications), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text(L10n.of(context).notifications), ), body: MaxWidthBody( - withScrolling: true, child: StreamBuilder( - stream: Matrix.of(context) - .client - .onAccountData - .stream - .where((event) => event.type == 'm.push_rules'), - builder: (BuildContext context, _) { - return Column( + stream: Matrix.of(context).client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ), + builder: (BuildContext context, _) { + final theme = Theme.of(context); + final lastReceivedPush = + lastReceivedPushNotification[Matrix.of( + context, + ).client.clientName]; + return SelectionArea( + child: Column( children: [ - SwitchListTile.adaptive( - value: !Matrix.of(context).client.allPushNotificationsMuted, - title: Text( - L10n.of(context)!.notificationsEnabledForThisAccount), - onChanged: (_) => showFutureLoadingDialog( - context: context, - future: () => - Matrix.of(context).client.setMuteAllPushNotifications( - !Matrix.of(context) - .client - .allPushNotificationsMuted, - ), - ), - ), - if (!Matrix.of(context).client.allPushNotificationsMuted) ...{ - const Divider(thickness: 1), + if (kDebugMode && lastReceivedPush != null) ListTile( - title: Text( - L10n.of(context)!.pushRules, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ), - ), + title: Text('Last received push notification'), + subtitle: Text(lastReceivedPush.toIso8601String()), ), - for (var item in NotificationSettingsItem.items) - SwitchListTile.adaptive( - value: controller.getNotificationSetting(item) ?? true, - title: Text(item.title(context)), - onChanged: (bool enabled) => - controller.setNotificationSetting(item, enabled), + if (kIsWeb) + SettingsSwitchListTile.adaptive( + title: L10n.of(context).playSoundOnNotification, + setting: AppSettings.webNotificationSound, + ), + if (pushRules != null) + for (final category in pushCategories) ...[ + ListTile( + title: Text( + category.kind.localized(L10n.of(context)), + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), ), - }, - const Divider(thickness: 1), + for (final rule in category.rules) + ListTile( + title: Text(rule.getPushRuleName(L10n.of(context))), + subtitle: Text.rich( + TextSpan( + children: [ + TextSpan( + text: rule.getPushRuleDescription( + L10n.of(context), + ), + ), + const TextSpan(text: ' '), + WidgetSpan( + child: InkWell( + onTap: () => controller.editPushRule( + rule, + category.kind, + ), + child: Text( + L10n.of(context).more, + style: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: + theme.colorScheme.primary, + ), + ), + ), + ), + ], + ), + ), + trailing: Switch.adaptive( + value: rule.enabled, + onChanged: controller.isLoading + ? null + : rule.ruleId != '.m.rule.master' && + Matrix.of( + context, + ).client.allPushNotificationsMuted + ? null + : (_) => controller.togglePushRule( + category.kind, + rule, + ), + ), + ), + Divider(color: theme.dividerColor), + ], ListTile( title: Text( - L10n.of(context)!.devices, + L10n.of(context).devices, style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), ), ), FutureBuilder?>( - future: Matrix.of(context).client.getPushers(), + future: controller.pusherFuture ??= Matrix.of( + context, + ).client.getPushers(), builder: (context, snapshot) { if (snapshot.hasError) { Center( @@ -88,25 +153,39 @@ class SettingsNotificationsView extends StatelessWidget { } if (snapshot.connectionState != ConnectionState.done) { const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2)); + child: CircularProgressIndicator.adaptive( + strokeWidth: 2, + ), + ); } final pushers = snapshot.data ?? []; + if (pushers.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: Text(L10n.of(context).noOtherDevicesFound), + ), + ); + } return ListView.builder( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: pushers.length, itemBuilder: (_, i) => ListTile( title: Text( - '${pushers[i].appDisplayName} - ${pushers[i].appId}'), + '${pushers[i].appDisplayName} - ${pushers[i].appId}', + ), subtitle: Text(pushers[i].data.url.toString()), + onTap: () => controller.onPusherTap(pushers[i]), ), ); }, ), ], - ); - }), + ), + ); + }, + ), ), ); } diff --git a/lib/pages/settings_password/settings_password.dart b/lib/pages/settings_password/settings_password.dart new file mode 100644 index 0000000000..6ddaa558b3 --- /dev/null +++ b/lib/pages/settings_password/settings_password.dart @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/settings_password/settings_password_view.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class SettingsPassword extends StatefulWidget { + const SettingsPassword({super.key}); + + @override + SettingsPasswordController createState() => SettingsPasswordController(); +} + +class SettingsPasswordController extends State { + final TextEditingController oldPasswordController = TextEditingController(); + final TextEditingController newPassword1Controller = TextEditingController(); + final TextEditingController newPassword2Controller = TextEditingController(); + + String? oldPasswordError; + String? newPassword1Error; + String? newPassword2Error; + + bool loading = false; + + Future changePassword() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); + setState(() { + oldPasswordError = newPassword1Error = newPassword2Error = null; + }); + if (oldPasswordController.text.isEmpty) { + setState(() { + oldPasswordError = L10n.of(context).pleaseEnterYourPassword; + }); + return; + } + if (newPassword1Controller.text.isEmpty || + newPassword1Controller.text.length < 6) { + setState(() { + newPassword1Error = L10n.of(context).pleaseChooseAStrongPassword; + }); + return; + } + if (newPassword1Controller.text != newPassword2Controller.text) { + setState(() { + newPassword2Error = L10n.of(context).passwordsDoNotMatch; + }); + return; + } + + setState(() { + loading = true; + }); + try { + await Matrix.of(context).client.changePassword( + newPassword1Controller.text, + oldPassword: oldPasswordController.text, + ); + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.passwordHasBeenChanged)), + ); + if (mounted) context.pop(); + } catch (e) { + setState(() { + newPassword2Error = e.toLocalizedString( + context, + ExceptionContext.changePassword, + ); + }); + } finally { + setState(() { + loading = false; + }); + } + } + + @override + Widget build(BuildContext context) => SettingsPasswordView(this); +} diff --git a/lib/pages/settings_password/settings_password_view.dart b/lib/pages/settings_password/settings_password_view.dart new file mode 100644 index 0000000000..1cab6f6fd1 --- /dev/null +++ b/lib/pages/settings_password/settings_password_view.dart @@ -0,0 +1,93 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/settings_password/settings_password.dart'; +import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class SettingsPasswordView extends StatelessWidget { + final SettingsPasswordController controller; + const SettingsPasswordView(this.controller, {super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + appBar: AppBar(title: Text(L10n.of(context).changePassword)), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: MaxWidthBody( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + const SizedBox(height: 16), + TextField( + controller: controller.oldPasswordController, + obscureText: true, + autocorrect: false, + autofocus: true, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outlined), + hintText: '********', + labelText: L10n.of(context).pleaseEnterYourCurrentPassword, + errorText: controller.oldPasswordError, + ), + ), + const Divider(height: 64), + TextField( + controller: controller.newPassword1Controller, + obscureText: true, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_reset_outlined), + hintText: '********', + labelText: L10n.of(context).newPassword, + errorText: controller.newPassword1Error, + ), + ), + const SizedBox(height: 16), + TextField( + controller: controller.newPassword2Controller, + obscureText: true, + autocorrect: false, + readOnly: controller.loading, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.repeat_outlined), + hintText: '********', + labelText: L10n.of(context).repeatPassword, + errorText: controller.newPassword2Error, + ), + ), + const SizedBox(height: 32), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: controller.loading + ? null + : controller.changePassword, + child: controller.loading + ? const LinearProgressIndicator() + : Text(L10n.of(context).changePassword), + ), + ), + const SizedBox(height: 16), + TextButton( + child: Text(L10n.of(context).passwordRecoverySettings), + onPressed: () => context.go('/rooms/settings/security/3pid'), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index a27e42ef43..2536245512 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -1,102 +1,164 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import '../bootstrap/bootstrap_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:matrix/matrix.dart'; + import 'settings_security_view.dart'; class SettingsSecurity extends StatefulWidget { - const SettingsSecurity({Key? key}) : super(key: key); + const SettingsSecurity({super.key}); @override SettingsSecurityController createState() => SettingsSecurityController(); } class SettingsSecurityController extends State { - void changePasswordAccountAction() async { - final input = await showTextInputDialog( - useRootNavigator: false, + Future toggleBiometrics() async { + AppLock.of(context).showLockScreen(); + + final oldState = AppLock.of(context).useBiometrics; + final actionStr = oldState + ? L10n.of(context).disableBiometrics + : L10n.of(context).enableBiometrics; + final consent = await showOkCancelAlertDialog( context: context, - title: L10n.of(context)!.changePassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - hintText: L10n.of(context)!.pleaseEnterYourPassword, - obscureText: true, - minLines: 1, - maxLines: 1, - ), - DialogTextField( - hintText: L10n.of(context)!.chooseAStrongPassword, - obscureText: true, - minLines: 1, - maxLines: 1, - ), - ], + title: actionStr, + message: L10n.of(context).biometricsDescription, + okLabel: actionStr, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, ); - if (input == null) return; - final success = await showFutureLoadingDialog( + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + + if (!oldState) { + final localAuth = LocalAuthentication(); + final unlocked = await localAuth.authenticate( + localizedReason: actionStr, + biometricOnly: true, + ); + if (!unlocked) return; + if (!mounted) return; + } + await AppLock.of(context).changeUseBiometrics(!oldState); + setState(() {}); + } + + Future disableAppLockAction() async { + AppLock.of(context).showLockScreen(); + final consent = await showOkCancelAlertDialog( context: context, - future: () => Matrix.of(context) - .client - .changePassword(input.last, oldPassword: input.first), + title: L10n.of(context).disableAppLock, + message: L10n.of(context).disableAppLockAreYouSure, + okLabel: L10n.of(context).disableAppLock, + cancelLabel: L10n.of(context).cancel, + isDestructive: true, ); - if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.passwordHasBeenChanged))); - } + if (consent != OkCancelResult.ok) return; + if (!mounted) return; + await AppLock.of(context).changePincode(null); + if (!mounted) return; + setState(() {}); } - void setAppLockAction() async { - final currentLock = - await const FlutterSecureStorage().read(key: SettingKeys.appLockKey); - if (currentLock?.isNotEmpty ?? false) { - await AppLock.of(context)!.showLockScreen(); + Future setAppLockAction() async { + await AppLock.of(context).changeUseBiometrics(false); + if (!mounted) return; + final l10n = L10n.of(context); + if (AppLock.of(context).isActive) { + AppLock.of(context).showLockScreen(); } final newLock = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context)!.pleaseChooseAPasscode, - message: L10n.of(context)!.pleaseEnter4Digits, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - DialogTextField( - validator: (text) { - if (text!.isEmpty || - (text.length == 4 && int.tryParse(text)! >= 0)) { - return null; - } - return L10n.of(context)!.pleaseEnter4Digits; - }, - keyboardType: TextInputType.number, - obscureText: true, - maxLines: 1, - minLines: 1, - ) - ], + title: l10n.pleaseChooseAPasscode, + message: l10n.pleaseEnter6Digits, + cancelLabel: l10n.cancel, + validator: (text) { + if (text.length == 6 && int.tryParse(text)! >= 0) { + return null; + } + return l10n.pleaseEnter6Digits; + }, + keyboardType: TextInputType.number, + obscureText: true, + maxLines: 1, + minLines: 1, + maxLength: 6, ); if (newLock != null) { - await const FlutterSecureStorage() - .write(key: SettingKeys.appLockKey, value: newLock.single); - if (newLock.single.isEmpty) { - AppLock.of(context)!.disable(); - } else { - AppLock.of(context)!.enable(); - } + if (!mounted) return; + await AppLock.of(context).changePincode(newLock); + setState(() {}); } } - void showBootstrapDialog(BuildContext context) async { - await BootstrapDialog( - client: Matrix.of(context).client, - ).show(context); + Future deleteAccountAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); + if (await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: l10n.warning, + message: l10n.deactivateAccountWarning, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + isDestructive: true, + ) == + OkCancelResult.cancel) { + return; + } + if (!mounted) return; + final supposedMxid = matrix.client.userID!; + final mxid = await showTextInputDialog( + useRootNavigator: false, + context: context, + title: l10n.confirmMatrixId, + validator: (text) => + text == supposedMxid ? null : l10n.supposedMxid(supposedMxid), + isDestructive: true, + okLabel: l10n.delete, + cancelLabel: l10n.cancel, + ); + if (mxid == null || mxid.isEmpty || mxid != supposedMxid) { + return; + } + if (!mounted) return; + final resp = await showFutureLoadingDialog( + context: context, + delay: false, + future: () => matrix.client.uiaRequestBackground( + (auth) => matrix.client.deactivateAccount(auth: auth, erase: true), + ), + ); + + if (!resp.isError) { + if (!mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => matrix.client.logout(), + ); + } + } + + Future dehydrateAction() => Matrix.of(context).dehydrateAction(context); + + Future changeShareKeysWith(ShareKeysWith? shareKeysWith) async { + if (shareKeysWith == null) return; + AppSettings.shareKeysWith.setItem(shareKeysWith.name); + Matrix.of(context).client.shareKeysWith = shareKeysWith; + setState(() {}); } @override diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart index ebe9567c0d..3485e73e93 100644 --- a/lib/pages/settings_security/settings_security_view.dart +++ b/lib/pages/settings_security/settings_security_view.dart @@ -1,115 +1,247 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/beautify_string_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:matrix/matrix.dart'; + import 'settings_security.dart'; class SettingsSecurityView extends StatelessWidget { final SettingsSecurityController controller; - const SettingsSecurityView(this.controller, {Key? key}) : super(key: key); + + const SettingsSecurityView(this.controller, {super.key}); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + final client = Matrix.of(context).client; + final publicMasterKey = + client.userDeviceKeys[client.userID]?.masterKey?.publicKey; + return Scaffold( - appBar: AppBar(title: Text(L10n.of(context)!.security)), + appBar: AppBar( + title: Text(L10n.of(context).security), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + ), body: ListTileTheme( - iconColor: Theme.of(context).textTheme.bodyText1!.color, + iconColor: theme.colorScheme.onSurface, child: MaxWidthBody( - withScrolling: true, - child: Column( - children: [ - ListTile( - trailing: const Icon(Icons.panorama_fish_eye), - title: Text(L10n.of(context)!.whoCanSeeMyStories), - onTap: () => VRouter.of(context).to('stories'), - ), - ListTile( - trailing: const Icon(Icons.close), - title: Text(L10n.of(context)!.ignoredUsers), - onTap: () => VRouter.of(context).to('ignorelist'), - ), - ListTile( - trailing: const Icon(Icons.vpn_key_outlined), - title: Text( - L10n.of(context)!.changePassword, - ), - onTap: controller.changePasswordAccountAction, - ), - ListTile( - trailing: const Icon(Icons.mail_outlined), - title: Text(L10n.of(context)!.passwordRecovery), - onTap: () => VRouter.of(context).to('3pid'), - ), - if (Matrix.of(context).client.encryption != null) ...{ - const Divider(thickness: 1), - if (PlatformInfos.isMobile) + child: FutureBuilder( + future: Matrix.of( + context, + ).client.getCapabilities().timeout(const Duration(seconds: 10)), + builder: (context, snapshot) { + final capabilities = snapshot.data; + final error = snapshot.error; + if (error == null && capabilities == null) { + return const Center( + child: Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(strokeWidth: 2), + ), + ); + } + return Column( + children: [ ListTile( - trailing: const Icon(Icons.lock_outlined), - title: Text(L10n.of(context)!.appLock), - onTap: controller.setAppLockAction, + title: Text( + L10n.of(context).privacy, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), ), - ListTile( - title: Text(L10n.of(context)!.yourPublicKey), - onTap: () => showOkAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.yourPublicKey, - message: - Matrix.of(context).client.fingerprintKey.beautified, - okLabel: L10n.of(context)!.ok, + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendTypingNotifications, + subtitle: L10n.of( + context, + ).sendTypingNotificationsDescription, + setting: AppSettings.sendTypingNotifications, ), - trailing: const Icon(Icons.vpn_key_outlined), - ), - if (!Matrix.of(context).client.encryption!.crossSigning.enabled) - ListTile( - title: Text(L10n.of(context)!.crossSigningEnabled), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + SettingsSwitchListTile.adaptive( + title: L10n.of(context).sendReadReceipts, + subtitle: L10n.of(context).sendReadReceiptsDescription, + setting: AppSettings.sendPublicReadReceipts, ), - if (!Matrix.of(context).client.encryption!.keyManager.enabled) ListTile( - title: Text(L10n.of(context)!.onlineKeyBackupEnabled), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).blockedUsers), + subtitle: Text( + L10n.of(context).thereAreCountUsersBlocked( + Matrix.of(context).client.ignoredUsers.length, + ), + ), + onTap: () => + context.go('/rooms/settings/security/ignorelist'), ), - if (Matrix.of(context).client.isUnknownSession) + if (PlatformInfos.supportsAppLock) ...[ + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).appLock, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text(L10n.of(context).appLockDescription), + ), + SwitchListTile.adaptive( + value: AppLock.of(context).isActive, + title: Text(L10n.of(context).useAppLock), + onChanged: (active) => active + ? controller.setAppLockAction() + : controller.disableAppLockAction(), + ), + if (AppLock.of(context).isActive) ...[ + FutureBuilder( + future: LocalAuthentication().canCheckBiometrics, + builder: (context, snapshot) { + if (snapshot.data != true) return SizedBox.shrink(); + return SwitchListTile.adaptive( + value: AppLock.of(context).useBiometrics, + onChanged: (_) => controller.toggleBiometrics(), + title: Text(L10n.of(context).unlockWithBiometrics), + ); + }, + ), + ListTile( + trailing: const Icon(Icons.lock_reset_outlined), + title: Text(L10n.of(context).resetPin), + onTap: controller.setAppLockAction, + ), + ], + ], + + Divider(color: theme.dividerColor), ListTile( - title: const Text('Session verified'), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + title: Text( + L10n.of(context).shareKeysWith, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + subtitle: Text(L10n.of(context).shareKeysWithDescription), ), - FutureBuilder( - future: () async { - return (await Matrix.of(context) - .client - .encryption! - .keyManager - .isCached()) && - (await Matrix.of(context) - .client - .encryption! - .crossSigning - .isCached()); - }(), - builder: (context, snapshot) => snapshot.data == true - ? Container() - : ListTile( - title: Text(L10n.of(context)!.keysCached), - trailing: const Icon(Icons.error, color: Colors.red), - onTap: () => controller.showBootstrapDialog(context), + ListTile( + title: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: theme.colorScheme.onInverseSurface, + child: DropdownButton( + isExpanded: true, + padding: const EdgeInsets.symmetric(horizontal: 8.0), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, ), - ), - }, - ], + underline: const SizedBox.shrink(), + value: Matrix.of(context).client.shareKeysWith, + items: ShareKeysWith.values + .map( + (share) => DropdownMenuItem( + value: share, + child: Text(share.localized(L10n.of(context))), + ), + ) + .toList(), + onChanged: controller.changeShareKeysWith, + ), + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: Text( + L10n.of(context).account, + style: TextStyle( + color: theme.colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), + if (publicMasterKey != null) + ListTile( + title: Text(L10n.of(context).yourPublicKey), + leading: const Icon(Icons.verified_user_outlined), + subtitle: SelectableText( + publicMasterKey.beautified, + style: const TextStyle(fontFamily: 'RobotoMono'), + ), + ), + ListTile( + title: Text(L10n.of(context).deviceIdentityKey), + leading: const Icon(Icons.mobile_friendly_outlined), + subtitle: SelectableText( + Matrix.of(context).client.fingerprintKey.beautified, + style: const TextStyle(fontFamily: 'RobotoMono'), + ), + ), + if (capabilities?.mChangePassword?.enabled != false || + error != null) + ListTile( + leading: const Icon(Icons.password_outlined), + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context).changePassword), + onTap: () => + context.go('/rooms/settings/security/password'), + ), + Divider(color: theme.dividerColor), + ListTile( + iconColor: Colors.orange, + leading: const Icon(Icons.delete_sweep_outlined), + title: Text( + L10n.of(context).dehydrate, + style: const TextStyle(color: Colors.orange), + ), + onTap: controller.dehydrateAction, + ), + ListTile( + iconColor: Colors.red, + leading: const Icon(Icons.delete_outlined), + title: Text( + L10n.of(context).deleteAccount, + style: const TextStyle(color: Colors.red), + ), + onTap: controller.deleteAccountAction, + ), + ], + ); + }, ), ), ), ); } } + +extension on ShareKeysWith { + String localized(L10n l10n) { + switch (this) { + case ShareKeysWith.all: + return l10n.allDevices; + case ShareKeysWith.crossVerifiedIfEnabled: + return l10n.crossVerifiedDevicesIfEnabled; + case ShareKeysWith.crossVerified: + return l10n.crossVerifiedDevices; + case ShareKeysWith.directlyVerifiedOnly: + return l10n.verifiedDevicesOnly; + } + } +} diff --git a/lib/pages/settings_stories/settings_stories.dart b/lib/pages/settings_stories/settings_stories.dart deleted file mode 100644 index b0a4818d12..0000000000 --- a/lib/pages/settings_stories/settings_stories.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/pages/settings_stories/settings_stories_view.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; - -class SettingsStories extends StatefulWidget { - const SettingsStories({Key? key}) : super(key: key); - - @override - SettingsStoriesController createState() => SettingsStoriesController(); -} - -class SettingsStoriesController extends State { - final Map users = {}; - - Room? _storiesRoom; - - Future? loadUsers; - - bool noStoriesRoom = false; - - Future toggleUser(User user) async { - final room = _storiesRoom; - if (room == null) return; - - if (users[user] ?? false) { - // Kick user from stories room and add to block list - final blockList = room.client.storiesBlockList; - blockList.add(user.id); - await showFutureLoadingDialog( - context: context, - future: () async { - await user.kick(); - await room.client.setStoriesBlockList(blockList.toSet().toList()); - setState(() { - users[user] = false; - }); - }); - return; - } - - // Invite user to stories room and remove from block list - final blockList = room.client.storiesBlockList; - blockList.remove(user.id); - await showFutureLoadingDialog( - context: context, - future: () async { - await room.client.setStoriesBlockList(blockList); - await room.invite(user.id); - setState(() { - users[user] = true; - }); - }); - return; - } - - Future _loadUsers() async { - final room = - _storiesRoom = await Matrix.of(context).client.getStoriesRoom(context); - if (room == null) { - noStoriesRoom = true; - return; - } - final users = await room.requestParticipants(); - users.removeWhere((u) => u.id == room.client.userID); - final contacts = Matrix.of(context) - .client - .contacts - .where((contact) => !users.any((u) => u.id == contact.id)); - for (final user in contacts) { - this.users[user] = false; - } - for (final user in users) { - this.users[user] = true; - } - return; - } - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - loadUsers = _loadUsers(); - }); - }); - } - - @override - Widget build(BuildContext context) => SettingsStoriesView(this); -} diff --git a/lib/pages/settings_stories/settings_stories_view.dart b/lib/pages/settings_stories/settings_stories_view.dart deleted file mode 100644 index d502373c91..0000000000 --- a/lib/pages/settings_stories/settings_stories_view.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/pages/settings_stories/settings_stories.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; - -class SettingsStoriesView extends StatelessWidget { - final SettingsStoriesController controller; - const SettingsStoriesView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(L10n.of(context)!.whoCanSeeMyStories), - elevation: 0, - ), - body: Column( - children: [ - ListTile( - title: Text(L10n.of(context)!.whoCanSeeMyStoriesDesc), - leading: CircleAvatar( - backgroundColor: Theme.of(context).secondaryHeaderColor, - foregroundColor: Theme.of(context).colorScheme.secondary, - child: const Icon(Icons.lock), - ), - ), - const Divider(height: 1), - Expanded( - child: FutureBuilder( - future: controller.loadUsers, - builder: (context, snapshot) { - final error = snapshot.error; - if (error != null) { - return Center(child: Text(error.toLocalizedString(context))); - } - if (snapshot.connectionState != ConnectionState.done) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2, - )); - } - return ListView.builder( - itemCount: controller.users.length, - itemBuilder: (context, i) { - final user = controller.users.keys.toList()[i]; - return SwitchListTile.adaptive( - value: controller.users[user] ?? false, - onChanged: (_) => controller.toggleUser(user), - secondary: Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - ), - title: Text(user.calcDisplayname()), - ); - }, - ); - }, - ), - ), - ], - ), - ); - } -} diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index 63cabb6768..8eb6b18c16 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -1,96 +1,139 @@ -import 'dart:io'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/file_selector.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/theme_builder.dart'; import 'package:flutter/material.dart'; -import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:file_picker_cross/file_picker_cross.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/config/themes.dart'; import '../../widgets/matrix.dart'; import 'settings_style_view.dart'; class SettingsStyle extends StatefulWidget { - const SettingsStyle({Key? key}) : super(key: key); + const SettingsStyle({super.key}); @override SettingsStyleController createState() => SettingsStyleController(); } class SettingsStyleController extends State { - void setWallpaperAction() async { - final wallpaper = - await FilePickerCross.importFromStorage(type: FileTypeCross.image); - final path = wallpaper.path; - if (path == null) return; - Matrix.of(context).wallpaper = File(path); - await Matrix.of(context) - .store - .setItem(SettingKeys.wallpaper, wallpaper.path); - setState(() {}); + void setChatColor(Color? color) { + AppSettings.colorSchemeSeedInt.setItem( + color?.toARGB32() ?? AppSettings.colorSchemeSeedInt.defaultValue, + ); + ThemeController.of(context).setPrimaryColor(color); } - void deleteWallpaperAction() async { - Matrix.of(context).wallpaper = null; - await Matrix.of(context).store.deleteItem(SettingKeys.wallpaper); - setState(() {}); - } + Future setWallpaper() async { + final client = Matrix.of(context).client; + final picked = await selectFiles(context, type: FileType.image); + final pickedFile = picked.firstOrNull; + if (pickedFile == null) return; + if (!mounted) return; - void setChatColor(Color? color) async { - await Matrix.of(context).store.setItem( - SettingKeys.chatColor, - color?.value.toString(), + await showFutureLoadingDialog( + context: context, + future: () async { + final url = await client.uploadContent( + await pickedFile.readAsBytes(), + filename: pickedFile.name, + ); + await client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperUrl: url), ); - AppConfig.colorSchemeSeed = color; - AdaptiveTheme.of(context).setTheme( - light: FluffyThemes.light(), - dark: FluffyThemes.dark(), + }, ); } - AdaptiveThemeMode? currentTheme; + double get wallpaperOpacity => + _wallpaperOpacity ?? + Matrix.of(context).client.applicationAccountConfig.wallpaperOpacity ?? + 0.5; + + double? _wallpaperOpacity; + + Future saveWallpaperOpacity(double opacity) async { + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () => client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperOpacity: opacity), + ), + ); + if (result.isValue) return; + + setState(() { + _wallpaperOpacity = client.applicationAccountConfig.wallpaperOpacity; + }); + } + + void updateWallpaperOpacity(double opacity) { + setState(() { + _wallpaperOpacity = opacity; + }); + } - static final List customColors = [ - AppConfig.primaryColor, - Colors.blue.shade800, - Colors.green.shade800, - Colors.orange.shade700, - Colors.pink.shade700, - Colors.blueGrey.shade600, - null, - ]; + double get wallpaperBlur => + _wallpaperBlur ?? + Matrix.of(context).client.applicationAccountConfig.wallpaperBlur ?? + 0.5; + double? _wallpaperBlur; - void switchTheme(AdaptiveThemeMode? newTheme) { + Future saveWallpaperBlur(double blur) async { + final client = Matrix.of(context).client; + final result = await showFutureLoadingDialog( + context: context, + future: () => client.updateApplicationAccountConfig( + ApplicationAccountConfig(wallpaperBlur: blur), + ), + ); + if (result.isValue) return; + + setState(() { + _wallpaperBlur = client.applicationAccountConfig.wallpaperBlur; + }); + } + + void updateWallpaperBlur(double blur) { + setState(() { + _wallpaperBlur = blur; + }); + } + + void deleteChatWallpaper() => showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.setApplicationAccountConfig( + const ApplicationAccountConfig(wallpaperUrl: null, wallpaperBlur: null), + ), + ); + + ThemeMode get currentTheme => ThemeController.of(context).themeMode; + Color? get currentColor => ThemeController.of(context).primaryColor; + + void switchTheme(ThemeMode? newTheme) { if (newTheme == null) return; switch (newTheme) { - case AdaptiveThemeMode.light: - AdaptiveTheme.of(context).setLight(); + case ThemeMode.light: + ThemeController.of(context).setThemeMode(ThemeMode.light); break; - case AdaptiveThemeMode.dark: - AdaptiveTheme.of(context).setDark(); + case ThemeMode.dark: + ThemeController.of(context).setThemeMode(ThemeMode.dark); break; - case AdaptiveThemeMode.system: - AdaptiveTheme.of(context).setSystem(); + case ThemeMode.system: + ThemeController.of(context).setThemeMode(ThemeMode.system); break; } - setState(() => currentTheme = newTheme); - } - - void changeFontSizeFactor(double d) { - setState(() => AppConfig.fontSizeFactor = d); - Matrix.of(context).store.setItem( - SettingKeys.fontSizeFactor, - AppConfig.fontSizeFactor.toString(), - ); + setState(() {}); } - void changeBubbleSizeFactor(double d) { - setState(() => AppConfig.bubbleSizeFactor = d); - Matrix.of(context).store.setItem( - SettingKeys.bubbleSizeFactor, - AppConfig.bubbleSizeFactor.toString(), - ); + Future changeFontSizeFactor(double d) async { + await AppSettings.fontSizeFactor.setItem(d); + setState(() {}); } @override diff --git a/lib/pages/settings_style/settings_style_view.dart b/lib/pages/settings_style/settings_style_view.dart index 9514d5e696..916eff6837 100644 --- a/lib/pages/settings_style/settings_style_view.dart +++ b/lib/pages/settings_style/settings_style_view.dart @@ -1,192 +1,346 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'dart:ui'; +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/events/state_message.dart'; +import 'package:fluffychat/utils/account_config.dart'; +import 'package:fluffychat/utils/color_value.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/app_config.dart'; -import '../../widgets/matrix.dart'; import 'settings_style.dart'; class SettingsStyleView extends StatelessWidget { final SettingsStyleController controller; - const SettingsStyleView(this.controller, {Key? key}) : super(key: key); + const SettingsStyleView(this.controller, {super.key}); @override Widget build(BuildContext context) { - controller.currentTheme ??= AdaptiveTheme.of(context).mode; + final theme = Theme.of(context); + const colorPickerSize = 32.0; - final wallpaper = Matrix.of(context).wallpaper; + final client = Matrix.of(context).client; return Scaffold( appBar: AppBar( - leading: const BackButton(), - title: Text(L10n.of(context)!.changeTheme), + automaticallyImplyLeading: !FluffyThemes.isColumnMode(context), + centerTitle: FluffyThemes.isColumnMode(context), + title: Text(L10n.of(context).changeTheme), ), - backgroundColor: Theme.of(context).colorScheme.surface, + backgroundColor: theme.colorScheme.surface, body: MaxWidthBody( - withScrolling: true, child: Column( + crossAxisAlignment: .stretch, children: [ - SizedBox( - height: colorPickerSize + 24, - child: ListView( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - children: SettingsStyleController.customColors - .map( - (color) => Padding( - padding: const EdgeInsets.all(12.0), - child: InkWell( - borderRadius: BorderRadius.circular(colorPickerSize), - onTap: () => controller.setChatColor(color), - child: color == null - ? Material( - elevation: - AppConfig.colorSchemeSeed?.value == null - ? 100 - : 0, - shadowColor: AppConfig.colorSchemeSeed, - borderRadius: - BorderRadius.circular(colorPickerSize), - child: Image.asset( - 'assets/colors.png', - width: colorPickerSize, - height: colorPickerSize, - ), - ) - : Material( - color: color, - elevation: 6, - borderRadius: - BorderRadius.circular(colorPickerSize), - child: SizedBox( - width: colorPickerSize, - height: colorPickerSize, - child: AppConfig.colorSchemeSeed?.value == - color.value - ? const Center( - child: Icon( - Icons.check, - size: 16, - color: Colors.white, - )) - : null), - ), - ), - ), - ) - .toList(), + Padding( + padding: const EdgeInsets.all(12.0), + child: SegmentedButton( + selected: {controller.currentTheme}, + onSelectionChanged: (selected) => + controller.switchTheme(selected.single), + segments: [ + ButtonSegment( + value: ThemeMode.light, + label: Text(L10n.of(context).lightTheme), + icon: const Icon(Icons.light_mode_outlined), + ), + ButtonSegment( + value: ThemeMode.dark, + label: Text(L10n.of(context).darkTheme), + icon: const Icon(Icons.dark_mode_outlined), + ), + ButtonSegment( + value: ThemeMode.system, + label: Text(L10n.of(context).systemTheme), + icon: const Icon(Icons.auto_mode_outlined), + ), + ], ), ), - const Divider(height: 1), - RadioListTile( - groupValue: controller.currentTheme, - value: AdaptiveThemeMode.system, - title: Text(L10n.of(context)!.systemTheme), - onChanged: controller.switchTheme, - ), - RadioListTile( - groupValue: controller.currentTheme, - value: AdaptiveThemeMode.light, - title: Text(L10n.of(context)!.lightTheme), - onChanged: controller.switchTheme, - ), - RadioListTile( - groupValue: controller.currentTheme, - value: AdaptiveThemeMode.dark, - title: Text(L10n.of(context)!.darkTheme), - onChanged: controller.switchTheme, - ), - const Divider(height: 1), + Divider(color: theme.dividerColor), ListTile( title: Text( - L10n.of(context)!.wallpaper, + L10n.of(context).setColorTheme, style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), ), ), - if (wallpaper != null) - ListTile( - title: Image.file( - wallpaper, - height: 38, - fit: BoxFit.cover, - ), - trailing: const Icon( - Icons.delete_outlined, - color: Colors.red, - ), - onTap: controller.deleteWallpaperAction, - ), - Builder(builder: (context) { - return ListTile( - title: Text(L10n.of(context)!.changeWallpaper), - trailing: Icon( - Icons.photo_outlined, - color: Theme.of(context).textTheme.bodyText1?.color, - ), - onTap: controller.setWallpaperAction, - ); - }), - const Divider(height: 1), + DynamicColorBuilder( + builder: (light, dark) { + final systemColor = + Theme.of(context).brightness == Brightness.light + ? light?.primary + : dark?.primary; + final colors = [null, AppConfig.chatColor, ...Colors.primaries]; + if (systemColor == null) { + colors.remove(null); + } + return GridView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 64, + ), + itemCount: colors.length, + itemBuilder: (context, i) { + final color = colors[i]; + return Padding( + padding: const EdgeInsets.all(12.0), + child: Tooltip( + message: color == null + ? L10n.of(context).systemTheme + : '#${color.hexValue.toRadixString(16).toUpperCase()}', + child: InkWell( + borderRadius: BorderRadius.circular(colorPickerSize), + onTap: () => controller.setChatColor(color), + child: Material( + color: color ?? systemColor, + elevation: 6, + borderRadius: BorderRadius.circular( + colorPickerSize, + ), + child: SizedBox( + width: colorPickerSize, + height: colorPickerSize, + child: controller.currentColor == color + ? Center( + child: Icon( + Icons.check, + size: 16, + color: Theme.of( + context, + ).colorScheme.onPrimary, + ), + ) + : null, + ), + ), + ), + ), + ); + }, + ); + }, + ), + Divider(color: theme.dividerColor), ListTile( title: Text( - L10n.of(context)!.messages, + L10n.of(context).messagesStyle, style: TextStyle( - color: Theme.of(context).colorScheme.secondary, + color: theme.colorScheme.secondary, fontWeight: FontWeight.bold, ), ), ), - Container( - alignment: Alignment.centerLeft, - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Material( - color: Theme.of(context).colorScheme.primary, - elevation: 6, - shadowColor: - Theme.of(context).secondaryHeaderColor.withAlpha(100), - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - child: Padding( - padding: EdgeInsets.all(16 * AppConfig.bubbleSizeFactor), - child: Text( - 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontSize: - AppConfig.messageFontSize * AppConfig.fontSizeFactor, - ), - ), - ), + StreamBuilder( + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => + accountData.type == + ApplicationAccountConfigExtension.accountDataKey, + ) ?? + false, ), + builder: (context, snapshot) { + final accountConfig = client.applicationAccountConfig; + + return Column( + mainAxisSize: .min, + children: [ + MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: TextScaler.linear( + AppSettings.fontSizeFactor.value, + ), + ), + child: AnimatedContainer( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + decoration: const BoxDecoration(), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.center, + children: [ + if (accountConfig.wallpaperUrl != null) + Opacity( + opacity: controller.wallpaperOpacity, + child: ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: controller.wallpaperBlur, + sigmaY: controller.wallpaperBlur, + ), + child: MxcImage( + key: ValueKey(accountConfig.wallpaperUrl), + uri: accountConfig.wallpaperUrl, + fit: BoxFit.cover, + isThumbnail: true, + width: FluffyThemes.columnWidth * 2, + height: 212, + ), + ), + ), + Column( + mainAxisSize: .min, + children: [ + const SizedBox(height: 16), + StateMessage( + Event( + eventId: 'style_dummy', + room: Room( + id: '!style_dummy', + client: client, + ), + content: {'membership': 'join'}, + type: EventTypes.RoomMember, + senderId: client.userID!, + originServerTs: DateTime.now(), + stateKey: client.userID, + ), + ), + Padding( + padding: EdgeInsets.only( + left: 12 + 12 + Avatar.defaultSize, + right: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: DecoratedBox( + decoration: BoxDecoration( + color: theme.bubbleColor, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor', + style: TextStyle( + color: theme.onBubbleColor, + fontSize: AppConfig.messageFontSize, + ), + ), + ), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.only( + right: 12, + left: 12, + top: accountConfig.wallpaperUrl == null + ? 0 + : 12, + bottom: 12, + ), + child: Material( + color: theme + .colorScheme + .surfaceContainerHigh, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + child: Text( + 'Lorem ipsum dolor sit amet', + style: TextStyle( + color: theme.colorScheme.onSurface, + fontSize: AppConfig.messageFontSize, + ), + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + ), + Divider(color: theme.dividerColor), + ListTile( + title: TextButton.icon( + style: TextButton.styleFrom( + backgroundColor: theme.colorScheme.secondaryContainer, + foregroundColor: + theme.colorScheme.onSecondaryContainer, + ), + onPressed: controller.setWallpaper, + icon: const Icon(Icons.edit_outlined), + label: Text(L10n.of(context).setWallpaper), + ), + trailing: accountConfig.wallpaperUrl == null + ? null + : IconButton( + icon: const Icon(Icons.delete_outlined), + color: theme.colorScheme.error, + onPressed: controller.deleteChatWallpaper, + ), + ), + if (accountConfig.wallpaperUrl != null) ...[ + ListTile(title: Text(L10n.of(context).opacity)), + Slider.adaptive( + min: 0.1, + max: 1.0, + divisions: 9, + semanticFormatterCallback: (d) => d.toString(), + value: controller.wallpaperOpacity, + onChanged: controller.updateWallpaperOpacity, + onChangeEnd: controller.saveWallpaperOpacity, + ), + ListTile(title: Text(L10n.of(context).blur)), + Slider.adaptive( + min: 0.0, + max: 10.0, + divisions: 10, + semanticFormatterCallback: (d) => d.toString(), + value: controller.wallpaperBlur, + onChanged: controller.updateWallpaperBlur, + onChangeEnd: controller.saveWallpaperBlur, + ), + ], + ], + ); + }, ), ListTile( - title: Text(L10n.of(context)!.fontSize), - trailing: Text('× ${AppConfig.fontSizeFactor}'), + title: Text(L10n.of(context).fontSize), + trailing: Text('× ${AppSettings.fontSizeFactor.value}'), ), Slider.adaptive( min: 0.5, max: 2.5, divisions: 20, - value: AppConfig.fontSizeFactor, + value: AppSettings.fontSizeFactor.value, semanticFormatterCallback: (d) => d.toString(), onChanged: controller.changeFontSizeFactor, ), - ListTile( - title: Text(L10n.of(context)!.bubbleSize), - trailing: Text('× ${AppConfig.bubbleSizeFactor}'), - ), - Slider.adaptive( - min: 0.5, - max: 1.5, - divisions: 4, - value: AppConfig.bubbleSizeFactor, - semanticFormatterCallback: (d) => d.toString(), - onChanged: controller.changeBubbleSizeFactor, - ), ], ), ), diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart new file mode 100644 index 0000000000..d48f02f6b5 --- /dev/null +++ b/lib/pages/sign_in/sign_in_page.dart @@ -0,0 +1,247 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:fluffychat/pages/sign_in/view_model/sign_in_view_model.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; +import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:fluffychat/widgets/view_model_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class SignInPage extends StatelessWidget { + final bool signUp; + const SignInPage({required this.signUp, super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return ViewModelBuilder( + create: () => SignInViewModel(Matrix.of(context), signUp: signUp), + builder: (context, viewModel, _) { + final state = viewModel.value; + final publicHomeservers = state.filteredPublicHomeservers; + final selectedHomserver = state.selectedHomeserver; + return LoginScaffold( + appBar: AppBar( + leading: + state.loginLoading.connectionState == ConnectionState.waiting + ? CloseButton( + onPressed: () => + viewModel.setLoginLoading(AsyncSnapshot.nothing()), + ) + : BackButton(onPressed: Navigator.of(context).pop), + backgroundColor: theme.colorScheme.surface, + surfaceTintColor: theme.colorScheme.surface, + scrolledUnderElevation: 0, + centerTitle: true, + title: Text( + signUp + ? L10n.of(context).createNewAccount + : L10n.of(context).login, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + spacing: 16, + children: [ + SelectableText( + signUp + ? L10n.of(context).signUpGreeting + : L10n.of(context).signInGreeting, + textAlign: .center, + ), + TextField( + readOnly: + state.publicHomeservers.connectionState == + ConnectionState.waiting || + state.loginLoading.connectionState == + ConnectionState.waiting, + controller: viewModel.filterTextController, + autocorrect: false, + keyboardType: TextInputType.url, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + errorText: state.publicHomeservers.error?.toLocalizedString( + context, + ), + prefixIcon: const Icon(Icons.search_outlined), + hintText: L10n.of(context).searchOrEnterHomeserverAddress, + ), + ), + if (state.publicHomeservers.connectionState == + ConnectionState.done) + Expanded( + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + clipBehavior: Clip.hardEdge, + color: theme.colorScheme.surfaceContainerLow, + child: RadioGroup( + groupValue: state.selectedHomeserver, + onChanged: viewModel.selectHomeserver, + child: ListView.builder( + itemCount: publicHomeservers.length, + itemBuilder: (context, i) { + final server = publicHomeservers[i]; + final website = server.website; + return RadioListTile( + value: server, + enabled: + state.loginLoading.connectionState != + ConnectionState.waiting, + title: Row( + children: [ + Expanded( + child: Text(server.name ?? 'Unknown'), + ), + if (website != null) + SizedBox.square( + dimension: 32, + child: IconButton( + tooltip: website, + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, + ), + onPressed: () => + launchUrlString(website), + ), + ), + ], + ), + subtitle: Column( + spacing: 4.0, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (server.features?.isNotEmpty == true) + Wrap( + spacing: 4.0, + runSpacing: 4.0, + children: [ + ...?server.languages?.map( + (language) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .tertiaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + language, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onTertiaryContainer, + ), + ), + ), + ), + ), + ...server.features!.map( + (feature) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .secondaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + feature, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ], + ), + Text( + server.description ?? 'A matrix homeserver', + ), + ], + ), + ); + }, + ), + ), + ), + ) + else + Center(child: CircularProgressIndicator.adaptive()), + ], + ), + ), + bottomNavigationBar: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: + selectedHomserver == null || + !publicHomeservers.contains(selectedHomserver) + ? const SizedBox.shrink() + : Material( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SafeArea( + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: + state.loginLoading.connectionState == + ConnectionState.waiting + ? null + : () => connectToHomeserverFlow( + selectedHomserver, + context, + viewModel.setLoginLoading, + signUp, + ), + child: + state.loginLoading.connectionState == + ConnectionState.waiting + ? const CircularProgressIndicator.adaptive() + : Text(L10n.of(context).continueText), + ), + ), + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/sign_in/view_model/model/public_homeserver_data.dart b/lib/pages/sign_in/view_model/model/public_homeserver_data.dart new file mode 100644 index 0000000000..b911435dc0 --- /dev/null +++ b/lib/pages/sign_in/view_model/model/public_homeserver_data.dart @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +class PublicHomeserverData { + final String? name; + final String? clientDomain; + final String? website; + final String? isp; + final String? staffJur; + final String? rules; + final String? privacy; + final bool? usingVanillaReg; + final String? description; + final String? regMethod; + final String? regLink; + final String? software; + final String? version; + final bool? captcha; + final bool? email; + final List? languages; + final List? features; + final int? onlineStatus; + final String? serverDomain; + final int? verStatus; + final int? roomDirectory; + final bool? slidingSync; + final bool? ipv6; + + PublicHomeserverData({ + this.name, + this.clientDomain, + this.website, + this.isp, + this.staffJur, + this.rules, + this.privacy, + this.usingVanillaReg, + this.description, + this.regMethod, + this.regLink, + this.software, + this.version, + this.captcha, + this.email, + this.languages, + this.features, + this.onlineStatus, + this.serverDomain, + this.verStatus, + this.roomDirectory, + this.slidingSync, + this.ipv6, + }); + + factory PublicHomeserverData.fromJson(Map json) { + return PublicHomeserverData( + name: json['name'], + clientDomain: json['client_domain'], + website: json['website'], + isp: json['isp'], + staffJur: json['staff_jur'], + rules: json['rules'], + privacy: json['privacy'], + usingVanillaReg: json['using_vanilla_reg'], + description: json['description'], + regMethod: json['reg_method'], + regLink: json['reg_link'], + software: json['software'], + version: json['version'], + captcha: json['captcha'], + email: json['email'], + languages: List.from(json['languages'] ?? []), + features: List.from(json['features'] ?? []), + onlineStatus: json['online_status'], + serverDomain: json['server_domain'], + verStatus: json['ver_status'], + roomDirectory: json['room_directory'], + slidingSync: json['sliding_sync'], + ipv6: json['ipv6'], + ); + } +} diff --git a/lib/pages/sign_in/view_model/sign_in_state.dart b/lib/pages/sign_in/view_model/sign_in_state.dart new file mode 100644 index 0000000000..9abd8ce139 --- /dev/null +++ b/lib/pages/sign_in/view_model/sign_in_state.dart @@ -0,0 +1,15 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:flutter/material.dart'; + +class SignInState { + PublicHomeserverData? selectedHomeserver; + AsyncSnapshot> publicHomeservers = + const AsyncSnapshot.nothing(); + List filteredPublicHomeservers = []; + AsyncSnapshot loginLoading = const AsyncSnapshot.nothing(); +} diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart new file mode 100644 index 0000000000..acb0a8ca9b --- /dev/null +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -0,0 +1,113 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/widgets.dart'; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; + +class SignInViewModel extends ValueNotifier { + final MatrixState matrixService; + final bool signUp; + final TextEditingController filterTextController = TextEditingController(); + + SignInViewModel(this.matrixService, {required this.signUp}) + : super(SignInState()) { + refreshPublicHomeservers(); + filterTextController.addListener(_filterHomeservers); + } + + @override + void dispose() { + filterTextController.removeListener(_filterHomeservers); + super.dispose(); + } + + void _filterHomeservers() { + final filterText = filterTextController.text.trim().toLowerCase(); + final filteredPublicHomeservers = + value.publicHomeservers.data + ?.where( + (homeserver) => + homeserver.name?.toLowerCase().contains(filterText) ?? false, + ) + .toList() ?? + []; + if (filterText.length >= 3 && + (filterText.contains('.') || filterText.endsWith('localhost')) && + Uri.tryParse(filterText) != null && + !filteredPublicHomeservers.any( + (homeserver) => homeserver.name == filterText, + )) { + filteredPublicHomeservers.add(PublicHomeserverData(name: filterText)); + } + value.filteredPublicHomeservers = filteredPublicHomeservers; + notifyListeners(); + } + + Future refreshPublicHomeservers() async { + notifyListeners(); + value.publicHomeservers = AsyncSnapshot.waiting(); + final defaultHomeserverData = PublicHomeserverData( + name: AppSettings.defaultHomeserver.value, + ); + try { + final client = await matrixService.getLoginClient(); + final response = await client.httpClient.get(AppConfig.homeserverList); + final json = jsonDecode(response.body) as Map; + final homeserverJsonList = json['public_servers'] as List; + + final publicHomeservers = homeserverJsonList + .map((json) => PublicHomeserverData.fromJson(json)) + .toList(); + + if (signUp) { + publicHomeservers.removeWhere((server) { + return server.regMethod == null; + }); + } + + final defaultServer = publicHomeservers.singleWhereOrNull( + (server) => server.name == AppSettings.defaultHomeserver.value, + ); + + if (defaultServer == null) { + publicHomeservers.insert(0, defaultHomeserverData); + } + + value.selectedHomeserver = + value.selectedHomeserver ?? publicHomeservers.first; + value.publicHomeservers = AsyncSnapshot.withData( + ConnectionState.done, + publicHomeservers, + ); + notifyListeners(); + } catch (e, s) { + Logs().w('Unable to fetch public homeservers...', e, s); + value.selectedHomeserver = defaultHomeserverData; + value.publicHomeservers = AsyncSnapshot.withData(ConnectionState.done, [ + defaultHomeserverData, + ]); + notifyListeners(); + } + _filterHomeservers(); + } + + void selectHomeserver(PublicHomeserverData? publicHomeserverData) { + value.selectedHomeserver = publicHomeserverData; + notifyListeners(); + } + + void setLoginLoading(AsyncSnapshot loginLoading) { + value.loginLoading = loginLoading; + notifyListeners(); + } +} diff --git a/lib/pages/sign_up/signup.dart b/lib/pages/sign_up/signup.dart deleted file mode 100644 index e4a4d773b7..0000000000 --- a/lib/pages/sign_up/signup.dart +++ /dev/null @@ -1,129 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/sign_up/signup_view.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../../utils/localized_exception_extension.dart'; - -class SignupPage extends StatefulWidget { - const SignupPage({Key? key}) : super(key: key); - - @override - SignupPageController createState() => SignupPageController(); -} - -class SignupPageController extends State { - final TextEditingController passwordController = TextEditingController(); - final TextEditingController password2Controller = TextEditingController(); - final TextEditingController emailController = TextEditingController(); - String? error; - bool loading = false; - bool showPassword = false; - bool noEmailWarningConfirmed = false; - bool displaySecondPasswordField = false; - - static const int minPassLength = 8; - - void toggleShowPassword() => setState(() => showPassword = !showPassword); - - String? get domain => VRouter.of(context).queryParameters['domain']; - - final GlobalKey formKey = GlobalKey(); - - void onPasswordType(String text) { - if (text.length >= minPassLength && !displaySecondPasswordField) { - setState(() { - displaySecondPasswordField = true; - }); - } - } - - String? password1TextFieldValidator(String? value) { - if (value!.isEmpty) { - return L10n.of(context)!.chooseAStrongPassword; - } - if (value.length < minPassLength) { - return L10n.of(context)! - .pleaseChooseAtLeastChars(minPassLength.toString()); - } - return null; - } - - String? password2TextFieldValidator(String? value) { - if (value!.isEmpty) { - return L10n.of(context)!.repeatPassword; - } - if (value != passwordController.text) { - return L10n.of(context)!.passwordsDoNotMatch; - } - return null; - } - - String? emailTextFieldValidator(String? value) { - if (value!.isEmpty && !noEmailWarningConfirmed) { - noEmailWarningConfirmed = true; - return L10n.of(context)!.noEmailWarning; - } - if (value.isNotEmpty && !value.contains('@')) { - return L10n.of(context)!.pleaseEnterValidEmail; - } - return null; - } - - void signup([_]) async { - setState(() { - error = null; - }); - if (!formKey.currentState!.validate()) return; - - setState(() { - loading = true; - }); - - try { - final client = Matrix.of(context).getLoginClient(); - final email = emailController.text; - if (email.isNotEmpty) { - Matrix.of(context).currentClientSecret = - DateTime.now().millisecondsSinceEpoch.toString(); - Matrix.of(context).currentThreepidCreds = - await client.requestTokenToRegisterEmail( - Matrix.of(context).currentClientSecret, - email, - 0, - ); - } - - final displayname = Matrix.of(context).loginUsername!; - final localPart = displayname.toLowerCase().replaceAll(' ', '_'); - - await client.uiaRequestBackground( - (auth) => client.register( - username: localPart, - password: passwordController.text, - initialDeviceDisplayName: PlatformInfos.clientName, - auth: auth, - ), - ); - // Set displayname - if (displayname != localPart) { - await client.setDisplayName( - client.userID!, - displayname, - ); - } - } catch (e) { - error = (e).toLocalizedString(context); - } finally { - if (mounted) { - setState(() => loading = false); - } - } - } - - @override - Widget build(BuildContext context) => SignupPageView(this); -} diff --git a/lib/pages/sign_up/signup_view.dart b/lib/pages/sign_up/signup_view.dart deleted file mode 100644 index 754c235821..0000000000 --- a/lib/pages/sign_up/signup_view.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; -import 'signup.dart'; - -class SignupPageView extends StatelessWidget { - final SignupPageController controller; - const SignupPageView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return LoginScaffold( - appBar: AppBar( - automaticallyImplyLeading: !controller.loading, - backgroundColor: Colors.transparent, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - title: Text( - L10n.of(context)!.signUp, - style: const TextStyle(color: Colors.white), - ), - ), - body: Form( - key: controller.formKey, - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - readOnly: controller.loading, - autocorrect: false, - onChanged: controller.onPasswordType, - autofillHints: - controller.loading ? null : [AutofillHints.newPassword], - controller: controller.passwordController, - obscureText: !controller.showPassword, - validator: controller.password1TextFieldValidator, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.vpn_key_outlined), - suffixIcon: IconButton( - tooltip: L10n.of(context)!.showPassword, - icon: Icon( - controller.showPassword - ? Icons.visibility_off_outlined - : Icons.visibility_outlined, - color: Colors.black, - ), - onPressed: controller.toggleShowPassword, - ), - errorStyle: const TextStyle(color: Colors.orange), - hintText: L10n.of(context)!.chooseAStrongPassword, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - ), - ), - if (controller.displaySecondPasswordField) - Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - readOnly: controller.loading, - autocorrect: false, - autofillHints: - controller.loading ? null : [AutofillHints.newPassword], - controller: controller.password2Controller, - obscureText: !controller.showPassword, - validator: controller.password2TextFieldValidator, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.repeat_outlined), - hintText: L10n.of(context)!.repeatPassword, - errorStyle: const TextStyle(color: Colors.orange), - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - ), - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: TextFormField( - readOnly: controller.loading, - autocorrect: false, - controller: controller.emailController, - keyboardType: TextInputType.emailAddress, - autofillHints: - controller.loading ? null : [AutofillHints.username], - validator: controller.emailTextFieldValidator, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.mail_outlined), - hintText: L10n.of(context)!.enterAnEmailAddress, - errorText: controller.error, - fillColor: Theme.of(context) - .colorScheme - .background - .withOpacity(0.75), - errorStyle: TextStyle( - color: controller.emailController.text.isEmpty - ? Colors.orangeAccent - : Colors.orange, - ), - ), - ), - ), - Hero( - tag: 'loginButton', - child: Padding( - padding: const EdgeInsets.all(16), - child: ElevatedButton( - onPressed: controller.loading ? () {} : controller.signup, - child: controller.loading - ? const LinearProgressIndicator() - : Text(L10n.of(context)!.signUp), - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/story/story_page.dart b/lib/pages/story/story_page.dart deleted file mode 100644 index f6d200c334..0000000000 --- a/lib/pages/story/story_page.dart +++ /dev/null @@ -1,521 +0,0 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:video_player/video_player.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/pages/story/story_view.dart'; -import 'package:fluffychat/utils/date_time_extension.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/room_status_extension.dart'; -import 'package:fluffychat/utils/story_theme_data.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class StoryPage extends StatefulWidget { - const StoryPage({Key? key}) : super(key: key); - - @override - StoryPageController createState() => StoryPageController(); -} - -class StoryPageController extends State { - int index = 0; - int max = 0; - Duration progress = Duration.zero; - Timer? _progressTimer; - bool loadingMode = false; - - final TextEditingController replyController = TextEditingController(); - final FocusNode replyFocus = FocusNode(); - - final List events = []; - - Timeline? timeline; - - Event? get currentEvent => index < events.length ? events[index] : null; - StoryThemeData get storyThemeData => - StoryThemeData.fromJson(currentEvent?.content - .tryGetMap(StoryThemeData.contentKey) ?? - {}); - - bool replyLoading = false; - bool _modalOpened = false; - - VideoPlayerController? _videoPlayerController; - - void replyEmojiAction() async { - if (replyLoading) return; - _modalOpened = true; - await showModalBottomSheet( - context: context, - builder: (context) => EmojiPicker( - onEmojiSelected: (c, e) { - Navigator.of(context).pop(); - replyAction(e.emoji); - }, - ), - ); - _modalOpened = false; - } - - void replyAction([String? message]) async { - message ??= replyController.text; - if (message.isEmpty) return; - final currentEvent = this.currentEvent; - if (currentEvent == null) return; - setState(() { - replyLoading = true; - }); - try { - final client = Matrix.of(context).client; - final roomId = await client.startDirectChat(currentEvent.senderId); - var replyText = L10n.of(context)!.storyFrom( - currentEvent.originServerTs.localizedTime(context), - currentEvent.content.tryGet('body') ?? ''); - replyText = replyText.split('\n').map((line) => '> $line').join('\n'); - message = '$replyText\n\n$message'; - await client.getRoomById(roomId)!.sendTextEvent(message); - replyController.clear(); - replyFocus.unfocus(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.replyHasBeenSent)), - ); - } catch (e, s) { - Logs().w('Unable to reply to story', e, s); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(e.toLocalizedString(context))), - ); - } finally { - setState(() { - replyLoading = false; - }); - } - } - - List get currentSeenByUsers { - final timeline = this.timeline; - final currentEvent = this.currentEvent; - if (timeline == null || currentEvent == null) return []; - return Matrix.of(context).client.getRoomById(roomId)?.getSeenByUsers( - timeline, - events, - {}, - eventId: currentEvent.eventId, - ) ?? - []; - } - - void share() async { - Matrix.of(context).shareContent = currentEvent?.content; - hold(); - VRouter.of(context).to('share'); - } - - void displaySeenByUsers() async { - _modalOpened = true; - await showModalBottomSheet( - context: context, - builder: (context) => Scaffold( - appBar: AppBar( - title: Text(seenByUsersTitle), - ), - body: ListView.builder( - itemCount: currentSeenByUsers.length, - itemBuilder: (context, i) => ListTile( - leading: Avatar( - mxContent: currentSeenByUsers[i].avatarUrl, - name: currentSeenByUsers[i].calcDisplayname(), - ), - title: Text(currentSeenByUsers[i].calcDisplayname()), - ), - ), - ), - ); - _modalOpened = false; - } - - String get seenByUsersTitle { - final seenByUsers = currentSeenByUsers; - if (seenByUsers.isEmpty) return ''; - if (seenByUsers.length == 1) { - return L10n.of(context)!.seenByUser(seenByUsers.single.calcDisplayname()); - } - if (seenByUsers.length == 2) { - return L10n.of(context)!.seenByUserAndUser( - seenByUsers.first.calcDisplayname(), - seenByUsers.last.calcDisplayname(), - ); - } - return L10n.of(context)!.seenByUserAndCountOthers( - seenByUsers.first.calcDisplayname(), - seenByUsers.length - 1, - ); - } - - static const Duration _step = Duration(milliseconds: 50); - static const Duration maxProgress = Duration(seconds: 5); - - void _restartTimer([bool reset = true]) { - _progressTimer?.cancel(); - if (reset) progress = Duration.zero; - _progressTimer = Timer.periodic(_step, (_) { - if (replyFocus.hasFocus || _modalOpened) return; - if (!mounted) { - _progressTimer?.cancel(); - return; - } - if (loadingMode) return; - setState(() { - final video = _videoPlayerController; - if (video == null) { - progress += _step; - } else { - progress = video.value.position; - } - }); - final max = _videoPlayerController?.value.duration ?? maxProgress; - if (progress >= max) { - skip(); - } - }); - } - - bool get isOwnStory { - final client = Matrix.of(context).client; - final room = client.getRoomById(roomId); - if (room == null) return false; - return room.ownPowerLevel >= 100; - } - - String get roomId => VRouter.of(context).pathParameters['roomid'] ?? ''; - - Future? loadVideoControllerFuture; - - Future loadVideoController(Event event) async { - try { - final matrixFile = await event.downloadAndDecryptAttachment(); - if (!mounted) return null; - final tmpDirectory = await getTemporaryDirectory(); - final fileName = - event.content.tryGet('filename') ?? 'unknown_story_video.mp4'; - final file = File(tmpDirectory.path + '/' + fileName); - await file.writeAsBytes(matrixFile.bytes); - if (!mounted) return null; - final videoPlayerController = - _videoPlayerController = VideoPlayerController.file(file); - await videoPlayerController.initialize(); - await videoPlayerController.play(); - return videoPlayerController; - } catch (e, s) { - Logs().w('Unable to load video story. Try again...', e, s); - await Future.delayed(const Duration(seconds: 3)); - return loadVideoController(event); - } - } - - void skip() { - if (index + 1 >= max) { - if (isOwnStory) { - VRouter.of(context).to('/stories/create'); - } else { - VRouter.of(context).to('/rooms'); - } - return; - } - setState(() { - _videoPlayerController?.dispose(); - _videoPlayerController = null; - loadVideoControllerFuture = null; - index++; - }); - _restartTimer(); - maybeSetReadMarker(); - } - - DateTime _holdedAt = DateTime.fromMicrosecondsSinceEpoch(0); - - bool isHold = false; - - @override - void dispose() { - _videoPlayerController?.dispose(); - super.dispose(); - } - - void hold([_]) { - _holdedAt = DateTime.now(); - if (loadingMode) return; - _progressTimer?.cancel(); - setState(() { - isHold = true; - }); - } - - void unhold([_]) { - isHold = false; - if (DateTime.now().millisecondsSinceEpoch - - _holdedAt.millisecondsSinceEpoch < - 200) { - skip(); - return; - } - _restartTimer(false); - } - - void loadingModeOn() => _setLoadingMode(true); - void loadingModeOff() => _setLoadingMode(false); - - final Map> _fileCache = {}; - - void _delete() async { - final event = currentEvent; - if (event == null) return; - _modalOpened = true; - if (await showOkCancelAlertDialog( - context: context, - title: L10n.of(context)!.deleteMessage, - message: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.cancel, - ) != - OkCancelResult.ok) { - return; - } - await showFutureLoadingDialog( - context: context, - future: event.redactEvent, - ); - setState(() { - events.remove(event); - _modalOpened = false; - }); - } - - void _report() async { - _modalOpened = true; - final event = currentEvent; - if (event == null) return; - final score = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.reportMessage, - message: L10n.of(context)!.howOffensiveIsThisContent, - cancelLabel: L10n.of(context)!.cancel, - okLabel: L10n.of(context)!.ok, - actions: [ - AlertDialogAction( - key: -100, - label: L10n.of(context)!.extremeOffensive, - ), - AlertDialogAction( - key: -50, - label: L10n.of(context)!.offensive, - ), - AlertDialogAction( - key: 0, - label: L10n.of(context)!.inoffensive, - ), - ]); - if (score == null) return; - final reason = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.whyDoYouWantToReportThis, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [DialogTextField(hintText: L10n.of(context)!.reason)]); - if (reason == null || reason.single.isEmpty) return; - final result = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.reportContent( - roomId, - event.eventId, - reason: reason.single, - score: score, - ), - ); - _modalOpened = false; - if (result.error != null) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.contentHasBeenReported)), - ); - } - - Future downloadAndDecryptAttachment( - Event event, bool getThumbnail) async { - return _fileCache[event.eventId] ??= - event.downloadAndDecryptAttachment(getThumbnail: getThumbnail); - } - - void _setLoadingMode(bool mode) => loadingMode != mode - ? WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - loadingMode = mode; - }); - }) - : null; - - Uri? get avatar => Matrix.of(context) - .client - .getRoomById(roomId) - ?.getState(EventTypes.RoomCreate) - ?.senderFromMemoryOrFallback - .avatarUrl; - - String get title => - Matrix.of(context) - .client - .getRoomById(roomId) - ?.getState(EventTypes.RoomCreate) - ?.senderFromMemoryOrFallback - .calcDisplayname() ?? - 'Story not found'; - - Future? loadStory; - - Future _loadStory() async { - try { - final client = Matrix.of(context).client; - await client.roomsLoading; - await client.accountDataLoading; - final room = client.getRoomById(roomId); - if (room == null) return; - if (room.membership != Membership.join) { - final joinedFuture = room.client.onSync.stream - .where((u) => u.rooms?.join?.containsKey(room.id) ?? false) - .first; - await room.join(); - await joinedFuture; - } - final timeline = this.timeline = await room.getTimeline(); - timeline.requestKeys(); - var events = timeline.events - .where((e) => - e.type == EventTypes.Message && - !e.redacted && - e.status == EventStatus.synced) - .toList(); - - final hasOutdatedEvents = events.removeOutdatedEvents(); - - // Request history if possible - if (!hasOutdatedEvents && - timeline.events.first.type != EventTypes.RoomCreate && - events.length < 30) { - try { - await timeline - .requestHistory(historyCount: 100) - .timeout(const Duration(seconds: 5)); - events = timeline.events - .where((e) => e.type == EventTypes.Message) - .toList(); - events.removeOutdatedEvents(); - } catch (e, s) { - Logs().d('Unable to request history in stories', e, s); - } - } - - max = events.length; - if (events.isNotEmpty) { - _restartTimer(); - } - - // Preload images and videos - events - .where((event) => {MessageTypes.Image, MessageTypes.Video} - .contains(event.messageType)) - .forEach((event) => downloadAndDecryptAttachment( - event, - event.messageType == MessageTypes.Video && - PlatformInfos.isMobile)); - - // Reverse list - this.events.clear(); - this.events.addAll(events.reversed.toList()); - - // Set start position - if (this.events.isNotEmpty) { - final receiptId = room.roomAccountData['m.receipt']?.content - .tryGetMap(room.client.userID!) - ?.tryGet('event_id'); - index = this.events.indexWhere((event) => event.eventId == receiptId); - index++; - if (index >= this.events.length) index = 0; - } - maybeSetReadMarker(); - } catch (e, s) { - Logs().e('Unable to load story', e, s); - } - return; - } - - void maybeSetReadMarker() { - final currentEvent = this.currentEvent; - if (currentEvent == null) return; - final room = currentEvent.room; - room.client.updateIosBadge(); - if (index == events.length - 1) { - timeline!.setReadMarker(); - return; - } - if (!currentSeenByUsers.any((u) => u.id == u.room.client.userID)) { - timeline!.setReadMarker(currentEvent.eventId); - } - } - - void onPopupStoryAction(PopupStoryAction action) async { - switch (action) { - case PopupStoryAction.report: - _report(); - break; - case PopupStoryAction.delete: - _delete(); - break; - case PopupStoryAction.message: - final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => - currentEvent!.senderFromMemoryOrFallback.startDirectChat(), - ); - if (roomIdResult.error != null) return; - VRouter.of(context).toSegments(['rooms', roomIdResult.result!]); - break; - } - } - - @override - Widget build(BuildContext context) { - loadStory ??= _loadStory(); - return StoryView(this); - } -} - -extension on List { - bool removeOutdatedEvents() { - final outdatedIndex = indexWhere((event) => - DateTime.now().difference(event.originServerTs).inHours > - ClientStoriesExtension.lifeTimeInHours); - if (outdatedIndex != -1) { - removeRange(outdatedIndex, length); - return true; - } - return false; - } -} - -enum PopupStoryAction { - report, - delete, - message, -} diff --git a/lib/pages/story/story_view.dart b/lib/pages/story/story_view.dart deleted file mode 100644 index 38762a7296..0000000000 --- a/lib/pages/story/story_view.dart +++ /dev/null @@ -1,383 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_blurhash/flutter_blurhash.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; -import 'package:matrix_link_text/link_text.dart'; -import 'package:video_player/video_player.dart'; - -import 'package:fluffychat/pages/story/story_page.dart'; -import 'package:fluffychat/utils/date_time_extension.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/string_color.dart'; -import 'package:fluffychat/utils/url_launcher.dart'; -import 'package:fluffychat/widgets/avatar.dart'; - -class StoryView extends StatelessWidget { - final StoryPageController controller; - const StoryView(this.controller, {Key? key}) : super(key: key); - - static const List textShadows = [ - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(5, 5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - Shadow( - color: Colors.black, - offset: Offset(-5, -5), - blurRadius: 20, - ), - ]; - - @override - Widget build(BuildContext context) { - final currentEvent = controller.currentEvent; - return Scaffold( - backgroundColor: Colors.blueGrey.shade900, - appBar: AppBar( - titleSpacing: 0, - leading: IconButton( - icon: const Icon(Icons.close), - onPressed: Navigator.of(context).pop, - ), - title: ListTile( - contentPadding: EdgeInsets.zero, - title: Text( - controller.title, - style: const TextStyle( - color: Colors.white, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(0, 0), - blurRadius: 5, - ), - ], - ), - ), - subtitle: currentEvent != null - ? Text( - currentEvent.originServerTs.localizedTime(context), - style: const TextStyle( - color: Colors.white70, - shadows: [ - Shadow( - color: Colors.black, - offset: Offset(0, 0), - blurRadius: 5, - ), - ], - ), - ) - : null, - leading: Hero( - tag: 'stories_${controller.roomId}', - child: Avatar( - mxContent: controller.avatar, - name: controller.title, - ), - ), - ), - actions: currentEvent == null - ? null - : [ - if (!controller.isOwnStory) - IconButton( - icon: Icon(Icons.adaptive.share_outlined), - onPressed: controller.share, - ), - PopupMenuButton( - onSelected: controller.onPopupStoryAction, - itemBuilder: (context) => [ - if (controller.currentEvent?.canRedact ?? false) - PopupMenuItem( - value: PopupStoryAction.delete, - child: Text(L10n.of(context)!.delete), - ), - PopupMenuItem( - value: PopupStoryAction.report, - child: Text(L10n.of(context)!.reportMessage), - ), - if (!controller.isOwnStory) - PopupMenuItem( - value: PopupStoryAction.message, - child: Text(L10n.of(context)!.sendAMessage), - ), - ], - ), - ], - systemOverlayStyle: SystemUiOverlayStyle.light, - iconTheme: const IconThemeData(color: Colors.white), - elevation: 0, - backgroundColor: Colors.transparent, - ), - extendBodyBehindAppBar: true, - body: FutureBuilder( - future: controller.loadStory, - builder: (context, snapshot) { - final error = snapshot.error; - if (error != null) { - return Center(child: Text(error.toLocalizedString(context))); - } - final events = controller.events; - if (snapshot.connectionState != ConnectionState.done) { - return const Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2, - )); - } - if (events.isEmpty) { - return Center( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Avatar( - mxContent: controller.avatar, - name: controller.title, - size: 128, - fontSize: 64, - ), - const SizedBox(height: 32), - Text( - L10n.of(context)!.thisUserHasNotPostedAnythingYet, - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 20, - color: Colors.white, - ), - ), - ], - ), - ); - } - final event = events[controller.index]; - final backgroundColor = controller.storyThemeData.color1 ?? - event.content.tryGet('body')?.color ?? - Theme.of(context).primaryColor; - final backgroundColorDark = controller.storyThemeData.color2 ?? - event.content.tryGet('body')?.darkColor ?? - Theme.of(context).primaryColorDark; - if (event.messageType == MessageTypes.Text) { - controller.loadingModeOff(); - } - final hash = event.infoMap['xyz.amorgan.blurhash']; - return Stack( - children: [ - if (hash is String) - BlurHash( - hash: hash, - imageFit: BoxFit.cover, - ), - if ({MessageTypes.Video, MessageTypes.Audio} - .contains(event.messageType) && - PlatformInfos.isMobile) - Positioned( - top: 80, - bottom: 64, - left: 0, - right: 0, - child: FutureBuilder( - future: controller.loadVideoControllerFuture ??= - controller.loadVideoController(event), - builder: (context, snapshot) { - final videoPlayerController = snapshot.data; - if (videoPlayerController == null) { - controller.loadingModeOn(); - return Container(); - } - controller.loadingModeOff(); - return Center(child: VideoPlayer(videoPlayerController)); - }, - ), - ), - if (event.messageType == MessageTypes.Image || - (event.messageType == MessageTypes.Video && - !PlatformInfos.isMobile)) - FutureBuilder( - future: controller.downloadAndDecryptAttachment( - event, event.messageType == MessageTypes.Video), - builder: (context, snapshot) { - final matrixFile = snapshot.data; - if (matrixFile == null) { - controller.loadingModeOn(); - return Container(); - } - controller.loadingModeOff(); - return Container( - constraints: const BoxConstraints.expand(), - alignment: controller.storyThemeData.fit == BoxFit.cover - ? null - : Alignment.center, - child: Image.memory( - matrixFile.bytes, - fit: controller.storyThemeData.fit, - ), - ); - }, - ), - GestureDetector( - onTapDown: controller.hold, - onTapUp: controller.unhold, - onTapCancel: controller.unhold, - onVerticalDragStart: controller.hold, - onVerticalDragEnd: controller.unhold, - onHorizontalDragStart: controller.hold, - onHorizontalDragEnd: controller.unhold, - child: AnimatedContainer( - duration: const Duration(milliseconds: 200), - padding: const EdgeInsets.symmetric( - horizontal: 16.0, - vertical: 80, - ), - decoration: BoxDecoration( - gradient: event.messageType == MessageTypes.Text - ? LinearGradient( - colors: [ - backgroundColorDark, - backgroundColor, - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - ) - : null, - ), - alignment: Alignment( - controller.storyThemeData.alignmentX.toDouble() / 100, - controller.storyThemeData.alignmentY.toDouble() / 100, - ), - child: SafeArea( - child: LinkText( - text: controller.loadingMode - ? L10n.of(context)!.loadingPleaseWait - : event.content.tryGet('body') ?? '', - textAlign: TextAlign.center, - onLinkTap: (url) => UrlLauncher(context, url).launchUrl(), - linkStyle: TextStyle( - fontSize: 24, - color: Colors.blue.shade50, - decoration: TextDecoration.underline, - shadows: event.messageType == MessageTypes.Text - ? null - : textShadows, - ), - textStyle: TextStyle( - fontSize: 24, - color: Colors.white, - shadows: event.messageType == MessageTypes.Text - ? null - : textShadows, - ), - ), - ), - ), - ), - Positioned( - top: 4, - left: 4, - right: 4, - child: SafeArea( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - for (var i = 0; i < events.length; i++) - Expanded( - child: i == controller.index - ? LinearProgressIndicator( - color: Colors.white, - minHeight: 2, - backgroundColor: Colors.grey.shade600, - value: controller.loadingMode - ? null - : controller.progress.inMilliseconds / - StoryPageController - .maxProgress.inMilliseconds, - ) - : Container( - margin: const EdgeInsets.all(4), - height: 2, - color: i < controller.index - ? Colors.white - : Colors.grey.shade600, - ), - ), - ], - ), - ), - ), - if (!controller.isOwnStory && currentEvent != null) - Positioned( - bottom: 16, - left: 16, - right: 16, - child: SafeArea( - child: TextField( - focusNode: controller.replyFocus, - controller: controller.replyController, - onSubmitted: controller.replyAction, - textInputAction: TextInputAction.send, - readOnly: controller.replyLoading, - decoration: InputDecoration( - hintText: L10n.of(context)!.reply, - prefixIcon: IconButton( - onPressed: controller.replyEmojiAction, - icon: const Icon(Icons.emoji_emotions_outlined), - ), - suffixIcon: controller.replyLoading - ? const SizedBox( - width: 16, - height: 16, - child: Center( - child: CircularProgressIndicator.adaptive( - strokeWidth: 2), - ), - ) - : IconButton( - onPressed: controller.replyAction, - icon: const Icon(Icons.send_outlined), - ), - fillColor: Theme.of(context).colorScheme.background, - ), - ), - ), - ), - if (controller.isOwnStory && - controller.currentSeenByUsers.isNotEmpty) - Positioned( - bottom: 16, - left: 16, - right: 16, - child: SafeArea( - child: Center( - child: OutlinedButton.icon( - style: OutlinedButton.styleFrom( - backgroundColor: - Theme.of(context).colorScheme.surface, - ), - onPressed: controller.displaySeenByUsers, - icon: const Icon(Icons.visibility_outlined), - label: Text(controller.seenByUsersTitle), - ), - ), - ), - ), - ], - ); - }, - ), - ); - } -} diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet.dart deleted file mode 100644 index 4316b62ba6..0000000000 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/widgets/permission_slider_dialog.dart'; -import '../../widgets/matrix.dart'; -import 'user_bottom_sheet_view.dart'; - -class UserBottomSheet extends StatefulWidget { - final User user; - final Function? onMention; - final BuildContext outerContext; - - const UserBottomSheet({ - Key? key, - required this.user, - required this.outerContext, - this.onMention, - }) : super(key: key); - - @override - UserBottomSheetController createState() => UserBottomSheetController(); -} - -class UserBottomSheetController extends State { - void participantAction(String action) async { - // ignore: prefer_function_declarations_over_variables - final Function _askConfirmation = - () async => (await showOkCancelAlertDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.yes, - cancelLabel: L10n.of(context)!.no, - ) == - OkCancelResult.ok); - switch (action) { - case 'report': - final event = widget.user; - final score = await showConfirmationDialog( - context: context, - title: L10n.of(context)!.reportUser, - message: L10n.of(context)!.howOffensiveIsThisContent, - cancelLabel: L10n.of(context)!.cancel, - okLabel: L10n.of(context)!.ok, - actions: [ - AlertDialogAction( - key: -100, - label: L10n.of(context)!.extremeOffensive, - ), - AlertDialogAction( - key: -50, - label: L10n.of(context)!.offensive, - ), - AlertDialogAction( - key: 0, - label: L10n.of(context)!.inoffensive, - ), - ]); - if (score == null) return; - final reason = await showTextInputDialog( - useRootNavigator: false, - context: context, - title: L10n.of(context)!.whyDoYouWantToReportThis, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [DialogTextField(hintText: L10n.of(context)!.reason)]); - if (reason == null || reason.single.isEmpty) return; - final result = await showFutureLoadingDialog( - context: context, - future: () => Matrix.of(context).client.reportContent( - event.roomId!, - event.eventId, - reason: reason.single, - score: score, - ), - ); - if (result.error != null) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.contentHasBeenReported))); - break; - case 'mention': - Navigator.of(context, rootNavigator: false).pop(); - widget.onMention!(); - break; - case 'ban': - if (await _askConfirmation()) { - await showFutureLoadingDialog( - context: context, - future: () => widget.user.ban(), - ); - Navigator.of(context, rootNavigator: false).pop(); - } - break; - case 'unban': - if (await _askConfirmation()) { - await showFutureLoadingDialog( - context: context, - future: () => widget.user.unban(), - ); - Navigator.of(context, rootNavigator: false).pop(); - } - break; - case 'kick': - if (await _askConfirmation()) { - await showFutureLoadingDialog( - context: context, - future: () => widget.user.kick(), - ); - Navigator.of(context, rootNavigator: false).pop(); - } - break; - case 'permission': - final newPermission = await PermissionSliderDialog( - initialPermission: widget.user.powerLevel) - .show(context); - if (newPermission != null) { - if (newPermission == 100 && await _askConfirmation() == false) break; - await showFutureLoadingDialog( - context: context, - future: () => widget.user.setPower(newPermission), - ); - Navigator.of(context, rootNavigator: false).pop(); - } - break; - case 'message': - final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => widget.user.startDirectChat(), - ); - if (roomIdResult.error != null) return; - VRouter.of(widget.outerContext) - .toSegments(['rooms', roomIdResult.result!]); - Navigator.of(context, rootNavigator: false).pop(); - break; - case 'ignore': - if (await _askConfirmation()) { - await showFutureLoadingDialog( - context: context, - future: () => - Matrix.of(context).client.ignoreUser(widget.user.id)); - } - } - } - - @override - Widget build(BuildContext context) => UserBottomSheetView(this); -} diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart deleted file mode 100644 index da9933e0ea..0000000000 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart +++ /dev/null @@ -1,176 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/utils/fluffy_share.dart'; -import '../../utils/matrix_sdk_extensions.dart/presence_extension.dart'; -import '../../widgets/content_banner.dart'; -import '../../widgets/matrix.dart'; -import 'user_bottom_sheet.dart'; - -class UserBottomSheetView extends StatelessWidget { - final UserBottomSheetController controller; - - const UserBottomSheetView(this.controller, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final user = controller.widget.user; - final client = Matrix.of(context).client; - final presence = client.presences[user.id]; - return Center( - child: SizedBox( - width: min( - MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5), - child: Material( - elevation: 4, - child: SafeArea( - child: Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - backgroundColor: - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), - onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, - ), - title: Text(user.calcDisplayname()), - actions: [ - if (user.id != client.userID) - PopupMenuButton( - itemBuilder: (_) => [ - if (controller.widget.onMention != null) - PopupMenuItem( - value: 'mention', - child: _TextWithIcon( - L10n.of(context)!.mention, - Icons.alternate_email_outlined, - ), - ), - if (user.id != client.userID && !user.room.isDirectChat) - PopupMenuItem( - value: 'message', - child: _TextWithIcon( - L10n.of(context)!.sendAMessage, - Icons.send_outlined, - ), - ), - if (user.canChangePowerLevel) - PopupMenuItem( - value: 'permission', - child: _TextWithIcon( - L10n.of(context)!.setPermissionsLevel, - Icons.edit_attributes_outlined, - ), - ), - if (user.canKick) - PopupMenuItem( - value: 'kick', - child: _TextWithIcon( - L10n.of(context)!.kickFromChat, - Icons.exit_to_app_outlined, - ), - ), - if (user.canBan && user.membership != Membership.ban) - PopupMenuItem( - value: 'ban', - child: _TextWithIcon( - L10n.of(context)!.banFromChat, - Icons.warning_sharp, - ), - ) - else if (user.canBan && - user.membership == Membership.ban) - PopupMenuItem( - value: 'unban', - child: _TextWithIcon( - L10n.of(context)!.unbanFromChat, - Icons.warning_outlined, - ), - ), - if (!client.ignoredUsers.contains(user.id)) - PopupMenuItem( - value: 'ignore', - child: _TextWithIcon( - L10n.of(context)!.ignore, - Icons.block, - ), - ), - PopupMenuItem( - value: 'report', - child: _TextWithIcon( - L10n.of(context)!.reportUser, - Icons.shield_outlined, - ), - ), - ], - onSelected: controller.participantAction, - ), - ], - ), - body: Column( - children: [ - Expanded( - child: ContentBanner( - mxContent: user.avatarUrl, - defaultIcon: Icons.account_circle_outlined, - client: client, - ), - ), - ListTile( - title: Text(L10n.of(context)!.username), - subtitle: Text(user.id), - trailing: Icon(Icons.adaptive.share_outlined), - onTap: () => FluffyShare.share( - user.id, - context, - ), - ), - if (presence != null) - ListTile( - title: Text(presence.getLocalizedStatusMessage(context)), - subtitle: - Text(presence.getLocalizedLastActiveAgo(context)), - trailing: Icon(Icons.circle, - color: presence.presence == PresenceType.online - ? Colors.green - : Colors.grey), - ), - ], - ), - ), - ), - ), - ), - ); - } -} - -class _TextWithIcon extends StatelessWidget { - final String text; - final IconData iconData; - - const _TextWithIcon( - this.text, - this.iconData, { - Key? key, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(iconData), - const SizedBox(width: 16), - Text(text), - ], - ); - } -} diff --git a/lib/utils/account_bundles.dart b/lib/utils/account_bundles.dart index f45f9dc70c..f5a9374434 100644 --- a/lib/utils/account_bundles.dart +++ b/lib/utils/account_bundles.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:matrix/matrix.dart'; class AccountBundles { @@ -7,9 +12,9 @@ class AccountBundles { AccountBundles({this.prefix, this.bundles}); AccountBundles.fromJson(Map json) - : prefix = json.tryGet('prefix'), - bundles = json['bundles'] is List - ? json['bundles'] + : prefix = json.tryGet('prefix'), + bundles = json['bundles'] is List + ? json['bundles'] .map((b) { try { return AccountBundle.fromJson(b); @@ -19,13 +24,12 @@ class AccountBundles { }) .whereType() .toList() - : null; + : null; Map toJson() => { - if (prefix != null) 'prefix': prefix, - if (bundles != null) - 'bundles': bundles!.map((v) => v.toJson()).toList(), - }; + if (prefix != null) 'prefix': prefix, + if (bundles != null) 'bundles': bundles!.map((v) => v.toJson()).toList(), + }; } class AccountBundle { @@ -35,13 +39,13 @@ class AccountBundle { AccountBundle({this.name, this.priority}); AccountBundle.fromJson(Map json) - : name = json.tryGet('name'), - priority = json.tryGet('priority'); + : name = json.tryGet('name'), + priority = json.tryGet('priority'); Map toJson() => { - if (name != null) 'name': name, - if (priority != null) 'priority': priority, - }; + if (name != null) 'name': name, + if (priority != null) 'priority': priority, + }; } const accountBundlesType = 'im.fluffychat.account_bundles'; @@ -50,22 +54,21 @@ extension AccountBundlesExtension on Client { List get accountBundles { List? ret; if (accountData.containsKey(accountBundlesType)) { - ret = AccountBundles.fromJson(accountData[accountBundlesType]!.content) - .bundles; + ret = AccountBundles.fromJson( + accountData[accountBundlesType]!.content, + ).bundles; } ret ??= []; if (ret.isEmpty) { - ret.add(AccountBundle( - name: userID, - priority: 0, - )); + ret.add(AccountBundle(name: userID, priority: 0)); } return ret; } Future setAccountBundle(String name, [int? priority]) async { - final data = - AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {}); + final data = AccountBundles.fromJson( + accountData[accountBundlesType]?.content ?? {}, + ); var foundBundle = false; final bundles = data.bundles ??= []; for (final bundle in bundles) { @@ -85,16 +88,18 @@ extension AccountBundlesExtension on Client { if (!accountData.containsKey(accountBundlesType)) { return; // nothing to do } - final data = - AccountBundles.fromJson(accountData[accountBundlesType]!.content); + final data = AccountBundles.fromJson( + accountData[accountBundlesType]!.content, + ); if (data.bundles == null) return; data.bundles!.removeWhere((b) => b.name == name); await setAccountData(userID!, accountBundlesType, data.toJson()); } String get sendPrefix { - final data = - AccountBundles.fromJson(accountData[accountBundlesType]?.content ?? {}); + final data = AccountBundles.fromJson( + accountData[accountBundlesType]?.content ?? {}, + ); return data.prefix!; } } diff --git a/lib/utils/account_config.dart b/lib/utils/account_config.dart new file mode 100644 index 0000000000..a5f246a8d4 --- /dev/null +++ b/lib/utils/account_config.dart @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:matrix/matrix.dart'; + +extension ApplicationAccountConfigExtension on Client { + static const String accountDataKey = 'im.fluffychat.account_config'; + + ApplicationAccountConfig get applicationAccountConfig => + ApplicationAccountConfig.fromJson( + accountData[accountDataKey]?.content ?? {}, + ); + + Future setApplicationAccountConfig(ApplicationAccountConfig config) => + setAccountData(userID!, accountDataKey, config.toJson()); + + /// Only updates the specified values in ApplicationAccountConfig + Future updateApplicationAccountConfig(ApplicationAccountConfig config) { + final currentConfig = applicationAccountConfig; + return setAccountData( + userID!, + accountDataKey, + ApplicationAccountConfig( + wallpaperUrl: config.wallpaperUrl ?? currentConfig.wallpaperUrl, + wallpaperOpacity: + config.wallpaperOpacity ?? currentConfig.wallpaperOpacity, + wallpaperBlur: config.wallpaperBlur ?? currentConfig.wallpaperBlur, + ).toJson(), + ); + } +} + +class ApplicationAccountConfig { + final Uri? wallpaperUrl; + final double? wallpaperOpacity; + final double? wallpaperBlur; + + const ApplicationAccountConfig({ + this.wallpaperUrl, + this.wallpaperOpacity, + this.wallpaperBlur, + }); + + static double _sanitizedOpacity(double? opacity) { + if (opacity == null) return 1; + if (opacity > 1 || opacity < 0) return 1; + return opacity; + } + + factory ApplicationAccountConfig.fromJson(Map json) => + ApplicationAccountConfig( + wallpaperUrl: json['wallpaper_url'] is String + ? Uri.tryParse(json['wallpaper_url']) + : null, + wallpaperOpacity: _sanitizedOpacity( + json.tryGet('wallpaper_opacity'), + ), + wallpaperBlur: json.tryGet('wallpaper_blur'), + ); + + Map toJson() => { + 'wallpaper_url': wallpaperUrl?.toString(), + 'wallpaper_opacity': wallpaperOpacity, + 'wallpaper_blur': wallpaperBlur, + }; +} diff --git a/lib/utils/adaptive_bottom_sheet.dart b/lib/utils/adaptive_bottom_sheet.dart new file mode 100644 index 0000000000..398e13b5cc --- /dev/null +++ b/lib/utils/adaptive_bottom_sheet.dart @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:math'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; + +Future showAdaptiveBottomSheet({ + required BuildContext context, + required Widget Function(BuildContext) builder, + bool isDismissible = true, + bool isScrollControlled = true, + bool useRootNavigator = true, +}) { + if (FluffyThemes.isColumnMode(context)) { + return showDialog( + context: context, + useRootNavigator: useRootNavigator, + barrierDismissible: isDismissible, + useSafeArea: true, + builder: (context) => Center( + child: Container( + margin: const EdgeInsets.all(16), + constraints: const BoxConstraints(maxWidth: 480, maxHeight: 720), + child: Material( + elevation: Theme.of(context).dialogTheme.elevation ?? 4, + shadowColor: Theme.of(context).dialogTheme.shadowColor, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: Theme.of(context).scaffoldBackgroundColor, + clipBehavior: Clip.hardEdge, + child: builder(context), + ), + ), + ), + ); + } + + return showModalBottomSheet( + context: context, + builder: (context) => ConstrainedBox( + constraints: BoxConstraints( + maxHeight: + MediaQuery.viewInsetsOf(context).bottom + + min(MediaQuery.sizeOf(context).height - 32, 600), + ), + child: builder(context), + ), + useSafeArea: true, + useRootNavigator: useRootNavigator, + isDismissible: isDismissible, + isScrollControlled: isScrollControlled, + clipBehavior: Clip.hardEdge, + ); +} diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 05567660ed..5ead47dbc0 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -1,150 +1,183 @@ -/* - * Famedly - * Copyright (C) 2020, 2021 Famedly GmbH - * Copyright (C) 2021 Fluffychat - * - * 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, either version 3 of the - * License, or (at your option) any later version. - * - * 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 . - */ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// Copyright (C) 2020, 2021 Famedly GmbH +// Copyright (C) 2021 Fluffychat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; +import 'dart:isolate'; import 'dart:ui'; +//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/main.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/push_helper.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:http/http.dart' as http; import 'package:matrix/matrix.dart'; import 'package:unifiedpush/unifiedpush.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:unifiedpush_ui/unifiedpush_ui.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/client_stories_extension.dart'; -import 'package:fluffychat/utils/push_helper.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; -import 'famedlysdk_store.dart'; +import '../widgets/matrix.dart'; import 'platform_infos.dart'; -//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; - -class NoTokenException implements Exception { - String get cause => 'Cannot get firebase token'; -} - class BackgroundPush { static BackgroundPush? _instance; final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); - Client client; - BuildContext? context; - GlobalKey? router; + + List _clients; + List get clients => matrix?.widget.clients ?? _clients; + + MatrixState? matrix; String? _fcmToken; void Function(String errorMsg, {Uri? link})? onFcmError; L10n? l10n; - Store? _store; - Store get store => _store ??= Store(); + Future loadLocale() async { + final context = matrix?.context; // inspired by _lookupL10n in .dart_tool/flutter_gen/gen_l10n/l10n.dart - l10n ??= (context != null ? L10n.of(context!) : null) ?? - (await L10n.delegate.load(window.locale)); + l10n ??= + (context != null && context.mounted ? L10n.of(context) : null) ?? + (await L10n.delegate.load(PlatformDispatcher.instance.locale)); } final pendingTests = >{}; + bool firebaseEnabled = false; - final dynamic firebase = null; //FcmSharedIsolate(); + //final firebase = FcmSharedIsolate(); DateTime? lastReceivedPush; bool upAction = false; - BackgroundPush._(this.client) { - onLogin ??= - client.onLoginStateChanged.stream.listen(handleLoginStateChanged); - onRoomSync ??= client.onSync.stream - .where((s) => s.hasRoomUpdate) - .listen((s) => _onClearingPush(getFromServer: false)); - firebase?.setListeners( - onMessage: (message) => pushHelper( - PushNotification.fromJson( - Map.from(message['data'] ?? message)), - client: client, - l10n: l10n, - activeRoomId: router?.currentState?.pathParameters['roomid'], - onSelectNotification: goToRoom, - ), - onNewToken: _newFcmToken, - ); - if (Platform.isAndroid) { - UnifiedPush.initialize( - onNewEndpoint: _newUpEndpoint, - onRegistrationFailed: _upUnregistered, - onUnregistered: _upUnregistered, - onMessage: _onUpMessage, + Future _init() async { + //firebaseEnabled = true; + try { + mainIsolateReceivePort?.listen((message) async { + try { + await notificationTap( + NotificationResponseJson.fromJsonString(message), + clients: clients, + router: FluffyChatApp.router, + l10n: l10n, + ); + } catch (e, s) { + Logs().wtf('Main Notification Tap crashed', e, s); + } + }); + if (PlatformInfos.isAndroid) { + final port = ReceivePort(); + IsolateNameServer.removePortNameMapping('background_tab_port'); + IsolateNameServer.registerPortWithName( + port.sendPort, + 'background_tab_port', + ); + port.listen((message) async { + try { + await notificationTap( + NotificationResponseJson.fromJsonString(message), + clients: clients, + router: FluffyChatApp.router, + l10n: l10n, + ); + } catch (e, s) { + Logs().wtf('Main Notification Tap crashed', e, s); + } + }); + } + await _flutterLocalNotificationsPlugin.initialize( + settings: const InitializationSettings( + android: AndroidInitializationSettings('notifications_icon'), + iOS: DarwinInitializationSettings(), + ), + onDidReceiveNotificationResponse: (response) => notificationTap( + response, + clients: clients, + router: FluffyChatApp.router, + l10n: l10n, + ), + onDidReceiveBackgroundNotificationResponse: notificationTapBackground, ); + Logs().v('Flutter Local Notifications initialized'); + //firebase.setListeners( + // onMessage: (message) => pushHelper( + // PushNotification.fromJson( + // message.tryGetMap('data') ?? message, + // ), + // clients: clients, + // l10n: l10n, + // activeRoomId: matrix?.activeRoomId, + // flutterLocalNotificationsPlugin: _flutterLocalNotificationsPlugin, + // ), + //); + if (Platform.isAndroid) { + await UnifiedPush.initialize( + onNewEndpoint: _newUpEndpoint, + onRegistrationFailed: (_, i) => _upUnregistered(i), + onUnregistered: _upUnregistered, + onMessage: _onUpMessage, + ); + } + } catch (e, s) { + Logs().e('Unable to initialize Flutter local notifications', e, s); } } - factory BackgroundPush.clientOnly(Client client) { - _instance ??= BackgroundPush._(client); - return _instance!; + BackgroundPush._(this._clients) { + _init(); + } + + factory BackgroundPush.clientOnly(List clients) { + return _instance ??= BackgroundPush._(clients); } factory BackgroundPush( - Client _client, BuildContext _context, GlobalKey? router, - {final void Function(String errorMsg, {Uri? link})? onFcmError}) { - final instance = BackgroundPush.clientOnly(_client); - instance.context = _context; - // ignore: prefer_initializing_formals - instance.router = router; + MatrixState matrix, { + final void Function(String errorMsg, {Uri? link})? onFcmError, + }) { + final instance = BackgroundPush.clientOnly(matrix.widget.clients); + instance.matrix = matrix; // ignore: prefer_initializing_formals instance.onFcmError = onFcmError; - instance.fullInit(); return instance; } - Future fullInit() => setupPush(); - - void handleLoginStateChanged(_) => setupPush(); - - StreamSubscription? onLogin; - StreamSubscription? onRoomSync; - - void _newFcmToken(String token) { - _fcmToken = token; - setupPush(); - } - + /// Makes sure that there is exactly ONE pusher with these settings for this + /// client and deletes all other pushers if not. Future setupPusher({ + required Client client, String? gatewayUrl, String? token, - Set? oldTokens, bool useDeviceSpecificAppId = false, }) async { if (PlatformInfos.isIOS) { - await firebase?.requestPermission(); + //await firebase.requestPermission(); + } + if (PlatformInfos.isAndroid && !isIntegrationTest) { + _flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin + >() + ?.requestNotificationsPermission(); } - final clientName = PlatformInfos.clientName; - oldTokens ??= {}; - final pushers = await (client.getPushers().catchError((e) { + final appDisplayName = PlatformInfos.appDisplayName; + + final pushers = + await (client.getPushers().catchError((e) { Logs().w('[Push] Unable to request pushers', e); return []; })) ?? []; - var setNewPusher = false; + // Just the plain app id, we add the .data_message suffix later var appId = AppConfig.pushNotificationsAppId; // we need the deviceAppId to remove potential legacy UP pusher @@ -157,165 +190,190 @@ class BackgroundPush { appId += '.data_message'; } final thisAppId = useDeviceSpecificAppId ? deviceAppId : appId; - if (gatewayUrl != null && token != null) { - final currentPushers = pushers.where((pusher) => pusher.pushkey == token); - if (currentPushers.length == 1 && - currentPushers.first.kind == 'http' && - currentPushers.first.appId == thisAppId && - currentPushers.first.appDisplayName == clientName && - currentPushers.first.deviceDisplayName == client.deviceName && - currentPushers.first.lang == 'en' && - currentPushers.first.data.url.toString() == gatewayUrl && - currentPushers.first.data.format == - AppConfig.pushNotificationsPusherFormat) { - Logs().i('[Push] Pusher already set'); - } else { - Logs().i('Need to set new pusher'); - oldTokens.add(token); - if (client.isLogged()) { - setNewPusher = true; - } - } - } else { + if (gatewayUrl == null || token == null) { Logs().w('[Push] Missing required push credentials'); + return; } - for (final pusher in pushers) { - if ((token != null && - pusher.pushkey != token && - deviceAppId == pusher.appId) || - oldTokens.contains(pusher.pushkey)) { - try { - await client.deletePusher(pusher); - Logs().i('[Push] Removed legacy pusher for this device'); - } catch (err) { - Logs().w('[Push] Failed to remove old pusher', err); - } - } + + if (pushers.any( + (currentPusher) => + currentPusher.pushkey == token && + currentPusher.data.additionalProperties['client_name'] == + client.clientName && + currentPusher.kind == 'http' && + currentPusher.appId == thisAppId && + currentPusher.appDisplayName == appDisplayName && + currentPusher.deviceDisplayName == client.deviceName && + currentPusher.lang == 'en' && + currentPusher.data.url.toString() == gatewayUrl && + currentPusher.data.format == + AppSettings.pushNotificationsPusherFormat.value && + currentPusher.data.additionalProperties['data_message'] == + pusherDataMessageFormat, + )) { + Logs().i('[Push] Pusher already set for ${client.clientName}'); + return; } - if (setNewPusher) { + + if (!client.isLogged()) return; + + final legacyPushers = pushers.where((pusher) => pusher.pushkey == token); + for (final pusher in legacyPushers) { try { - await client.postPusher( - Pusher( - pushkey: token!, - appId: thisAppId, - appDisplayName: clientName, - deviceDisplayName: client.deviceName!, - lang: 'en', - data: PusherData( - url: Uri.parse(gatewayUrl!), - format: AppConfig.pushNotificationsPusherFormat, - ), - kind: 'http', - ), - append: false, + await client.deletePusher(pusher); + Logs().i('[Push] Removed legacy pusher for ${client.clientName}'); + } catch (err) { + Logs().w( + '[Push] Failed to remove old pusher for ${client.clientName}', + err, ); - } catch (e, s) { - Logs().e('[Push] Unable to set pushers', e, s); } } + + Logs().i('Need to set new pusher for ${client.clientName}'); + try { + await client.postPusher( + Pusher( + pushkey: token, + appId: thisAppId, + appDisplayName: appDisplayName, + deviceDisplayName: PlatformInfos.appDisplayName, + lang: 'en', + data: PusherData( + url: Uri.parse(gatewayUrl), + format: AppSettings.pushNotificationsPusherFormat.value, + additionalProperties: { + 'client_name': client.clientName, + 'data_message': pusherDataMessageFormat, + }, + ), + kind: 'http', + ), + append: true, + ); + } catch (e, s) { + Logs().e('[Push] Unable to set pushers', e, s); + } } - bool _wentToRoomOnStartup = false; + final pusherDataMessageFormat = Platform.isAndroid + ? 'android' + : Platform.isIOS + ? 'ios' + : null; + + static bool _wentToRoomOnStartup = false; Future setupPush() async { - Logs().d("SetupPush"); - if (client.onLoginStateChanged.value != LoginState.loggedIn || - !PlatformInfos.isMobile || - context == null) { - return; - } - // Do not setup unifiedpush if this has been initialized by - // an unifiedpush action - if (upAction) { - return; - } - if (!PlatformInfos.isIOS && - (await UnifiedPush.getDistributors()).isNotEmpty) { - await setupUp(); + final context = matrix?.context; + if (PlatformInfos.isAndroid && + (await UnifiedPush.getDistributors()).isNotEmpty && + context != null && + context.mounted) { + await UnifiedPushUi( + context: context, + instances: ['default'], + unifiedPushFunctions: UPFunctions(), + showNoDistribDialog: false, + onNoDistribDialogDismissed: () {}, // TODO: Implement me + ).registerAppWithDialog(); } else { - await setupFirebase(); + for (final client in clients) { + Logs().d('SetupPush for Client ${client.clientName}'); + if (client.onLoginStateChanged.value != LoginState.loggedIn || + !PlatformInfos.isMobile || + matrix == null) { + return; + } + // Do not setup unifiedpush if this has been initialized by + // an unifiedpush action + if (upAction) { + return; + } + await setupFirebase(client); + } } // ignore: unawaited_futures - _flutterLocalNotificationsPlugin - .getNotificationAppLaunchDetails() - .then((details) { + _flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails().then(( + details, + ) { if (details == null || !details.didNotificationLaunchApp || - _wentToRoomOnStartup || - router == null) { + _wentToRoomOnStartup) { return; } _wentToRoomOnStartup = true; - goToRoom(details.payload); + final response = details.notificationResponse; + if (response != null) { + notificationTap( + response, + clients: clients, + router: FluffyChatApp.router, + l10n: l10n, + ); + } }); } Future _noFcmWarning() async { - if (context == null) { + if (matrix == null) { + return; + } + if (AppSettings.showNoGoogle.value) { return; } - if (await store.getItemBool(SettingKeys.showNoGoogle, true)) { - await loadLocale(); + await loadLocale(); + WidgetsBinding.instance.addPostFrameCallback((_) { if (PlatformInfos.isAndroid) { onFcmError?.call( l10n!.noGoogleServicesWarning, - link: Uri.parse( - AppConfig.enablePushTutorial, - ), + link: Uri.parse(AppConfig.enablePushTutorial), ); + return; } onFcmError?.call(l10n!.oopsPushError); - - if (null == await store.getItem(SettingKeys.showNoGoogle)) { - await store.setItemBool(SettingKeys.showNoGoogle, false); - } - } + }); } - Future setupFirebase() async { + Future setupFirebase(Client client) async { Logs().v('Setup firebase'); + if (!firebaseEnabled) { + await _noFcmWarning(); + return; + } if (_fcmToken?.isEmpty ?? true) { - try { - _fcmToken = await firebase?.getToken(); - if (_fcmToken == null) throw ('PushToken is null'); - } catch (e, s) { - Logs().w('[Push] cannot get token', e, e is String ? null : s); + if (PlatformInfos.isIOS) { + //await firebase.requestPermission(); + } + const max = 5; + for (var i = 0; i < max; i++) { + try { + await Future.delayed(const Duration(seconds: 1)); + //_fcmToken = await firebase.getToken(); + if (_fcmToken != null) break; + } catch (e, s) { + Logs().w( + '[Push] cannot get token - try ($i/$max)', + e, + e is String ? null : s, + ); + } + } + if (_fcmToken == null) { await _noFcmWarning(); return; } } await setupPusher( - gatewayUrl: AppConfig.pushNotificationsGatewayUrl, + client: client, + gatewayUrl: AppSettings.pushNotificationsGatewayUrl.value, token: _fcmToken, ); } - Future goToRoom(String? roomId) async { - try { - Logs().v('[Push] Attempting to go to room $roomId...'); - if (router == null || roomId == null) { - return; - } - await client.roomsLoading; - await client.accountDataLoading; - final isStory = client - .getRoomById(roomId) - ?.getState(EventTypes.RoomCreate) - ?.content - .tryGet('type') == - ClientStoriesExtension.storiesRoomType; - router!.currentState!.toSegments([isStory ? 'stories' : 'rooms', roomId]); - } catch (e, s) { - Logs().e('[Push] Failed to open room', e, s); - } - } - - Future setupUp() async { - await UnifiedPush.registerAppWithDialog(context!); - } - - Future _newUpEndpoint(String newEndpoint, String i) async { + Future _newUpEndpoint(PushEndpoint newPushEndpoint, String i) async { + final newEndpoint = newPushEndpoint.url; upAction = true; if (newEndpoint.isEmpty) { await _upUnregistered(i); @@ -325,15 +383,13 @@ class BackgroundPush { 'https://matrix.gateway.unifiedpush.org/_matrix/push/v1/notify'; try { final url = Uri.parse(newEndpoint) - .replace( - path: '/_matrix/push/v1/notify', - query: '', - ) + .replace(path: '/_matrix/push/v1/notify', query: '') .toString() .split('?') .first; - final res = - json.decode(utf8.decode((await http.get(Uri.parse(url))).bodyBytes)); + final res = json.decode( + utf8.decode((await http.get(Uri.parse(url))).bodyBytes), + ); if (res['gateway'] == 'matrix' || (res['unifiedpush'] is Map && res['unifiedpush']['gateway'] == 'matrix')) { @@ -341,153 +397,75 @@ class BackgroundPush { } } catch (e) { Logs().i( - '[Push] No self-hosted unified push gateway present: ' + newEndpoint); + '[Push] No self-hosted unified push gateway present: $newEndpoint', + ); } - Logs().i('[Push] UnifiedPush using endpoint ' + endpoint); - final oldTokens = {}; - try { - final fcmToken = await firebase?.getToken(); - oldTokens.add(fcmToken); - } catch (_) {} - await setupPusher( - gatewayUrl: endpoint, - token: newEndpoint, - oldTokens: oldTokens, - useDeviceSpecificAppId: true, - ); - await store.setItem(SettingKeys.unifiedPushEndpoint, newEndpoint); - await store.setItemBool(SettingKeys.unifiedPushRegistered, true); + Logs().i('[Push] UnifiedPush using endpoint $endpoint'); + + for (final client in clients) { + await setupPusher( + client: client, + gatewayUrl: endpoint, + token: newEndpoint, + useDeviceSpecificAppId: true, + ); + } + await AppSettings.unifiedPushEndpoint.setItem(newEndpoint); + await AppSettings.unifiedPushRegistered.setItem(true); } Future _upUnregistered(String i) async { upAction = true; Logs().i('[Push] Removing UnifiedPush endpoint...'); - final oldEndpoint = await store.getItem(SettingKeys.unifiedPushEndpoint); - await store.setItemBool(SettingKeys.unifiedPushRegistered, false); - await store.deleteItem(SettingKeys.unifiedPushEndpoint); - if (oldEndpoint?.isNotEmpty ?? false) { - // remove the old pusher - await setupPusher( - oldTokens: {oldEndpoint}, - ); - } + await AppSettings.unifiedPushEndpoint.setItem( + AppSettings.unifiedPushEndpoint.defaultValue, + ); + await AppSettings.unifiedPushRegistered.setItem(false); } - Future _onUpMessage(Uint8List message, String i) async { + Future _onUpMessage(PushMessage pushMessage, String i) async { + Logs().wtf('Push Notification from UP received', pushMessage); + final message = pushMessage.content; upAction = true; final data = Map.from( - json.decode(utf8.decode(message))['notification']); + json.decode(utf8.decode(message))['notification'], + ); // UP may strip the devices list data['devices'] ??= []; await pushHelper( PushNotification.fromJson(data), - client: client, + clients: clients, l10n: l10n, - activeRoomId: router?.currentState?.pathParameters['roomid'], + activeRoomId: matrix?.activeRoomId, + flutterLocalNotificationsPlugin: _flutterLocalNotificationsPlugin, + useNotificationActions: + false, // Buggy with UP: https://codeberg.org/UnifiedPush/flutter-connector/issues/34 ); } +} - /// Workaround for the problem that local notification IDs must be int but we - /// sort by [roomId] which is a String. To make sure that we don't have duplicated - /// IDs we map the [roomId] to a number and store this number. - late Map idMap; - Future _loadIdMap() async { - idMap = Map.from(json.decode( - (await store.getItem(SettingKeys.notificationCurrentIds)) ?? '{}')); +class UPFunctions extends UnifiedPushFunctions { + final List features = [ + /*list of features*/ + ]; + + @override + Future getDistributor() async { + return await UnifiedPush.getDistributor(); } - Future mapRoomIdToInt(String roomId) async { - await _loadIdMap(); - int? currentInt; - try { - currentInt = idMap[roomId]; - } catch (_) { - currentInt = null; - } - if (currentInt != null) { - return currentInt; - } - var nCurrentInt = 0; - while (idMap.values.contains(currentInt)) { - nCurrentInt++; - } - idMap[roomId] = nCurrentInt; - await store.setItem(SettingKeys.notificationCurrentIds, json.encode(idMap)); - return nCurrentInt; + @override + Future> getDistributors() async { + return await UnifiedPush.getDistributors(features); } - bool _clearingPushLock = false; - Future _onClearingPush({bool getFromServer = true}) async { - if (_clearingPushLock) { - return; - } - try { - _clearingPushLock = true; - late Iterable emptyRooms; - if (getFromServer) { - Logs().v('[Push] Got new clearing push'); - var syncErrored = false; - if (client.syncPending) { - Logs().v('[Push] waiting for existing sync'); - // we need to catchError here as the Future might be in a different execution zone - await client.oneShotSync().catchError((e) { - syncErrored = true; - Logs().v('[Push] Error one-shot syncing', e); - }); - } - if (!syncErrored) { - Logs().v('[Push] single oneShotSync'); - // we need to catchError here as the Future might be in a different execution zone - await client.oneShotSync().catchError((e) { - syncErrored = true; - Logs().v('[Push] Error one-shot syncing', e); - }); - if (!syncErrored) { - emptyRooms = client.rooms - .where((r) => r.notificationCount == 0) - .map((r) => r.id); - } - } - if (syncErrored) { - try { - Logs().v( - '[Push] failed to sync for fallback push, fetching notifications endpoint...'); - final notifications = await client.getNotifications(limit: 20); - final notificationRooms = - notifications.notifications.map((n) => n.roomId).toSet(); - emptyRooms = client.rooms - .where((r) => !notificationRooms.contains(r.id)) - .map((r) => r.id); - } catch (e) { - Logs().v( - '[Push] failed to fetch pending notifications for clearing push, falling back...', - e); - emptyRooms = client.rooms - .where((r) => r.notificationCount == 0) - .map((r) => r.id); - } - } - } else { - emptyRooms = client.rooms - .where((r) => r.notificationCount == 0) - .map((r) => r.id); - } - await _loadIdMap(); - var changed = false; - for (final roomId in emptyRooms) { - final id = idMap[roomId]; - if (id != null) { - idMap.remove(roomId); - changed = true; - await _flutterLocalNotificationsPlugin.cancel(id); - } - } - if (changed) { - await store.setItem( - SettingKeys.notificationCurrentIds, json.encode(idMap)); - } - } finally { - _clearingPushLock = false; - } + @override + Future registerApp(String instance) async { + await UnifiedPush.register(instance: instance, features: features); + } + + @override + Future saveDistributor(String distributor) async { + await UnifiedPush.saveDistributor(distributor); } } diff --git a/lib/utils/beautify_string_extension.dart b/lib/utils/beautify_string_extension.dart index b555d6def2..58d44e4901 100644 --- a/lib/utils/beautify_string_extension.dart +++ b/lib/utils/beautify_string_extension.dart @@ -1,10 +1,26 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + extension BeautifyStringExtension on String { + String get beautifiedOneLine { + var beautifiedStr = ''; + for (var i = 0; i < length; i++) { + beautifiedStr += substring(i, i + 1); + if (i % 4 == 3) { + beautifiedStr += ' '; + } + } + return beautifiedStr; + } + String get beautified { var beautifiedStr = ''; for (var i = 0; i < length; i++) { beautifiedStr += substring(i, i + 1); if (i % 4 == 3) { - beautifiedStr += ' '; + beautifiedStr += ' '; } if (i % 16 == 15) { beautifiedStr += '\n'; diff --git a/lib/utils/client_download_content_extension.dart b/lib/utils/client_download_content_extension.dart new file mode 100644 index 0000000000..d4f2c2e7a1 --- /dev/null +++ b/lib/utils/client_download_content_extension.dart @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:math' show min; +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:matrix/matrix.dart'; + +extension ClientDownloadContentExtension on Client { + Future downloadMxcCached( + Uri mxc, { + num? width, + num? height, + bool isThumbnail = false, + bool? animated, + ThumbnailMethod? thumbnailMethod, + bool rounded = false, + }) async { + // To stay compatible with previous storeKeys: + final cacheKey = isThumbnail + // ignore: deprecated_member_use + ? mxc.getThumbnail( + this, + width: width, + height: height, + animated: animated, + method: thumbnailMethod, + ) + : mxc; + + final cachedData = await database.getFile(cacheKey); + if (cachedData != null) return cachedData; + + final httpUri = isThumbnail + ? await mxc.getThumbnailUri( + this, + width: width, + height: height, + animated: animated, + method: thumbnailMethod, + ) + : await mxc.getDownloadUri(this); + + final response = await httpClient.get( + httpUri, + headers: accessToken == null + ? null + : {'authorization': 'Bearer $accessToken'}, + ); + if (response.statusCode != 200) { + throw Exception(); + } + var imageData = response.bodyBytes; + + if (rounded) { + imageData = await _convertToCircularImage( + imageData, + min(width ?? 64, height ?? 64).round(), + ); + } + + await database.storeFile(cacheKey, imageData, 0); + + return imageData; + } +} + +Future _convertToCircularImage( + Uint8List imageBytes, + int size, +) async { + final codec = await instantiateImageCodec(imageBytes); + final frame = await codec.getNextFrame(); + final originalImage = frame.image; + + final recorder = PictureRecorder(); + final canvas = Canvas(recorder); + + final paint = Paint(); + final rect = Rect.fromLTWH(0, 0, size.toDouble(), size.toDouble()); + + final clipPath = Path() + ..addOval( + Rect.fromCircle(center: Offset(size / 2, size / 2), radius: size / 2), + ); + + canvas.clipPath(clipPath); + + canvas.drawImageRect( + originalImage, + Rect.fromLTWH( + 0, + 0, + originalImage.width.toDouble(), + originalImage.height.toDouble(), + ), + rect, + paint, + ); + + final picture = recorder.endRecording(); + final circularImage = await picture.toImage(size, size); + + final byteData = await circularImage.toByteData(format: ImageByteFormat.png); + return byteData!.buffer.asUint8List(); +} diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 1acdd09669..cb6510be72 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -1,93 +1,121 @@ -import 'dart:convert'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/custom_http_client.dart'; +import 'package:fluffychat/utils/custom_image_resizer.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/foundation.dart'; - -import 'package:hive_flutter/hive_flutter.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/html.dart' as html; -import 'package:fluffychat/utils/custom_http_client.dart'; -import 'package:fluffychat/utils/custom_image_resizer.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'famedlysdk_store.dart'; -import 'matrix_sdk_extensions.dart/fluffybox_database.dart'; +import 'matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart'; +import 'matrix_sdk_extensions/on_soft_logout.dart'; abstract class ClientManager { static const String clientNamespace = 'im.fluffychat.store.clients'; - static Future> getClients({bool initialize = true}) async { - if (PlatformInfos.isLinux) { - Hive.init((await getApplicationSupportDirectory()).path); - } else { - await Hive.initFlutter(); - } + + static Future> getClients({ + bool initialize = true, + required SharedPreferences store, + }) async { final clientNames = {}; try { - final rawClientNames = await Store().getItem(clientNamespace); - if (rawClientNames != null) { - final clientNamesList = - (jsonDecode(rawClientNames) as List).cast(); - clientNames.addAll(clientNamesList); - } + final clientNamesList = store.getStringList(clientNamespace) ?? []; + clientNames.addAll(clientNamesList); } catch (e, s) { Logs().w('Client names in store are corrupted', e, s); - await Store().deleteItem(clientNamespace); + await store.remove(clientNamespace); } if (clientNames.isEmpty) { - clientNames.add(PlatformInfos.clientName); - await Store().setItem(clientNamespace, jsonEncode(clientNames.toList())); + clientNames.add(PlatformInfos.appDisplayName); + await store.setStringList(clientNamespace, clientNames.toList()); } - final clients = clientNames.map(createClient).toList(); + final clients = await Future.wait( + clientNames.map((name) => createClient(name, store)), + ); if (initialize) { - await Future.wait(clients.map((client) => client - .init( - waitForFirstSync: false, - waitUntilLoadCompletedLoaded: false, - ) - .catchError( - (e, s) => Logs().e('Unable to initialize client', e, s)))); + await Future.wait( + clients.map( + (client) => client + .initWithRestore( + onMigration: () async { + final l10n = await lookupL10n( + PlatformDispatcher.instance.locale, + ); + sendInitNotification( + l10n.databaseMigrationTitle, + l10n.databaseMigrationBody, + ); + }, + ) + .catchError( + (e, s) => Logs().e('Unable to initialize client', e, s), + ), + ), + ); } if (clients.length > 1 && clients.any((c) => !c.isLogged())) { final loggedOutClients = clients.where((c) => !c.isLogged()).toList(); for (final client in loggedOutClients) { Logs().w( - 'Multi account is enabled but client ${client.userID} is not logged in. Removing...'); + 'Multi account is enabled but client ${client.userID} is not logged in. Removing...', + ); clientNames.remove(client.clientName); clients.remove(client); } - await Store().setItem(clientNamespace, jsonEncode(clientNames.toList())); + await store.setStringList(clientNamespace, clientNames.toList()); } return clients; } - static Future addClientNameToStore(String clientName) async { - final clientNamesList = []; - final rawClientNames = await Store().getItem(clientNamespace); - if (rawClientNames != null) { - final stored = (jsonDecode(rawClientNames) as List).cast(); - clientNamesList.addAll(stored); - } + static Future addClientNameToStore( + String clientName, + SharedPreferences store, + ) async { + final clientNamesList = store.getStringList(clientNamespace) ?? []; clientNamesList.add(clientName); - await Store().setItem(clientNamespace, jsonEncode(clientNamesList)); + await store.setStringList(clientNamespace, clientNamesList); } - static Future removeClientNameFromStore(String clientName) async { - final clientNamesList = []; - final rawClientNames = await Store().getItem(clientNamespace); - if (rawClientNames != null) { - final stored = (jsonDecode(rawClientNames) as List).cast(); - clientNamesList.addAll(stored); - } + static Future removeClientNameFromStore( + String clientName, + SharedPreferences store, + ) async { + final clientNamesList = store.getStringList(clientNamespace) ?? []; clientNamesList.remove(clientName); - await Store().setItem(clientNamespace, jsonEncode(clientNamesList)); + await store.setStringList(clientNamespace, clientNamesList); } - static Client createClient(String clientName) { + static NativeImplementations get nativeImplementations => kIsWeb + ? NativeImplementationsWebWorker( + Uri.parse('native_executor.js'), + timeout: const Duration(minutes: 1), + ) + : NativeImplementationsIsolate( + compute, + vodozemacInit: () => vod.init(wasmPath: './assets/assets/vodozemac/'), + ); + + static Future createClient( + String clientName, + SharedPreferences store, + ) async { + final shareKeysWith = AppSettings.shareKeysWith.value; + final enableSoftLogout = AppSettings.enableSoftLogout.value; + return Client( clientName, - httpClient: - PlatformInfos.isAndroid ? CustomHttpClient.createHTTPClient() : null, + httpClient: CustomHttpClient.createHTTPClient(), verificationMethods: { KeyVerificationMethod.numbers, if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isLinux) @@ -96,20 +124,59 @@ abstract class ClientManager { importantStateEvents: { // To make room emotes work 'im.ponies.room_emotes', - // To check which story room we can post in - EventTypes.RoomPowerLevels, }, - databaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, - legacyDatabaseBuilder: FlutterFluffyBoxDatabase.databaseBuilder, + customImageResizer: PlatformInfos.supportsCustomImageResizer + ? customImageResizer + : null, + logLevel: kReleaseMode ? Level.warning : Level.verbose, + database: await flutterMatrixSdkDatabaseBuilder(clientName), supportedLoginTypes: { AuthenticationTypes.password, - if (PlatformInfos.isMobile || - PlatformInfos.isWeb || - PlatformInfos.isMacOS) - AuthenticationTypes.sso + AuthenticationTypes.sso, }, - compute: compute, - customImageResizer: PlatformInfos.isMobile ? customImageResizer : null, + nativeImplementations: nativeImplementations, + defaultNetworkRequestTimeout: const Duration(minutes: 30), + enableDehydratedDevices: true, + shareKeysWith: + ShareKeysWith.values.singleWhereOrNull( + (share) => share.name == shareKeysWith, + ) ?? + ShareKeysWith.all, + onSoftLogout: enableSoftLogout ? onSoftLogout : null, + sendTimelineEventTimeout: Duration( + seconds: AppSettings.sendTimelineEventTimeout.value, + ), + ); + } + + static Future sendInitNotification(String title, String body) async { + if (kIsWeb) { + html.Notification(title, body: body); + return; + } + + final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + + await flutterLocalNotificationsPlugin.initialize( + settings: const InitializationSettings( + android: AndroidInitializationSettings('notifications_icon'), + iOS: DarwinInitializationSettings(), + ), + ); + + await flutterLocalNotificationsPlugin.show( + id: 0, + title: title, + body: body, + notificationDetails: const NotificationDetails( + android: AndroidNotificationDetails( + 'error_message', + 'Error Messages', + importance: Importance.high, + priority: Priority.max, + ), + iOS: DarwinNotificationDetails(sound: 'notification.caf'), + ), ); } } diff --git a/lib/utils/code_highlight_theme.dart b/lib/utils/code_highlight_theme.dart new file mode 100644 index 0000000000..e2396cc3b1 --- /dev/null +++ b/lib/utils/code_highlight_theme.dart @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/widgets.dart'; + +const hightlightTextColor = Color(0xffabb2bf); +const atomOneBackgroundColor = Color(0xff282c34); +const atomOneDarkTheme = { + 'root': TextStyle(color: hightlightTextColor), + 'comment': TextStyle(color: Color(0xff5c6370), fontStyle: FontStyle.italic), + 'quote': TextStyle(color: Color(0xff5c6370), fontStyle: FontStyle.italic), + 'doctag': TextStyle(color: Color(0xffc678dd)), + 'keyword': TextStyle(color: Color(0xffc678dd)), + 'formula': TextStyle(color: Color(0xffc678dd)), + 'section': TextStyle(color: Color(0xffe06c75)), + 'name': TextStyle(color: Color(0xffe06c75)), + 'selector-tag': TextStyle(color: Color(0xffe06c75)), + 'deletion': TextStyle(color: Color(0xffe06c75)), + 'subst': TextStyle(color: Color(0xffe06c75)), + 'literal': TextStyle(color: Color(0xff56b6c2)), + 'string': TextStyle(color: Color(0xff98c379)), + 'regexp': TextStyle(color: Color(0xff98c379)), + 'addition': TextStyle(color: Color(0xff98c379)), + 'attribute': TextStyle(color: Color(0xff98c379)), + 'meta-string': TextStyle(color: Color(0xff98c379)), + 'built_in': TextStyle(color: Color(0xffe6c07b)), + 'attr': TextStyle(color: Color(0xffd19a66)), + 'variable': TextStyle(color: Color(0xffd19a66)), + 'template-variable': TextStyle(color: Color(0xffd19a66)), + 'type': TextStyle(color: Color(0xffd19a66)), + 'selector-class': TextStyle(color: Color(0xffd19a66)), + 'selector-attr': TextStyle(color: Color(0xffd19a66)), + 'selector-pseudo': TextStyle(color: Color(0xffd19a66)), + 'number': TextStyle(color: Color(0xffd19a66)), + 'symbol': TextStyle(color: Color(0xff61aeee)), + 'bullet': TextStyle(color: Color(0xff61aeee)), + 'link': TextStyle(color: Color(0xff61aeee)), + 'meta': TextStyle(color: Color(0xff61aeee)), + 'selector-id': TextStyle(color: Color(0xff61aeee)), + 'title': TextStyle(color: Color(0xff61aeee)), + 'emphasis': TextStyle(fontStyle: FontStyle.italic), + 'strong': TextStyle(fontWeight: FontWeight.bold), +}; diff --git a/lib/utils/color_value.dart b/lib/utils/color_value.dart new file mode 100644 index 0000000000..e706044dd8 --- /dev/null +++ b/lib/utils/color_value.dart @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/widgets.dart'; + +extension ColorValue on Color { + int get hexValue { + return _floatToInt8(a) << 24 | + _floatToInt8(r) << 16 | + _floatToInt8(g) << 8 | + _floatToInt8(b) << 0; + } + + static int _floatToInt8(double x) { + return (x * 255.0).round() & 0xff; + } +} diff --git a/lib/utils/custom_http_client.dart b/lib/utils/custom_http_client.dart index 479e5edb5d..bc94bf844e 100644 --- a/lib/utils/custom_http_client.dart +++ b/lib/utils/custom_http_client.dart @@ -1,20 +1,29 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:convert'; import 'dart:io'; +import 'package:fluffychat/config/isrg_x1.dart'; +import 'package:fluffychat/config/isrg_x2.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:http/http.dart' as http; import 'package:http/io_client.dart'; +import 'package:http/retry.dart' as retry; -import 'package:fluffychat/config/isrg_x1.dart'; - +/// Custom HTTP client that adds the ISRG Root certificates used by Let's +/// Encrypt. Older Android versions may not include these roots in their +/// trust store, so we ship them ourselves to ensure TLS connections to +/// Let's Encrypt–signed servers continue to work. class CustomHttpClient { - static HttpClient customHttpClient(String? cert) { + static HttpClient customHttpClient() { final context = SecurityContext.defaultContext; try { - if (cert != null) { - final bytes = utf8.encode(cert); - context.setTrustedCertificatesBytes(bytes); - } + context.setTrustedCertificatesBytes(utf8.encode(ISRG_X1)); + context.setTrustedCertificatesBytes(utf8.encode(ISRG_X2)); } on TlsException catch (e) { if (e.osError != null && e.osError!.message.contains('CERT_ALREADY_IN_HASH_TABLE')) { @@ -26,5 +35,7 @@ class CustomHttpClient { return HttpClient(context: context); } - static http.Client createHTTPClient() => IOClient(customHttpClient(ISRG_X1)); + static http.Client createHTTPClient() => retry.RetryClient( + PlatformInfos.isAndroid ? IOClient(customHttpClient()) : http.Client(), + ); } diff --git a/lib/utils/custom_image_resizer.dart b/lib/utils/custom_image_resizer.dart index 677d7e8eb4..a938f7e58f 100644 --- a/lib/utils/custom_image_resizer.dart +++ b/lib/utils/custom_image_resizer.dart @@ -1,63 +1,109 @@ -import 'dart:typed_data'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:ui'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; import 'package:matrix/matrix.dart'; import 'package:native_imaging/native_imaging.dart' as native; +(int, int) _scaleToBox(int width, int height, {required int boxSize}) { + final fit = applyBoxFit( + BoxFit.scaleDown, + Size(width.toDouble(), height.toDouble()), + Size(boxSize.toDouble(), boxSize.toDouble()), + ).destination; + return (fit.width.round(), fit.height.round()); +} + Future customImageResizer( - MatrixImageFileResizeArguments arguments) async { + MatrixImageFileResizeArguments arguments, +) async { await native.init(); - late native.Image nativeImg; + + var imageBytes = arguments.bytes; + String? blurhash; + + var originalWidth = 0; + var originalHeight = 0; + var width = 0; + var height = 0; + String? mimeType; try { - nativeImg = await native.Image.loadEncoded(arguments.bytes); // load on web - } on UnsupportedError { - try { - // for the other platforms - final dartCodec = await instantiateImageCodec(arguments.bytes); - final dartFrame = await dartCodec.getNextFrame(); - final rgbaData = await dartFrame.image.toByteData(); - if (rgbaData == null) { - return null; - } - final rgba = Uint8List.view( - rgbaData.buffer, rgbaData.offsetInBytes, rgbaData.lengthInBytes); + // for the other platforms + final dartCodec = await instantiateImageCodec(arguments.bytes); + final frameCount = dartCodec.frameCount; + final dartFrame = await dartCodec.getNextFrame(); + final rgbaData = await dartFrame.image.toByteData(); + if (rgbaData == null) { + return null; + } + final rgba = Uint8List.view( + rgbaData.buffer, + rgbaData.offsetInBytes, + rgbaData.lengthInBytes, + ); - final width = dartFrame.image.width; - final height = dartFrame.image.height; + width = originalWidth = dartFrame.image.width; + height = originalHeight = dartFrame.image.height; - dartFrame.image.dispose(); - dartCodec.dispose(); + var nativeImg = native.Image.fromRGBA(width, height, rgba); - nativeImg = native.Image.fromRGBA(width, height, rgba); - } catch (e, s) { - Logs().e("Could not generate preview", e, s); - rethrow; - } - } + dartFrame.image.dispose(); + dartCodec.dispose(); - final width = nativeImg.width; - final height = nativeImg.height; + if (arguments.calcBlurhash) { + // scale down image for blurhashing to speed it up + final (blurW, blurH) = _scaleToBox(width, height, boxSize: 100); + final blurhashImg = nativeImg.resample( + blurW, + blurH, + // nearest is unsupported... + native.Transform.bilinear, + ); - final max = arguments.maxDimension; - if (width > max || height > max) { - var w = max, h = max; - if (width > height) { - h = max * height ~/ width; - } else { - w = max * width ~/ height; + blurhash = blurhashImg.toBlurhash(3, 3); + + blurhashImg.free(); } - final scaledImg = nativeImg.resample(w, h, native.Transform.lanczos); - nativeImg.free(); - nativeImg = scaledImg; + if (frameCount > 1) { + // Don't scale down animated images, since those would lose frames. + nativeImg.free(); + } else { + final max = arguments.maxDimension; + if (width > max || height > max) { + (width, height) = _scaleToBox(width, height, boxSize: max); + + final scaledImg = nativeImg.resample( + width, + height, + native.Transform.lanczos, + ); + nativeImg.free(); + nativeImg = scaledImg; + } + + imageBytes = await nativeImg.toJpeg(75); + mimeType = 'image/jpeg'; + nativeImg.free(); + } + } catch (e, s) { + Logs().e('Could not generate preview', e, s); + mimeType = null; } - final jpegBytes = await nativeImg.toJpeg(75); return MatrixImageFileResizedResponse( - bytes: jpegBytes, - width: nativeImg.width, - height: nativeImg.height, - blurhash: arguments.calcBlurhash ? nativeImg.toBlurhash(3, 3) : null, + bytes: imageBytes, + width: width, + height: height, + originalWidth: originalWidth, + originalHeight: originalHeight, + blurhash: blurhash, + mimeType: mimeType, ); } diff --git a/lib/utils/custom_scroll_behaviour.dart b/lib/utils/custom_scroll_behaviour.dart index 8472111547..6b08847dac 100644 --- a/lib/utils/custom_scroll_behaviour.dart +++ b/lib/utils/custom_scroll_behaviour.dart @@ -1,10 +1,15 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; class CustomScrollBehavior extends MaterialScrollBehavior { @override Set get dragDevices => { - PointerDeviceKind.touch, - PointerDeviceKind.mouse, - }; + PointerDeviceKind.touch, + PointerDeviceKind.trackpad, + }; } diff --git a/lib/utils/date_time_extension.dart b/lib/utils/date_time_extension.dart index e37b4f0ef1..b7e14ed983 100644 --- a/lib/utils/date_time_extension.dart +++ b/lib/utils/date_time_extension.dart @@ -1,6 +1,12 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; /// Provides extra functionality for formatting the time. extension DateTimeExtension on DateTime { @@ -20,27 +26,25 @@ extension DateTimeExtension on DateTime { return millisecondsSinceEpoch <= other.millisecondsSinceEpoch; } - /// Two message events can belong to the same environment. That means that they - /// don't need to display the time they were sent because they are close - /// enaugh. - static const minutesBetweenEnvironments = 5; - /// Checks if two DateTimes are close enough to belong to the same /// environment. - bool sameEnvironment(DateTime prevTime) { - return millisecondsSinceEpoch - prevTime.millisecondsSinceEpoch < - 1000 * 60 * minutesBetweenEnvironments; - } + bool sameEnvironment(DateTime prevTime) => + difference(prevTime).abs() < const Duration(minutes: 5) && + sameDay(prevTime); + + bool sameDay(DateTime prevTime) => + prevTime.year == year && prevTime.month == month && prevTime.day == day; /// Returns a simple time String. - /// TODO: Add localization - String localizedTimeOfDay(BuildContext context) { - if (MediaQuery.of(context).alwaysUse24HourFormat) { - return '${_z(hour)}:${_z(minute)}'; - } else { - return '${_z(hour % 12 == 0 ? 12 : hour % 12)}:${_z(minute)} ${hour > 11 ? "pm" : "am"}'; - } - } + String localizedTimeOfDay(BuildContext context) => use24HourFormat(context) + ? DateFormat( + 'HH:mm', + Localizations.localeOf(context).languageCode, + ).format(this) + : DateFormat( + 'h:mm a', + Localizations.localeOf(context).languageCode, + ).format(this); /// Returns [localizedTimeOfDay()] if the ChatTime is today, the name of the week /// day if the ChatTime is this week and a date string else. @@ -51,7 +55,8 @@ extension DateTimeExtension on DateTime { final sameDay = sameYear && now.month == month && now.day == day; - final sameWeek = sameYear && + final sameWeek = + sameYear && !sameDay && now.millisecondsSinceEpoch - millisecondsSinceEpoch < 1000 * 60 * 60 * 24 * 7; @@ -59,28 +64,51 @@ extension DateTimeExtension on DateTime { if (sameDay) { return localizedTimeOfDay(context); } else if (sameWeek) { - switch (weekday) { - case 1: - return L10n.of(context)!.monday; - case 2: - return L10n.of(context)!.tuesday; - case 3: - return L10n.of(context)!.wednesday; - case 4: - return L10n.of(context)!.thursday; - case 5: - return L10n.of(context)!.friday; - case 6: - return L10n.of(context)!.saturday; - case 7: - return L10n.of(context)!.sunday; - } + return DateFormat.E( + Localizations.localeOf(context).languageCode, + ).format(this); } else if (sameYear) { - return L10n.of(context)!.dateWithoutYear( - month.toString().padLeft(2, '0'), day.toString().padLeft(2, '0')); + return DateFormat.MMMd( + Localizations.localeOf(context).languageCode, + ).format(this); } - return L10n.of(context)!.dateWithYear(year.toString(), - month.toString().padLeft(2, '0'), day.toString().padLeft(2, '0')); + return DateFormat.yMMMd( + Localizations.localeOf(context).languageCode, + ).format(this); + } + + DateTime get dateOnly => DateTime(year, month, day); + + String localizedDate(BuildContext context) { + final date = dateOnly; + final now = DateTime.now().dateOnly; + + final sameYear = now.year == date.year; + + final sameDay = now == date; + + final sameWeek = + sameYear && + !sameDay && + now.millisecondsSinceEpoch - millisecondsSinceEpoch < + 1000 * 60 * 60 * 24 * 7; + + if (sameDay) { + return L10n.of(context).today; + } else if (now.difference(date).inDays == 1) { + return L10n.of(context).yesterday; + } else if (sameWeek) { + return DateFormat.EEEE( + Localizations.localeOf(context).languageCode, + ).format(date); + } else if (sameYear) { + return DateFormat.MMMMd( + Localizations.localeOf(context).languageCode, + ).format(date); + } + return DateFormat.yMMMMd( + Localizations.localeOf(context).languageCode, + ).format(date); } /// If the DateTime is today, this returns [localizedTimeOfDay()], if not it also @@ -94,9 +122,70 @@ extension DateTimeExtension on DateTime { final sameDay = sameYear && now.month == month && now.day == day; if (sameDay) return localizedTimeOfDay(context); - return L10n.of(context)!.dateAndTimeOfDay( - localizedTimeShort(context), localizedTimeOfDay(context)); + return L10n.of(context).dateAndTimeOfDay( + localizedTimeShort(context), + localizedTimeOfDay(context), + ); } - static String _z(int i) => i < 10 ? '0${i.toString()}' : i.toString(); + String localizedDetailedTime(BuildContext context) => + L10n.of(context).dateAndTimeOfDay( + DateFormat.yMMMd( + Localizations.localeOf(context).languageCode, + ).format(this), + use24HourFormat(context) + ? DateFormat( + 'HH:mm:ss', + Localizations.localeOf(context).languageCode, + ).format(this) + : DateFormat( + 'h:mm:ss a', + Localizations.localeOf(context).languageCode, + ).format(this), + ); + + /// Check if time needs to be in 24h format + bool use24HourFormat(BuildContext context) { + final mediaQuery24h = MediaQuery.alwaysUse24HourFormatOf(context); + + // For Android this should always work. + if (PlatformInfos.isAndroid) return mediaQuery24h; + + final locale = Localizations.localeOf(context).languageCode; + // Note: I don't like maintaining my own list but I haven't found a way to + // check this completely in Flutter side, as `alwaysUse24HourFormatOf()` + // doesn't seem to work on web or desktop. + const languages24Hour = { + 'de', + 'fr', + 'es', + 'it', + 'nl', + 'pt', + 'ru', + 'zh', + 'ja', + 'ko', + 'ar', + 'pl', + 'cs', + 'hu', + 'sv', + 'no', + 'da', + 'fi', + 'el', + 'he', + 'tr', + 'lt', + }; + final l10n24h = languages24Hour.contains(locale); + + // https://github.com/krille-chan/fluffychat/pull/1457#discussion_r1836817914 + if (PlatformInfos.isIOS) { + return mediaQuery24h || l10n24h; + } + + return l10n24h; + } } diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart new file mode 100644 index 0000000000..ae6d2a8e51 --- /dev/null +++ b/lib/utils/error_reporter.dart @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class ErrorReporter { + final BuildContext? context; + final String? message; + + const ErrorReporter(this.context, [this.message]); + + static const Set ingoredTypes = { + 'IOException', + 'ClientException', + 'SocketException', + 'TlsException', + 'HandshakeException', + }; + + Future onErrorCallback(Object error, [StackTrace? stackTrace]) async { + if (ingoredTypes.contains(error.runtimeType.toString())) return; + Logs().e(message ?? 'Error caught', error, stackTrace); + final text = '$error\n${stackTrace ?? ''}'; + return _onErrorCallback(text); + } + + Future _onErrorCallback(String text) async { + await showAdaptiveDialog( + context: context!, + builder: (context) => AlertDialog.adaptive( + title: Text(L10n.of(context).reportErrorDescription), + content: SizedBox( + height: 256, + width: 256, + child: SingleChildScrollView( + child: Text( + text, + style: const TextStyle(fontSize: 14, fontFamily: 'RobotoMono'), + ), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(), + child: Text(L10n.of(context).close), + ), + AdaptiveDialogAction( + onPressed: () => Clipboard.setData(ClipboardData(text: text)), + child: Text(L10n.of(context).copy), + ), + AdaptiveDialogAction( + onPressed: () => launchUrl( + AppConfig.newIssueUrl.resolveUri( + Uri(queryParameters: {'template': 'bug_report.yaml'}), + ), + mode: LaunchMode.externalApplication, + ), + child: Text(L10n.of(context).report), + ), + ], + ), + ); + } +} diff --git a/lib/utils/event_checkbox_extension.dart b/lib/utils/event_checkbox_extension.dart new file mode 100644 index 0000000000..01d4e20bbf --- /dev/null +++ b/lib/utils/event_checkbox_extension.dart @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:matrix/matrix.dart'; + +extension EventCheckboxRoomExtension on Room { + static const String relationshipType = 'im.fluffychat.checkboxes'; + Future checkCheckbox( + String eventId, + int checkboxId, { + String? txid, + }) => sendEvent( + { + 'm.relates_to': { + 'rel_type': relationshipType, + 'event_id': eventId, + 'checkbox_id': checkboxId, + }, + }, + type: EventTypes.Reaction, + txid: txid, + ); +} + +extension EventCheckboxExtension on Event { + int? get checkedCheckboxId => content + .tryGetMap('m.relates_to') + ?.tryGet('checkbox_id'); +} diff --git a/lib/utils/famedlysdk_store.dart b/lib/utils/famedlysdk_store.dart deleted file mode 100644 index 2f16b5963c..0000000000 --- a/lib/utils/famedlysdk_store.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:core'; - -import 'package:shared_preferences/shared_preferences.dart'; - -class Store { - SharedPreferences? _prefs; - - Future _setupLocalStorage() async { - _prefs ??= await SharedPreferences.getInstance(); - } - - Future getItem(String key) async { - await _setupLocalStorage(); - return _prefs!.getString(key); - } - - Future getItemBool(String key, [bool? defaultValue]) async { - await _setupLocalStorage(); - return _prefs!.getBool(key) ?? defaultValue ?? true; - } - - Future setItem(String key, String? value) async { - await _setupLocalStorage(); - if (value == null) { - await _prefs!.remove(key); - return; - } - await _prefs!.setString(key, value); - return; - } - - Future setItemBool(String key, bool value) async { - await _setupLocalStorage(); - await _prefs!.setBool(key, value); - return; - } - - Future deleteItem(String key) async { - await _setupLocalStorage(); - await _prefs!.remove(key); - return; - } -} diff --git a/lib/utils/file_description.dart b/lib/utils/file_description.dart new file mode 100644 index 0000000000..68f9067624 --- /dev/null +++ b/lib/utils/file_description.dart @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:matrix/matrix.dart'; + +extension FileDescriptionExtension on Event { + String? get fileDescription { + if (!{ + MessageTypes.File, + MessageTypes.Image, + MessageTypes.Sticker, + MessageTypes.Video, + MessageTypes.Audio, + }.contains(messageType)) { + return null; + } + final filename = content.tryGet('filename'); + final body = calcUnlocalizedBody(hideReply: true, plaintextBody: true); + + if (filename != body && + filename != null && + content.tryGet('body')?.isNotEmpty == true) { + return body; + } + return null; + } +} diff --git a/lib/utils/file_selector.dart b/lib/utils/file_selector.dart new file mode 100644 index 0000000000..376df35460 --- /dev/null +++ b/lib/utils/file_selector.dart @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:file_picker/file_picker.dart'; +import 'package:file_selector/file_selector.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/widgets.dart'; + +Future> selectFiles( + BuildContext context, { + String? title, + FileType type = FileType.any, + bool allowMultiple = false, +}) async { + final result = await AppLock.of(context).pauseWhile( + showFutureLoadingDialog( + context: context, + future: () async { + if (allowMultiple) { + final result = await FilePicker.pickFiles( + type: type, + dialogTitle: title, + ); + return result?.xFiles; + } + final result = await FilePicker.pickFile( + type: type, + dialogTitle: title, + ); + return [?result?.xFile]; + }, + ), + ); + return result.result ?? []; +} diff --git a/lib/utils/fluffy_share.dart b/lib/utils/fluffy_share.dart index 630803b3e0..db7182924e 100644 --- a/lib/utils/fluffy_share.dart +++ b/lib/utils/fluffy_share.dart @@ -1,25 +1,54 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; +import '../widgets/matrix.dart'; abstract class FluffyShare { - static Future share(String text, BuildContext context) async { - if (PlatformInfos.isMobile) { + static Future share( + String text, + BuildContext context, { + bool copyOnly = false, + }) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); + if (PlatformInfos.isMobile && !copyOnly) { final box = context.findRenderObject() as RenderBox; - return Share.share( - text, - sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, + await SharePlus.instance.share( + ShareParams( + text: text, + sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, + ), + ); + return; + } + await Clipboard.setData(ClipboardData(text: text)); + if (!PlatformInfos.isMobile) { + scaffoldMessenger.showSnackBar( + SnackBar(showCloseIcon: true, content: Text(l10n.copiedToClipboard)), ); } - await Clipboard.setData( - ClipboardData(text: text), - ); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.copiedToClipboard))); return; } + + static Future shareInviteLink(BuildContext context) async { + final l10n = L10n.of(context); + final client = Matrix.of(context).client; + final ownProfile = await client.fetchOwnProfile(); + if (!context.mounted) return; + await FluffyShare.share( + l10n.inviteText( + ownProfile.displayName ?? client.userID!, + 'https://matrix.to/#/${client.userID}?client=im.fluffychat', + ), + context, + ); + } } diff --git a/lib/utils/get_client_secret.dart b/lib/utils/get_client_secret.dart deleted file mode 100644 index d86cd388ea..0000000000 --- a/lib/utils/get_client_secret.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'dart:math'; - -const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890'; -Random _rnd = Random(); - -String getClientSecret(int length) => String.fromCharCodes(Iterable.generate( - length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length)))); diff --git a/lib/utils/init_with_restore.dart b/lib/utils/init_with_restore.dart new file mode 100644 index 0000000000..03f101ce6a --- /dev/null +++ b/lib/utils/init_with_restore.dart @@ -0,0 +1,154 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; +import 'dart:ui'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; + +class SessionBackup { + final String? olmAccount; + final String accessToken; + final String userId; + final String homeserver; + final String? deviceId; + final String? deviceName; + + const SessionBackup({ + required this.olmAccount, + required this.accessToken, + required this.userId, + required this.homeserver, + required this.deviceId, + this.deviceName, + }); + + factory SessionBackup.fromJsonString(String json) => + SessionBackup.fromJson(jsonDecode(json)); + + factory SessionBackup.fromJson(Map json) => SessionBackup( + olmAccount: json['olm_account'], + accessToken: json['access_token'], + userId: json['user_id'], + homeserver: json['homeserver'], + deviceId: json['device_id'], + deviceName: json['device_name'], + ); + + Map toJson() => { + 'olm_account': olmAccount, + 'access_token': accessToken, + 'user_id': userId, + 'homeserver': homeserver, + 'device_id': deviceId, + if (deviceName != null) 'device_name': deviceName, + }; + + @override + String toString() => jsonEncode(toJson()); +} + +extension InitWithRestoreExtension on Client { + static Future deleteSessionBackup(String clientName) async { + final storage = PlatformInfos.isMobile || PlatformInfos.isLinux + ? const FlutterSecureStorage() + : null; + await storage?.delete( + key: '${AppSettings.applicationName.value}_session_backup_$clientName', + ); + } + + Future initWithRestore({void Function()? onMigration}) async { + final storageKey = + '${AppSettings.applicationName.value}_session_backup_$clientName'; + final storage = PlatformInfos.isMobile || PlatformInfos.isLinux + ? const FlutterSecureStorage() + : null; + + try { + await init( + onInitStateChanged: (state) { + if (state == InitState.migratingDatabase) onMigration?.call(); + }, + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + ); + if (isLogged()) { + final accessToken = this.accessToken; + final homeserver = this.homeserver?.toString(); + final deviceId = deviceID; + final userId = userID; + final hasBackup = + accessToken != null && + homeserver != null && + deviceId != null && + userId != null; + assert(hasBackup); + if (hasBackup) { + Logs().v('Store session in backup'); + storage?.write( + key: storageKey, + value: SessionBackup( + olmAccount: encryption?.pickledOlmAccount, + accessToken: accessToken, + deviceId: deviceId, + homeserver: homeserver, + deviceName: deviceName, + userId: userId, + ).toString(), + ); + } + } + } catch (e, s) { + Logs().wtf('Client init failed!', e, s); + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + final sessionBackupString = await storage?.read(key: storageKey); + if (sessionBackupString == null) { + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.sessionLostBody(AppConfig.newIssueUrl.toString(), e.toString()), + ); + rethrow; + } + + try { + final sessionBackup = SessionBackup.fromJsonString(sessionBackupString); + await init( + newToken: sessionBackup.accessToken, + newOlmAccount: sessionBackup.olmAccount, + newDeviceID: sessionBackup.deviceId, + newDeviceName: sessionBackup.deviceName, + newHomeserver: Uri.tryParse(sessionBackup.homeserver), + newUserID: sessionBackup.userId, + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + onInitStateChanged: (state) { + if (state == InitState.migratingDatabase) onMigration?.call(); + }, + ); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.restoreSessionBody( + AppConfig.newIssueUrl.toString(), + e.toString(), + ), + ); + } catch (e, s) { + Logs().wtf('Restore client failed!', e, s); + ClientManager.sendInitNotification( + l10n.initAppError, + l10n.sessionLostBody(AppConfig.newIssueUrl.toString(), e.toString()), + ); + rethrow; + } + } + } +} diff --git a/lib/utils/localized_exception_extension.dart b/lib/utils/localized_exception_extension.dart index 16dd7f4f36..ae3a64cabe 100644 --- a/lib/utils/localized_exception_extension.dart +++ b/lib/utils/localized_exception_extension.dart @@ -1,37 +1,75 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:io'; +import 'dart:math'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:flutter/services.dart'; +import 'package:http/http.dart'; +import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'uia_request_manager.dart'; extension LocalizedExceptionExtension on Object { - String toLocalizedString(BuildContext context) { + static String _formatFileSize(int size) { + if (size < 1000) return '$size B'; + final i = (log(size) / log(1000)).floor(); + final num = (size / pow(1000, i)); + final round = num.round(); + final numString = round < 10 + ? num.toStringAsFixed(2) + : round < 100 + ? num.toStringAsFixed(1) + : round.toString(); + return '$numString ${'kMGTPEZY'[i - 1]}B'; + } + + String toLocalizedString( + BuildContext context, [ + ExceptionContext? exceptionContext, + ]) { + if (this is FileTooBigMatrixException) { + final exception = this as FileTooBigMatrixException; + return L10n.of( + context, + ).fileIsTooBigForServer(_formatFileSize(exception.maxFileSize)); + } + if (this is OtherPartyCanNotReceiveMessages) { + return L10n.of(context).otherPartyNotLoggedIn; + } if (this is MatrixException) { switch ((this as MatrixException).error) { case MatrixError.M_FORBIDDEN: - return L10n.of(context)!.noPermission; + if (exceptionContext == ExceptionContext.changePassword) { + return L10n.of(context).passwordIsWrong; + } + return L10n.of(context).noPermission; case MatrixError.M_LIMIT_EXCEEDED: - return L10n.of(context)!.tooManyRequestsWarning; + return L10n.of(context).tooManyRequestsWarning; default: + if (exceptionContext == ExceptionContext.joinRoom) { + return L10n.of(context).unableToJoinChat; + } return (this as MatrixException).errorMessage; } } - if (this is BadServerVersionsException) { - final serverVersions = (this as BadServerVersionsException) - .serverVersions - .toString() - .replaceAll('{', '"') - .replaceAll('}', '"'); - final supportedVersions = (this as BadServerVersionsException) - .supportedVersions - .toString() - .replaceAll('{', '"') - .replaceAll('}', '"'); - return L10n.of(context)! - .badServerVersionsException(serverVersions, supportedVersions); + if (this is InvalidPassphraseException) { + return L10n.of(context).wrongRecoveryKey; + } + if (this is PlatformException) { + if ((this as PlatformException).code == 'CANCELED') { + return L10n.of(context).theProcessWasCanceled; + } + final message = (this as PlatformException).message; + if (message != null) { + return message; + } } if (this is BadServerLoginTypesException) { final serverVersions = (this as BadServerLoginTypesException) @@ -44,15 +82,39 @@ extension LocalizedExceptionExtension on Object { .toString() .replaceAll('{', '"') .replaceAll('}', '"'); - return L10n.of(context)! - .badServerLoginTypesException(serverVersions, supportedVersions); + return L10n.of( + context, + ).badServerLoginTypesException(serverVersions, supportedVersions); + } + if (this is IOException || + this is SocketException || + this is SyncConnectionException || + this is ClientException) { + return L10n.of(context).noConnectionToTheServer; + } + if (this is FormatException && + exceptionContext == ExceptionContext.checkHomeserver) { + return L10n.of(context).doesNotSeemToBeAValidHomeserver; } - if (this is MatrixConnectionException || this is SocketException) { - return L10n.of(context)!.noConnectionToTheServer; + if (this is FormatException && + exceptionContext == ExceptionContext.checkServerSupportInfo) { + return L10n.of(context).noContactInformationProvided; } if (this is String) return toString(); if (this is UiaException) return toString(); + + if (exceptionContext == ExceptionContext.joinRoom) { + return L10n.of(context).unableToJoinChat; + } + Logs().w('Something went wrong: ', this); - return L10n.of(context)!.oopsSomethingWentWrong; + return L10n.of(context).oopsSomethingWentWrong; } } + +enum ExceptionContext { + changePassword, + checkHomeserver, + checkServerSupportInfo, + joinRoom, +} diff --git a/lib/utils/markdown_context_builder.dart b/lib/utils/markdown_context_builder.dart new file mode 100644 index 0000000000..6a4f4d7465 --- /dev/null +++ b/lib/utils/markdown_context_builder.dart @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:flutter/material.dart'; + +class MarkdownContextBuilder extends StatelessWidget { + final EditableTextState editableTextState; + final TextEditingController controller; + + const MarkdownContextBuilder({ + required this.editableTextState, + required this.controller, + super.key, + }); + + @override + Widget build(BuildContext context) { + final value = editableTextState.textEditingValue; + final selectedText = value.selection.textInside(value.text); + final buttonItems = editableTextState.contextMenuButtonItems; + final l10n = L10n.of(context); + + return AdaptiveTextSelectionToolbar.buttonItems( + anchors: editableTextState.contextMenuAnchors, + buttonItems: [ + ...buttonItems, + if (selectedText.isNotEmpty) ...[ + ContextMenuButtonItem( + label: l10n.link, + onPressed: () async { + final input = await showTextInputDialog( + context: context, + title: l10n.addLink, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + validator: (text) { + if (text.isEmpty) { + return l10n.pleaseFillOut; + } + try { + text.startsWith('http') ? Uri.parse(text) : Uri.https(text); + } catch (_) { + return l10n.invalidUrl; + } + return null; + }, + hintText: 'www...', + keyboardType: TextInputType.url, + ); + final urlString = input; + if (urlString == null) return; + final url = urlString.startsWith('http') + ? Uri.parse(urlString) + : Uri.https(urlString); + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '[$selectedText]($url)', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.checkList, + onPressed: () { + final text = controller.text; + final selection = controller.selection; + + var start = selection.textBefore(text).lastIndexOf('\n'); + if (start == -1) start = 0; + final end = selection.end; + + final fullLineSelection = TextSelection( + baseOffset: start, + extentOffset: end, + ); + + const checkBox = '- [ ]'; + + final replacedRange = fullLineSelection + .textInside(text) + .split('\n') + .map( + (line) => line.startsWith(checkBox) || line.isEmpty + ? line + : '$checkBox $line', + ) + .join('\n'); + controller.text = controller.text.replaceRange( + start, + end, + replacedRange, + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.boldText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '**$selectedText**', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.italicText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '*$selectedText*', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.strikeThrough, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '~~$selectedText~~', + ); + ContextMenuController.removeAny(); + }, + ), + ], + ], + ); + } +} diff --git a/lib/utils/matrix_sdk_extensions.dart/client_presence_extension.dart b/lib/utils/matrix_sdk_extensions.dart/client_presence_extension.dart deleted file mode 100644 index e9d06794bc..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/client_presence_extension.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:matrix/matrix.dart'; - -extension ClientPresenceExtension on Client { - List get contactList { - final directChatsMxid = rooms - .where((r) => r.isDirectChat) - .map((r) => r.directChatMatrixID) - .toSet(); - final contactList = directChatsMxid - .map( - (mxid) => - presences[mxid] ?? - CachedPresence( - PresenceType.offline, - 0, - null, - false, - mxid ?? '', - ), - ) - .toList(); - - contactList.sort((a, b) => a.userid.compareTo(b.userid)); - contactList.sort((a, b) => ((a.lastActiveTimestamp ?? - DateTime.fromMillisecondsSinceEpoch(0)) - .compareTo( - b.lastActiveTimestamp ?? DateTime.fromMillisecondsSinceEpoch(0)))); - return contactList; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/client_stories_extension.dart b/lib/utils/matrix_sdk_extensions.dart/client_stories_extension.dart deleted file mode 100644 index 269de73c87..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/client_stories_extension.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:matrix/matrix.dart'; - -extension ClientStoriesExtension on Client { - static const String storiesRoomType = 'msc3588.stories.stories-room'; - static const String storiesBlockListType = 'msc3588.stories.block-list'; - - static const int lifeTimeInHours = 24; - static const int maxPostsPerStory = 20; - - List get contacts => rooms - .where((room) => room.isDirectChat) - .map((room) => - room.unsafeGetUserFromMemoryOrFallback(room.directChatMatrixID!)) - .toList(); - - List get storiesRooms => rooms - .where((room) => - room - .getState(EventTypes.RoomCreate) - ?.content - .tryGet('type') == - storiesRoomType) - .toList(); - - Future> getUndecidedContactsForStories(Room? storiesRoom) async { - if (storiesRoom == null) return contacts; - final invitedContacts = - (await storiesRoom.requestParticipants()).map((user) => user.id); - final decidedContacts = storiesBlockList.toSet()..addAll(invitedContacts); - return contacts - .where((contact) => !decidedContacts.contains(contact.id)) - .toList(); - } - - List get storiesBlockList => - accountData[storiesBlockListType]?.content.tryGetList('users') ?? - []; - - Future setStoriesBlockList(List users) => setAccountData( - userID!, - storiesBlockListType, - {'users': users}, - ); - - Future createStoriesRoom([List? invite]) async { - final roomId = await createRoom( - creationContent: {"type": "msc3588.stories.stories-room"}, - preset: CreateRoomPreset.privateChat, - powerLevelContentOverride: {"events_default": 100}, - name: 'Stories from ${userID!.localpart}', - topic: - 'This is a room for stories sharing, not unlike the similarly named features in other messaging networks. For best experience please use FluffyChat or minesTrix. Feature development can be followed on: https://github.com/matrix-org/matrix-doc/pull/3588', - initialState: [ - StateEvent( - type: EventTypes.Encryption, - stateKey: '', - content: { - 'algorithm': 'm.megolm.v1.aes-sha2', - }, - ), - StateEvent( - type: 'm.room.retention', - stateKey: '', - content: { - 'min_lifetime': 86400000, - 'max_lifetime': 86400000, - }, - ), - ], - invite: invite, - ); - if (getRoomById(roomId) == null) { - // Wait for room actually appears in sync - await onSync.stream - .firstWhere((sync) => sync.rooms?.join?.containsKey(roomId) ?? false); - } - return getRoomById(roomId)!; - } - - Future getStoriesRoom(BuildContext context) async { - final candidates = rooms.where((room) => - room.getState(EventTypes.RoomCreate)?.content.tryGet('type') == - storiesRoomType && - room.ownPowerLevel >= 100); - if (candidates.isEmpty) return null; - if (candidates.length == 1) return candidates.single; - return await showModalActionSheet( - context: context, - actions: candidates - .map( - (room) => SheetAction(label: room.displayname, key: room), - ) - .toList()); - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/event_extension.dart b/lib/utils/matrix_sdk_extensions.dart/event_extension.dart deleted file mode 100644 index b6796a40e8..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/event_extension.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; - -import 'matrix_file_extension.dart'; - -extension LocalizedBody on Event { - Future> _getFile(BuildContext context) => - showFutureLoadingDialog( - context: context, - future: () => downloadAndDecryptAttachmentCached(), - ); - - void saveFile(BuildContext context) async { - final matrixFile = await _getFile(context); - - matrixFile.result?.save(context); - } - - void shareFile(BuildContext context) async { - final matrixFile = await _getFile(context); - - matrixFile.result?.share(context); - } - - bool get isAttachmentSmallEnough => - infoMap['size'] is int && - infoMap['size'] < room.client.database!.maxFileSize; - - bool get isThumbnailSmallEnough => - thumbnailInfoMap['size'] is int && - thumbnailInfoMap['size'] < room.client.database!.maxFileSize; - - bool get showThumbnail => - [MessageTypes.Image, MessageTypes.Sticker, MessageTypes.Video] - .contains(messageType) && - (kIsWeb || - isAttachmentSmallEnough || - isThumbnailSmallEnough || - (content['url'] is String)); - - String? get sizeString { - if (content['info'] is Map && - content['info'].containsKey('size')) { - num size = content['info']['size']; - if (size < 1000000) { - size = size / 1000; - size = (size * 10).round() / 10; - return '${size.toString()} KB'; - } else if (size < 1000000000) { - size = size / 1000000; - size = (size * 10).round() / 10; - return '${size.toString()} MB'; - } else { - size = size / 1000000000; - size = (size * 10).round() / 10; - return '${size.toString()} GB'; - } - } else { - return null; - } - } - - static final _downloadAndDecryptFutures = >{}; - - Future isAttachmentCached({bool getThumbnail = false}) async { - final mxcUrl = attachmentOrThumbnailMxcUrl(getThumbnail: getThumbnail); - if (mxcUrl == null) return false; - // check if we have it in-memory - if (_downloadAndDecryptFutures.containsKey(mxcUrl)) { - return true; - } - // check if it is stored - if (await isAttachmentInLocalStore(getThumbnail: getThumbnail)) { - return true; - } - // check if the url is cached - final url = mxcUrl.getDownloadLink(room.client); - final file = await DefaultCacheManager().getFileFromCache(url.toString()); - return file != null; - } - - Future downloadAndDecryptAttachmentCached( - {bool getThumbnail = false}) async { - final mxcUrl = - attachmentOrThumbnailMxcUrl(getThumbnail: getThumbnail)?.toString() ?? - eventId; - _downloadAndDecryptFutures[mxcUrl] ??= downloadAndDecryptAttachment( - getThumbnail: getThumbnail, - downloadCallback: (Uri url) async { - final file = await DefaultCacheManager().getSingleFile(url.toString()); - return await file.readAsBytes(); - }, - ); - final res = await _downloadAndDecryptFutures[mxcUrl]; - return res; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart deleted file mode 100644 index 565a07a90b..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/filtered_timeline_extension.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:matrix/matrix.dart'; - -import '../../config/app_config.dart'; - -extension FilteredTimelineExtension on Timeline { - List getFilteredEvents({Set unfolded = const {}}) { - final filteredEvents = events - .where((e) => - // always filter out edit and reaction relationships - !{RelationshipTypes.edit, RelationshipTypes.reaction} - .contains(e.relationshipType) && - // always filter out m.key.* events - !e.type.startsWith('m.key.verification.') && - // event types to hide: redaction and reaction events - // if a reaction has been redacted we also want it to be hidden in the timeline - !{EventTypes.Reaction, EventTypes.Redaction}.contains(e.type) && - // if we enabled to hide all redacted events, don't show those - (!AppConfig.hideRedactedEvents || !e.redacted) && - // if we enabled to hide all unknown events, don't show those - (!AppConfig.hideUnknownEvents || e.isEventTypeKnown) && - // remove state events that we don't want to render - (e.isState || !AppConfig.hideAllStateEvents)) - .toList(); - - // Fold state events - var counter = 0; - for (var i = filteredEvents.length - 1; i >= 0; i--) { - if (!filteredEvents[i].isState) continue; - if (i > 0 && - filteredEvents[i - 1].isState && - !unfolded.contains(filteredEvents[i - 1].eventId)) { - counter++; - filteredEvents[i].unsigned ??= {}; - filteredEvents[i].unsigned!['im.fluffychat.collapsed_state_event'] = - true; - } else { - filteredEvents[i].unsigned!['im.fluffychat.collapsed_state_event'] = - false; - filteredEvents[i] - .unsigned!['im.fluffychat.collapsed_state_event_count'] = counter; - counter = 0; - } - } - return filteredEvents; - } -} - -extension IsStateExtension on Event { - bool get isState => !{ - EventTypes.Message, - EventTypes.Sticker, - EventTypes.Encrypted - }.contains(type); -} diff --git a/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart b/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart deleted file mode 100644 index c2e938fd36..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/fluffybox_database.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:flutter/foundation.dart' hide Key; -import 'package:flutter/services.dart'; - -import 'package:fluffybox/hive.dart' as fluffybox; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:hive_flutter/hive_flutter.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; - -import '../client_manager.dart'; -import '../famedlysdk_store.dart'; - -// ignore: deprecated_member_use -class FlutterFluffyBoxDatabase extends FluffyBoxDatabase { - FlutterFluffyBoxDatabase( - String name, - String path, { - fluffybox.HiveCipher? key, - }) : super( - name, - path, - key: key, - ); - - static const String _cipherStorageKey = 'database_encryption_key'; - - // ignore: deprecated_member_use - static Future databaseBuilder(Client client) async { - Logs().d('Open FluffyBox...'); - fluffybox.HiveAesCipher? hiverCipher; - try { - // Workaround for secure storage is calling Platform.operatingSystem on web - if (kIsWeb) throw MissingPluginException(); - - const secureStorage = FlutterSecureStorage(); - final containsEncryptionKey = - await secureStorage.containsKey(key: _cipherStorageKey); - if (!containsEncryptionKey) { - // do not try to create a buggy secure storage for new Linux users - if (Platform.isLinux) throw MissingPluginException(); - final key = Hive.generateSecureKey(); - await secureStorage.write( - key: _cipherStorageKey, - value: base64UrlEncode(key), - ); - } - - // workaround for if we just wrote to the key and it still doesn't exist - final rawEncryptionKey = await secureStorage.read(key: _cipherStorageKey); - if (rawEncryptionKey == null) throw MissingPluginException(); - - hiverCipher = fluffybox.HiveAesCipher(base64Url.decode(rawEncryptionKey)); - } on MissingPluginException catch (_) { - Logs().i('FluffyBox encryption is not supported on this platform'); - } catch (_) { - const FlutterSecureStorage().delete(key: _cipherStorageKey); - rethrow; - } - - // ignore: deprecated_member_use - final db = FluffyBoxDatabase( - 'fluffybox_${client.clientName.replaceAll(' ', '_').toLowerCase()}', - await _findDatabasePath(client), - key: hiverCipher, - ); - try { - await db.open(); - } catch (_) { - Logs().w('Unable to open FluffyBox. Delete database and storage key...'); - await Store().deleteItem(ClientManager.clientNamespace); - const FlutterSecureStorage().delete(key: _cipherStorageKey); - await db.clear(); - rethrow; - } - Logs().d('FluffyBox is ready'); - return db; - } - - static Future _findDatabasePath(Client client) async { - String path = client.clientName; - if (!kIsWeb) { - Directory directory; - try { - if (Platform.isLinux) { - directory = await getApplicationSupportDirectory(); - } else { - directory = await getApplicationDocumentsDirectory(); - } - } catch (_) { - try { - directory = await getLibraryDirectory(); - } catch (_) { - directory = Directory.current; - } - } - // do not destroy your stable FluffyChat in debug mode - if (kDebugMode) { - directory = Directory(directory.uri.resolve('debug').toFilePath()); - directory.create(recursive: true); - } - path = directory.path; - } - return path; - } - - @override - int get maxFileSize => supportsFileStoring ? 100 * 1024 * 1024 : 0; - @override - bool get supportsFileStoring => !kIsWeb; - - Future _getFileStoreDirectory() async { - try { - try { - return (await getApplicationSupportDirectory()).path; - } catch (_) { - return (await getApplicationDocumentsDirectory()).path; - } - } catch (_) { - return (await getDownloadsDirectory())!.path; - } - } - - @override - Future getFile(Uri mxcUri) async { - if (!supportsFileStoring) return null; - final tempDirectory = await _getFileStoreDirectory(); - final file = - File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); - if (await file.exists() == false) return null; - final bytes = await file.readAsBytes(); - return bytes; - } - - @override - Future storeFile(Uri mxcUri, Uint8List bytes, int time) async { - if (!supportsFileStoring) return null; - final tempDirectory = await _getFileStoreDirectory(); - final file = - File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); - if (await file.exists()) return; - await file.writeAsBytes(bytes); - return; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart b/lib/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart deleted file mode 100644 index 0f77567273..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart +++ /dev/null @@ -1,141 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:flutter/foundation.dart' hide Key; -import 'package:flutter/services.dart'; - -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:hive/hive.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; - -class FlutterHiveCollectionsDatabase extends HiveCollectionsDatabase { - FlutterHiveCollectionsDatabase( - String name, - String path, { - HiveCipher? key, - }) : super( - name, - path, - key: key, - ); - - static const String _cipherStorageKey = 'database_encryption_key'; - - static Future databaseBuilder( - Client client) async { - Logs().d('Open Hive...'); - HiveAesCipher? hiverCipher; - try { - // Workaround for secure storage is calling Platform.operatingSystem on web - if (kIsWeb) throw MissingPluginException(); - - const secureStorage = FlutterSecureStorage(); - final containsEncryptionKey = - await secureStorage.containsKey(key: _cipherStorageKey); - if (!containsEncryptionKey) { - // do not try to create a buggy secure storage for new Linux users - if (Platform.isLinux) throw MissingPluginException(); - final key = Hive.generateSecureKey(); - await secureStorage.write( - key: _cipherStorageKey, - value: base64UrlEncode(key), - ); - } - - // workaround for if we just wrote to the key and it still doesn't exist - final rawEncryptionKey = await secureStorage.read(key: _cipherStorageKey); - if (rawEncryptionKey == null) throw MissingPluginException(); - - hiverCipher = HiveAesCipher(base64Url.decode(rawEncryptionKey)); - } on MissingPluginException catch (_) { - Logs().i('Hive encryption is not supported on this platform'); - } catch (_) { - const FlutterSecureStorage().delete(key: _cipherStorageKey); - rethrow; - } - - final db = FlutterHiveCollectionsDatabase( - 'hive_collections_${client.clientName.replaceAll(' ', '_').toLowerCase()}', - await _findDatabasePath(client), - key: hiverCipher, - ); - try { - await db.open(); - } catch (_) { - Logs().w('Unable to open Hive. Delete database and storage key...'); - const FlutterSecureStorage().delete(key: _cipherStorageKey); - await db.clear(); - rethrow; - } - Logs().d('Hive is ready'); - return db; - } - - static Future _findDatabasePath(Client client) async { - String path = client.clientName; - if (!kIsWeb) { - Directory directory; - try { - if (Platform.isLinux) { - directory = await getApplicationSupportDirectory(); - } else { - directory = await getApplicationDocumentsDirectory(); - } - } catch (_) { - try { - directory = await getLibraryDirectory(); - } catch (_) { - directory = Directory.current; - } - } - // do not destroy your stable FluffyChat in debug mode - if (kDebugMode) { - directory = Directory(directory.uri.resolve('debug').toFilePath()); - directory.create(recursive: true); - } - path = directory.path; - } - return path; - } - - @override - int get maxFileSize => supportsFileStoring ? 100 * 1024 * 1024 : 0; - @override - bool get supportsFileStoring => !kIsWeb; - - Future _getFileStoreDirectory() async { - try { - try { - return (await getApplicationSupportDirectory()).path; - } catch (_) { - return (await getApplicationDocumentsDirectory()).path; - } - } catch (_) { - return (await getDownloadsDirectory())!.path; - } - } - - @override - Future getFile(Uri mxcUri) async { - if (!supportsFileStoring) return null; - final tempDirectory = await _getFileStoreDirectory(); - final file = - File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); - if (await file.exists() == false) return null; - final bytes = await file.readAsBytes(); - return bytes; - } - - @override - Future storeFile(Uri mxcUri, Uint8List bytes, int time) async { - if (!supportsFileStoring) return null; - final tempDirectory = await _getFileStoreDirectory(); - final file = - File('$tempDirectory/${Uri.encodeComponent(mxcUri.toString())}'); - if (await file.exists()) return; - await file.writeAsBytes(bytes); - return; - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart b/lib/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart deleted file mode 100644 index 6c2e4d1205..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/ios_badge_client_extension.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter_app_badger/flutter_app_badger.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; - -extension IosBadgeClientExtension on Client { - void updateIosBadge() { - if (PlatformInfos.isIOS) { - // Workaround for iOS not clearing notifications with fcm_shared_isolate - if (!rooms.any((r) => - r.membership == Membership.invite || (r.notificationCount > 0))) { - // ignore: unawaited_futures - FlutterLocalNotificationsPlugin().cancelAll(); - FlutterAppBadger.removeBadge(); - } - } - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart deleted file mode 100644 index 17ebd33910..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/matrix_file_extension.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/material.dart'; - -import 'package:file_picker_cross/file_picker_cross.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:share_plus/share_plus.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; - -extension MatrixFileExtension on MatrixFile { - void save(BuildContext context) async { - if (PlatformInfos.isIOS) { - return share(context); - } - final fileName = name.split('/').last; - - final file = FilePickerCross(bytes); - await file.exportToStorage(fileName: fileName, share: false); - } - - void share(BuildContext context) async { - final fileName = name.split('/').last; - final tmpDirectory = await getTemporaryDirectory(); - final path = '${tmpDirectory.path}$fileName'; - await File(path).writeAsBytes(bytes); - final box = context.findRenderObject() as RenderBox; - await Share.shareFiles( - [path], - sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size, - ); - return; - } - - MatrixFile get detectFileType { - if (msgType == MessageTypes.Image) { - return MatrixImageFile(bytes: bytes, name: name); - } - if (msgType == MessageTypes.Video) { - return MatrixVideoFile(bytes: bytes, name: name); - } - if (msgType == MessageTypes.Audio) { - return MatrixAudioFile(bytes: bytes, name: name); - } - return this; - } - - String get sizeString { - var size = this.size.toDouble(); - if (size < 1000000) { - size = size / 1000; - size = (size * 10).round() / 10; - return '${size.toString()} KB'; - } else if (size < 1000000000) { - size = size / 1000000; - size = (size * 10).round() / 10; - return '${size.toString()} MB'; - } else { - size = size / 1000000000; - size = (size * 10).round() / 10; - return '${size.toString()} GB'; - } - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/presence_extension.dart b/lib/utils/matrix_sdk_extensions.dart/presence_extension.dart deleted file mode 100644 index bb6e1069ed..0000000000 --- a/lib/utils/matrix_sdk_extensions.dart/presence_extension.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import '../date_time_extension.dart'; - -extension PresenceExtension on CachedPresence { - String getLocalizedLastActiveAgo(BuildContext context) { - final lastActiveTimestamp = this.lastActiveTimestamp; - if (lastActiveTimestamp != null) { - return L10n.of(context)! - .lastActiveAgo(lastActiveTimestamp.localizedTimeShort(context)); - } - return L10n.of(context)!.lastSeenLongTimeAgo; - } - - String getLocalizedStatusMessage(BuildContext context) { - final statusMsg = this.statusMsg; - if (statusMsg != null && statusMsg.isNotEmpty) { - return statusMsg; - } - if (currentlyActive ?? false) { - return L10n.of(context)!.currentlyActive; - } - return getLocalizedLastActiveAgo(context); - } - - Color get color { - switch (presence) { - case PresenceType.online: - return Colors.green; - case PresenceType.offline: - return Colors.grey; - case PresenceType.unavailable: - default: - return Colors.red; - } - } -} diff --git a/lib/utils/matrix_sdk_extensions.dart/device_extension.dart b/lib/utils/matrix_sdk_extensions/device_extension.dart similarity index 70% rename from lib/utils/matrix_sdk_extensions.dart/device_extension.dart rename to lib/utils/matrix_sdk_extensions/device_extension.dart index 55f3ebfc9b..aba6552fe7 100644 --- a/lib/utils/matrix_sdk_extensions.dart/device_extension.dart +++ b/lib/utils/matrix_sdk_extensions/device_extension.dart @@ -1,13 +1,18 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; IconData _getIconFromName(String displayname) { final name = displayname.toLowerCase(); - if ({'android'}.any((s) => name.contains(s))) { + if ({'android'}.any(name.contains)) { return Icons.phone_android_outlined; } - if ({'ios', 'ipad', 'iphone', 'ipod'}.any((s) => name.contains(s))) { + if ({'ios', 'ipad', 'iphone', 'ipod'}.any(name.contains)) { return Icons.phone_iphone_outlined; } if ({ @@ -19,11 +24,10 @@ IconData _getIconFromName(String displayname) { '/_matrix', 'safari', 'opera', - }.any((s) => name.contains(s))) { + }.any(name.contains)) { return Icons.web_outlined; } - if ({'desktop', 'windows', 'macos', 'linux', 'ubuntu'} - .any((s) => name.contains(s))) { + if ({'desktop', 'windows', 'macos', 'linux', 'ubuntu'}.any(name.contains)) { return Icons.desktop_mac_outlined; } return Icons.device_unknown_outlined; diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart new file mode 100644 index 0000000000..e20715a71e --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:async/async.dart' as async; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import 'matrix_file_extension.dart'; + +extension LocalizedBody on Event { + Future> _getFile(BuildContext context) => + showFutureLoadingDialog( + context: context, + futureWithProgress: (onProgress) { + final fileSize = infoMap['size'] is int + ? infoMap['size'] as int + : null; + return downloadAndDecryptAttachment( + onDownloadProgress: fileSize == null + ? null + : (bytes) => onProgress(bytes / fileSize), + ); + }, + ); + + Future saveFile(BuildContext context) async { + final matrixFile = await _getFile(context); + if (!context.mounted) return; + + matrixFile.result?.save(context); + } + + Future shareFile(BuildContext context) async { + final matrixFile = await _getFile(context); + if (!context.mounted) return; + + matrixFile.result?.share(context); + } + + bool get isAttachmentSmallEnough => + infoMap['size'] is int && + (infoMap['size'] as int) < room.client.database.maxFileSize; + + bool get isThumbnailSmallEnough => + thumbnailInfoMap['size'] is int && + (thumbnailInfoMap['size'] as int) < room.client.database.maxFileSize; + + bool get showThumbnail => + [ + MessageTypes.Image, + MessageTypes.Sticker, + MessageTypes.Video, + ].contains(messageType) && + (kIsWeb || + isAttachmentSmallEnough || + isThumbnailSmallEnough || + (content['url'] is String)); + + String? get sizeString => content + .tryGetMap('info') + ?.tryGet('size') + ?.sizeString; +} diff --git a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart new file mode 100644 index 0000000000..337cd2ad30 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:matrix/matrix.dart'; + +extension VisibleInGuiExtension on List { + List filterByVisibleInGui({ + String? exceptionEventId, + String? threadId, + }) => where((event) { + if (threadId != null && + event.relationshipType != RelationshipTypes.reaction) { + if ((event.relationshipType != RelationshipTypes.thread || + event.relationshipEventId != threadId) && + event.eventId != threadId) { + return false; + } + } else if (event.relationshipType == RelationshipTypes.thread) { + return false; + } + return event.isVisibleInGui || event.eventId == exceptionEventId; + }).toList(); +} + +extension IsStateExtension on Event { + bool get isVisibleInGui => + // always filter out edit and reaction relationships + !{ + RelationshipTypes.edit, + RelationshipTypes.reaction, + }.contains(relationshipType) && + // always filter out m.key.* and other known but unimportant events + !isKnownHiddenStates && + // event types to hide: redaction and reaction events + // if a reaction has been redacted we also want it to be hidden in the timeline + !{EventTypes.Reaction, EventTypes.Redaction}.contains(type) && + // if we enabled to hide all redacted events, don't show those + (!AppSettings.hideRedactedEvents.value || !redacted) && + // if we enabled to hide all unknown events, don't show those + (!AppSettings.hideUnknownEvents.value || isEventTypeKnown); + + bool get isState => !{EventTypes.Message, EventTypes.Sticker}.contains(type); + + bool get isCollapsedState => !{ + EventTypes.Message, + EventTypes.Sticker, + EventTypes.RoomCreate, + EventTypes.RoomTombstone, + }.contains(type); + + bool get isKnownHiddenStates => + {PollEventContent.responseType}.contains(type) || + type.startsWith('m.key.verification.'); +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart new file mode 100644 index 0000000000..3e9cbfb4f0 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -0,0 +1,147 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:io'; + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; +import 'package:universal_html/html.dart' as html; + +import 'cipher.dart'; +import 'sqlcipher_stub.dart' + if (dart.library.io) 'package:sqlcipher_flutter_libs/sqlcipher_flutter_libs.dart'; + +Future flutterMatrixSdkDatabaseBuilder(String clientName) async { + MatrixSdkDatabase? database; + try { + database = await _constructDatabase(clientName); + await database.open(); + return database; + } catch (e, s) { + Logs().wtf('Unable to construct database!', e, s); + + try { + // Send error notification: + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + ClientManager.sendInitNotification(l10n.initAppError, e.toString()); + } catch (e, s) { + Logs().e('Unable to send error notification', e, s); + } + + // Try to delete database so that it can created again on next init: + database?.delete().catchError( + (e, s) => Logs().wtf( + 'Unable to delete database, after failed construction', + e, + s, + ), + ); + + // Delete database file: + if (!kIsWeb) { + final dbFile = File(await _getDatabasePath(clientName)); + if (await dbFile.exists()) await dbFile.delete(); + } + + rethrow; + } +} + +Future _constructDatabase(String clientName) async { + if (kIsWeb) { + html.window.navigator.storage?.persist(); + return await MatrixSdkDatabase.init(clientName); + } + + final cipher = await getDatabaseCipher(); + + Directory? fileStorageLocation; + try { + final temporaryDirectory = await getTemporaryDirectory(); + fileStorageLocation = await Directory( + join(temporaryDirectory.path, 'fluffychat_download_cache'), + ).create(recursive: true); + } on MissingPlatformDirectoryException catch (_) { + Logs().w( + 'No temporary directory for file cache available on this platform.', + ); + } + + final path = await _getDatabasePath(clientName); + + // fix dlopen for old Android + await applyWorkaroundToOpenSqlCipherOnOldAndroidVersions(); + // import the SQLite / SQLCipher shared objects / dynamic libraries + final factory = createDatabaseFactoryFfi( + ffiInit: SQfLiteEncryptionHelper.ffiInit, + ); + + // required for [getDatabasesPath] + databaseFactory = factory; + + // migrate from potential previous SQLite database path to current one + await _migrateLegacyLocation(path, clientName); + + // in case we got a cipher, we use the encryption helper + // to manage SQLite encryption + final helper = cipher == null + ? null + : SQfLiteEncryptionHelper(factory: factory, path: path, cipher: cipher); + + // check whether the DB is already encrypted and otherwise do so + await helper?.ensureDatabaseFileEncrypted(); + + final database = await factory.openDatabase( + path, + options: OpenDatabaseOptions( + version: 1, + // most important : apply encryption when opening the DB + onConfigure: helper?.applyPragmaKey, + ), + ); + + return await MatrixSdkDatabase.init( + clientName, + database: database, + maxFileSize: 1000 * 1000 * 10, + fileStorageLocation: fileStorageLocation?.uri, + deleteFilesAfterDuration: const Duration(days: 30), + ); +} + +Future _getDatabasePath(String clientName) async { + final databaseDirectory = PlatformInfos.isIOS || PlatformInfos.isMacOS + ? await getLibraryDirectory() + : await getApplicationSupportDirectory(); + + return join(databaseDirectory.path, '$clientName.sqlite'); +} + +Future _migrateLegacyLocation( + String sqlFilePath, + String clientName, +) async { + final oldPath = PlatformInfos.isDesktop + ? (await getApplicationSupportDirectory()).path + : await getDatabasesPath(); + + final oldFilePath = join(oldPath, clientName); + if (oldFilePath == sqlFilePath) return; + + final maybeOldFile = File(oldFilePath); + if (await maybeOldFile.exists()) { + Logs().i( + 'Migrate legacy location for database from "$oldFilePath" to "$sqlFilePath"', + ); + await maybeOldFile.copy(sqlFilePath); + await maybeOldFile.delete(); + } +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart new file mode 100644 index 0000000000..ea47230ac0 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; +import 'dart:math'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; + +const _passwordStorageKey = 'database_password'; + +Future getDatabaseCipher() async { + String? password; + + try { + const secureStorage = FlutterSecureStorage(); + final containsEncryptionKey = + await secureStorage.read(key: _passwordStorageKey) != null; + if (!containsEncryptionKey) { + final rng = Random.secure(); + final list = Uint8List(32); + list.setAll(0, Iterable.generate(list.length, (i) => rng.nextInt(256))); + final newPassword = base64UrlEncode(list); + await secureStorage.write(key: _passwordStorageKey, value: newPassword); + } + // workaround for if we just wrote to the key and it still doesn't exist + password = await secureStorage.read(key: _passwordStorageKey); + if (password == null) throw MissingPluginException(); + } on MissingPluginException catch (e) { + const FlutterSecureStorage() + .delete(key: _passwordStorageKey) + .catchError((_) {}); + Logs().w('Database encryption is not supported on this platform', e); + _sendNoEncryptionWarning(e); + } catch (e, s) { + const FlutterSecureStorage() + .delete(key: _passwordStorageKey) + .catchError((_) {}); + Logs().w('Unable to init database encryption', e, s); + _sendNoEncryptionWarning(e); + } + + return password; +} + +Future _sendNoEncryptionWarning(Object exception) async { + final isStored = AppSettings.noEncryptionWarningShown.value; + + if (isStored == true) return; + + final l10n = await lookupL10n(PlatformDispatcher.instance.locale); + ClientManager.sendInitNotification( + l10n.noDatabaseEncryption, + exception.toString(), + ); + + await AppSettings.noEncryptionWarningShown.setItem(true); +} diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart new file mode 100644 index 0000000000..af4040afe6 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart @@ -0,0 +1,7 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +Future applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() => + Future.value(); diff --git a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart new file mode 100644 index 0000000000..009b5f7bd7 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:file_picker/file_picker.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/size_string.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:open_file/open_file.dart'; +import 'package:share_plus/share_plus.dart'; + +extension MatrixFileExtension on MatrixFile { + Future save(BuildContext context) async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + final l10n = L10n.of(context); + final downloadPath = await FilePicker.saveFile( + dialogTitle: l10n.saveFile, + fileName: name, + type: filePickerFileType, + bytes: bytes, + ); + if (downloadPath == null) return; + + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text(l10n.fileHasBeenSavedAt(downloadPath)), + action: SnackBarAction( + label: l10n.open, + onPressed: () => OpenFile.open(downloadPath), + ), + ), + ); + } + + FileType get filePickerFileType { + if (this is MatrixImageFile) return FileType.image; + if (this is MatrixAudioFile) return FileType.audio; + if (this is MatrixVideoFile) return FileType.video; + return FileType.any; + } + + Future share(BuildContext context) async { + // Workaround for iPad from + // https://github.com/fluttercommunity/plus_plugins/tree/main/packages/share_plus/share_plus#ipad + final box = context.findRenderObject() as RenderBox?; + + await SharePlus.instance.share( + ShareParams( + files: [XFile.fromData(bytes, name: name, mimeType: mimeType)], + sharePositionOrigin: box == null + ? null + : box.localToGlobal(Offset.zero) & box.size, + ), + ); + return; + } + + MatrixFile get detectFileType { + if (msgType == MessageTypes.Image) { + return MatrixImageFile(bytes: bytes, name: name); + } + if (msgType == MessageTypes.Video) { + return MatrixVideoFile(bytes: bytes, name: name); + } + if (msgType == MessageTypes.Audio) { + return MatrixAudioFile(bytes: bytes, name: name); + } + return this; + } + + String get sizeString => size.sizeString; +} diff --git a/lib/utils/matrix_sdk_extensions.dart/matrix_locals.dart b/lib/utils/matrix_sdk_extensions/matrix_locals.dart similarity index 72% rename from lib/utils/matrix_sdk_extensions.dart/matrix_locals.dart rename to lib/utils/matrix_sdk_extensions/matrix_locals.dart index f54bd68d47..daffb557c9 100644 --- a/lib/utils/matrix_sdk_extensions.dart/matrix_locals.dart +++ b/lib/utils/matrix_sdk_extensions/matrix_locals.dart @@ -1,4 +1,9 @@ -import 'package:flutter_gen/gen_l10n/l10n.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; import 'package:matrix/matrix.dart'; /// This is a temporary helper class until there is a proper solution to this with the new system @@ -36,13 +41,13 @@ class MatrixLocals extends MatrixLocalizations { } @override - String changedTheChatDescriptionTo(String senderName, String content) { - return l10n.changedTheChatDescriptionTo(senderName, content); + String changedTheChatDescriptionTo(String senderName, _) { + return l10n.changedTheChatDescription(senderName); } @override - String changedTheChatNameTo(String senderName, String content) { - return l10n.changedTheChatNameTo(senderName, content); + String changedTheChatNameTo(String senderName, _) { + return l10n.changedTheChatName(senderName); } @override @@ -62,7 +67,9 @@ class MatrixLocals extends MatrixLocalizations { @override String changedTheGuestAccessRulesTo( - String senderName, String localizedString) { + String senderName, + String localizedString, + ) { return l10n.changedTheGuestAccessRulesTo(senderName, localizedString); } @@ -73,7 +80,9 @@ class MatrixLocals extends MatrixLocalizations { @override String changedTheHistoryVisibilityTo( - String senderName, String localizedString) { + String senderName, + String localizedString, + ) { return l10n.changedTheHistoryVisibilityTo(senderName, localizedString); } @@ -172,14 +181,18 @@ class MatrixLocals extends MatrixLocalizations { } @override - String get needPantalaimonWarning => l10n.needPantalaimonWarning; + String get needPantalaimonWarning => l10n.oopsSomethingWentWrong; @override - String get noPermission => l10n.noPermission; + String get noPermission => l10n.noKeyForThisMessage; @override - String redactedAnEvent(String senderName) { - return l10n.redactedAnEvent(senderName); + String redactedAnEvent(Event redactedEvent) { + return l10n.redactedAnEvent( + redactedEvent.redactedBecause?.senderFromMemoryOrFallback + .calcDisplayname() ?? + l10n.user, + ); } @override @@ -188,8 +201,10 @@ class MatrixLocals extends MatrixLocalizations { } @override - String removedBy(String calcDisplayname) { - return l10n.removedBy(calcDisplayname); + String removedBy(Event redactedEvent) { + return l10n.redactedBy( + redactedEvent.senderFromMemoryOrFallback.calcDisplayname(), + ); } @override @@ -245,7 +260,7 @@ class MatrixLocals extends MatrixLocalizations { @override String unknownEvent(String typeKey) { - return l10n.unknownEvent(typeKey); + return l10n.userSentUnknownEvent('User', typeKey); } @override @@ -300,4 +315,64 @@ class MatrixLocals extends MatrixLocalizations { @override String youUnbannedUser(String targetName) => l10n.youUnbannedUser(targetName); + + @override + String wasDirectChatDisplayName(String oldDisplayName) => + l10n.wasDirectChatDisplayName(oldDisplayName); + + @override + String get unknownUser => l10n.user; + + @override + String hasKnocked(String targetName) => l10n.hasKnocked(targetName); + + @override + String acceptedKeyVerification(String senderName) => + l10n.acceptedKeyVerification(senderName); + + @override + String canceledKeyVerification(String senderName) => + l10n.canceledKeyVerification(senderName); + + @override + String completedKeyVerification(String senderName) => + l10n.completedKeyVerification(senderName); + + @override + String isReadyForKeyVerification(String senderName) => + l10n.isReadyForKeyVerification(senderName); + + @override + String requestedKeyVerification(String senderName) => + l10n.requestedKeyVerification(senderName); + + @override + String startedKeyVerification(String senderName) => + l10n.startedKeyVerification(senderName); + + @override + String invitedBy(String senderName) => senderName; + + @override + String get cancelledSend => l10n.sendCanceled; + + @override + String voiceMessage( + String senderName, + Duration? duration, + ) => l10n.sentVoiceMessage( + senderName, + duration == null + ? '' + : '${duration.inMinutes.toString().padLeft(2, '0')}:${(duration.inSeconds % 60).toString().padLeft(2, '0')}', + ); + + @override + String get refreshingLastEvent => l10n.loadingPleaseWait; + + @override + String startedAPoll(String senderName) => '$senderName started a poll'; + + @override + String get pollHasBeenEnded => l10n.pollHasBeenEnded; } diff --git a/lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart b/lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart new file mode 100644 index 0000000000..fd941f6e36 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:matrix/matrix.dart'; + +extension OidcSessionJsonExtension on OidcLoginSession { + static const String storeKey = 'oidc_session'; + static const String homeserverStoreKey = 'oidc_stored_homeserver'; + Map toJson() => { + 'oidc_client_data': oidcClientData.toJson(), + 'authentication_uri': authenticationUri.toString(), + 'redirect_uri': redirectUri.toString(), + 'code_verifier': codeVerifier, + 'state': state, + }; + + static OidcLoginSession fromJson(Map json) => + OidcLoginSession( + oidcClientData: OidcClientData.fromJson( + json['oidc_client_data'] as Map, + ), + authenticationUri: Uri.parse(json['authentication_uri'] as String), + redirectUri: Uri.parse(json['redirect_uri'] as String), + codeVerifier: json['code_verifier'] as String, + state: json['state'] as String, + ); +} diff --git a/lib/utils/matrix_sdk_extensions/on_soft_logout.dart b/lib/utils/matrix_sdk_extensions/on_soft_logout.dart new file mode 100644 index 0000000000..d21dc9a1f8 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/on_soft_logout.dart @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:io'; + +import 'package:fluffychat/utils/error_reporter.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:matrix/matrix.dart'; + +// Workaround until https://github.com/famedly/matrix-dart-sdk/pull/2360 +Future onSoftLogout(Client client) async { + try { + await client.refreshAccessToken(); + } on MatrixException catch (_) { + rethrow; + } on IOException catch (_) { + rethrow; + } catch (e, s) { + final context = + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext; + if (context != null && context.mounted) { + ErrorReporter( + context, + 'Error on refresh access token!', + ).onErrorCallback(e, s); + } + rethrow; + } +} diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart new file mode 100644 index 0000000000..f056efc83d --- /dev/null +++ b/lib/utils/notification_background_handler.dart @@ -0,0 +1,210 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:collection/collection.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/push_helper.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import '../config/app_config.dart'; +import '../config/setting_keys.dart'; + +bool _vodInitialized = false; + +extension NotificationResponseJson on NotificationResponse { + String toJsonString() => jsonEncode({ + 'type': notificationResponseType.name, + 'id': id, + 'actionId': actionId, + 'input': input, + 'payload': payload, + 'data': data, + }); + + static NotificationResponse fromJsonString(String jsonString) { + final json = jsonDecode(jsonString) as Map; + return NotificationResponse( + notificationResponseType: NotificationResponseType.values.singleWhere( + (t) => t.name == json['type'], + ), + id: json['id'] as int?, + actionId: json['actionId'] as String?, + input: json['input'] as String?, + payload: json['payload'] as String?, + data: json['data'] as Map, + ); + } +} + +Future waitForPushIsolateDone() async { + if (IsolateNameServer.lookupPortByName(AppConfig.pushIsolatePortName) != + null) { + Logs().i('Wait for Push Isolate to be done...'); + await Future.delayed(const Duration(milliseconds: 300)); + } +} + +@pragma('vm:entry-point') +Future notificationTapBackground( + NotificationResponse notificationResponse, +) async { + final sendPort = IsolateNameServer.lookupPortByName( + AppConfig.mainIsolatePortName, + ); + if (sendPort != null) { + sendPort.send(notificationResponse.toJsonString()); + Logs().i('Notification tap sent to main isolate!'); + return; + } + Logs().i( + 'Main isolate no up - Create temporary client for notification tap intend!', + ); + + final pushIsolateReceivePort = ReceivePort(); + IsolateNameServer.registerPortWithName( + pushIsolateReceivePort.sendPort, + AppConfig.pushIsolatePortName, + ); + + if (!_vodInitialized) { + await vod.init(); + _vodInitialized = true; + } + final store = await AppSettings.init(); + + final payload = FluffyChatPushPayload.fromString( + notificationResponse.payload ?? '', + ); + final clientName = payload.clientName; + final client = clientName == null + ? (await ClientManager.getClients(store: store, initialize: false)).first + : (await ClientManager.createClient(clientName, store)); + await client.abortSync(); + await client.init( + waitForFirstSync: false, + waitUntilLoadCompletedLoaded: false, + ); + + if (!client.isLogged()) { + throw Exception('Notification tab in background but not logged in!'); + } + try { + await notificationTap(notificationResponse, clients: [client]); + } finally { + await client.dispose(closeDatabase: false); + pushIsolateReceivePort.sendPort.send('DONE'); + IsolateNameServer.removePortNameMapping(AppConfig.pushIsolatePortName); + } + return; +} + +Future notificationTap( + NotificationResponse notificationResponse, { + GoRouter? router, + required List clients, + L10n? l10n, +}) async { + Logs().d( + 'Notification action handler started', + notificationResponse.notificationResponseType.name, + ); + final payload = FluffyChatPushPayload.fromString( + notificationResponse.payload ?? '', + ); + final client = + clients.firstWhereOrNull( + (client) => client.clientName == payload.clientName, + ) ?? + clients.first; + + updateSummaryNotification( + flutterLocalNotificationsPlugin: FlutterLocalNotificationsPlugin(), + clientName: client.clientName, + l10n: await lookupL10n(PlatformDispatcher.instance.locale), + ); + + switch (notificationResponse.notificationResponseType) { + case NotificationResponseType.selectedNotification: + final roomId = payload.roomId; + if (roomId == null) return; + + if (router == null) { + Logs().v('Ignore select notification action in background mode'); + return; + } + Logs().v('Open room from notification tap', roomId); + await client.roomsLoading; + await client.accountDataLoading; + if (client.getRoomById(roomId) == null) { + await client + .waitForRoomInSync(roomId) + .timeout(const Duration(seconds: 30)); + } + router.go( + client.getRoomById(roomId)?.membership == Membership.invite + ? '/rooms?client=${client.clientName}' + : '/rooms/$roomId?client=${client.clientName}', + ); + case NotificationResponseType.selectedNotificationAction: + final actionType = FluffyChatNotificationActions.values.singleWhereOrNull( + (action) => action.name == notificationResponse.actionId, + ); + if (actionType == null) { + throw Exception('Selected notification with action but no action ID'); + } + final roomId = payload.roomId; + if (roomId == null) { + throw Exception('Selected notification with action but no payload'); + } + await client.roomsLoading; + await client.accountDataLoading; + await client.userDeviceKeysLoading; + final room = client.getRoomById(roomId); + if (room == null) { + throw Exception( + 'Selected notification with action but unknown room $roomId', + ); + } + switch (actionType) { + case FluffyChatNotificationActions.markAsRead: + await room.setReadMarker( + payload.eventId ?? room.lastEvent!.eventId, + mRead: payload.eventId ?? room.lastEvent!.eventId, + public: AppSettings.sendPublicReadReceipts.value, + ); + case FluffyChatNotificationActions.reply: + final input = notificationResponse.input; + if (input == null || input.isEmpty) { + throw Exception( + 'Selected notification with reply action but without input', + ); + } + + await room.sendTextEvent( + input, + parseCommands: false, + displayPendingEvent: false, + ); + case FluffyChatNotificationActions.mute: + await room.setPushRuleState(PushRuleState.mentionsOnly); + case FluffyChatNotificationActions.open: + router?.go( + client.getRoomById(roomId)?.membership == Membership.invite + ? '/rooms?client=${client.clientName}' + : '/rooms/$roomId?client=${client.clientName}', + ); + } + } +} + +enum FluffyChatNotificationActions { markAsRead, reply, mute, open } diff --git a/lib/utils/other_party_can_receive.dart b/lib/utils/other_party_can_receive.dart new file mode 100644 index 0000000000..2efc33fbf0 --- /dev/null +++ b/lib/utils/other_party_can_receive.dart @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:matrix/matrix.dart'; + +extension OtherPartyCanReceiveExtension on Room { + bool get otherPartyCanReceiveMessages { + if (!encrypted) return true; + final users = getParticipants() + .map((u) => u.id) + .where((userId) => userId != client.userID) + .toSet(); + if (users.isEmpty) return true; + + for (final userId in users) { + if (client.userDeviceKeys[userId]?.deviceKeys.values.isNotEmpty == true) { + return true; + } + } + return false; + } +} + +class OtherPartyCanNotReceiveMessages implements Exception {} diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index a80714308f..f331edc163 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -1,14 +1,18 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:io'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/widgets/sentry_switch_list_tile.dart'; import '../config/app_config.dart'; abstract class PlatformInfos { @@ -30,10 +34,19 @@ abstract class PlatformInfos { static bool get usesTouchscreen => !isMobile; + static bool get supportsVideoPlayer => + !PlatformInfos.isWindows && !PlatformInfos.isLinux; + + static bool get supportsCustomImageResizer => + PlatformInfos.isWeb || PlatformInfos.isMobile; + + /// Web could also record in theory but currently creates broken opus static bool get platformCanRecord => (isMobile || isMacOS); - static String get clientName => - '${AppConfig.applicationName} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; + static bool get supportsAppLock => (isMobile || isMacOS); + + static String get appDisplayName => + '${AppSettings.applicationName.value} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; static Future getVersion() async { var version = kIsWeb ? 'Web' : 'Unknown'; @@ -43,29 +56,53 @@ abstract class PlatformInfos { return version; } - static void showDialog(BuildContext context) async { + static Future showDialog(BuildContext context) async { + final l10n = L10n.of(context); final version = await PlatformInfos.getVersion(); + if (!context.mounted) return; showAboutDialog( context: context, - useRootNavigator: false, children: [ - Text('Version: $version'), - OutlinedButton( - onPressed: () => launch(AppConfig.sourceCodeUrl), - child: Text(L10n.of(context)!.sourceCode), + Text(l10n.versionWithNumber(version)), + TextButton.icon( + onPressed: () => launchUrlString(AppConfig.sourceCodeUrl), + icon: const Icon(Icons.source_outlined), + label: Text(l10n.sourceCode), ), - OutlinedButton( - onPressed: () => launch(AppConfig.emojiFontUrl), - child: const Text(AppConfig.emojiFontName), + Builder( + builder: (innerContext) { + return TextButton.icon( + onPressed: () { + context.go('/logs'); + Navigator.of(innerContext).pop(); + }, + icon: const Icon(Icons.list_outlined), + label: Text(l10n.logs), + ); + }, ), - OutlinedButton( - onPressed: () => VRouter.of(context).to('logs'), - child: const Text('Logs'), + Builder( + builder: (innerContext) { + return TextButton.icon( + onPressed: () { + context.go('/configs'); + Navigator.of(innerContext).pop(); + }, + icon: const Icon(Icons.settings_applications_outlined), + label: Text(l10n.advancedConfigs), + ); + }, ), - SentrySwitchListTile.adaptive(label: L10n.of(context)!.sendBugReports), ], - applicationIcon: Image.asset('assets/logo.png', width: 64, height: 64), - applicationName: AppConfig.applicationName, + applicationIcon: ClipRRect( + borderRadius: BorderRadius.circular(64), + child: Image.asset( + './assets/logo/mini/logo_mini.png', + width: 64, + height: 64, + ), + ), + applicationName: AppSettings.applicationName.value, ); } } diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index f21544fee8..e90e649619 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -1,150 +1,483 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'dart:ui'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_new_badger/flutter_new_badger.dart'; +import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; +const notificationAvatarDimension = 128; +final Map lastReceivedPushNotification = {}; Future pushHelper( PushNotification notification, { - Client? client, + List? clients, + L10n? l10n, + String? activeRoomId, + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, + bool useNotificationActions = true, +}) async { + try { + await _tryPushHelper( + notification, + clients: clients, + l10n: l10n, + activeRoomId: activeRoomId, + flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, + useNotificationActions: useNotificationActions, + ); + } catch (e, s) { + l10n ??= await lookupL10n(PlatformDispatcher.instance.locale); + await flutterLocalNotificationsPlugin.show( + id: notification.hashCode, + title: l10n.newMessageInFluffyChat, + body: l10n.openAppToReadMessages, + notificationDetails: NotificationDetails( + iOS: const DarwinNotificationDetails(), + android: AndroidNotificationDetails( + AppConfig.pushNotificationsChannelId, + l10n.incomingMessages, + number: notification.counts?.unread, + ticker: l10n.unreadChatsInApp( + AppSettings.applicationName.value, + (notification.counts?.unread ?? 0).toString(), + ), + importance: Importance.high, + priority: Priority.max, + shortcutId: notification.roomId, + ), + ), + ); + + if (e is! TimeoutException && e is! IOException) { + Logs().e('Push Helper has crashed! Writing into temporary file...', e, s); + final store = await SharedPreferences.getInstance(); + await store.setStringList(AppConfig.pushHelperCrashReportKey, [ + e.toString(), + s.toString(), + ]); + } + rethrow; + } +} + +Future _tryPushHelper( + PushNotification notification, { + List? clients, L10n? l10n, String? activeRoomId, - Future Function(String?)? onSelectNotification, + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, + bool useNotificationActions = true, }) async { - final isBackgroundMessage = client == null; + final isBackgroundMessage = clients == null; Logs().v( 'Push helper has been started (background=$isBackgroundMessage).', notification.toJson(), ); - if (!isBackgroundMessage && + if (notification.roomId != null && activeRoomId == notification.roomId && - activeRoomId != null && - client?.syncPresence == null) { + WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { Logs().v('Room is in foreground. Stop push helper here.'); return; } - // Initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project - final _flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); - await _flutterLocalNotificationsPlugin.initialize( - const InitializationSettings( - android: AndroidInitializationSettings('notifications_icon'), - iOS: IOSInitializationSettings(), - ), - onSelectNotification: onSelectNotification, + final clientName = notification.devices?.firstOrNull?.data?.tryGet( + 'client_name', ); + final store = await AppSettings.init(); + + final client = clientName == null + ? (clients?.first ?? + (await ClientManager.getClients( + initialize: false, + store: store, + )).first) + : (clients?.firstWhereOrNull( + (client) => client.clientName == clientName, + ) ?? + await ClientManager.createClient(clientName, store)); + + lastReceivedPushNotification[client.clientName] = DateTime.now(); - client ??= (await ClientManager.getClients(initialize: false)).first; final event = await client.getEventByPushNotification( notification, - storeInDatabase: isBackgroundMessage, + storeInDatabase: false, ); + final awaitingOneShotSync = client.oneShotSync(); + l10n ??= await L10n.delegate.load(PlatformDispatcher.instance.locale); + + updateAppBadge(notification.counts?.unread ?? 0); + if (event == null) { Logs().v('Notification is a clearing indicator.'); - await _flutterLocalNotificationsPlugin.cancelAll(); - final store = await SharedPreferences.getInstance(); - await store.setString(SettingKeys.notificationCurrentIds, json.encode({})); + if (clients?.length == 1 && (notification.counts?.unread == 0)) { + await flutterLocalNotificationsPlugin.cancelAll(); + } else { + // Make sure client is fully loaded and synced before dismiss notifications: + await client.roomsLoading; + await awaitingOneShotSync; + final activeNotifications = await flutterLocalNotificationsPlugin + .getActiveNotifications(); + activeNotifications.removeWhere( + (notification) => notification.groupKey != client.clientName, + ); + var needsUpdateForSummaryNotification = false; + for (final activeNotification in activeNotifications) { + final room = client.rooms.singleWhereOrNull( + (room) => + '${client.clientName}_${room.id}'.hashCode == + activeNotification.id, + ); + if (room != null && !room.isUnreadOrInvited) { + flutterLocalNotificationsPlugin.cancel(id: activeNotification.id!); + if (PlatformInfos.isAndroid) needsUpdateForSummaryNotification = true; + } + } + if (needsUpdateForSummaryNotification) { + await updateSummaryNotification( + clientName: client.clientName, + l10n: l10n, + flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, + ); + } + } + return; + } + Logs().v('Push helper got notification event of type ${event.type}.'); + + if (!client.pushruleEvaluator.match(event).notify) { + Logs().i('Push helper: filtered by client-side push rules.'); + return; + } + + if (event.type.startsWith('m.call')) { + // make sure bg sync is on (needed to update hold, unhold events) + // prevent over write from app life cycle change + client.backgroundSync = true; + } + + if (event.type == EventTypes.CallHangup) { + client.backgroundSync = false; + } + + if (event.type.startsWith('m.call') && event.type != EventTypes.CallInvite) { + Logs().v('Push message is a m.call but not invite. Do not display.'); + return; + } + + if ((event.type.startsWith('m.call') && + event.type != EventTypes.CallInvite) || + event.type == 'org.matrix.call.sdp_stream_metadata_changed') { + Logs().v('Push message was for a call, but not call invite.'); return; } - Logs().v('Push helper got notification event.'); - l10n ??= await L10n.delegate.load(window.locale); final matrixLocals = MatrixLocals(l10n); // Calculate the body - final body = await event.calcLocalizedBody( - matrixLocals, - plaintextBody: true, - withSenderNamePrefix: !event.room.isDirectChat, - hideReply: true, - hideEdit: true, - removeMarkdown: true, - ); + final body = event.type == EventTypes.Encrypted + ? l10n.newMessageInFluffyChat + : await event.calcLocalizedBody( + matrixLocals, + plaintextBody: true, + withSenderNamePrefix: false, + hideReply: true, + hideEdit: true, + removeMarkdown: true, + ); // The person object for the android message style notification - final avatar = event.room.avatar - ?.getThumbnail( - client, - width: 126, - height: 126, - ) - .toString(); - final avatarFile = - avatar == null ? null : await DefaultCacheManager().getSingleFile(avatar); + final avatar = event.room.avatar; + final senderAvatar = event.room.isDirectChat + ? avatar + : event.senderFromMemoryOrFallback.avatarUrl; + final ownUser = event.room.unsafeGetUserFromMemoryOrFallback(client.userID!); + + final userAvatarFile = await client.tryDownloadNotificationAvatar( + ownUser.avatarUrl, + ); + final roomAvatarFile = await client.tryDownloadNotificationAvatar(avatar); + final senderAvatarFile = await client.tryDownloadNotificationAvatar( + senderAvatar, + ); + + final id = '${client.clientName}_${notification.roomId}'.hashCode; + + final senderName = event.senderFromMemoryOrFallback.calcDisplayname(); // Show notification + + final newMessage = Message( + body, + event.originServerTs, + Person( + bot: event.messageType == MessageTypes.Notice, + key: event.senderId, + name: senderName, + icon: senderAvatarFile == null + ? null + : ByteArrayAndroidIcon(senderAvatarFile), + ), + ); + + final messagingStyleInformation = PlatformInfos.isAndroid + ? await AndroidFlutterLocalNotificationsPlugin() + .getActiveNotificationMessagingStyle(id: id) + : null; + messagingStyleInformation?.messages?.add(newMessage); + + final roomName = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); + + final notificationGroupId = event.room.isDirectChat + ? 'directChats' + : 'groupChats'; + final groupName = event.room.isDirectChat ? l10n.directChats : l10n.groups; + + final messageRooms = AndroidNotificationChannelGroup( + notificationGroupId, + groupName, + ); + final roomsChannel = AndroidNotificationChannel( + event.room.id, + roomName, + groupId: notificationGroupId, + ); + + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin + >() + ?.createNotificationChannelGroup(messageRooms); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin + >() + ?.createNotificationChannel(roomsChannel); + final androidPlatformChannelSpecifics = AndroidNotificationDetails( AppConfig.pushNotificationsChannelId, - AppConfig.pushNotificationsChannelName, - channelDescription: AppConfig.pushNotificationsChannelDescription, - styleInformation: MessagingStyleInformation( - Person(name: event.room.client.userID), - conversationTitle: event.room.displayname, - groupConversation: !event.room.isDirectChat, - messages: [ - Message( - body, - event.originServerTs, + l10n.incomingMessages, + number: notification.counts?.unread, + category: AndroidNotificationCategory.message, + shortcutId: event.room.id, + styleInformation: + messagingStyleInformation ?? + MessagingStyleInformation( Person( - name: event.room.displayname, - icon: avatarFile == null + name: ownUser.calcDisplayname(), + icon: userAvatarFile == null ? null - : BitmapFilePathAndroidIcon(avatarFile.path), + : ByteArrayAndroidIcon(userAvatarFile), + key: event.room.client.userID, ), - ) - ], + conversationTitle: event.room.isDirectChat ? null : roomName, + groupConversation: !event.room.isDirectChat, + messages: [newMessage], + ), + ticker: event.calcLocalizedBodyFallback( + matrixLocals, + plaintextBody: true, + withSenderNamePrefix: !event.room.isDirectChat, + hideReply: true, + hideEdit: true, + removeMarkdown: true, ), - ticker: l10n.unreadChats(notification.counts?.unread ?? 1), - importance: Importance.max, - priority: Priority.high, - groupKey: event.room.id, + importance: Importance.high, + priority: Priority.max, + groupKey: client.clientName, + actions: event.type == EventTypes.RoomMember || !useNotificationActions + ? null + : [ + AndroidNotificationAction( + FluffyChatNotificationActions.reply.name, + l10n.reply, + inputs: [ + AndroidNotificationActionInput(label: l10n.writeAMessage), + ], + allowGeneratedReplies: true, + semanticAction: SemanticAction.reply, + ), + AndroidNotificationAction( + FluffyChatNotificationActions.markAsRead.name, + l10n.markAsRead, + semanticAction: SemanticAction.markAsRead, + ), + AndroidNotificationAction( + FluffyChatNotificationActions.mute.name, + l10n.mute, + semanticAction: SemanticAction.mute, + ), + ], + ); + final iOSPlatformChannelSpecifics = DarwinNotificationDetails( + threadIdentifier: event.room.id, ); - const iOSPlatformChannelSpecifics = IOSNotificationDetails(); final platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics, ); - await _flutterLocalNotificationsPlugin.show( - await mapRoomIdToInt(event.room.id), - event.room.displayname, - body, - platformChannelSpecifics, - payload: event.roomId, + + final title = event.room.getLocalizedDisplayname(MatrixLocals(l10n)); + + if (PlatformInfos.isAndroid && messagingStyleInformation == null) { + await _setShortcut(event, l10n, title, roomAvatarFile); + } + + final needsTitleAndBody = !PlatformInfos.isAndroid; + + await flutterLocalNotificationsPlugin.show( + id: id, + title: needsTitleAndBody ? title : null, + body: needsTitleAndBody ? body : null, + notificationDetails: platformChannelSpecifics, + payload: FluffyChatPushPayload( + client.clientName, + event.room.id, + event.eventId, + ).toString(), ); + + // Send summary notification on Android + if (PlatformInfos.isAndroid) { + await updateSummaryNotification( + clientName: client.clientName, + l10n: l10n, + flutterLocalNotificationsPlugin: flutterLocalNotificationsPlugin, + ); + } Logs().v('Push helper has been completed!'); } -/// Workaround for the problem that local notification IDs must be int but we -/// sort by [roomId] which is a String. To make sure that we don't have duplicated -/// IDs we map the [roomId] to a number and store this number. -Future mapRoomIdToInt(String roomId) async { - final store = await SharedPreferences.getInstance(); - final idMap = Map.from( - jsonDecode(store.getString(SettingKeys.notificationCurrentIds) ?? '{}')); - int? currentInt; - try { - currentInt = idMap[roomId]; - } catch (_) { - currentInt = null; +void updateAppBadge(int unreadCount) { + if (PlatformInfos.isAndroid || PlatformInfos.isMacOS || PlatformInfos.isIOS) { + if (unreadCount == 0) { + FlutterNewBadger.removeBadge(); + } else { + FlutterNewBadger.setBadge(unreadCount); + } + return; } - if (currentInt != null) { - return currentInt; +} + +Future updateSummaryNotification({ + required FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, + required String clientName, + required L10n l10n, +}) async { + final activeNotifications = + (await flutterLocalNotificationsPlugin.getActiveNotifications()) + .where((n) => n.groupKey == clientName) + .toList(); + + if (activeNotifications.length <= 1) { + await flutterLocalNotificationsPlugin.cancel(id: clientName.hashCode); + return; + } + + if (activeNotifications.any( + (notification) => notification.id == clientName.hashCode, + )) { + // Already have a visible summary notification! + return; } - var nCurrentInt = 0; - while (idMap.values.contains(nCurrentInt)) { - nCurrentInt++; + + await flutterLocalNotificationsPlugin.show( + id: clientName.hashCode, + notificationDetails: NotificationDetails( + android: AndroidNotificationDetails( + AppConfig.pushNotificationsChannelId, + l10n.incomingMessages, + groupKey: clientName, + setAsGroupSummary: true, + styleInformation: InboxStyleInformation( + activeNotifications.map((n) => n.body ?? '').toList(), + ), + autoCancel: false, + ), + ), + ); +} + +class FluffyChatPushPayload { + final String? clientName, roomId, eventId; + + FluffyChatPushPayload(this.clientName, this.roomId, this.eventId); + + factory FluffyChatPushPayload.fromString(String payload) { + final parts = payload.split('|'); + if (parts.length != 3) { + return FluffyChatPushPayload(null, null, null); + } + return FluffyChatPushPayload(parts.first, parts[1], parts[2]); + } + + @override + String toString() => '$clientName|$roomId|$eventId'; +} + +/// Creates a shortcut for Android platform but does not block displaying the +/// notification. This is optional but provides a nicer view of the +/// notification popup. +Future _setShortcut( + Event event, + L10n l10n, + String title, + Uint8List? avatarFile, +) async { + final flutterShortcuts = FlutterShortcuts(); + await flutterShortcuts.initialize(debug: !kReleaseMode); + await flutterShortcuts.pushShortcutItem( + shortcut: ShortcutItem( + id: event.room.id, + action: AppConfig.inviteLinkPrefix + event.room.id, + shortLabel: title, + conversationShortcut: true, + icon: avatarFile == null ? null : base64Encode(avatarFile), + shortcutIconAsset: avatarFile == null + ? ShortcutIconAsset.androidAsset + : ShortcutIconAsset.memoryAsset, + isImportant: event.room.isFavourite, + ), + ); +} + +extension on Client { + Future tryDownloadNotificationAvatar(Uri? avatar) async { + if (avatar == null) return null; + try { + return await downloadMxcCached( + avatar, + thumbnailMethod: ThumbnailMethod.crop, + width: notificationAvatarDimension, + height: notificationAvatarDimension, + animated: false, + isThumbnail: true, + rounded: true, + ).timeout(const Duration(seconds: 3)); + } catch (e, s) { + Logs().e('Unable to get avatar picture', e, s); + return null; + } } - idMap[roomId] = nCurrentInt; - await store.setString(SettingKeys.notificationCurrentIds, json.encode(idMap)); - return nCurrentInt; } diff --git a/lib/utils/resize_image.dart b/lib/utils/resize_image.dart deleted file mode 100644 index c18a8e2921..0000000000 --- a/lib/utils/resize_image.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:blurhash_dart/blurhash_dart.dart'; -import 'package:image/image.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:video_compress/video_compress.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; - -extension ResizeImage on MatrixFile { - static const int max = 1200; - static const int quality = 40; - - Future resizeVideo() async { - final tmpDir = await getTemporaryDirectory(); - final tmpFile = File(tmpDir.path + '/' + name); - MediaInfo? mediaInfo; - await tmpFile.writeAsBytes(bytes); - try { - // will throw an error e.g. on Android SDK < 18 - mediaInfo = await VideoCompress.compressVideo(tmpFile.path); - } catch (e, s) { - SentryController.captureException(e, s); - } - return MatrixVideoFile( - bytes: (await mediaInfo?.file?.readAsBytes()) ?? bytes, - name: name, - mimeType: mimeType, - width: mediaInfo?.width, - height: mediaInfo?.height, - duration: mediaInfo?.duration?.round(), - ); - } - - Future getVideoThumbnail() async { - if (!PlatformInfos.isMobile) return null; - final tmpDir = await getTemporaryDirectory(); - final tmpFile = File(tmpDir.path + '/' + name); - if (await tmpFile.exists() == false) { - await tmpFile.writeAsBytes(bytes); - } - try { - final bytes = await VideoCompress.getByteThumbnail(tmpFile.path); - if (bytes == null) return null; - return MatrixImageFile( - bytes: bytes, - name: name, - ); - } catch (e, s) { - SentryController.captureException(e, s); - } - return null; - } -} - -Future createBlurHash(Uint8List file) async { - final image = decodeImage(file)!; - return BlurHash.encode(image, numCompX: 4, numCompY: 3); -} diff --git a/lib/utils/resize_video.dart b/lib/utils/resize_video.dart new file mode 100644 index 0000000000..620807ce31 --- /dev/null +++ b/lib/utils/resize_video.dart @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:matrix/matrix.dart'; +import 'package:video_compress/video_compress.dart'; + +extension ResizeImage on XFile { + static const int max = 1200; + static const int quality = 40; + + Future getVideoInfo({bool compress = true}) async { + MediaInfo? mediaInfo; + try { + if (PlatformInfos.isMobile) { + // will throw an error e.g. on Android SDK < 18 + mediaInfo = compress + ? await VideoCompress.compressVideo(path, deleteOrigin: true) + : await VideoCompress.getMediaInfo(path); + } + } catch (e, s) { + Logs().w('Error while fetching video media info', e, s); + } + + return MatrixVideoFile( + bytes: (await mediaInfo?.file?.readAsBytes()) ?? await readAsBytes(), + name: name, + mimeType: mimeType, + // on Android width and height is reversed: + // https://github.com/jonataslaw/VideoCompress/issues/172 + width: PlatformInfos.isAndroid ? mediaInfo?.height : mediaInfo?.width, + height: PlatformInfos.isAndroid ? mediaInfo?.width : mediaInfo?.height, + duration: mediaInfo?.duration?.round(), + ); + } + + Future getVideoThumbnail() async { + if (!PlatformInfos.isMobile) return null; + + try { + final bytes = await VideoCompress.getByteThumbnail(path); + if (bytes == null) return null; + return MatrixImageFile(bytes: bytes, name: name); + } catch (e, s) { + Logs().w('Error while compressing video', e, s); + } + return null; + } +} diff --git a/lib/utils/room_status_extension.dart b/lib/utils/room_status_extension.dart index 5468010cda..d7eeb116da 100644 --- a/lib/utils/room_status_extension.dart +++ b/lib/utils/room_status_extension.dart @@ -1,78 +1,49 @@ -import 'package:flutter/widgets.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/widgets.dart'; import 'package:matrix/matrix.dart'; import '../config/app_config.dart'; -import 'date_time_extension.dart'; -import 'matrix_sdk_extensions.dart/filtered_timeline_extension.dart'; extension RoomStatusExtension on Room { - CachedPresence? get directChatPresence => - client.presences[directChatMatrixID]; - - String getLocalizedStatus(BuildContext context) { - if (isDirectChat) { - final directChatPresence = this.directChatPresence; - if (directChatPresence != null && - (directChatPresence.lastActiveTimestamp != null || - directChatPresence.currentlyActive != null)) { - if (directChatPresence.statusMsg?.isNotEmpty ?? false) { - return directChatPresence.statusMsg!; - } - if (directChatPresence.currentlyActive == true) { - return L10n.of(context)!.currentlyActive; - } - if (directChatPresence.lastActiveTimestamp == null) { - return L10n.of(context)!.lastSeenLongTimeAgo; - } - final time = directChatPresence.lastActiveTimestamp!; - return L10n.of(context)! - .lastActiveAgo(time.localizedTimeShort(context)); - } - return L10n.of(context)!.lastSeenLongTimeAgo; - } - return L10n.of(context)! - .countParticipants(summary.mJoinedMemberCount.toString()); - } - String getLocalizedTypingText(BuildContext context) { var typingText = ''; final typingUsers = this.typingUsers; typingUsers.removeWhere((User u) => u.id == client.userID); if (AppConfig.hideTypingUsernames) { - typingText = L10n.of(context)!.isTyping; + typingText = L10n.of(context).isTyping; if (typingUsers.first.id != directChatMatrixID) { - typingText = - L10n.of(context)!.numUsersTyping(typingUsers.length.toString()); + typingText = L10n.of(context).numUsersTyping(typingUsers.length); } } else if (typingUsers.length == 1) { - typingText = L10n.of(context)!.isTyping; + typingText = L10n.of(context).isTyping; if (typingUsers.first.id != directChatMatrixID) { - typingText = - L10n.of(context)!.userIsTyping(typingUsers.first.calcDisplayname()); + typingText = L10n.of( + context, + ).userIsTyping(typingUsers.first.calcDisplayname()); } } else if (typingUsers.length == 2) { - typingText = L10n.of(context)!.userAndUserAreTyping( - typingUsers.first.calcDisplayname(), - typingUsers[1].calcDisplayname()); + typingText = L10n.of(context).userAndUserAreTyping( + typingUsers.first.calcDisplayname(), + typingUsers[1].calcDisplayname(), + ); } else if (typingUsers.length > 2) { - typingText = L10n.of(context)!.userAndOthersAreTyping( - typingUsers.first.calcDisplayname(), - (typingUsers.length - 1).toString()); + typingText = L10n.of(context).userAndOthersAreTyping( + typingUsers.first.calcDisplayname(), + (typingUsers.length - 1), + ); } return typingText; } - List getSeenByUsers( - Timeline timeline, List filteredEvents, Set unfolded, - {String? eventId}) { + List getSeenByUsers(Timeline timeline, {String? eventId}) { if (timeline.events.isEmpty) return []; - - final filteredEvents = timeline.getFilteredEvents(unfolded: unfolded); - if (filteredEvents.isEmpty) return []; - eventId ??= filteredEvents.first.eventId; + eventId ??= timeline.events.first.eventId; final lastReceipts = {}; // now we iterate the timeline events until we hit the first rendered event @@ -82,8 +53,10 @@ extension RoomStatusExtension on Room { break; } } - lastReceipts.removeWhere((user) => - user.id == client.userID || user.id == filteredEvents.first.senderId); + lastReceipts.removeWhere( + (user) => + user.id == client.userID || user.id == timeline.events.first.senderId, + ); return lastReceipts.toList(); } } diff --git a/lib/utils/run_in_background.dart b/lib/utils/run_in_background.dart deleted file mode 100644 index e75d14525b..0000000000 --- a/lib/utils/run_in_background.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'dart:async'; - -import 'package:isolate/isolate.dart'; - -Future runInBackground( - FutureOr Function(U arg) function, U arg) async { - final isolate = await IsolateRunner.spawn(); - try { - return await isolate.run(function, arg); - } finally { - await isolate.close(); - } -} diff --git a/lib/utils/sentry_controller.dart b/lib/utils/sentry_controller.dart deleted file mode 100644 index f81c6ca22d..0000000000 --- a/lib/utils/sentry_controller.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:sentry/sentry.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import '../config/setting_keys.dart'; -import 'famedlysdk_store.dart'; - -abstract class SentryController { - static Future toggleSentryAction( - BuildContext context, bool enableSentry) async { - if (!AppConfig.enableSentry) return; - final storage = Store(); - await storage.setItemBool(SettingKeys.sentry, enableSentry); - return; - } - - static Future getSentryStatus() async { - if (!AppConfig.enableSentry) return false; - final storage = Store(); - return await storage.getItemBool(SettingKeys.sentry); - } - - static final sentry = SentryClient(SentryOptions(dsn: AppConfig.sentryDns)); - - static void captureException(error, stackTrace) async { - Logs().e('Capture exception', error, stackTrace); - if (!kDebugMode && await getSentryStatus()) { - await sentry.captureException( - error, - stackTrace: stackTrace, - ); - } - } -} diff --git a/lib/utils/show_scaffold_dialog.dart b/lib/utils/show_scaffold_dialog.dart new file mode 100644 index 0000000000..e66f4ad802 --- /dev/null +++ b/lib/utils/show_scaffold_dialog.dart @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; + +Future showScaffoldDialog({ + required BuildContext context, + Color? barrierColor, + Color? containerColor, + double maxWidth = 480, + double maxHeight = 720, + required Widget Function(BuildContext context) builder, +}) => showDialog( + context: context, + useSafeArea: false, + builder: FluffyThemes.isColumnMode(context) + ? (context) => Center( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + color: + containerColor ?? Theme.of(context).scaffoldBackgroundColor, + ), + clipBehavior: Clip.hardEdge, + margin: const EdgeInsets.all(16), + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: maxHeight, + ), + child: builder(context), + ), + ) + : builder, +); diff --git a/lib/utils/show_update_snackbar.dart b/lib/utils/show_update_snackbar.dart new file mode 100644 index 0000000000..eed049856e --- /dev/null +++ b/lib/utils/show_update_snackbar.dart @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +abstract class UpdateNotifier { + static const String versionStoreKey = 'last_known_version'; + + static Future showUpdateDialog(BuildContext context) async { + final l10n = L10n.of(context); + final currentVersion = await PlatformInfos.getVersion(); + final store = await SharedPreferences.getInstance(); + final storedVersion = store.getString(versionStoreKey); + if (!context.mounted) return; + + if (currentVersion != storedVersion) { + if (storedVersion != null) { + showAdaptiveDialog( + barrierDismissible: true, + context: context, + builder: (context) => AlertDialog.adaptive( + title: Text( + l10n.updateInstalled(currentVersion), + style: TextStyle(fontWeight: FontWeight.bold), + ), + content: Text(l10n.possibleByYou), + actions: [ + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => launchUrlString(AppConfig.helpUrl), + child: Row( + mainAxisSize: .min, + spacing: 4, + children: [ + Icon( + Icons.favorite, + color: Theme.of(context).colorScheme.error, + ), + Text( + l10n.support, + style: TextStyle( + color: Theme.of(context).colorScheme.error, + ), + ), + ], + ), + ), + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => launchUrlString(AppConfig.changelogUrl), + child: Text(l10n.changelog), + ), + AdaptiveDialogAction( + bigButtons: true, + onPressed: () => Navigator.of(context).pop(), + child: Text(l10n.close), + ), + ], + ), + ); + } + await store.setString(versionStoreKey, currentVersion); + } + } +} diff --git a/lib/utils/sign_in_flows/calc_redirect_url.dart b/lib/utils/sign_in_flows/calc_redirect_url.dart new file mode 100644 index 0000000000..76f47bc02f --- /dev/null +++ b/lib/utils/sign_in_flows/calc_redirect_url.dart @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:universal_html/html.dart' as html; + +(Uri redirectUrl, String urlScheme) calcRedirectUrl({ + bool withAuthHtmlPath = false, +}) { + var redirectUrl = kIsWeb + ? Uri.parse(html.window.location.href.split('#').first.split('?').first) + : (PlatformInfos.isMobile || PlatformInfos.isMacOS) + ? Uri.parse('${AppConfig.appSsoUrlScheme.toLowerCase()}:/login') + : Uri.parse('http://localhost:3001/login'); + + if (kIsWeb && withAuthHtmlPath) { + redirectUrl = redirectUrl.resolveUri(Uri(pathSegments: ['auth.html'])); + } + + final urlScheme = + (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) + ? redirectUrl.scheme + : 'http://localhost:3001'; + + return (redirectUrl, urlScheme); +} diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart new file mode 100644 index 0000000000..f37bfe67c4 --- /dev/null +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -0,0 +1,95 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/oidc_login.dart'; +import 'package:fluffychat/utils/sign_in_flows/sso_login.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +Future connectToHomeserverFlow( + PublicHomeserverData homeserverData, + BuildContext context, + void Function(AsyncSnapshot) setState, + bool signUp, +) async { + setState(AsyncSnapshot.waiting()); + try { + final homeserverInput = homeserverData.name!; + var homeserver = Uri.parse(homeserverInput); + if (homeserver.scheme.isEmpty) { + homeserver = Uri.https(homeserverInput, ''); + } + final l10n = L10n.of(context); + final client = await Matrix.of(context).getLoginClient(); + final (_, _, loginFlows, authMetadata) = await client.checkHomeserver( + homeserver, + fetchAuthMetadata: true, + ); + + final regLink = homeserverData.regLink; + final supportsSso = loginFlows.any((flow) => flow.type == 'm.login.sso'); + + if ((kIsWeb || PlatformInfos.isLinux) && + (supportsSso || authMetadata != null || (signUp && regLink != null))) { + if (!context.mounted) return; + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.appWantsToUseForLogin(homeserverInput), + message: l10n.appWantsToUseForLoginDescription, + okLabel: l10n.continueText, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + } + if (!context.mounted) return; + + if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) { + await oidcLoginFlow(client, context, signUp); + } else if (supportsSso) { + await ssoLoginFlow(client, context, signUp, loginFlows); + } else { + if (signUp && regLink != null) { + await launchUrlString(regLink); + } + if (!context.mounted) return; + final pathSegments = List.of( + GoRouter.of(context).routeInformationProvider.value.uri.pathSegments, + ); + pathSegments.removeLast(); + pathSegments.add('login'); + context.go('/${pathSegments.join('/')}', extra: client); + setState(AsyncSnapshot.withData(ConnectionState.done, true)); + return; + } + + await AppSettings.defaultHomeserver.setItem(homeserverInput); + + if (context.mounted) { + setState(AsyncSnapshot.withData(ConnectionState.done, true)); + context.go('/backup'); + } + } catch (e, s) { + Logs().w('Unable to login', e, s); + setState(AsyncSnapshot.withError(ConnectionState.done, e, s)); + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toLocalizedString(context, ExceptionContext.checkHomeserver), + ), + ), + ); + } +} diff --git a/lib/utils/sign_in_flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart new file mode 100644 index 0000000000..244f759000 --- /dev/null +++ b/lib/utils/sign_in_flows/oidc_login.dart @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:convert'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +Future oidcLoginFlow( + Client client, + BuildContext context, + bool signUp, +) async { + Logs().i('Starting Matrix Native OIDC Flow...'); + + final (redirectUrl, urlScheme) = calcRedirectUrl(); + + final clientUri = Uri.parse(AppSettings.website.value); + final supportWebPlatform = + kIsWeb && + kReleaseMode && + redirectUrl.scheme == 'https' && + redirectUrl.host.contains(clientUri.host); + if (kIsWeb && !supportWebPlatform) { + Logs().w( + 'OIDC Application Type web is not supported. Using native now. Please use this instance not in production!', + ); + } + + final oidcClientData = await client.registerOidcClient( + redirectUris: [redirectUrl], + applicationType: supportWebPlatform + ? OidcApplicationType.web + : OidcApplicationType.native, + clientInformation: OidcClientInformation( + clientName: AppSettings.applicationName.value, + clientUri: clientUri, + logoUri: Uri.parse(AppSettings.logoUrl.value), + tosUri: Uri.parse(AppSettings.tos.value), + policyUri: Uri.parse(AppSettings.privacyPolicy.value), + ), + ); + + final session = await client.initOidcLoginSession( + oidcClientData: oidcClientData, + redirectUri: redirectUrl, + prompt: signUp ? 'create' : null, + ); + + if (!context.mounted) return; + + if (kIsWeb) { + final store = await SharedPreferences.getInstance(); + store.setString( + OidcSessionJsonExtension.homeserverStoreKey, + client.homeserver!.toString(), + ); + store.setString( + OidcSessionJsonExtension.storeKey, + jsonEncode(session.toJson()), + ); + } + + final returnUrlString = await FlutterWebAuth2.authenticate( + url: session.authenticationUri.toString(), + callbackUrlScheme: urlScheme, + options: FlutterWebAuth2Options( + useWebview: PlatformInfos.isMobile, + windowName: '_self', + ), + ); + if (kIsWeb) return; // On Web we return at intro page when app starts again! + + final returnUrl = Uri.parse(returnUrlString); + final queryParameters = returnUrl.fragment.isNotEmpty + ? Uri.parse(returnUrl.fragment).queryParameters + : returnUrl.queryParameters; + + final code = queryParameters['code'] as String; + final state = queryParameters['state'] as String; + + await client.oidcLogin(session: session, code: code, state: state); +} diff --git a/lib/utils/sign_in_flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart new file mode 100644 index 0000000000..5aae3465c2 --- /dev/null +++ b/lib/utils/sign_in_flows/sso_login.dart @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:matrix/matrix.dart'; + +Future ssoLoginFlow( + Client client, + BuildContext context, + bool signUp, + List loginFlows, +) async { + final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true); + + Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl); + + final ssoProviders = + (loginFlows + .firstWhere((flow) => flow.type == 'm.login.sso') + .additionalProperties['identity_providers'] + as List?) + ?.map( + (json) => ( + name: json['name'] as String, + id: json['id'] as String, + brand: json['brand'] as String?, + icon: json['icon'] as String?, + ), + ) + .toList(); + + final provider = ssoProviders == null + ? null + : await showModalActionPopup( + context: context, + title: L10n.of(context).logInTo(client.homeserver!.host), + actions: ssoProviders + .map( + (provider) => + AdaptiveModalAction(label: provider.name, value: provider), + ) + .toList(), + ); + + final url = client.homeserver!.replace( + path: + '/_matrix/client/v3/login/sso/redirect${provider == null ? '' : '/${provider.id}'}', + queryParameters: { + 'redirectUrl': redirectUrl.toString(), + 'action': signUp ? 'register' : 'login', + }, + ); + + final result = await FlutterWebAuth2.authenticate( + url: url.toString(), + callbackUrlScheme: urlScheme, + options: FlutterWebAuth2Options(useWebview: PlatformInfos.isMobile), + ); + final token = Uri.parse(result).queryParameters['loginToken']; + if (token?.isEmpty ?? false) return; + + await client.login( + LoginType.mLoginToken, + token: token, + initialDeviceDisplayName: PlatformInfos.appDisplayName, + ); +} diff --git a/lib/utils/size_string.dart b/lib/utils/size_string.dart new file mode 100644 index 0000000000..786009114e --- /dev/null +++ b/lib/utils/size_string.dart @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +extension SizeString on num { + String get sizeString { + var size = toDouble(); + if (size < 1000) { + return '${size.round()} Bytes'; + } + if (size < 1000 * 1000) { + size = size / 1000; + size = (size * 10).round() / 10; + return '$size KB'; + } + if (size < 1000 * 1000 * 1000) { + size = size / 1000000; + size = (size * 10).round() / 10; + return '$size MB'; + } + size = size / 1000 * 1000 * 1000 * 1000; + size = (size * 10).round() / 10; + return '$size GB'; + } +} diff --git a/lib/utils/story_theme_data.dart b/lib/utils/story_theme_data.dart deleted file mode 100644 index 9006dcc0a5..0000000000 --- a/lib/utils/story_theme_data.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -class StoryThemeData { - final Color? color1; - final Color? color2; - final BoxFit fit; - final int alignmentX; - final int alignmentY; - - static const String contentKey = 'msc3588.stories.design'; - - const StoryThemeData({ - this.color1, - this.color2, - this.fit = BoxFit.contain, - this.alignmentX = 0, - this.alignmentY = 0, - }); - - factory StoryThemeData.fromJson(Map json) { - final color1Int = json.tryGet('color1'); - final color2Int = json.tryGet('color2'); - final color1 = color1Int == null ? null : Color(color1Int); - final color2 = color2Int == null ? null : Color(color2Int); - return StoryThemeData( - color1: color1, - color2: color2, - fit: - json.tryGet('fit') == 'cover' ? BoxFit.cover : BoxFit.contain, - alignmentX: json.tryGet('alignment_x') ?? 0, - alignmentY: json.tryGet('alignment_y') ?? 0, - ); - } - - Map toJson() => { - if (color1 != null) 'color1': color1?.value, - if (color2 != null) 'color2': color2?.value, - 'fit': fit.name, - 'alignment_x': alignmentX, - 'alignment_y': alignmentY, - }; -} diff --git a/lib/utils/stream_extension.dart b/lib/utils/stream_extension.dart index afd8deba80..93fa60dd0c 100644 --- a/lib/utils/stream_extension.dart +++ b/lib/utils/stream_extension.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; extension StreamExtension on Stream { @@ -9,9 +14,9 @@ extension StreamExtension on Stream { var gotMessage = false; // as we call our inline-defined function recursively we need to make sure that the // variable exists prior of creating the function. Silly dart. - Function? _onMessage; + Function? onMessage; // callback to determine if we should send out an update - _onMessage = () { + onMessage = () { // do nothing if it is already closed if (controller.isClosed) { return; @@ -25,7 +30,7 @@ extension StreamExtension on Stream { // method to send out an update! timer = null; if (gotMessage) { - _onMessage?.call(); + onMessage?.call(); } }); } else { @@ -33,9 +38,11 @@ extension StreamExtension on Stream { gotMessage = true; } }; - final subscription = listen((_) => _onMessage?.call(), - onDone: () => controller.close(), - onError: (e, s) => controller.addError(e, s)); + final subscription = listen( + (_) => onMessage?.call(), + onDone: controller.close, + onError: (e, s) => controller.addError(e, s), + ); // add proper cleanup to the subscription and the controller, to not memory leak controller.onCancel = () { subscription.cancel(); diff --git a/lib/utils/string_color.dart b/lib/utils/string_color.dart index 4ed39432b9..6f24ab5133 100644 --- a/lib/utils/string_color.dart +++ b/lib/utils/string_color.dart @@ -1,30 +1,39 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter/material.dart'; extension StringColor on String { - Color get color { + static final _colorCache = >{}; + + Color _getColorLight(double light) { var number = 0.0; for (var i = 0; i < length; i++) { number += codeUnitAt(i); } number = (number % 12) * 25.5; - return HSLColor.fromAHSL(1, number, 1, 0.35).toColor(); + return HSLColor.fromAHSL(0.75, number, 1, light).toColor(); + } + + Color get color { + _colorCache[this] ??= {}; + return _colorCache[this]![0.3] ??= _getColorLight(0.3); } Color get darkColor { - var number = 0.0; - for (var i = 0; i < length; i++) { - number += codeUnitAt(i); - } - number = (number % 12) * 25.5; - return HSLColor.fromAHSL(1, number, 1, 0.2).toColor(); + _colorCache[this] ??= {}; + return _colorCache[this]![0.2] ??= _getColorLight(0.2); } - Color get lightColor { - var number = 0.0; - for (var i = 0; i < length; i++) { - number += codeUnitAt(i); - } - number = (number % 12) * 25.5; - return HSLColor.fromAHSL(1, number, 1, 0.8).toColor(); + Color get lightColorText { + _colorCache[this] ??= {}; + return _colorCache[this]![0.7] ??= _getColorLight(0.7); + } + + Color get lightColorAvatar { + _colorCache[this] ??= {}; + return _colorCache[this]![0.45] ??= _getColorLight(0.45); } } diff --git a/lib/utils/string_extension.dart b/lib/utils/string_extension.dart deleted file mode 100644 index 3c77ed4ae1..0000000000 --- a/lib/utils/string_extension.dart +++ /dev/null @@ -1,15 +0,0 @@ -extension StringCasingExtension on String { - String removeDiacritics() { - const withDia = - 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž'; - const withoutDia = - 'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz'; - - String str = this; - for (int i = 0; i < withDia.length; i++) { - str = str.replaceAll(withDia[i], withoutDia[i]); - } - - return str; - } -} diff --git a/lib/utils/sync_status_localization.dart b/lib/utils/sync_status_localization.dart new file mode 100644 index 0000000000..13c71ba64d --- /dev/null +++ b/lib/utils/sync_status_localization.dart @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +extension SyncStatusLocalization on SyncStatusUpdate { + String calcLocalizedString(BuildContext context) { + final progress = this.progress; + switch (status) { + case SyncStatus.waitingForResponse: + return L10n.of(context).waitingForServer; + case SyncStatus.error: + return ((error?.exception ?? Object()) as Object).toLocalizedString( + context, + ); + case SyncStatus.processing: + case SyncStatus.cleaningUp: + case SyncStatus.finished: + return progress == null + ? L10n.of(context).synchronizingPleaseWait + : L10n.of(context).synchronizingPleaseWaitCounter( + (progress * 100).round().toString(), + ); + } + } +} diff --git a/lib/utils/uia_request_manager.dart b/lib/utils/uia_request_manager.dart index 757ff4572b..830ef26621 100644 --- a/lib/utils/uia_request_manager.dart +++ b/lib/utils/uia_request_manager.dart @@ -1,14 +1,25 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - extension UiaRequestManager on MatrixState { Future uiaRequestHandler(UiaRequest uiaRequest) async { + final l10n = L10n.of(context); + final navigatorContext = + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context; try { if (uiaRequest.state != UiaRequestState.waitForUser || uiaRequest.nextStages.isEmpty) { @@ -19,22 +30,18 @@ extension UiaRequestManager on MatrixState { Logs().d('Uia Request Stage: $stage'); switch (stage) { case AuthenticationTypes.password: - final input = cachedPassword ?? + final input = + cachedPassword ?? (await showTextInputDialog( context: navigatorContext, - title: L10n.of(context)!.pleaseEnterYourPassword, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, - textFields: [ - const DialogTextField( - minLines: 1, - maxLines: 1, - obscureText: true, - hintText: '******', - ) - ], - )) - ?.single; + title: l10n.pleaseEnterYourPassword, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + minLines: 1, + maxLines: 1, + obscureText: true, + hintText: '******', + )); if (input == null || input.isEmpty) { return uiaRequest.cancel(); } @@ -45,33 +52,6 @@ extension UiaRequestManager on MatrixState { identifier: AuthenticationUserIdentifier(user: client.userID!), ), ); - case AuthenticationTypes.emailIdentity: - final currentThreepidCreds = this.currentThreepidCreds; - if (currentThreepidCreds == null) { - return uiaRequest.cancel( - UiaException(L10n.of(widget.context)!.serverRequiresEmail), - ); - } - final auth = AuthenticationThreePidCreds( - session: uiaRequest.session, - type: AuthenticationTypes.emailIdentity, - threepidCreds: ThreepidCreds( - sid: currentThreepidCreds.sid, - clientSecret: currentClientSecret, - ), - ); - if (OkCancelResult.ok == - await showOkCancelAlertDialog( - useRootNavigator: false, - context: navigatorContext, - title: L10n.of(context)!.weSentYouAnEmail, - message: L10n.of(context)!.pleaseClickOnLink, - okLabel: L10n.of(context)!.iHaveClickedOnLink, - cancelLabel: L10n.of(context)!.cancel, - )) { - return uiaRequest.completeStage(auth); - } - return uiaRequest.cancel(); case AuthenticationTypes.dummy: return uiaRequest.completeStage( AuthenticationData( @@ -80,27 +60,35 @@ extension UiaRequestManager on MatrixState { ), ); default: - final url = Uri.parse(client.homeserver.toString() + - '/_matrix/client/r0/auth/$stage/fallback/web?session=${uiaRequest.session}'); - launch( - url.toString(), - forceSafariVC: true, - forceWebView: false, + final stageUrl = uiaRequest.params + .tryGetMap(stage) + ?.tryGet('url'); + final fallbackUrl = client.homeserver!.replace( + path: '/_matrix/client/v3/auth/$stage/fallback/web', + queryParameters: {'session': uiaRequest.session}, + ); + final url = stageUrl != null + ? (Uri.tryParse(stageUrl) ?? fallbackUrl) + : fallbackUrl; + + final consent = await showOkCancelAlertDialog( + useRootNavigator: false, + title: l10n.pleaseFollowInstructionsOnWeb, + context: navigatorContext, + okLabel: l10n.open, + cancelLabel: l10n.cancel, + ); + if (consent != OkCancelResult.ok) return uiaRequest.cancel(); + + launchUrl(url, mode: LaunchMode.inAppBrowserView); + final completer = Completer(); + final listener = AppLifecycleListener(onResume: completer.complete); + await completer.future; + listener.dispose(); + + return uiaRequest.completeStage( + AuthenticationData(session: uiaRequest.session), ); - if (OkCancelResult.ok == - await showOkCancelAlertDialog( - useRootNavigator: false, - message: L10n.of(context)!.pleaseFollowInstructionsOnWeb, - context: navigatorContext, - okLabel: L10n.of(context)!.next, - cancelLabel: L10n.of(context)!.cancel, - )) { - return uiaRequest.completeStage( - AuthenticationData(session: uiaRequest.session), - ); - } else { - return uiaRequest.cancel(); - } } } catch (e, s) { Logs().e('Error while background UIA', e, s); diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index 3d60efbd8c..727db5fd37 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -1,26 +1,39 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart' show IterableExtension; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:punycode/punycode.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import 'package:fluffychat/widgets/profile_bottom_sheet.dart'; -import 'package:fluffychat/widgets/public_room_bottom_sheet.dart'; +import '../widgets/adaptive_dialogs/public_room_dialog.dart'; import 'platform_infos.dart'; class UrlLauncher { + /// The url to open. final String? url; + + /// The visible name in the GUI. For example the name of a markdown link + /// which may differ from the actual url to open. + final String? name; + final BuildContext context; - const UrlLauncher(this.context, this.url); - void launchUrl() { + const UrlLauncher(this.context, this.url, [this.name]); + + Future launchUrl() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || {'#', '@', '!', '+', '\$'}.contains(url![0]) || @@ -30,10 +43,25 @@ class UrlLauncher { final uri = Uri.tryParse(url!); if (uri == null) { // we can't open this thing - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.cantOpenUri(url!)))); + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.cantOpenUri(url!))), + ); return; } + + if (name != null && url != name) { + // If there is a name which differs from the url, we need to make sure + // that the user can see the actual url before opening the browser. + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.openLinkInBrowser, + message: url, + okLabel: l10n.open, + cancelLabel: l10n.cancel, + ); + if (consent != OkCancelResult.ok) return; + } + if (!{'https', 'http'}.contains(uri.scheme)) { // just launch non-https / non-http uris directly @@ -44,7 +72,7 @@ class UrlLauncher { .split(';') .first .split(',') - .map((s) => double.tryParse(s)) + .map(double.tryParse) .toList(); if (latlong.length == 2 && latlong.first != null && @@ -54,51 +82,61 @@ class UrlLauncher { // to an apple maps thingy // https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html final ll = '${latlong.first},${latlong.last}'; - launch('https://maps.apple.com/?q=$ll&sll=$ll'); + launchUrlString('https://maps.apple.com/?q=$ll&sll=$ll'); } else { // transmute geo URIs on desktop to openstreetmap links, as those usually can't handle // geo URIs - launch( - 'https://www.openstreetmap.org/?mlat=${latlong.first}&mlon=${latlong.last}#map=16/${latlong.first}/${latlong.last}'); + launchUrlString( + 'https://www.openstreetmap.org/?mlat=${latlong.first}&mlon=${latlong.last}#map=16/${latlong.first}/${latlong.last}', + ); } return; } } - launch(url!); + launchUrlString(url!); return; } if (uri.host.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context)!.cantOpenUri(url!)))); + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.cantOpenUri(url!))), + ); return; } // okay, we have either an http or an https URI. // As some platforms have issues with opening unicode URLs, we are going to help // them out by punycode-encoding them for them ourself. - final newHost = uri.host.split('.').map((hostPartEncoded) { - final hostPart = Uri.decodeComponent(hostPartEncoded); - final hostPartPunycode = punycodeEncode(hostPart); - return hostPartPunycode != hostPart + '-' - ? 'xn--$hostPartPunycode' - : hostPart; - }).join('.'); - launch(uri.replace(host: newHost).toString()); + final newHost = uri.host + .split('.') + .map((hostPartEncoded) { + final hostPart = Uri.decodeComponent(hostPartEncoded); + final hostPartPunycode = punycodeEncode(hostPart); + return hostPartPunycode != '$hostPart-' + ? 'xn--$hostPartPunycode' + : hostPart; + }) + .join('.'); + // Force LaunchMode.externalApplication, otherwise url_launcher will default + // to opening links in a webview on mobile platforms. + launchUrlString( + uri.replace(host: newHost).toString(), + mode: LaunchMode.externalApplication, + ); } - void openMatrixToUrl() async { + Future openMatrixToUrl() async { final matrix = Matrix.of(context); final url = this.url!.replaceFirst( - AppConfig.deepLinkPrefix, - AppConfig.inviteLinkPrefix, - ); + AppConfig.deepLinkPrefix, + AppConfig.inviteLinkPrefix, + ); // The identifier might be a matrix.to url and needs escaping. Or, it might have multiple // identifiers (room id & event id), or it might also have a query part. // All this needs parsing. - final identityParts = url.parseIdentifierIntoParts() ?? + final identityParts = + url.parseIdentifierIntoParts() ?? Uri.tryParse(url)?.host.parseIdentifierIntoParts() ?? - Uri.tryParse(url) - ?.pathSegments + Uri.tryParse(url)?.pathSegments .lastWhereOrNull((_) => true) ?.parseIdentifierIntoParts(); if (identityParts == null) { @@ -109,7 +147,8 @@ class UrlLauncher { // we got a room! Let's open that one final roomIdOrAlias = identityParts.primaryIdentifier; final event = identityParts.secondaryIdentifier; - var room = matrix.client.getRoomByAlias(roomIdOrAlias) ?? + var room = + matrix.client.getRoomByAlias(roomIdOrAlias) ?? matrix.client.getRoomById(roomIdOrAlias); var roomId = room?.id; // we make the servers a set and later on convert to a list, so that we can easily @@ -121,33 +160,42 @@ class UrlLauncher { context: context, future: () => matrix.client.getRoomIdByAlias(roomIdOrAlias), ); - if (response.error != null) { - return; // nothing to do, the alias doesn't exist + final result = response.result; + if (result != null) { + roomId = result.roomId; + servers.addAll(result.servers!); + room = matrix.client.getRoomById(roomId!); } - roomId = response.result!.roomId; - servers.addAll(response.result!.servers!); - room = matrix.client.getRoomById(roomId!); } servers.addAll(identityParts.via); + if (!context.mounted) return; if (room != null) { + if (room.isSpace) { + // TODO: Implement navigate to space + context.go('/rooms/${room.id}'); + + return; + } // we have the room, so....just open it if (event != null) { - VRouter.of(context).toSegments(['rooms', room.id], - queryParameters: {'event': event}); + context.go( + '/${Uri(pathSegments: ['rooms', room.id], queryParameters: {'event': event})}', + ); } else { - VRouter.of(context).toSegments(['rooms', room.id]); + context.go('/rooms/${room.id}'); } return; } else { - await showModalBottomSheet( + if (!context.mounted) return; + await showAdaptiveDialog( context: context, - builder: (c) => PublicRoomBottomSheet( - roomAlias: identityParts.primaryIdentifier, - outerContext: context, - ), + barrierDismissible: true, + builder: (c) => + PublicRoomDialog(roomAlias: identityParts.primaryIdentifier), ); } if (roomIdOrAlias.sigil == '!') { + if (!context.mounted) return; if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, @@ -155,6 +203,7 @@ class UrlLauncher { ) == OkCancelResult.ok) { roomId = roomIdOrAlias; + if (!context.mounted) return; final response = await showFutureLoadingDialog( context: context, future: () => matrix.client.joinRoom( @@ -163,25 +212,41 @@ class UrlLauncher { ), ); if (response.error != null) return; + if (!context.mounted) return; // wait for two seconds so that it probably came down /sync await showFutureLoadingDialog( - context: context, - future: () => Future.delayed(const Duration(seconds: 2))); + context: context, + future: () => Future.delayed(const Duration(seconds: 2)), + ); + if (!context.mounted) return; if (event != null) { - VRouter.of(context).toSegments(['rooms', response.result!], - queryParameters: {'event': event}); + context.go( + Uri( + pathSegments: ['rooms', response.result!], + queryParameters: {'event': event}, + ).toString(), + ); } else { - VRouter.of(context).toSegments(['rooms', response.result!]); + context.go('/rooms/${response.result!}'); } } } } else if (identityParts.primaryIdentifier.sigil == '@') { - await showModalBottomSheet( + final userId = identityParts.primaryIdentifier; + var noProfileWarning = false; + final profileResult = await showFutureLoadingDialog( + context: context, + future: () => + matrix.client.getProfileFromUserId(userId).catchError((_) { + noProfileWarning = true; + return Profile(userId: userId); + }), + ); + if (!context.mounted) return; + await UserDialog.show( context: context, - builder: (c) => ProfileBottomSheet( - userId: identityParts.primaryIdentifier, - outerContext: context, - ), + profile: profileResult.result!, + noProfileWarning: noProfileWarning, ); } } diff --git a/lib/utils/voip/callkeep_manager.dart b/lib/utils/voip/callkeep_manager.dart deleted file mode 100644 index d2b56f23bc..0000000000 --- a/lib/utils/voip/callkeep_manager.dart +++ /dev/null @@ -1,312 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:callkeep/callkeep.dart'; -import 'package:matrix/matrix.dart'; -import 'package:uuid/uuid.dart'; - -import 'package:fluffychat/utils/voip_plugin.dart'; - -class CallKeeper { - CallKeeper(this.callKeepManager, this.uuid, this.number, this.call) { - call?.onCallStateChanged.stream.listen(_handleCallState); - } - - CallKeepManager callKeepManager; - String number; - String uuid; - bool held = false; - bool muted = false; - bool connected = false; - CallSession? call; - - void _handleCallState(CallState state) { - Logs().v('CallKeepManager::handleCallState: ${state.toString()}'); - switch (state) { - case CallState.kConnecting: - break; - case CallState.kConnected: - if (!connected) { - callKeepManager.answer(uuid); - } else { - callKeepManager.setMutedCall(uuid, false); - callKeepManager.setOnHold(uuid, false); - } - break; - case CallState.kEnded: - callKeepManager.hangup(uuid); - break; - /* TODO: - case CallState.kMuted: - callKeepManager.setMutedCall(uuid, true); - break; - case CallState.kHeld: - callKeepManager.setOnHold(uuid, true); - break; - */ - case CallState.kFledgling: - // TODO: Handle this case. - break; - case CallState.kInviteSent: - // TODO: Handle this case. - break; - case CallState.kWaitLocalMedia: - // TODO: Handle this case. - break; - case CallState.kCreateOffer: - // TODO: Handle this case. - break; - case CallState.kCreateAnswer: - // TODO: Handle this case. - break; - case CallState.kRinging: - // TODO: Handle this case. - break; - } - } -} - -class CallKeepManager { - factory CallKeepManager() { - return _instance; - } - - CallKeepManager._internal() { - _callKeep = FlutterCallkeep(); - } - - static final CallKeepManager _instance = CallKeepManager._internal(); - - late FlutterCallkeep _callKeep; - VoipPlugin? _voipPlugin; - Map calls = {}; - - String newUUID() => const Uuid().v4(); - - String get appName => 'Famedly'; - - Map get alertOptions => { - 'alertTitle': 'Permissions required', - 'alertDescription': '$appName needs to access your phone accounts!', - 'cancelButton': 'Cancel', - 'okButton': 'ok', - // Required to get audio in background when using Android 11 - 'foregroundService': { - 'channelId': 'com.famedly.talk', - 'channelName': 'Foreground service for my app', - 'notificationTitle': '$appName is running on background', - 'notificationIcon': 'mipmap/ic_notification_launcher', - }, - }; - - void setVoipPlugin(VoipPlugin plugin) { - if (kIsWeb) { - throw 'Not support callkeep for flutter web'; - } - _voipPlugin = plugin; - _voipPlugin!.onIncomingCall = (CallSession call) async { - await _callKeep.setup( - null, - { - 'ios': { - 'appName': appName, - }, - 'android': alertOptions, - }, - backgroundMode: true); - - await displayIncomingCall(call); - - call.onCallStateChanged.stream.listen((state) { - if (state == CallState.kEnded) { - _callKeep.endAllCalls(); - } - }); - call.onCallEventChanged.stream.listen((event) { - if (event == CallEvent.kLocalHoldUnhold) { - Logs().i( - 'Call hold event: local ${call.localHold}, remote ${call.remoteOnHold}'); - } - }); - }; - } - - void removeCall(String callUUID) { - calls.remove(callUUID); - } - - void addCall(String callUUID, CallKeeper callKeeper) { - calls[callUUID] = callKeeper; - } - - String findCallUUID(String number) { - var uuid = ''; - calls.forEach((String key, CallKeeper item) { - if (item.number == number) { - uuid = key; - return; - } - }); - return uuid; - } - - void setCallHeld(String callUUID, bool held) { - calls[callUUID]!.held = held; - } - - void setCallMuted(String callUUID, bool muted) { - calls[callUUID]!.muted = muted; - } - - void didDisplayIncomingCall(CallKeepDidDisplayIncomingCall event) { - final callUUID = event.callUUID; - final number = event.handle; - Logs().v('[displayIncomingCall] $callUUID number: $number'); - addCall(callUUID!, CallKeeper(this, callUUID, number!, null)); - } - - void onPushKitToken(CallKeepPushKitToken event) { - Logs().v('[onPushKitToken] token => ${event.token}'); - } - - Future initialize() async { - _callKeep.on(CallKeepPerformAnswerCallAction(), answerCall); - _callKeep.on(CallKeepDidPerformDTMFAction(), didPerformDTMFAction); - _callKeep.on( - CallKeepDidReceiveStartCallAction(), didReceiveStartCallAction); - _callKeep.on(CallKeepDidToggleHoldAction(), didToggleHoldCallAction); - _callKeep.on( - CallKeepDidPerformSetMutedCallAction(), didPerformSetMutedCallAction); - _callKeep.on(CallKeepPerformEndCallAction(), endCall); - _callKeep.on(CallKeepPushKitToken(), onPushKitToken); - _callKeep.on(CallKeepDidDisplayIncomingCall(), didDisplayIncomingCall); - } - - Future hangup(String callUUID) async { - await _callKeep.endCall(callUUID); - removeCall(callUUID); - } - - Future reject(String callUUID) async { - await _callKeep.rejectCall(callUUID); - } - - Future answer(String callUUID) async { - final keeper = calls[callUUID]; - if (!keeper!.connected) { - await _callKeep.answerIncomingCall(callUUID); - keeper.connected = true; - } - } - - Future setOnHold(String callUUID, bool held) async { - await _callKeep.setOnHold(callUUID, held); - setCallHeld(callUUID, held); - } - - Future setMutedCall(String callUUID, bool muted) async { - await _callKeep.setMutedCall(callUUID, muted); - setCallMuted(callUUID, muted); - } - - Future updateDisplay(String callUUID) async { - final number = calls[callUUID]!.number; - // Workaround because Android doesn't display well displayName, se we have to switch ... - if (isIOS) { - await _callKeep.updateDisplay(callUUID, - displayName: 'New Name', handle: number); - } else { - await _callKeep.updateDisplay(callUUID, - displayName: number, handle: 'New Name'); - } - } - - Future displayIncomingCall(CallSession call) async { - final callUUID = newUUID(); - final callKeeper = CallKeeper(this, callUUID, call.displayName!, call); - addCall(callUUID, callKeeper); - await _callKeep.displayIncomingCall(callUUID, call.displayName!, - handleType: 'number', hasVideo: call.type == CallType.kVideo); - return callKeeper; - } - - Future checkoutPhoneAccountSetting(BuildContext context) async { - await _callKeep.setup(context, { - 'ios': { - 'appName': appName, - }, - 'android': alertOptions, - }); - final hasPhoneAccount = await _callKeep.hasPhoneAccount(); - if (!hasPhoneAccount) { - await _callKeep.hasDefaultPhoneAccount(context, alertOptions); - } - } - - /// CallActions. - Future answerCall(CallKeepPerformAnswerCallAction event) async { - final callUUID = event.callUUID; - final keeper = calls[event.callUUID]!; - if (!keeper.connected) { - // Answer Call - keeper.call!.answer(); - keeper.connected = true; - } - Timer(const Duration(seconds: 1), () { - _callKeep.setCurrentCallActive(callUUID!); - }); - } - - Future endCall(CallKeepPerformEndCallAction event) async { - final keeper = calls[event.callUUID]; - keeper?.call?.hangup(); - removeCall(event.callUUID!); - } - - Future didPerformDTMFAction(CallKeepDidPerformDTMFAction event) async { - final keeper = calls[event.callUUID]!; - keeper.call?.sendDTMF(event.digits!); - } - - Future didReceiveStartCallAction( - CallKeepDidReceiveStartCallAction event) async { - if (event.handle == null) { - // @TODO: sometime we receive `didReceiveStartCallAction` with handle` undefined` - return; - } - final callUUID = event.callUUID ?? newUUID(); - if (event.callUUID == null) { - final call = - await _voipPlugin!.voip.inviteToCall(event.handle!, CallType.kVideo); - addCall(callUUID, CallKeeper(this, callUUID, call.displayName!, call)); - } - await _callKeep.startCall(callUUID, event.handle!, event.handle!); - Timer(const Duration(seconds: 1), () { - _callKeep.setCurrentCallActive(callUUID); - }); - } - - Future didPerformSetMutedCallAction( - CallKeepDidPerformSetMutedCallAction event) async { - final keeper = calls[event.callUUID]!; - if (event.muted ?? false) { - keeper.call?.setMicrophoneMuted(true); - } else { - keeper.call?.setMicrophoneMuted(false); - } - setCallMuted(event.callUUID!, event.muted!); - } - - Future didToggleHoldCallAction( - CallKeepDidToggleHoldAction event) async { - final keeper = calls[event.callUUID]!; - if (event.hold ?? false) { - keeper.call?.setRemoteOnHold(true); - } else { - keeper.call?.setRemoteOnHold(false); - } - setCallHeld(event.callUUID!, event.hold!); - } -} diff --git a/lib/utils/voip/user_media_manager.dart b/lib/utils/voip/user_media_manager.dart index 874da93ee1..f5ea532ffd 100644 --- a/lib/utils/voip/user_media_manager.dart +++ b/lib/utils/voip/user_media_manager.dart @@ -1,10 +1,10 @@ -import 'package:flutter/foundation.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_ringtone_player/flutter_ringtone_player.dart'; import 'package:just_audio/just_audio.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; - class UserMediaManager { factory UserMediaManager() { return _instance; @@ -17,22 +17,15 @@ class UserMediaManager { AudioPlayer? _assetsAudioPlayer; Future startRingingTone() async { - if (PlatformInfos.isMobile) { - await FlutterRingtonePlayer.playRingtone(volume: 80); - } else if ((kIsWeb || PlatformInfos.isMacOS) && - _assetsAudioPlayer != null) { - const path = 'assets/sounds/phone.ogg'; - final player = _assetsAudioPlayer = AudioPlayer(); - player.setAsset(path); - player.play(); - } + const path = 'assets/sounds/phone.ogg'; + final player = _assetsAudioPlayer = AudioPlayer(); + player.setAsset(path); + player.play(); + return; } Future stopRingingTone() async { - if (PlatformInfos.isMobile) { - await FlutterRingtonePlayer.stop(); - } await _assetsAudioPlayer?.stop(); _assetsAudioPlayer = null; return; diff --git a/lib/utils/voip/video_renderer.dart b/lib/utils/voip/video_renderer.dart new file mode 100644 index 0000000000..ceab2dc262 --- /dev/null +++ b/lib/utils/voip/video_renderer.dart @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'package:flutter_webrtc/flutter_webrtc.dart'; +import 'package:matrix/matrix.dart'; + +class VideoRenderer extends StatefulWidget { + final WrappedMediaStream? stream; + final bool mirror; + final RTCVideoViewObjectFit fit; + + const VideoRenderer( + this.stream, { + this.mirror = false, + this.fit = RTCVideoViewObjectFit.RTCVideoViewObjectFitContain, + super.key, + }); + + @override + State createState() => _VideoRendererState(); +} + +class _VideoRendererState extends State { + RTCVideoRenderer? _renderer; + bool _rendererReady = false; + MediaStream? get mediaStream => widget.stream?.stream; + StreamSubscription? _streamChangeSubscription; + + Future _initializeRenderer() async { + _renderer ??= RTCVideoRenderer(); + await _renderer!.initialize(); + _renderer!.srcObject = mediaStream; + return _renderer!; + } + + void disposeRenderer() { + try { + _renderer?.srcObject = null; + _renderer?.dispose(); + _renderer = null; + // ignore: empty_catches + } catch (e) {} + } + + @override + void initState() { + _streamChangeSubscription = widget.stream?.onStreamChanged.stream.listen(( + stream, + ) { + setState(() { + _renderer?.srcObject = stream; + }); + }); + setupRenderer(); + super.initState(); + } + + Future setupRenderer() async { + await _initializeRenderer(); + setState(() => _rendererReady = true); + } + + @override + void dispose() { + _streamChangeSubscription?.cancel(); + disposeRenderer(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => !_rendererReady + ? Container() + : Builder( + key: widget.key, + builder: (ctx) { + return RTCVideoView( + _renderer!, + mirror: widget.mirror, + filterQuality: FilterQuality.medium, + objectFit: widget.fit, + placeholderBuilder: (_) => + Container(color: Colors.white.withAlpha(45)), + ); + }, + ); +} diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index c14207214e..903cc7fea7 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -1,127 +1,89 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:core'; +import 'package:fluffychat/pages/dialer/dialer.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc_impl; import 'package:matrix/matrix.dart'; import 'package:webrtc_interface/webrtc_interface.dart' hide Navigator; -import 'package:fluffychat/pages/dialer/dialer.dart'; import '../../utils/voip/user_media_manager.dart'; +import '../widgets/matrix.dart'; -class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { - VoipPlugin({required this.client, required this.context}) { +class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { + final MatrixState matrix; + Client get client => matrix.client; + VoipPlugin(this.matrix) { voip = VoIP(client, this); - try { - Connectivity() - .onConnectivityChanged - .listen(_handleNetworkChanged) - .onError((e) => _currentConnectivity = ConnectivityResult.none); - } catch (e, s) { - Logs().w('Could not subscribe network updates', e, s); - } - Connectivity() - .checkConnectivity() - .then((result) => _currentConnectivity = result) - .catchError((e) => _currentConnectivity = ConnectivityResult.none); if (!kIsWeb) { final wb = WidgetsBinding.instance; wb.addObserver(this); - didChangeAppLifecycleState(wb.lifecycleState!); + didChangeAppLifecycleState(wb.lifecycleState); } } - - final Client client; bool background = false; bool speakerOn = false; late VoIP voip; - ConnectivityResult? _currentConnectivity; - ValueChanged? onIncomingCall; OverlayEntry? overlayEntry; - - // hacky workaround: in order to have [Overlay.of] working on web, the context - // mus explicitly be re-assigned - // - // hours wasted: 5 - BuildContext context; - - void _handleNetworkChanged(ConnectivityResult result) async { - /// Got a new connectivity status! - if (_currentConnectivity != result) { - voip.calls.forEach((_, sess) { - sess.restartIce(); - }); - } - _currentConnectivity = result; - } + BuildContext? context; @override - void didChangeAppLifecycleState(AppLifecycleState state) { - Logs().v('AppLifecycleState = $state'); - background = !(state != AppLifecycleState.detached && - state != AppLifecycleState.paused); + void didChangeAppLifecycleState(AppLifecycleState? state) { + background = + (state == AppLifecycleState.detached || + state == AppLifecycleState.paused); } - void addCallingOverlay( - BuildContext context, String callId, CallSession call) { + void addCallingOverlay(String callId, CallSession call) { + final context = this.context; + if (context == null || !context.mounted) { + throw ('addCallingOverlay because of missing context', context); + } + if (overlayEntry != null) { - Logs().w('[VOIP] addCallingOverlay: The call session already exists?'); - overlayEntry?.remove(); + Logs().e('[VOIP] addCallingOverlay: The call session already exists?'); + overlayEntry!.remove(); } - // Overlay.of(context) is broken on web - // falling back on a dialog - if (kIsWeb) { - showDialog( + + overlayEntry = OverlayEntry( + builder: (_) => Calling( context: context, - builder: (context) => Calling( - context: context, - client: client, - callId: callId, - call: call, - onClear: () => Navigator.of(context).pop(), - ), - ); - } else { - overlayEntry = OverlayEntry( - builder: (_) => Calling( - context: context, - client: client, - callId: callId, - call: call, - onClear: () { - overlayEntry?.remove(); - overlayEntry = null; - }), - ); - Overlay.of(context)!.insert(overlayEntry!); - } + client: client, + callId: callId, + call: call, + onClear: () { + overlayEntry?.remove(); + overlayEntry = null; + }, + ), + ); + Overlay.of(context).insert(overlayEntry!); } @override MediaDevices get mediaDevices => webrtc_impl.navigator.mediaDevices; - @override - bool get isBackgroud => background; - @override bool get isWeb => kIsWeb; @override Future createPeerConnection( - Map configuration, - [Map constraints = const {}]) => - webrtc_impl.createPeerConnection(configuration, constraints); + Map configuration, [ + Map constraints = const {}, + ]) => webrtc_impl.createPeerConnection(configuration, constraints); - @override - VideoRenderer createRenderer() { - return webrtc_impl.RTCVideoRenderer(); - } + Future get hasCallingAccount async => false; @override - void playRingtone() async { - if (!background) { + Future playRingtone() async { + if (!background && !await hasCallingAccount) { try { await UserMediaManager().startRingingTone(); } catch (_) {} @@ -129,8 +91,8 @@ class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { } @override - void stopRingtone() async { - if (!background) { + Future stopRingtone() async { + if (!background && !await hasCallingAccount) { try { await UserMediaManager().stopRingingTone(); } catch (_) {} @@ -138,36 +100,74 @@ class VoipPlugin extends WidgetsBindingObserver implements WebRTCDelegate { } @override - void handleNewCall(CallSession call) async { - /// Popup CallingPage for incoming call. - if (!background) { - addCallingOverlay(context, call.callId, call); + Future handleNewCall(CallSession call) async { + if (PlatformInfos.isAndroid) { + try { + final wasForeground = await FlutterForegroundTask.isAppOnForeground; + + await matrix.store.setString( + 'wasForeground', + wasForeground == true ? 'true' : 'false', + ); + FlutterForegroundTask.setOnLockScreenVisibility(true); + FlutterForegroundTask.wakeUpScreen(); + FlutterForegroundTask.launchApp(); + } catch (e) { + Logs().e('VOIP foreground failed $e'); + } + // use fallback flutter call pages for outgoing and video calls. + addCallingOverlay(call.callId, call); } else { - onIncomingCall?.call(call); + addCallingOverlay(call.callId, call); } } @override - void handleCallEnded(CallSession session) async { + Future handleCallEnded(CallSession session) async { if (overlayEntry != null) { - overlayEntry?.remove(); + overlayEntry!.remove(); overlayEntry = null; + if (PlatformInfos.isAndroid) { + FlutterForegroundTask.setOnLockScreenVisibility(false); + FlutterForegroundTask.stopService(); + final wasForeground = matrix.store.getString('wasForeground'); + if (wasForeground == 'false') FlutterForegroundTask.minimizeApp(); + } } } @override - void handleGroupCallEnded(GroupCall groupCall) { + Future handleGroupCallEnded(GroupCallSession groupCall) async { // TODO: implement handleGroupCallEnded } @override - void handleNewGroupCall(GroupCall groupCall) { + Future handleNewGroupCall(GroupCallSession groupCall) async { // TODO: implement handleNewGroupCall + return; + } + + @override + // TODO: implement canHandleNewCall + bool get canHandleNewCall => + voip.currentCID == null && voip.currentGroupCID == null; + + @override + Future handleMissedCall(CallSession session) async { + // TODO: implement handleMissedCall + return; + } + + @override + // TODO: implement keyProvider + EncryptionKeyProvider? get keyProvider { + // TODO: Implement me + return null; } @override - Future cloneStream(webrtc_impl.MediaStream stream) { - // TODO: implement cloneStream - throw UnimplementedError(); + Future registerListeners(CallSession session) async { + // TODO: Implement me + return; } } diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart new file mode 100644 index 0000000000..6bb513e9e1 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -0,0 +1,164 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class AdaptiveDialogAction extends StatelessWidget { + final VoidCallback? onPressed; + final bool autofocus; + final Widget child; + final bool bigButtons; + final BorderRadius? borderRadius; + + static const BorderRadius topRadius = BorderRadius.only( + topLeft: Radius.circular(AppConfig.borderRadius), + topRight: Radius.circular(AppConfig.borderRadius), + bottomLeft: Radius.circular(2), + bottomRight: Radius.circular(2), + ); + static const BorderRadius centerRadius = BorderRadius.all(Radius.circular(2)); + static const BorderRadius bottomRadius = BorderRadius.only( + bottomLeft: Radius.circular(AppConfig.borderRadius), + bottomRight: Radius.circular(AppConfig.borderRadius), + topLeft: Radius.circular(2), + topRight: Radius.circular(2), + ); + + const AdaptiveDialogAction({ + super.key, + required this.onPressed, + required this.child, + this.autofocus = false, + this.bigButtons = false, + this.borderRadius, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.linux: + case TargetPlatform.windows: + if (bigButtons) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 2.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: + borderRadius ?? + BorderRadius.circular(AppConfig.borderRadius), + ), + backgroundColor: autofocus + ? theme.colorScheme.primary + : theme.colorScheme.surfaceBright, + foregroundColor: autofocus + ? theme.colorScheme.onPrimary + : theme.colorScheme.primary, + ), + onPressed: onPressed, + autofocus: autofocus, + child: child, + ), + ), + ); + } + return TextButton( + onPressed: onPressed, + autofocus: autofocus, + child: child, + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return CupertinoDialogAction( + onPressed: onPressed, + isDefaultAction: autofocus, + child: child, + ); + } + } +} + +class AdaptiveDialogInkWell extends StatelessWidget { + final Widget child; + final VoidCallback? onTap; + final EdgeInsets padding; + + const AdaptiveDialogInkWell({ + super.key, + required this.onTap, + required this.child, + this.padding = const EdgeInsets.all(16), + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if ({TargetPlatform.iOS, TargetPlatform.macOS}.contains(theme.platform)) { + return CupertinoButton( + onPressed: onTap, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.surfaceBright, + padding: padding, + child: child, + ); + } + return Material( + color: onTap == null + ? theme.colorScheme.surfaceContainer + : theme.colorScheme.surfaceBright, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: InkWell( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + onTap: onTap, + child: Padding( + padding: padding, + child: Center(child: child), + ), + ), + ); + } +} + +class AdaptiveIconTextButton extends StatelessWidget { + final String label; + final IconData icon; + final VoidCallback? onTap; + const AdaptiveIconTextButton({ + super.key, + required this.label, + required this.icon, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme.secondary; + return Expanded( + child: AdaptiveDialogInkWell( + padding: EdgeInsets.all(8.0), + onTap: onTap, + child: Column( + mainAxisSize: .min, + children: [ + Icon(icon, color: color), + Text( + label, + style: TextStyle(fontSize: 12, color: color), + maxLines: 1, + overflow: .ellipsis, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/adaptive_dialogs/dialog_text_field.dart b/lib/widgets/adaptive_dialogs/dialog_text_field.dart new file mode 100644 index 0000000000..5cc1cb2d04 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/dialog_text_field.dart @@ -0,0 +1,120 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class DialogTextField extends StatelessWidget { + final TextEditingController? controller; + final String? hintText; + final String? labelText; + final String? initialText; + final String? counterText; + final String? prefixText; + final String? suffixText; + final String? errorText; + final bool obscureText; + final bool isDestructive = false; + final int? minLines; + final int? maxLines; + final TextInputType? keyboardType; + final int? maxLength; + final bool autocorrect = true; + final bool readOnly; + final TextStyle? textStyle; + + const DialogTextField({ + super.key, + this.hintText, + this.labelText, + this.initialText, + this.prefixText, + this.suffixText, + this.minLines, + this.maxLines, + this.keyboardType, + this.maxLength, + this.controller, + this.counterText, + this.errorText, + this.obscureText = false, + this.readOnly = false, + this.textStyle, + }); + + @override + Widget build(BuildContext context) { + final prefixText = this.prefixText; + final suffixText = this.suffixText; + final errorText = this.errorText; + final theme = Theme.of(context); + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.linux: + case TargetPlatform.windows: + return TextField( + readOnly: readOnly, + controller: controller, + obscureText: obscureText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + autocorrect: autocorrect, + style: textStyle, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + borderSide: BorderSide(color: theme.dividerColor), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + borderSide: BorderSide(color: theme.dividerColor), + ), + filled: true, + fillColor: theme.colorScheme.surfaceBright, + errorText: errorText, + hintText: hintText, + labelText: labelText, + prefixText: prefixText, + suffixText: suffixText, + counterText: counterText, + ), + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + final placeholder = labelText ?? hintText; + return Column( + children: [ + SizedBox( + height: placeholder == null ? null : ((maxLines ?? 1) + 1) * 20, + child: CupertinoTextField( + controller: controller, + readOnly: readOnly, + obscureText: obscureText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + autocorrect: autocorrect, + style: textStyle, + prefix: prefixText != null ? Text(prefixText) : null, + suffix: suffixText != null ? Text(suffixText) : null, + placeholder: placeholder, + ), + ), + if (errorText != null) + Text( + errorText, + style: TextStyle(fontSize: 11, color: theme.colorScheme.error), + textAlign: TextAlign.left, + ), + ], + ); + } + } +} diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart new file mode 100644 index 0000000000..37f9624aa7 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -0,0 +1,308 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import '../../config/themes.dart'; +import '../../utils/url_launcher.dart'; +import '../avatar.dart'; +import '../future_loading_dialog.dart'; +import '../hover_builder.dart'; +import '../matrix.dart'; +import '../mxc_image_viewer.dart'; +import 'adaptive_dialog_action.dart'; + +class PublicRoomDialog extends StatelessWidget { + final String? roomAlias; + final PublishedRoomsChunk? chunk; + final List? via; + + const PublicRoomDialog({super.key, this.roomAlias, this.chunk, this.via}); + + Future _joinRoom(BuildContext context) async { + final l10n = L10n.of(context); + final client = Matrix.of(context).client; + final chunk = this.chunk; + final knock = chunk?.joinRule == 'knock'; + final result = await showFutureLoadingDialog( + context: context, + future: () async { + if (chunk != null && + client.getRoomById(chunk.roomId) != null && + client.getRoomById(chunk.roomId)?.membership != Membership.leave) { + return chunk.roomId; + } + final roomId = chunk != null && knock + ? await client.knockRoom(chunk.roomId, via: via) + : await client.joinRoom(roomAlias ?? chunk!.roomId, via: via); + + if (!knock && client.getRoomById(roomId) == null) { + await client.waitForRoomInSync(roomId); + } + return roomId; + }, + ); + final roomId = result.result; + if (roomId == null) return; + if (!context.mounted) return; + if (knock && client.getRoomById(roomId) == null) { + Navigator.of(context).pop(true); + await showOkAlertDialog( + context: context, + title: l10n.youHaveKnocked, + message: l10n.pleaseWaitUntilInvited, + ); + return; + } + if (result.error != null) return; + if (!context.mounted) return; + Navigator.of(context).pop(true); + // don't open the room if the joined room is a space + if (chunk?.roomType != 'm.space' && + !client.getRoomById(result.result!)!.isSpace) { + context.go('/rooms/$roomId'); + } else { + context.go('/rooms?spaceId=$roomId'); + } + return; + } + + bool _testRoom(PublishedRoomsChunk r) => r.canonicalAlias == roomAlias; + + Future _search(BuildContext context) async { + final l10n = L10n.of(context); + final chunk = this.chunk; + if (chunk != null) return chunk; + final query = await Matrix.of(context).client.queryPublicRooms( + server: roomAlias!.domain, + filter: PublicRoomQueryFilter(genericSearchTerm: roomAlias), + ); + if (!query.chunk.any(_testRoom)) { + throw (l10n.noRoomsFound); + } + return query.chunk.firstWhere(_testRoom); + } + + @override + Widget build(BuildContext context) { + final roomAlias = this.roomAlias ?? chunk?.canonicalAlias; + final roomLink = roomAlias ?? chunk?.roomId; + var copied = false; + return AlertDialog.adaptive( + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: FutureBuilder( + future: _search(context), + builder: (context, snapshot) { + final theme = Theme.of(context); + + final profile = snapshot.data; + final avatar = profile?.avatarUrl; + final topic = profile?.topic; + return SingleChildScrollView( + child: Column( + spacing: 8, + mainAxisSize: .min, + crossAxisAlignment: .stretch, + children: [ + Row( + spacing: 12, + children: [ + Avatar( + mxContent: avatar, + name: profile?.name ?? roomLink, + size: Avatar.defaultSize * 1.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + Expanded( + child: Column( + crossAxisAlignment: .start, + children: [ + Text( + profile?.name ?? + roomLink ?? + profile?.roomId ?? + ' - ', + maxLines: 1, + overflow: .ellipsis, + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: 8), + if (roomLink != null) + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: roomLink), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only( + right: 4.0, + ), + child: AnimatedScale( + duration: FluffyThemes + .animationDuration, + curve: FluffyThemes + .animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied + ? Colors.green + : null, + ), + ), + ), + ), + TextSpan(text: roomLink), + ], + style: theme.textTheme.bodyMedium + ?.copyWith(fontSize: 10), + ), + maxLines: 1, + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + + if (profile?.numJoinedMembers != null) + Text( + L10n.of(context).countParticipants( + profile?.numJoinedMembers ?? 0, + ), + style: const TextStyle(fontSize: 10), + textAlign: TextAlign.center, + ), + ], + ), + ), + ], + ), + if (topic != null && topic.isNotEmpty) + ConstrainedBox( + constraints: BoxConstraints(maxHeight: 200), + child: Scrollbar( + thumbVisibility: true, + trackVisibility: true, + child: SingleChildScrollView( + child: SelectableLinkify( + text: topic, + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + textAlign: .start, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + ), + + Row( + mainAxisAlignment: .spaceBetween, + spacing: 4, + children: [ + AdaptiveIconTextButton( + label: L10n.of(context).report, + icon: Icons.gavel_outlined, + onTap: () async { + Navigator.of(context).pop(); + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).report, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.reportRoom( + chunk?.roomId ?? roomAlias!, + reason, + ), + ); + }, + ), + AdaptiveIconTextButton( + label: L10n.of(context).copy, + icon: Icons.copy_outlined, + onTap: () => + Clipboard.setData(ClipboardData(text: roomLink!)), + ), + AdaptiveIconTextButton( + label: L10n.of(context).share, + icon: Icons.adaptive.share, + onTap: () => FluffyShare.share( + 'https://matrix.to/#/$roomLink', + context, + ), + ), + ], + ), + AdaptiveDialogInkWell( + onTap: () => _joinRoom(context), + child: Text( + chunk?.joinRule == 'knock' && + Matrix.of( + context, + ).client.getRoomById(chunk!.roomId) == + null + ? L10n.of(context).knock + : chunk?.roomType == 'm.space' + ? L10n.of(context).joinSpace + : L10n.of(context).joinRoom, + style: TextStyle(color: theme.colorScheme.secondary), + ), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart b/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart new file mode 100644 index 0000000000..e3b5ba8699 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_modal_action_popup.dart @@ -0,0 +1,119 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +Future showModalActionPopup({ + required BuildContext context, + required List> actions, + String? title, + String? message, + String? cancelLabel, + bool useRootNavigator = true, +}) { + final theme = Theme.of(context); + + switch (theme.platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + case TargetPlatform.windows: + case TargetPlatform.linux: + return showModalBottomSheet( + isScrollControlled: true, + useRootNavigator: useRootNavigator, + context: context, + clipBehavior: Clip.hardEdge, + constraints: BoxConstraints( + maxWidth: 512, + maxHeight: MediaQuery.sizeOf(context).height - 32, + ), + builder: (context) => ListView( + shrinkWrap: true, + children: [ + if (title != null || message != null) ...[ + ListTile( + title: title == null + ? null + : Text(title, style: theme.textTheme.labelSmall), + subtitle: message == null ? null : Text(message), + ), + const Divider(height: 1), + ], + ...actions.map( + (action) => ListTile( + leading: action.icon, + title: Text( + action.label, + maxLines: 1, + style: action.isDestructive + ? TextStyle( + color: theme.colorScheme.error, + fontWeight: action.isDefaultAction + ? FontWeight.bold + : null, + ) + : null, + ), + onTap: () => Navigator.of(context).pop(action.value), + ), + ), + if (cancelLabel != null) ...[ + const Divider(height: 1), + ListTile( + title: Text(cancelLabel), + onTap: () => Navigator.of(context).pop(null), + ), + ], + ], + ), + ); + case TargetPlatform.iOS: + case TargetPlatform.macOS: + return showCupertinoModalPopup( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 512), + child: CupertinoActionSheet( + title: title == null ? null : Text(title), + message: message == null ? null : Text(message), + cancelButton: cancelLabel == null + ? null + : CupertinoActionSheetAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(cancelLabel), + ), + actions: actions + .map( + (action) => CupertinoActionSheetAction( + isDestructiveAction: action.isDestructive, + isDefaultAction: action.isDefaultAction, + onPressed: () => Navigator.of(context).pop(action.value), + child: Text(action.label, maxLines: 1), + ), + ) + .toList(), + ), + ), + ); + } +} + +class AdaptiveModalAction { + final String label; + final T value; + Icon? icon; + final bool isDefaultAction; + final bool isDestructive; + + AdaptiveModalAction({ + required this.label, + required this.value, + this.icon, + this.isDefaultAction = false, + this.isDestructive = false, + }); +} diff --git a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart new file mode 100644 index 0000000000..364a41c080 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart @@ -0,0 +1,106 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; + +enum OkCancelResult { ok, cancel } + +Future showOkCancelAlertDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + String? cancelLabel, + bool isDestructive = false, + bool useRootNavigator = true, +}) => showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: message == null + ? null + : SelectableLinkify( + text: message, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + decorationColor: Theme.of(context).colorScheme.primary, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + actions: [ + AdaptiveDialogAction( + key: Key('ok_cancel_alert_dialog_cancel_button'), + onPressed: () => + Navigator.of(context).pop(OkCancelResult.cancel), + child: Text(cancelLabel ?? L10n.of(context).cancel), + ), + AdaptiveDialogAction( + key: Key('ok_cancel_alert_dialog_ok_button'), + onPressed: () => + Navigator.of(context).pop(OkCancelResult.ok), + autofocus: true, + child: Text( + okLabel ?? L10n.of(context).ok, + style: isDestructive + ? TextStyle(color: Theme.of(context).colorScheme.error) + : null, + ), + ), + ], + ), +); + +Future showOkAlertDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + bool useRootNavigator = true, +}) => showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) => AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: message == null + ? null + : SelectableLinkify( + text: message, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + decorationColor: Theme.of(context).colorScheme.primary, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => + Navigator.of(context).pop(OkCancelResult.ok), + autofocus: true, + child: Text(okLabel ?? L10n.of(context).close), + ), + ], + ), +); diff --git a/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart new file mode 100644 index 0000000000..1e1ae6c6e8 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart @@ -0,0 +1,111 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; + +Future showTextInputDialog({ + required BuildContext context, + required String title, + String? message, + String? okLabel, + String? cancelLabel, + bool useRootNavigator = true, + String? hintText, + String? labelText, + String? initialText, + String? prefixText, + String? suffixText, + bool obscureText = false, + bool isDestructive = false, + int? minLines, + int? maxLines, + String? Function(String input)? validator, + TextInputType? keyboardType, + int? maxLength, + bool autocorrect = true, +}) { + final controller = TextEditingController(text: initialText); + return showAdaptiveDialog( + context: context, + useRootNavigator: useRootNavigator, + builder: (context) { + final error = ValueNotifier(null); + return AlertDialog.adaptive( + title: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Text(title), + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Column( + mainAxisSize: .min, + children: [ + if (message != null) + SelectableLinkify( + text: message, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + linkStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + decorationColor: Theme.of(context).colorScheme.primary, + ), + options: const LinkifyOptions(humanize: false), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), + ), + const SizedBox(height: 16), + ValueListenableBuilder( + valueListenable: error, + builder: (context, error, _) { + return DialogTextField( + hintText: hintText, + errorText: error, + labelText: labelText, + controller: controller, + initialText: initialText, + prefixText: prefixText, + suffixText: suffixText, + minLines: minLines, + maxLines: maxLines, + maxLength: maxLength, + keyboardType: keyboardType, + obscureText: obscureText, + ); + }, + ), + ], + ), + ), + actions: [ + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(cancelLabel ?? L10n.of(context).cancel), + ), + AdaptiveDialogAction( + onPressed: () { + final input = controller.text; + final errorText = validator?.call(input); + if (errorText != null) { + error.value = errorText; + return; + } + Navigator.of(context).pop(input); + }, + autofocus: true, + child: Text( + okLabel ?? L10n.of(context).ok, + style: isDestructive + ? TextStyle(color: Theme.of(context).colorScheme.error) + : null, + ), + ), + ], + ); + }, + ); +} diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart new file mode 100644 index 0000000000..779dd45ff2 --- /dev/null +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -0,0 +1,274 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +import '../../utils/url_launcher.dart'; +import '../future_loading_dialog.dart'; +import '../hover_builder.dart'; +import '../matrix.dart'; +import '../mxc_image_viewer.dart'; + +// ignore: unused_import + +class UserDialog extends StatelessWidget { + static Future show({ + required BuildContext context, + required Profile profile, + bool noProfileWarning = false, + }) => showAdaptiveDialog( + context: context, + barrierDismissible: true, + builder: (context) => + UserDialog(profile, noProfileWarning: noProfileWarning), + ); + + final Profile profile; + final bool noProfileWarning; + + const UserDialog(this.profile, {this.noProfileWarning = false, super.key}); + + @override + Widget build(BuildContext context) { + final client = Matrix.of(context).client; + final directChatRoomId = client.getDirectChatFromUserId(profile.userId); + final displayname = + profile.displayName ?? + profile.userId.localpart ?? + L10n.of(context).user; + var copied = false; + final theme = Theme.of(context); + final avatar = profile.avatarUrl; + return AlertDialog.adaptive( + content: PresenceBuilder( + userId: profile.userId, + client: Matrix.of(context).client, + builder: (context, presence) { + if (presence == null) return const SizedBox.shrink(); + final statusMsg = presence.statusMsg; + final lastActiveTimestamp = presence.lastActiveTimestamp; + final presenceText = presence.currentlyActive == true + ? L10n.of(context).currentlyActive + : lastActiveTimestamp != null + ? L10n.of( + context, + ).lastActiveAgo(lastActiveTimestamp.localizedTimeShort(context)) + : null; + return Column( + spacing: 8, + mainAxisSize: .min, + crossAxisAlignment: .stretch, + children: [ + Row( + spacing: 12, + children: [ + Avatar( + mxContent: avatar, + name: displayname, + size: Avatar.defaultSize * 1.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + Expanded( + child: Column( + crossAxisAlignment: .start, + children: [ + Text( + displayname, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: 8), + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: profile.userId), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only( + right: 4.0, + ), + child: AnimatedScale( + duration: + FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied + ? Colors.green + : null, + ), + ), + ), + ), + TextSpan(text: profile.userId), + ], + style: theme.textTheme.bodyMedium?.copyWith( + fontSize: 10, + ), + ), + maxLines: 1, + overflow: .ellipsis, + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + if (presenceText != null) + Text( + presenceText, + style: theme.textTheme.bodyMedium?.copyWith( + fontSize: 10, + ), + ), + ], + ), + ), + ], + ), + + if (statusMsg != null) + ConstrainedBox( + constraints: BoxConstraints(maxHeight: 200), + child: Scrollbar( + thumbVisibility: true, + trackVisibility: true, + child: SingleChildScrollView( + child: SelectableLinkify( + text: statusMsg, + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + textAlign: TextAlign.start, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ), + ), + ), + Row( + mainAxisAlignment: .spaceBetween, + spacing: 4, + children: [ + AdaptiveIconTextButton( + label: L10n.of(context).block, + icon: Icons.block_outlined, + onTap: client.userID == profile.userId + ? null + : () { + final router = GoRouter.of(context); + Navigator.of(context).pop(); + router.go( + '/rooms/settings/security/ignorelist', + extra: profile.userId, + ); + }, + ), + AdaptiveIconTextButton( + label: L10n.of(context).report, + icon: Icons.gavel_outlined, + onTap: client.userID == profile.userId + ? null + : () async { + Navigator.of(context).pop(); + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).report, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of( + context, + ).client.reportUser(profile.userId, reason), + ); + }, + ), + AdaptiveIconTextButton( + label: L10n.of(context).share, + icon: Icons.adaptive.share, + onTap: () => FluffyShare.share( + 'https://matrix.to/#/${profile.userId}', + context, + ), + ), + ], + ), + AdaptiveDialogInkWell( + onTap: client.userID == profile.userId + ? null + : () async { + final router = GoRouter.of(context); + final roomIdResult = await showFutureLoadingDialog( + context: context, + future: () => client.startDirectChat(profile.userId), + ); + final roomId = roomIdResult.result; + if (roomId == null) return; + if (context.mounted) Navigator.of(context).pop(); + router.go('/rooms/$roomId'); + }, + child: Text( + directChatRoomId == null + ? L10n.of(context).createNewChat + : L10n.of(context).sendAMessage, + style: TextStyle(color: theme.colorScheme.secondary), + ), + ), + ], + ); + }, + ), + ); + } +} diff --git a/lib/widgets/adaptive_flat_button.dart b/lib/widgets/adaptive_flat_button.dart deleted file mode 100644 index 7faa7eed48..0000000000 --- a/lib/widgets/adaptive_flat_button.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; - -class AdaptiveFlatButton extends StatelessWidget { - final String label; - final Color? textColor; - final void Function()? onPressed; - - const AdaptiveFlatButton({ - Key? key, - required this.label, - this.textColor, - this.onPressed, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - if (PlatformInfos.isCupertinoStyle) { - return CupertinoDialogAction( - onPressed: onPressed, - textStyle: textColor != null ? TextStyle(color: textColor) : null, - child: Text(label), - ); - } - return TextButton( - onPressed: onPressed, - child: Text( - label, - style: TextStyle(color: textColor), - ), - ); - } -} diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart new file mode 100644 index 0000000000..f19ea49d3c --- /dev/null +++ b/lib/widgets/app_lock.dart @@ -0,0 +1,146 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/widgets/lock_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:provider/provider.dart'; + +class AppLockWidget extends StatefulWidget { + const AppLockWidget({ + required this.child, + required this.pincode, + required this.useBiometrics, + required this.isLoggedIn, + super.key, + }); + + final bool isLoggedIn, useBiometrics; + final String? pincode; + final Widget child; + + @override + State createState() => AppLock(); +} + +class AppLock extends State with WidgetsBindingObserver { + String? _pincode; + bool _isLocked = false; + bool _useBiometrics = false; + bool _triedAutoBiometrics = false; + bool _paused = false; + bool get isActive => + _pincode != null && + int.tryParse(_pincode!) != null && + _pincode!.length >= 4 && + !_paused; + bool get useBiometrics => _useBiometrics; + + @override + void initState() { + _useBiometrics = widget.useBiometrics; + _pincode = widget.pincode; + _isLocked = isActive; + super.initState(); + WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance.addPostFrameCallback(_checkLoggedIn); + if (isActive && useBiometrics) unlockWithBiometrics(); + } + + Future _checkLoggedIn(_) async { + if (widget.isLoggedIn) return; + + await changePincode(null); + setState(() { + _isLocked = false; + }); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (isActive && state == AppLifecycleState.hidden && !_isLocked) { + showLockScreen(); + } + if (_isLocked && + state == AppLifecycleState.resumed && + useBiometrics && + !_triedAutoBiometrics) { + unlockWithBiometrics(); + } + } + + bool get isLocked => _isLocked; + + Future changeUseBiometrics(bool useBiometrics) async { + await const FlutterSecureStorage().write( + key: 'chat.fluffy.use_biometrics', + value: useBiometrics.toString(), + ); + _useBiometrics = useBiometrics; + return; + } + + Future changePincode(String? pincode) async { + await const FlutterSecureStorage().write( + key: 'chat.fluffy.app_lock', + value: pincode, + ); + _pincode = pincode; + return; + } + + Future unlockWithBiometrics() async { + _triedAutoBiometrics = true; + final localAuth = LocalAuthentication(); + final unlocked = await localAuth.authenticate( + localizedReason: 'Please authenticate to unlock the app.', + persistAcrossBackgrounding: true, + biometricOnly: true, + ); + if (unlocked) { + setState(() { + _isLocked = false; + _triedAutoBiometrics = false; + }); + } + return unlocked; + } + + bool unlock(String pincode) { + final isCorrect = pincode == _pincode; + if (isCorrect) { + setState(() { + _isLocked = false; + }); + } + return isCorrect; + } + + void showLockScreen() => setState(() { + _isLocked = true; + }); + + Future pauseWhile(Future future) async { + _paused = true; + try { + return await future; + } finally { + _paused = false; + } + } + + static AppLock of(BuildContext context) => + Provider.of(context, listen: false); + + @override + Widget build(BuildContext context) => Provider( + create: (_) => this, + child: Stack( + fit: StackFit.expand, + children: [widget.child, if (isLocked) const LockScreen()], + ), + ); +} diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index 0d90f31dd3..8ef1126149 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -1,19 +1,28 @@ -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:matrix/matrix.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later import 'package:fluffychat/utils/string_color.dart'; -import 'matrix.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class Avatar extends StatelessWidget { final Uri? mxContent; final String? name; final double size; final void Function()? onTap; - static const double defaultSize = 44; + static const double defaultSize = 48; final Client? client; - final double fontSize; + final String? presenceUserId; + final Color? presenceBackgroundColor; + final BorderRadius? borderRadius; + final IconData? icon; + final ShapeBorder? shapeBorder; + final Color? backgroundColor; + final Color? textColor; const Avatar({ this.mxContent, @@ -21,73 +30,131 @@ class Avatar extends StatelessWidget { this.size = defaultSize, this.onTap, this.client, - this.fontSize = 18, - Key? key, - }) : super(key: key); + this.presenceUserId, + this.presenceBackgroundColor, + this.borderRadius, + this.shapeBorder, + this.icon, + this.backgroundColor, + this.textColor, + super.key, + }); @override Widget build(BuildContext context) { - final src = mxContent?.getThumbnail( - client ?? Matrix.of(context).client, - width: size * MediaQuery.of(context).devicePixelRatio, - height: size * MediaQuery.of(context).devicePixelRatio, - ); - var fallbackLetters = '@'; + final theme = Theme.of(context); + final name = this.name; - if (name != null) { - if (name.runes.length >= 2) { - fallbackLetters = String.fromCharCodes(name.runes, 0, 2); - } else if (name.runes.length == 1) { - fallbackLetters = name; - } - } - final noPic = mxContent == null || + final fallbackLetters = name == null || name.isEmpty + ? '@' + : name.substring(0, 1); + + final noPic = + mxContent == null || mxContent.toString().isEmpty || mxContent.toString() == 'null'; - final textWidget = Center( - child: Text( - fallbackLetters, - style: TextStyle( - color: noPic ? name?.darkColor : null, - fontSize: fontSize, - ), - ), - ); - final borderRadius = BorderRadius.circular(size / 2); - final container = Container( - decoration: BoxDecoration( - border: Border.all(color: Theme.of(context).dividerColor), - borderRadius: borderRadius, - ), - child: ClipRRect( - borderRadius: borderRadius, - child: Container( + final borderRadius = this.borderRadius ?? BorderRadius.circular(size / 2); + final presenceUserId = this.presenceUserId; + final container = Stack( + children: [ + SizedBox( width: size, height: size, - color: - noPic ? name?.lightColor : Theme.of(context).secondaryHeaderColor, - child: noPic - ? textWidget - : CachedNetworkImage( - imageUrl: src.toString(), - fit: BoxFit.cover, - width: size, - height: size, - placeholder: (c, s) => textWidget, - errorWidget: (c, s, d) => Stack( - children: [ - textWidget, - ], - ), + child: Material( + color: theme.brightness == Brightness.light + ? Colors.white + : Colors.black, + shape: + shapeBorder ?? + RoundedSuperellipseBorder( + borderRadius: borderRadius, + side: BorderSide.none, ), + clipBehavior: Clip.antiAlias, + child: MxcImage( + client: client, + borderRadius: borderRadius, + key: ValueKey(mxContent.toString()), + cacheKey: '${mxContent}_$size', + uri: mxContent, + fit: BoxFit.cover, + width: size, + height: size, + placeholder: (_) => noPic + ? Container( + decoration: BoxDecoration( + color: backgroundColor ?? name?.lightColorAvatar, + ), + alignment: Alignment.center, + child: Text( + fallbackLetters, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'RobotoMono', + color: textColor ?? Colors.white, + fontWeight: FontWeight.bold, + fontSize: (size / 2.5).roundToDouble(), + ), + ), + ) + : Center( + child: Icon( + Icons.person_2, + color: theme.colorScheme.tertiary, + size: size / 1.5, + ), + ), + ), + ), ), - ), + if (presenceUserId != null) + PresenceBuilder( + client: client, + userId: presenceUserId, + builder: (context, presence) { + if (presence == null || + (presence.presence == PresenceType.offline && + presence.lastActiveTimestamp == null)) { + return const SizedBox.shrink(); + } + final dotColor = presence.presence.isOnline + ? Colors.green + : presence.presence.isUnavailable + ? Colors.orange + : Colors.grey; + return Positioned( + bottom: -3, + right: -3, + child: Container( + width: 16, + height: 16, + decoration: BoxDecoration( + color: presenceBackgroundColor ?? theme.colorScheme.surface, + borderRadius: BorderRadius.circular(32), + ), + alignment: Alignment.center, + child: Container( + width: 10, + height: 10, + decoration: BoxDecoration( + color: dotColor, + borderRadius: BorderRadius.circular(16), + border: Border.all( + width: 1, + color: theme.colorScheme.surface, + ), + ), + ), + ), + ); + }, + ), + ], ); if (onTap == null) return container; - return InkWell( - onTap: onTap, - borderRadius: borderRadius, - child: container, + return MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector(onTap: onTap, child: container), ); } } diff --git a/lib/widgets/blur_hash.dart b/lib/widgets/blur_hash.dart new file mode 100644 index 0000000000..ada498221b --- /dev/null +++ b/lib/widgets/blur_hash.dart @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:blurhash_dart/blurhash_dart.dart' as b; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:image/image.dart' as image; + +class BlurHash extends StatefulWidget { + final double width; + final double height; + final String blurhash; + final BoxFit fit; + + const BlurHash({ + super.key, + String? blurhash, + required this.width, + required this.height, + this.fit = BoxFit.cover, + }) : blurhash = blurhash ?? 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + + @override + State createState() => _BlurHashState(); +} + +class _BlurHashState extends State { + Uint8List? _data; + + static Future getBlurhashData(BlurhashData blurhashData) async { + final blurhash = b.BlurHash.decode(blurhashData.hsh); + final img = blurhash.toImage(blurhashData.w, blurhashData.h); + return Uint8List.fromList(image.encodePng(img)); + } + + Future _computeBlurhashData() async { + if (_data != null) return _data!; + final ratio = widget.width / widget.height; + var width = 32; + var height = 32; + if (ratio > 1.0) { + height = (width / ratio).round(); + } else { + width = (height * ratio).round(); + } + + return _data ??= await compute( + getBlurhashData, + BlurhashData(hsh: widget.blurhash, w: width, h: height), + ); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _computeBlurhashData(), + initialData: _data, + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return Container( + width: widget.width, + height: widget.height, + color: Theme.of(context).colorScheme.onInverseSurface, + ); + } + return Image.memory( + data, + fit: widget.fit, + width: widget.width, + height: widget.height, + ); + }, + ); + } +} + +class BlurhashData { + final String hsh; + final int w; + final int h; + + const BlurhashData({required this.hsh, required this.w, required this.h}); + + factory BlurhashData.fromJson(Map json) => + BlurhashData(hsh: json['hsh'], w: json['w'], h: json['h']); + + Map toJson() => {'hsh': hsh, 'w': w, 'h': h}; +} diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index 34a589056c..dc48a12af6 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -1,33 +1,40 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; -import 'package:flutter/cupertino.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:adaptive_dialog/adaptive_dialog.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/pages/chat/cupertino_widgets_bottom_sheet.dart'; -import 'package:fluffychat/pages/chat/edit_widgets_dialog.dart'; -import 'package:fluffychat/pages/chat/widgets_bottom_sheet.dart'; import 'matrix.dart'; +enum ChatPopupMenuActions { + details, + mute, + unmute, + encryption, + emote, + leave, + search, +} + class ChatSettingsPopupMenu extends StatefulWidget { final Room room; final bool displayChatDetails; - const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {Key? key}) - : super(key: key); + const ChatSettingsPopupMenu(this.room, this.displayChatDetails, {super.key}); @override - _ChatSettingsPopupMenuState createState() => _ChatSettingsPopupMenuState(); + ChatSettingsPopupMenuState createState() => ChatSettingsPopupMenuState(); } -class _ChatSettingsPopupMenuState extends State { +class ChatSettingsPopupMenuState extends State { StreamSubscription? notificationChangeSub; @override @@ -36,164 +43,162 @@ class _ChatSettingsPopupMenuState extends State { super.dispose(); } + void goToEmoteSettings() => + context.push('/rooms/${widget.room.id}/details/emotes'); + @override Widget build(BuildContext context) { - notificationChangeSub ??= Matrix.of(context) - .client - .onAccountData - .stream - .where((u) => u.type == 'm.push_rules') - .listen( - (u) => setState(() {}), - ); - final items = >[ - PopupMenuItem( - value: 'widgets', - child: Row( - children: [ - const Icon(Icons.widgets_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.matrixWidgets), - ], - ), - ), - widget.room.pushRuleState == PushRuleState.notify - ? PopupMenuItem( - value: 'mute', - child: Row( - children: [ - const Icon(Icons.notifications_off_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.muteChat), - ], - ), - ) - : PopupMenuItem( - value: 'unmute', - child: Row( - children: [ - const Icon(Icons.notifications_on_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.unmuteChat), - ], - ), - ), - PopupMenuItem( - value: 'leave', - child: Row( - children: [ - const Icon(Icons.delete_outlined), - const SizedBox(width: 12), - Text(L10n.of(context)!.leave), - ], - ), - ), - ]; - if (widget.displayChatDetails) { - items.insert( - 0, - PopupMenuItem( - value: 'details', - child: Row( - children: [ - const Icon(Icons.info_outline_rounded), - const SizedBox(width: 12), - Text(L10n.of(context)!.chatDetails), - ], - ), - ), - ); - } + notificationChangeSub ??= Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.push_rules', + ) ?? + false, + ) + .listen((u) => setState(() {})); return Stack( alignment: Alignment.center, children: [ - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.keyI - }, - helpLabel: L10n.of(context)!.chatDetails, - onKeysPressed: _showChatDetails, - ), - KeyBoardShortcuts( - child: Container(), - keysToPress: { - LogicalKeyboardKey.controlLeft, - LogicalKeyboardKey.keyW - }, - helpLabel: L10n.of(context)!.matrixWidgets, - onKeysPressed: _showWidgets, - ), - PopupMenuButton( - onSelected: (String choice) async { + const SizedBox.shrink(), + PopupMenuButton( + useRootNavigator: true, + onSelected: (choice) async { switch (choice) { - case 'widgets': - if (widget.room.widgets.isNotEmpty) { - _showWidgets(); - } else { - showDialog( - context: context, - builder: (context) => EditWidgetsDialog(room: widget.room), - useRootNavigator: false, - ); - } - break; - case 'leave': + case ChatPopupMenuActions.leave: + final l10n = L10n.of(context); + final router = GoRouter.of(context); final confirmed = await showOkCancelAlertDialog( - useRootNavigator: false, context: context, - title: L10n.of(context)!.areYouSure, - okLabel: L10n.of(context)!.ok, - cancelLabel: L10n.of(context)!.cancel, + title: l10n.areYouSure, + message: l10n.archiveRoomDescription, + okLabel: l10n.leave, + cancelLabel: l10n.cancel, + isDestructive: true, + ); + if (confirmed != OkCancelResult.ok) return; + if (!context.mounted) return; + final result = await showFutureLoadingDialog( + context: context, + future: () => widget.room.leave(), ); - if (confirmed == OkCancelResult.ok) { - final success = await showFutureLoadingDialog( - context: context, future: () => widget.room.leave()); - if (success.error == null) { - VRouter.of(context).to('/rooms'); - } + if (result.error == null) { + router.go('/rooms'); } + break; - case 'mute': + case ChatPopupMenuActions.mute: await showFutureLoadingDialog( - context: context, - future: () => widget.room - .setPushRuleState(PushRuleState.mentionsOnly)); + context: context, + future: () => + widget.room.setPushRuleState(PushRuleState.mentionsOnly), + ); break; - case 'unmute': + case ChatPopupMenuActions.unmute: await showFutureLoadingDialog( - context: context, - future: () => - widget.room.setPushRuleState(PushRuleState.notify)); + context: context, + future: () => + widget.room.setPushRuleState(PushRuleState.notify), + ); break; - case 'details': + case ChatPopupMenuActions.details: _showChatDetails(); break; + case ChatPopupMenuActions.search: + context.go('/rooms/${widget.room.id}/search'); + break; + case ChatPopupMenuActions.emote: + goToEmoteSettings(); + case ChatPopupMenuActions.encryption: + context.go('/rooms/${widget.room.id}/encryption'); + break; } }, - itemBuilder: (BuildContext context) => items, + itemBuilder: (BuildContext context) => [ + if (widget.displayChatDetails) + PopupMenuItem( + value: ChatPopupMenuActions.details, + child: Row( + children: [ + const Icon(Icons.info_outline_rounded), + const SizedBox(width: 12), + Text(L10n.of(context).chatDetails), + ], + ), + ), + if (widget.room.pushRuleState == PushRuleState.notify) + PopupMenuItem( + value: ChatPopupMenuActions.mute, + child: Row( + children: [ + const Icon(Icons.notifications_off_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).muteChat), + ], + ), + ) + else + PopupMenuItem( + value: ChatPopupMenuActions.unmute, + child: Row( + children: [ + const Icon(Icons.notifications_on_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).unmuteChat), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.search, + child: Row( + children: [ + const Icon(Icons.search_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).search), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.encryption, + child: Row( + children: [ + const Icon(Icons.lock_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).encryption), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.emote, + child: Row( + children: [ + const Icon(Icons.emoji_emotions_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).emoteSettings), + ], + ), + ), + PopupMenuItem( + value: ChatPopupMenuActions.leave, + child: Row( + children: [ + const Icon(Icons.delete_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).leave), + ], + ), + ), + ], ), ], ); } - void _showWidgets() => [TargetPlatform.iOS, TargetPlatform.macOS] - .contains(Theme.of(context).platform) - ? showCupertinoModalPopup( - context: context, - builder: (context) => CupertinoWidgetsBottomSheet(room: widget.room), - ) - : showModalBottomSheet( - context: context, - builder: (context) => WidgetsBottomSheet(room: widget.room), - ); - void _showChatDetails() { - if (VRouter.of(context).path.endsWith('/details')) { - VRouter.of(context).toSegments(['rooms', widget.room.id]); + if (GoRouterState.of(context).uri.path.endsWith('/details')) { + context.go('/rooms/${widget.room.id}'); } else { - VRouter.of(context).toSegments(['rooms', widget.room.id, 'details']); + context.go('/rooms/${widget.room.id}/details'); } } } diff --git a/lib/widgets/config_viewer.dart b/lib/widgets/config_viewer.dart new file mode 100644 index 0000000000..c7d0c725b4 --- /dev/null +++ b/lib/widgets/config_viewer.dart @@ -0,0 +1,146 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ConfigViewer extends StatefulWidget { + const ConfigViewer({super.key}); + + @override + State createState() => _ConfigViewerState(); +} + +class _ConfigViewerState extends State { + String _searchQuery = ''; + + Future _changeSetting( + AppSettings appSetting, + SharedPreferences store, + String initialValue, + ) async { + if (appSetting is AppSettings) { + await appSetting.setItem(!(initialValue == 'true')); + setState(() {}); + return; + } + + final value = await showTextInputDialog( + context: context, + title: appSetting.name, + hintText: appSetting.defaultValue.toString(), + initialText: initialValue, + ); + if (value == null) return; + + if (appSetting is AppSettings) { + await appSetting.setItem(value); + } + if (appSetting is AppSettings) { + await appSetting.setItem(int.parse(value)); + } + if (appSetting is AppSettings) { + await appSetting.setItem(double.parse(value)); + } + + setState(() {}); + } + + Future _reset() async { + await AppSettings.reset(); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final normalizedQuery = _searchQuery.trim().toLowerCase(); + final filteredSettings = AppSettings.values + .where((setting) { + if (normalizedQuery.isEmpty) return true; + return setting.name.toLowerCase().contains(normalizedQuery); + }) + .toList(growable: false); + + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).advancedConfigurations), + leading: BackButton(onPressed: () => context.go('/')), + actions: [ + TextButton(onPressed: _reset, child: Text(L10n.of(context).reset)), + ], + ), + body: Column( + crossAxisAlignment: .stretch, + children: [ + Container( + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + color: theme.colorScheme.errorContainer, + child: Text( + 'Changing configs by hand is untested! Use without any warranty!', + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: TextField( + onChanged: (value) => setState(() => _searchQuery = value), + decoration: InputDecoration( + hintText: 'Search config key', + prefixIcon: const Icon(Icons.search), + border: const OutlineInputBorder(), + isDense: true, + filled: true, + fillColor: theme.colorScheme.surfaceContainerHighest.withAlpha( + 128, + ), + ), + ), + ), + const SizedBox(height: 8), + Expanded( + child: ListView.builder( + itemCount: filteredSettings.length, + itemBuilder: (context, i) { + final store = Matrix.of(context).store; + final appSetting = filteredSettings[i]; + var value = ''; + if (appSetting is AppSettings) { + value = appSetting.value; + } + if (appSetting is AppSettings) { + value = appSetting.value.toString(); + } + if (appSetting is AppSettings) { + return SwitchListTile.adaptive( + title: Text(appSetting.name), + subtitle: Text(value), + value: appSetting.value, + onChanged: (value) => + _changeSetting(appSetting, store, (!value).toString()), + ); + } + if (appSetting is AppSettings) { + value = appSetting.value.toString(); + } + return ListTile( + title: Text(appSetting.name), + subtitle: Text(value), + onTap: () => _changeSetting(appSetting, store, value), + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/connection_status_header.dart b/lib/widgets/connection_status_header.dart deleted file mode 100644 index 2bfc83e8e2..0000000000 --- a/lib/widgets/connection_status_header.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:matrix/matrix.dart'; - -import '../utils/localized_exception_extension.dart'; -import 'matrix.dart'; - -class ConnectionStatusHeader extends StatefulWidget { - const ConnectionStatusHeader({Key? key}) : super(key: key); - - @override - _ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState(); -} - -class _ConnectionStatusHeaderState extends State { - late final StreamSubscription _onSyncSub; - - @override - void initState() { - _onSyncSub = Matrix.of(context).client.onSyncStatus.stream.listen( - (_) => setState(() {}), - ); - super.initState(); - } - - @override - void dispose() { - _onSyncSub.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final status = Matrix.of(context).client.onSyncStatus.value ?? - const SyncStatusUpdate(SyncStatus.waitingForResponse); - final hide = Matrix.of(context).client.onSync.value != null && - status.status != SyncStatus.error && - Matrix.of(context).client.prevBatch != null; - - return AnimatedContainer( - duration: const Duration(milliseconds: 200), - curve: Curves.bounceInOut, - height: hide ? 0 : 36, - clipBehavior: Clip.hardEdge, - decoration: BoxDecoration(color: Theme.of(context).colorScheme.surface), - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - width: 24, - height: 24, - child: CircularProgressIndicator.adaptive( - strokeWidth: 2, - value: hide ? 1.0 : status.progress, - ), - ), - const SizedBox(width: 12), - Text( - status.toLocalizedString(context), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Theme.of(context).colorScheme.onSurface), - ), - ], - ), - ); - } -} - -extension on SyncStatusUpdate { - String toLocalizedString(BuildContext context) { - switch (status) { - case SyncStatus.waitingForResponse: - return L10n.of(context)!.loadingPleaseWait; - case SyncStatus.error: - return ((error?.exception ?? Object()) as Object) - .toLocalizedString(context); - case SyncStatus.processing: - case SyncStatus.cleaningUp: - case SyncStatus.finished: - default: - return L10n.of(context)!.synchronizingPleaseWait; - } - } -} diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart deleted file mode 100644 index a021d2acae..0000000000 --- a/lib/widgets/contacts_list.dart +++ /dev/null @@ -1,119 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/matrix_sdk_extensions.dart/client_presence_extension.dart'; -import '../utils/matrix_sdk_extensions.dart/presence_extension.dart'; - -class ContactsList extends StatefulWidget { - final TextEditingController searchController; - - const ContactsList({ - Key? key, - required this.searchController, - }) : super(key: key); - @override - _ContactsState createState() => _ContactsState(); -} - -class _ContactsState extends State { - StreamSubscription? _onSync; - - @override - void dispose() { - _onSync?.cancel(); - super.dispose(); - } - - DateTime _lastSetState = DateTime.now(); - Timer? _coolDown; - - void _updateView() { - _lastSetState = DateTime.now(); - setState(() {}); - } - - @override - Widget build(BuildContext context) { - final client = Matrix.of(context).client; - _onSync ??= client.onSync.stream.listen((_) { - if (DateTime.now().millisecondsSinceEpoch - - _lastSetState.millisecondsSinceEpoch < - 1000) { - _coolDown?.cancel(); - _coolDown = Timer(const Duration(seconds: 1), _updateView); - } else { - _updateView(); - } - }); - final contactList = Matrix.of(context) - .client - .contactList - .where((p) => p.userid - .toLowerCase() - .contains(widget.searchController.text.toLowerCase())) - .toList(); - return ListView.builder( - itemCount: contactList.length, - itemBuilder: (_, i) => _ContactListTile(contact: contactList[i]), - ); - } -} - -class _ContactListTile extends StatelessWidget { - final CachedPresence contact; - - const _ContactListTile({Key? key, required this.contact}) : super(key: key); - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: Matrix.of(context).client.getProfileFromUserId(contact.userid), - builder: (context, snapshot) { - final displayname = snapshot.data?.displayName ?? - contact.userid.localpart ?? - 'No valid MXID'; - final avatarUrl = snapshot.data?.avatarUrl; - return ListTile( - leading: SizedBox( - width: Avatar.defaultSize, - height: Avatar.defaultSize, - child: Stack( - children: [ - Center( - child: Avatar( - mxContent: avatarUrl, - name: displayname, - ), - ), - Align( - alignment: Alignment.bottomRight, - child: Icon( - Icons.circle, - color: contact.color, - size: 12, - ), - ), - ], - ), - ), - title: Text(displayname), - subtitle: Text(contact.getLocalizedStatusMessage(context), - style: contact.statusMsg?.isNotEmpty ?? false - ? TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - ) - : null), - onTap: () => VRouter.of(context).toSegments([ - 'rooms', - Matrix.of(context).client.getDirectChatFromUserId(contact.userid)! - ]), - ); - }); - } -} diff --git a/lib/widgets/content_banner.dart b/lib/widgets/content_banner.dart deleted file mode 100644 index d1a6b71793..0000000000 --- a/lib/widgets/content_banner.dart +++ /dev/null @@ -1,106 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:matrix/matrix.dart'; - -import 'matrix.dart'; - -class ContentBanner extends StatelessWidget { - final Uri? mxContent; - final double height; - final IconData defaultIcon; - final bool loading; - final void Function()? onEdit; - final Client? client; - final double opacity; - final String heroTag; - - const ContentBanner( - {this.mxContent, - this.height = 400, - this.defaultIcon = Icons.account_circle_outlined, - this.loading = false, - this.onEdit, - this.client, - this.opacity = 0.75, - this.heroTag = 'content_banner', - Key? key}) - : super(key: key); - - @override - Widget build(BuildContext context) { - final onEdit = this.onEdit; - return Container( - height: height, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondaryContainer, - ), - child: Stack( - children: [ - Positioned( - left: 0, - right: 0, - top: 0, - bottom: 0, - child: Opacity( - opacity: opacity, - child: (!loading) - ? LayoutBuilder(builder: - (BuildContext context, BoxConstraints constraints) { - // #775 don't request new image resolution on every resize - // by rounding up to the next multiple of stepSize - const stepSize = 300; - final bannerSize = - constraints.maxWidth * window.devicePixelRatio; - final steppedBannerSize = - (bannerSize / stepSize).ceil() * stepSize; - final src = mxContent?.getThumbnail( - client ?? Matrix.of(context).client, - width: steppedBannerSize, - height: steppedBannerSize, - method: ThumbnailMethod.scale, - animated: true, - ); - return Hero( - tag: heroTag, - child: CachedNetworkImage( - imageUrl: src.toString(), - height: 300, - fit: BoxFit.cover, - errorWidget: (c, m, e) => Icon( - defaultIcon, - size: 200, - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - ), - ); - }) - : Icon( - defaultIcon, - size: 200, - color: Theme.of(context).colorScheme.onSecondaryContainer, - ), - ), - ), - if (onEdit != null) - Container( - margin: const EdgeInsets.all(8), - alignment: Alignment.bottomRight, - child: FloatingActionButton( - mini: true, - onPressed: onEdit, - backgroundColor: Theme.of(context).backgroundColor, - foregroundColor: Theme.of(context).textTheme.bodyText1?.color, - child: const Icon(Icons.camera_alt_outlined), - ), - ), - ], - ), - ); - } -} diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart new file mode 100644 index 0000000000..2e2d7b029b --- /dev/null +++ b/lib/widgets/fluffy_chat_app.dart @@ -0,0 +1,94 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/routes.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:fluffychat/widgets/theme_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../utils/custom_scroll_behaviour.dart'; +import 'matrix.dart'; + +class FluffyChatApp extends StatelessWidget { + final Widget? testWidget; + final List clients; + final ({String? pincode, bool useBiometrics}) appLockSettings; + final SharedPreferences store; + + const FluffyChatApp({ + super.key, + this.testWidget, + required this.clients, + required this.store, + required this.appLockSettings, + }); + + /// getInitialLink may rereturn the value multiple times if this view is + /// opened multiple times for example if the user logs out after they logged + /// in with qr code or magic link. + static bool gotInitialLink = false; + + // Router must be outside of build method so that hot reload does not reset + // the current path. + static final GoRouter router = GoRouter( + routes: AppRoutes.routes, + debugLogDiagnostics: true, + redirect: (context, state) { + // Workaround for content sharings passed to go router: + if ({ + 'content', + 'sharemedia-im.fluffychat.app', + }.contains(state.uri.scheme)) { + Logs().d('Ignore content sharing handling in go router', state.uri); + return '/'; + } + + // Pass deep links to app: + if (state.uri.toString().startsWith(AppConfig.deepLinkPrefix)) { + return '/rooms/newprivatechat#${state.uri}'; + } + return null; + }, + ); + + @override + Widget build(BuildContext context) { + return ThemeBuilder( + builder: (context, themeMode, primaryColor) => MaterialApp.router( + title: AppSettings.applicationName.value, + themeMode: themeMode, + theme: FluffyThemes.buildTheme(context, Brightness.light, primaryColor), + darkTheme: FluffyThemes.buildTheme( + context, + Brightness.dark, + primaryColor, + ), + scrollBehavior: CustomScrollBehavior(), + localizationsDelegates: L10n.localizationsDelegates, + supportedLocales: L10n.supportedLocales, + routerConfig: router, + builder: (context, child) => AppLockWidget( + pincode: appLockSettings.pincode, + useBiometrics: appLockSettings.useBiometrics, + isLoggedIn: clients.any((client) => client.isLogged()), + // Need a navigator above the Matrix widget for + // displaying dialogs + child: Matrix( + clients: clients, + store: store, + child: testWidget ?? child, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart new file mode 100644 index 0000000000..84ffcb55e3 --- /dev/null +++ b/lib/widgets/future_loading_dialog.dart @@ -0,0 +1,170 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; + +import 'package:async/async.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; + +/// Displays a loading dialog which reacts to the given [future]. The dialog +/// will be dismissed and the value will be returned when the future completes. +/// If an error occured, then [onError] will be called and this method returns +/// null. +Future> showFutureLoadingDialog({ + required BuildContext context, + Future Function()? future, + Future Function(void Function(double?) setProgress)? futureWithProgress, + String? title, + String? backLabel, + bool barrierDismissible = false, + bool delay = true, + ExceptionContext? exceptionContext, + bool ignoreError = false, +}) async { + assert(future != null || futureWithProgress != null); + final onProgressStream = StreamController(); + final futureExec = + futureWithProgress?.call(onProgressStream.add) ?? future!(); + final resultFuture = ResultFuture(futureExec); + + if (delay) { + var i = 3; + while (i > 0) { + final result = resultFuture.result; + if (result != null) { + if (result.isError) break; + return result; + } + await Future.delayed(const Duration(milliseconds: 100)); + i--; + } + } + + if (!context.mounted) { + Logs().e( + 'Unable to show loading dialog!', + Exception('The BuildContext is not mounted!'), + StackTrace.current, + ); + return Result.capture(futureExec); + } + + final result = await showAdaptiveDialog>( + context: context, + barrierDismissible: barrierDismissible, + builder: (BuildContext context) => LoadingDialog( + future: futureExec, + title: title, + backLabel: backLabel, + exceptionContext: exceptionContext, + onProgressStream: onProgressStream.stream, + ), + ); + return result ?? + Result.error(Exception('FutureDialog canceled'), StackTrace.current); +} + +class LoadingDialog extends StatefulWidget { + final String? title; + final String? backLabel; + final Future future; + final ExceptionContext? exceptionContext; + final Stream onProgressStream; + + const LoadingDialog({ + super.key, + required this.future, + this.title, + this.backLabel, + this.exceptionContext, + required this.onProgressStream, + }); + + @override + LoadingDialogState createState() => LoadingDialogState(); +} + +class LoadingDialogState extends State { + Object? exception; + StackTrace? stackTrace; + + @override + void initState() { + super.initState(); + widget.future.then( + (result) { + if (!mounted) return; + if (!Navigator.of(context).canPop()) return; + Navigator.of(context).pop>(Result.value(result)); + }, + onError: (e, s) => setState(() { + exception = e; + stackTrace = s; + }), + ); + } + + @override + Widget build(BuildContext context) { + final exception = this.exception; + final titleLabel = exception != null + ? exception.toLocalizedString(context, widget.exceptionContext) + : widget.title ?? L10n.of(context).loadingPleaseWait; + + return AlertDialog.adaptive( + title: exception == null + ? null + : Icon( + Icons.error_outline_outlined, + color: Theme.of(context).colorScheme.error, + size: 48, + ), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256), + child: Row( + crossAxisAlignment: .center, + children: [ + if (exception == null) ...[ + StreamBuilder( + stream: widget.onProgressStream, + builder: (context, snapshot) => + CircularProgressIndicator.adaptive(value: snapshot.data), + ), + const SizedBox(width: 20), + ], + Expanded( + child: Text( + titleLabel, + maxLines: 4, + textAlign: exception == null ? TextAlign.left : null, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + actions: exception == null + ? null + : [ + AdaptiveDialogAction( + onPressed: () => Navigator.of( + context, + ).pop>(Result.error(exception, stackTrace)), + child: Text(widget.backLabel ?? L10n.of(context).close), + ), + ], + ); + } +} + +extension DeprecatedApiAccessExtension on Result { + T? get result => asValue?.value; + + Object? get error => asError?.error; +} diff --git a/lib/widgets/hover_builder.dart b/lib/widgets/hover_builder.dart new file mode 100644 index 0000000000..b6c4b9285a --- /dev/null +++ b/lib/widgets/hover_builder.dart @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; + +class HoverBuilder extends StatefulWidget { + final Widget Function(BuildContext context, bool hovered) builder; + const HoverBuilder({required this.builder, super.key}); + + @override + State createState() => _HoverBuilderState(); +} + +class _HoverBuilderState extends State { + bool hovered = false; + @override + Widget build(BuildContext context) { + return MouseRegion( + onEnter: (_) => hovered + ? null + : setState(() { + hovered = true; + }), + onExit: (_) => !hovered + ? null + : setState(() { + hovered = false; + }), + child: widget.builder(context, hovered), + ); + } +} diff --git a/lib/widgets/layouts/empty_page.dart b/lib/widgets/layouts/empty_page.dart index 0f3b2d428e..f250ddce44 100644 --- a/lib/widgets/layouts/empty_page.dart +++ b/lib/widgets/layouts/empty_page.dart @@ -1,43 +1,36 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:math'; import 'package:flutter/material.dart'; class EmptyPage extends StatelessWidget { - final bool loading; - static const double _width = 200; - const EmptyPage({this.loading = false, Key? key}) : super(key: key); + static const double _width = 400; + const EmptyPage({super.key}); @override Widget build(BuildContext context) { - final _width = min(MediaQuery.of(context).size.width, EmptyPage._width); + final width = min(MediaQuery.sizeOf(context).width, EmptyPage._width) / 2; + final theme = Theme.of(context); return Scaffold( // Add invisible appbar to make status bar on Android tablets bright. appBar: AppBar( automaticallyImplyLeading: false, elevation: 0, - backgroundColor: Theme.of(context).scaffoldBackgroundColor, + backgroundColor: Colors.transparent, ), extendBodyBehindAppBar: true, - body: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Center( - child: Hero( - tag: 'info-logo', - child: Image.asset( - 'assets/info-logo.png', - width: _width, - height: _width, - ), - ), - ), - if (loading) - Center( - child: SizedBox( - width: _width, - child: const LinearProgressIndicator(), - ), - ), - ], + body: Container( + alignment: Alignment.center, + child: Image.asset( + 'assets/logo/mini/logo_mono_mini.png', + color: theme.colorScheme.surfaceContainerHigh, + width: width, + height: width, + filterQuality: FilterQuality.medium, + ), ), ); } diff --git a/lib/widgets/layouts/loading_view.dart b/lib/widgets/layouts/loading_view.dart deleted file mode 100644 index 7015bcd97f..0000000000 --- a/lib/widgets/layouts/loading_view.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/widgets/layouts/empty_page.dart'; -import 'package:fluffychat/widgets/matrix.dart'; - -class LoadingView extends StatelessWidget { - const LoadingView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback( - (_) => VRouter.of(context).to( - Matrix.of(context).widget.clients.any((client) => - client.onLoginStateChanged.value == LoginState.loggedIn) - ? '/rooms' - : '/home', - queryParameters: VRouter.of(context).queryParameters, - ), - ); - return const EmptyPage(loading: true); - } -} diff --git a/lib/widgets/layouts/login_scaffold.dart b/lib/widgets/layouts/login_scaffold.dart index 90cc5f35bd..221bbc7d36 100644 --- a/lib/widgets/layouts/login_scaffold.dart +++ b/lib/widgets/layouts/login_scaffold.dart @@ -1,46 +1,142 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; +import 'package:particles_network/particles_network.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class LoginScaffold extends StatelessWidget { final Widget body; final AppBar? appBar; + final Widget? bottomNavigationBar; const LoginScaffold({ - Key? key, + super.key, required this.body, this.appBar, - }) : super(key: key); + this.bottomNavigationBar, + }); @override Widget build(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback((_) { - SystemChrome.setSystemUIOverlayStyle( - const SystemUiOverlayStyle( - statusBarIconBrightness: Brightness.light, - statusBarColor: Colors.transparent, - systemNavigationBarContrastEnforced: false, - systemNavigationBarColor: Colors.black, - systemNavigationBarIconBrightness: Brightness.light, - ), - ); - }); - return Scaffold( - appBar: appBar, - extendBodyBehindAppBar: true, - extendBody: true, - body: Container( - decoration: const BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: AssetImage( - 'assets/login_wallpaper.png', + final theme = Theme.of(context); + + return LayoutBuilder( + builder: (context, constraints) { + final isMobileMode = !FluffyThemes.isColumnModeByWidth( + constraints.maxWidth, + ); + if (isMobileMode) { + return Scaffold( + key: const Key('LoginScaffold'), + appBar: appBar, + body: SafeArea(child: body), + bottomNavigationBar: bottomNavigationBar, + ); + } + return Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + theme.colorScheme.surfaceContainerLow, + theme.colorScheme.surfaceContainer, + theme.colorScheme.surfaceContainerHighest, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, ), ), - ), - alignment: Alignment.center, - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 480), - child: body, + child: Stack( + children: [ + if (!MediaQuery.disableAnimationsOf(context)) + ParticleNetwork( + maxSpeed: 0.25, + particleColor: theme.colorScheme.primary, + lineColor: theme.colorScheme.secondary, + ), + Column( + children: [ + const SizedBox(height: 16), + Expanded( + child: Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + clipBehavior: Clip.hardEdge, + elevation: + theme.appBarTheme.scrolledUnderElevation ?? 4, + shadowColor: theme.appBarTheme.shadowColor, + child: ConstrainedBox( + constraints: isMobileMode + ? const BoxConstraints() + : const BoxConstraints( + maxWidth: 480, + maxHeight: 640, + ), + child: Scaffold( + key: const Key('LoginScaffold'), + appBar: appBar, + body: SafeArea(child: body), + bottomNavigationBar: bottomNavigationBar, + ), + ), + ), + ), + ), + ), + const _PrivacyButtons(mainAxisAlignment: .center), + ], + ), + ], + ), + ); + }, + ); + } +} + +class _PrivacyButtons extends StatelessWidget { + final MainAxisAlignment mainAxisAlignment; + const _PrivacyButtons({required this.mainAxisAlignment}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final shadowTextStyle = TextStyle(color: theme.colorScheme.secondary); + return SizedBox( + height: 64, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: mainAxisAlignment, + children: [ + TextButton( + onPressed: () => launchUrlString(AppSettings.website.value), + child: Text(L10n.of(context).website, style: shadowTextStyle), + ), + TextButton( + onPressed: () => launchUrlString(AppConfig.supportUrl), + child: Text(L10n.of(context).help, style: shadowTextStyle), + ), + TextButton( + onPressed: () => launchUrlString(AppSettings.privacyPolicy.value), + child: Text(L10n.of(context).privacy, style: shadowTextStyle), + ), + TextButton( + onPressed: () => PlatformInfos.showDialog(context), + child: Text(L10n.of(context).about, style: shadowTextStyle), + ), + ], ), ), ); diff --git a/lib/widgets/layouts/max_width_body.dart b/lib/widgets/layouts/max_width_body.dart index 804f317f5a..3a7aa1b34c 100644 --- a/lib/widgets/layouts/max_width_body.dart +++ b/lib/widgets/layouts/max_width_body.dart @@ -1,38 +1,66 @@ -import 'dart:math'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; import 'package:flutter/material.dart'; class MaxWidthBody extends StatelessWidget { - final Widget? child; + final Widget child; final double maxWidth; final bool withScrolling; + final EdgeInsets? innerPadding; const MaxWidthBody({ - this.child, + required this.child, this.maxWidth = 600, - this.withScrolling = false, - Key? key, - }) : super(key: key); + this.withScrolling = true, + this.innerPadding, + super.key, + }); @override Widget build(BuildContext context) { - return LayoutBuilder( - builder: (context, constraints) { - final padding = EdgeInsets.symmetric( - horizontal: max(0, (constraints.maxWidth - maxWidth) / 2), - ); - return withScrolling - ? SingleChildScrollView( - physics: const ScrollPhysics(), - child: Padding( - padding: padding, - child: child, - ), - ) - : Padding( - padding: padding, - child: child, - ); - }, + return SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + final theme = Theme.of(context); + + const desiredWidth = FluffyThemes.columnWidth * 1.5; + final body = constraints.maxWidth <= desiredWidth + ? child + : Container( + alignment: Alignment.topCenter, + padding: const EdgeInsets.all(32), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: Material( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + side: BorderSide(color: theme.dividerColor), + ), + clipBehavior: Clip.hardEdge, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: child, + ), + ), + ), + ); + if (!withScrolling) return body; + + return SingleChildScrollView( + padding: innerPadding, + physics: const ScrollPhysics(), + child: body, + ); + }, + ), ); } } diff --git a/lib/widgets/layouts/side_view_layout.dart b/lib/widgets/layouts/side_view_layout.dart deleted file mode 100644 index d0955cbabd..0000000000 --- a/lib/widgets/layouts/side_view_layout.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/themes.dart'; - -class SideViewLayout extends StatelessWidget { - final Widget mainView; - final Widget? sideView; - - const SideViewLayout({Key? key, required this.mainView, this.sideView}) - : super(key: key); - @override - Widget build(BuildContext context) { - var currentUrl = Uri.decodeFull(VRouter.of(context).url); - if (!currentUrl.endsWith('/')) currentUrl += '/'; - final hideSideView = currentUrl.split('/').length == 4; - final sideView = this.sideView; - return sideView == null - ? mainView - : MediaQuery.of(context).size.width < FluffyThemes.columnWidth * 3.5 && - !hideSideView - ? sideView - : Row( - children: [ - Expanded( - child: ClipRRect(child: mainView), - ), - Container( - width: 1.0, - color: Theme.of(context).dividerColor, - ), - AnimatedContainer( - duration: const Duration(milliseconds: 300), - clipBehavior: Clip.antiAlias, - decoration: const BoxDecoration(), - width: hideSideView ? 0 : 360.0, - child: hideSideView ? null : sideView, - ), - ], - ); - } -} diff --git a/lib/widgets/layouts/two_column_layout.dart b/lib/widgets/layouts/two_column_layout.dart index 9371be3d2f..40ae50f0d1 100644 --- a/lib/widgets/layouts/two_column_layout.dart +++ b/lib/widgets/layouts/two_column_layout.dart @@ -1,16 +1,26 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/themes.dart'; import 'package:flutter/material.dart'; class TwoColumnLayout extends StatelessWidget { final Widget mainView; final Widget sideView; + final bool hasNavigationRail; const TwoColumnLayout({ - Key? key, + super.key, required this.mainView, required this.sideView, - }) : super(key: key); + this.hasNavigationRail = true, + }); @override Widget build(BuildContext context) { + final theme = Theme.of(context); + return ScaffoldMessenger( child: Scaffold( body: Row( @@ -18,18 +28,13 @@ class TwoColumnLayout extends StatelessWidget { Container( clipBehavior: Clip.antiAlias, decoration: const BoxDecoration(), - width: 360.0, + width: + FluffyThemes.columnWidth + + (hasNavigationRail ? FluffyThemes.navRailWidth : 0), child: mainView, ), - Container( - width: 1.0, - color: Theme.of(context).dividerColor, - ), - Expanded( - child: ClipRRect( - child: sideView, - ), - ), + Container(width: 1.0, color: theme.dividerColor), + Expanded(child: ClipRRect(child: sideView)), ], ), ), diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index 37e8fbcf0d..840a7d4b99 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -1,116 +1,112 @@ -import 'dart:io'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/push_helper.dart'; +import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/foundation.dart'; - -import 'package:desktop_lifecycle/desktop_lifecycle.dart'; -import 'package:desktop_notifications/desktop_notifications.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:http/http.dart' as http; +import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:universal_html/html.dart' as html; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/matrix_locals.dart'; -import 'package:fluffychat/widgets/matrix.dart'; extension LocalNotificationsExtension on MatrixState { - void showLocalNotification(EventUpdate eventUpdate) async { - final roomId = eventUpdate.roomID; + static final html.AudioElement _audioPlayer = html.AudioElement() + ..src = 'assets/assets/sounds/notification.ogg' + ..load(); + + Future showLocalNotification(Event event) async { + final l10n = L10n.of(context); + final roomId = event.room.id; if (activeRoomId == roomId) { - if (kIsWeb && webHasFocus) return; - if (Platform.isLinux && DesktopLifecycle.instance.isActive.value) return; - } - final room = client.getRoomById(roomId); - if (room == null) { - Logs().w('Can not display notification for unknown room $roomId'); - return; + if (WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { + return; + } } - if (room.notificationCount == 0) return; - final event = Event.fromJson(eventUpdate.content, room); - final title = - room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)!)); + + final title = event.room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); final body = await event.calcLocalizedBody( - MatrixLocals(L10n.of(widget.context)!), + MatrixLocals(L10n.of(context)), withSenderNamePrefix: - !room.isDirectChat || room.lastEvent?.senderId == client.userID, + !event.room.isDirectChat || + event.room.lastEvent?.senderId == client.userID, plaintextBody: true, hideReply: true, hideEdit: true, removeMarkdown: true, ); - final icon = event.senderFromMemoryOrFallback.avatarUrl?.getThumbnail( - client, - width: 64, - height: 64, - method: ThumbnailMethod.crop) ?? - room.avatar?.getThumbnail(client, - width: 64, height: 64, method: ThumbnailMethod.crop); + final avatarUrl = event.room.avatar; + + const size = 128; + const thumbnailMethod = ThumbnailMethod.crop; + + if (avatarUrl != null) { + // Pre-cache so that we can later just set the thumbnail uri as icon: + try { + await client.downloadMxcCached( + avatarUrl, + width: size, + height: size, + thumbnailMethod: thumbnailMethod, + isThumbnail: true, + rounded: true, + ); + } catch (e, s) { + Logs().d('Unable to pre-download avatar for web notification', e, s); + } + } + if (kIsWeb) { - html.AudioElement() - ..src = - 'assets/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg' - ..autoplay = true - ..load(); - html.Notification( - title, - body: body, - icon: icon.toString(), + final thumbnailUri = await avatarUrl?.getThumbnailUri( + client, + width: size, + height: size, + method: thumbnailMethod, ); - } else if (Platform.isLinux) { - final appIconUrl = room.avatar?.getThumbnail( - room.client, - width: 56, - height: 56, - ); - File? appIconFile; - if (appIconUrl != null) { - final tempDirectory = await getApplicationSupportDirectory(); - final avatarDirectory = - await Directory('${tempDirectory.path}/notiavatars/').create(); - appIconFile = File( - '${avatarDirectory.path}/${Uri.encodeComponent(appIconUrl.toString())}'); - if (await appIconFile.exists() == false) { - final response = await http.get(appIconUrl); - await appIconFile.writeAsBytes(response.bodyBytes); - } - } - final notification = await linuxNotifications!.notify( + + if (AppSettings.webNotificationSound.value) _audioPlayer.play(); + + html.Notification( title, body: body, - replacesId: linuxNotificationIds[roomId] ?? 0, - appName: AppConfig.applicationName, - appIcon: appIconFile?.path ?? '', - actions: [ - NotificationAction( - DesktopNotificationActions.openChat.name, - L10n.of(widget.context)!.openChat, - ), - NotificationAction( - DesktopNotificationActions.seen.name, - L10n.of(widget.context)!.markAsRead, - ), - ], - hints: [ - NotificationHint.soundName('message-new-instant'), - ], + icon: thumbnailUri?.toString(), + tag: event.room.id, ); - notification.action.then((actionStr) { - final action = DesktopNotificationActions.values - .singleWhere((a) => a.name == actionStr); - switch (action) { - case DesktopNotificationActions.seen: - room.setReadMarker(event.eventId, mRead: event.eventId); - break; - case DesktopNotificationActions.openChat: - VRouter.of(navigatorContext).toSegments(['rooms', room.id]); - break; - } - }); - linuxNotificationIds[roomId] = notification.id; + return; } + + FlutterLocalNotificationsPlugin().show( + id: event.room.id.hashCode, + title: title, + body: body, + notificationDetails: NotificationDetails( + linux: LinuxNotificationDetails( + sound: ThemeLinuxSound('message-new-instant'), + actions: [ + LinuxNotificationAction( + key: FluffyChatNotificationActions.markAsRead.name, + label: l10n.markAsRead, + ), + LinuxNotificationAction( + key: FluffyChatNotificationActions.mute.name, + label: l10n.mute, + ), + ], + ), + ), + payload: FluffyChatPushPayload( + client.clientName, + event.room.id, + event.eventId, + ).toString(), + ); } } - -enum DesktopNotificationActions { seen, openChat } diff --git a/lib/widgets/lock_screen.dart b/lib/widgets/lock_screen.dart index 1a5a457542..b74a3acbc3 100644 --- a/lib/widgets/lock_screen.dart +++ b/lib/widgets/lock_screen.dart @@ -1,91 +1,196 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'package:flutter_app_lock/flutter_app_lock.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:pin_code_text_field/pin_code_text_field.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import 'dart:async'; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; -import 'layouts/login_scaffold.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:local_auth/local_auth.dart'; class LockScreen extends StatefulWidget { - const LockScreen({Key? key}) : super(key: key); + const LockScreen({super.key}); @override - _LockScreenState createState() => _LockScreenState(); + State createState() => _LockScreenState(); } class _LockScreenState extends State { + String? _errorText; + int _coolDownSeconds = 5; + bool _inputBlocked = false; final TextEditingController _textEditingController = TextEditingController(); - final FocusNode _focusNode = FocusNode(); - bool _wrongInput = false; + + Future tryUnlockWithBiometrics() async { + setState(() { + _errorText = null; + }); + + final success = await AppLock.of(context).unlockWithBiometrics(); + + if (success) { + setState(() { + _inputBlocked = false; + _errorText = null; + }); + return; + } + + setState(() { + _errorText = L10n.of(context).wrongPinEntered(_coolDownSeconds); + _inputBlocked = true; + }); + Future.delayed(Duration(seconds: _coolDownSeconds)).then((_) { + setState(() { + _inputBlocked = false; + _coolDownSeconds *= 2; + _errorText = null; + }); + }); + _textEditingController.clear(); + } + + Future tryUnlock(String text) async { + text = text.trim(); + setState(() { + _errorText = null; + }); + + final enteredPin = int.tryParse(text); + if (enteredPin == null) { + setState(() { + _errorText = L10n.of(context).invalidInput; + }); + _textEditingController.clear(); + return; + } + + if (AppLock.of(context).unlock(text)) { + setState(() { + _inputBlocked = false; + _errorText = null; + }); + _textEditingController.clear(); + return; + } + + setState(() { + _errorText = L10n.of(context).wrongPinEntered(_coolDownSeconds); + _inputBlocked = true; + }); + Future.delayed(Duration(seconds: _coolDownSeconds)).then((_) { + setState(() { + _inputBlocked = false; + _coolDownSeconds *= 2; + _errorText = null; + }); + }); + _textEditingController.clear(); + } + @override Widget build(BuildContext context) { - return MaterialApp( - theme: FluffyThemes.light(), - darkTheme: FluffyThemes.light(), - localizationsDelegates: L10n.localizationsDelegates, - supportedLocales: L10n.supportedLocales, - home: Builder( - builder: (context) => LoginScaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - elevation: 0, - centerTitle: true, - title: Text(L10n.of(context)!.pleaseEnterYourPin), - backgroundColor: Colors.transparent, - ), - body: Container( - decoration: BoxDecoration( - color: Theme.of(context).backgroundColor, - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - stops: const [ - 0.1, - 0.4, - 0.6, - 0.9, - ], - colors: [ - Theme.of(context).secondaryHeaderColor.withAlpha(16), - Theme.of(context).primaryColor.withAlpha(16), - Theme.of(context).colorScheme.secondary.withAlpha(16), - Theme.of(context).backgroundColor.withAlpha(16), + return Overlay( + initialEntries: [ + OverlayEntry( + builder: (context) => Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).pleaseEnterYourPin), + centerTitle: true, + ), + body: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth, + ), + child: ListView( + shrinkWrap: true, + padding: const EdgeInsets.all(16.0), + children: [ + Center( + child: Image.asset( + 'assets/logo/mini/logo_mono_mini.png', + width: 128, + color: Theme.of(context).colorScheme.surfaceContainerHigh, + ), + ), + const SizedBox(height: 16), + TextField( + controller: _textEditingController, + textInputAction: TextInputAction.go, + keyboardType: TextInputType.number, + obscureText: true, + autofocus: true, + textAlign: TextAlign.center, + readOnly: _inputBlocked, + onChanged: (text) { + if (text.length >= 6) tryUnlock(text); + }, + onSubmitted: tryUnlock, + style: const TextStyle(fontSize: 40), + inputFormatters: [LengthLimitingTextInputFormatter(6)], + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(40), + ), + errorText: _errorText, + hintText: '✱✱✱✱', + hintStyle: TextStyle( + color: Theme.of( + context, + ).colorScheme.surfaceContainerHighest, + ), + prefix: AppLock.of(context).useBiometrics + ? IconButton( + tooltip: L10n.of(context).unlockWithBiometrics, + icon: FutureBuilder( + future: LocalAuthentication() + .getAvailableBiometrics(), + builder: (context, snapshot) { + final availableBiometrics = + snapshot.data ?? []; + if (availableBiometrics.contains( + BiometricType.face, + )) { + return Icon(Icons.face_unlock_outlined); + } + return Icon(Icons.fingerprint_outlined); + }, + ), + onPressed: _inputBlocked + ? null + : tryUnlockWithBiometrics, + ) + : IconButton( + tooltip: L10n.of(context).reset, + icon: Icon(Icons.cancel_outlined), + onPressed: _inputBlocked + ? null + : _textEditingController.clear, + ), + suffix: IconButton( + tooltip: L10n.of(context).unlock, + icon: Icon(Icons.send_outlined), + onPressed: _inputBlocked + ? null + : () => tryUnlock(_textEditingController.text), + ), + ), + ), + if (_inputBlocked) + const Padding( + padding: EdgeInsets.all(16.0), + child: CircularProgressIndicator.adaptive(), + ), ], ), ), - alignment: Alignment.center, - child: PinCodeTextField( - autofocus: true, - controller: _textEditingController, - focusNode: _focusNode, - pinBoxRadius: AppConfig.borderRadius, - pinTextStyle: const TextStyle(fontSize: 32), - hideCharacter: true, - hasError: _wrongInput, - onDone: (String input) async { - if (input == - await ([TargetPlatform.linux] - .contains(Theme.of(context).platform) - ? SharedPreferences.getInstance().then( - (prefs) => prefs.getString(SettingKeys.appLockKey)) - : const FlutterSecureStorage() - .read(key: SettingKeys.appLockKey))) { - AppLock.of(context)!.didUnlock(); - } else { - _textEditingController.clear(); - setState(() => _wrongInput = true); - _focusNode.requestFocus(); - } - }, - ), ), ), - ), + ], ); } } diff --git a/lib/widgets/log_view.dart b/lib/widgets/log_view.dart index 0c18fa50de..90aadb66a8 100644 --- a/lib/widgets/log_view.dart +++ b/lib/widgets/log_view.dart @@ -1,28 +1,33 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; class LogViewer extends StatefulWidget { - const LogViewer({Key? key}) : super(key: key); + const LogViewer({super.key}); @override - _LogViewerState createState() => _LogViewerState(); + LogViewerState createState() => LogViewerState(); } -class _LogViewerState extends State { +class LogViewerState extends State { Level logLevel = Level.debug; double fontSize = 14; @override Widget build(BuildContext context) { - final outputEvents = Logs() - .outputEvents + final outputEvents = Logs().outputEvents .where((e) => e.level.index <= logLevel.index) .toList(); return Scaffold( backgroundColor: Colors.black, appBar: AppBar( title: Text(logLevel.toString()), - leading: const BackButton(), + leading: BackButton(onPressed: () => context.go('/')), actions: [ IconButton( icon: const Icon(Icons.zoom_in_outlined), @@ -33,11 +38,14 @@ class _LogViewerState extends State { onPressed: () => setState(() => fontSize--), ), PopupMenuButton( + useRootNavigator: true, itemBuilder: (context) => Level.values - .map((level) => PopupMenuItem( - value: level, - child: Text(level.toString()), - )) + .map( + (level) => PopupMenuItem( + value: level, + child: Text(level.toString()), + ), + ) .toList(), onSelected: (Level level) => setState(() => logLevel = level), ), @@ -49,9 +57,7 @@ class _LogViewerState extends State { scrollDirection: Axis.horizontal, child: SelectableText( outputEvents[i].toDisplayString(), - style: TextStyle( - color: outputEvents[i].color, - ), + style: TextStyle(color: outputEvents[i].color), ), ), ), @@ -73,7 +79,6 @@ extension on LogEvent { case Level.debug: return Colors.white; case Level.verbose: - default: return Colors.grey; } } @@ -81,10 +86,10 @@ extension on LogEvent { String toDisplayString() { var str = '# [${level.toString().split('.').last.toUpperCase()}] $title'; if (exception != null) { - str += ' - ${exception.toString()}'; + str += ' - $exception'; } if (stackTrace != null) { - str += '\n${stackTrace.toString()}'; + str += '\n$stackTrace'; } return str; } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index dd876482e7..357ad43854 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -1,62 +1,57 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:async'; import 'dart:convert'; -import 'dart:io'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/uia_request_manager.dart'; +import 'package:fluffychat/utils/voip_plugin.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:collection/collection.dart'; -import 'package:desktop_notifications/desktop_notifications.dart'; -import 'package:flutter_app_lock/flutter_app_lock.dart'; -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:http/http.dart' as http; -import 'package:image_picker/image_picker.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:intl/intl.dart'; +import 'package:just_audio/just_audio.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/html.dart' as html; -import 'package:url_launcher/url_launcher.dart'; -import 'package:vrouter/vrouter.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/sentry_controller.dart'; -import 'package:fluffychat/utils/uia_request_manager.dart'; -import 'package:fluffychat/utils/voip_plugin.dart'; -import '../config/app_config.dart'; import '../config/setting_keys.dart'; import '../pages/key_verification/key_verification_dialog.dart'; import '../utils/account_bundles.dart'; import '../utils/background_push.dart'; -import '../utils/famedlysdk_store.dart'; -import '../utils/platform_infos.dart'; import 'local_notifications_extension.dart'; -// import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - class Matrix extends StatefulWidget { final Widget? child; - final GlobalKey? router; - - final BuildContext context; - final List clients; final Map? queryParameters; + final SharedPreferences store; + const Matrix({ this.child, - required this.router, - required this.context, required this.clients, + required this.store, this.queryParameters, - Key? key, - }) : super(key: key); + super.key, + }); @override MatrixState createState() => MatrixState(); @@ -66,35 +61,21 @@ class Matrix extends StatefulWidget { Provider.of(context, listen: false); } -class MatrixState extends State with WidgetsBindingObserver { +class MatrixState extends State { int _activeClient = -1; String? activeBundle; - Store store = Store(); - late BuildContext navigatorContext; - HomeserverSummary? loginHomeserverSummary; - XFile? loginAvatar; - String? loginUsername; - bool? loginRegistrationSupported; + SharedPreferences get store => widget.store; - BackgroundPush? _backgroundPush; + BackgroundPush? backgroundPush; Client get client { - if (widget.clients.isEmpty) { - widget.clients.add(getLoginClient()); - } if (_activeClient < 0 || _activeClient >= widget.clients.length) { return currentBundle!.first!; } return widget.clients[_activeClient]; } - bool get webrtcIsSupported => - kIsWeb || - PlatformInfos.isMobile || - PlatformInfos.isWindows || - PlatformInfos.isMacOS; - VoipPlugin? voipPlugin; bool get isMultiAccount => widget.clients.length > 1; @@ -102,9 +83,6 @@ class MatrixState extends State with WidgetsBindingObserver { int getClientIndexByMatrixId(String matrixId) => widget.clients.indexWhere((client) => client.userID == matrixId); - late String currentClientSecret; - RequestTokenResponse? currentThreepidCreds; - void setActiveClient(Client? cl) { final i = widget.clients.indexWhere((c) => c == cl); if (i != -1) { @@ -128,7 +106,8 @@ class MatrixState extends State with WidgetsBindingObserver { } Map> get accountBundles { - final resBundles = >{}; + final resBundles = + >{}; for (var i = 0; i < widget.clients.length; i++) { final bundles = widget.clients[i].accountBundles; for (final bundle in bundles) { @@ -136,95 +115,70 @@ class MatrixState extends State with WidgetsBindingObserver { continue; } resBundles[bundle.name] ??= []; - resBundles[bundle.name]!.add(_AccountBundleWithClient( + resBundles[bundle.name]!.add(( client: widget.clients[i], bundle: bundle, )); } } for (final b in resBundles.values) { - b.sort((a, b) => a.bundle!.priority == null - ? 1 - : b.bundle!.priority == null - ? -1 - : a.bundle!.priority!.compareTo(b.bundle!.priority!)); + b.sort( + (a, b) => a.bundle!.priority == null + ? 1 + : b.bundle!.priority == null + ? -1 + : a.bundle!.priority!.compareTo(b.bundle!.priority!), + ); } - return resBundles - .map((k, v) => MapEntry(k, v.map((vv) => vv.client).toList())); + return resBundles.map( + (k, v) => MapEntry(k, v.map((vv) => vv.client).toList()), + ); } bool get hasComplexBundles => accountBundles.values.any((v) => v.length > 1); Client? _loginClientCandidate; - Client getLoginClient() { + AudioPlayer? audioPlayer; + final ValueNotifier voiceMessageEventId = ValueNotifier(null); + + Future getLoginClient() async { if (widget.clients.isNotEmpty && !client.isLogged()) { return client; } - final candidate = _loginClientCandidate ??= ClientManager.createClient( - '${AppConfig.applicationName}-${DateTime.now().millisecondsSinceEpoch}') - ..onLoginStateChanged - .stream - .where((l) => l == LoginState.loggedIn) - .first - .then((_) { - if (!widget.clients.contains(_loginClientCandidate)) { - widget.clients.add(_loginClientCandidate!); - } - ClientManager.addClientNameToStore(_loginClientCandidate!.clientName); - _registerSubs(_loginClientCandidate!.clientName); - _loginClientCandidate = null; - widget.router!.currentState!.to('/rooms'); - }); + final candidate = _loginClientCandidate ??= + await ClientManager.createClient( + '${AppSettings.applicationName.value}-${DateTime.now().millisecondsSinceEpoch}', + store, + ) + ..onLoginStateChanged.stream + .where((l) => l == LoginState.loggedIn) + .first + .then((_) { + if (!widget.clients.contains(_loginClientCandidate)) { + widget.clients.add(_loginClientCandidate!); + } + ClientManager.addClientNameToStore( + _loginClientCandidate!.clientName, + store, + ); + _registerSubs(_loginClientCandidate!.clientName); + setActiveClient(_loginClientCandidate); + _loginClientCandidate = null; + FluffyChatApp.router.go('/backup'); + }); + if (widget.clients.isEmpty) widget.clients.add(candidate); return candidate; } Client? getClientByName(String name) => widget.clients.firstWhereOrNull((c) => c.clientName == name); - Map? get shareContent => _shareContent; - - set shareContent(Map? content) { - _shareContent = content; - onShareContentChanged.add(_shareContent); - } - - Map? _shareContent; - - final StreamController?> onShareContentChanged = - StreamController.broadcast(); - - File? wallpaper; - - void _initWithStore() async { - try { - if (client.isLogged()) { - // TODO: Figure out how this works in multi account - final statusMsg = await store.getItem(SettingKeys.ownStatusMessage); - if (statusMsg?.isNotEmpty ?? false) { - Logs().v('Send cached status message: "$statusMsg"'); - await client.setPresence( - client.userID!, - PresenceType.online, - statusMsg: statusMsg, - ); - } - } - } catch (e, s) { - client.onLoginStateChanged.addError(e, s); - SentryController.captureException(e, s); - rethrow; - } - } - final onRoomKeyRequestSub = {}; final onKeyVerificationRequestSub = {}; final onNotification = {}; - final onLoginStateChanged = >{}; + final onLogoutSub = >{}; final onUiaRequest = >{}; - StreamSubscription? onFocusSub; - StreamSubscription? onBlurSub; - final onOwnPresence = >{}; String? _cachedPassword; Timer? _cachedPasswordClearTimer; @@ -241,126 +195,111 @@ class MatrixState extends State with WidgetsBindingObserver { }); } - bool webHasFocus = true; - - String? get activeRoomId => - VRouter.of(navigatorContext).pathParameters['roomid']; - - final linuxNotifications = - PlatformInfos.isLinux ? NotificationsClient() : null; - final Map linuxNotificationIds = {}; + String? get activeRoomId { + final route = FluffyChatApp.router.routeInformationProvider.value.uri.path; + if (!route.startsWith('/rooms/')) return null; + return route.split('/')[2]; + } @override void initState() { super.initState(); - WidgetsBinding.instance.addObserver(this); + _listener = AppLifecycleListener(onStateChange: didChangeAppLifecycleState); initMatrix(); - if (PlatformInfos.isWeb) { - initConfig().then((_) => initSettings()); - } else { - initSettings(); - } } - Future initConfig() async { - try { - final configJsonString = - utf8.decode((await http.get(Uri.parse('config.json'))).bodyBytes); - final configJson = json.decode(configJsonString); - AppConfig.loadFromJson(configJson); - } on FormatException catch (_) { - Logs().v('[ConfigLoader] config.json not found'); - } catch (e) { - Logs().v('[ConfigLoader] config.json not found', e); - } - } - - void _reportSyncError(SyncStatusUpdate update) => - SentryController.captureException( - update.error!.exception, - update.error!.stackTrace, - ); + AppLifecycleListener? _listener; void _registerSubs(String name) { final c = getClientByName(name); if (c == null) { Logs().w( - 'Attempted to register subscriptions for non-existing client $name'); + 'Attempted to register subscriptions for non-existing client $name', + ); return; } - c.onSyncStatus.stream - .where((s) => s.status == SyncStatus.error) - .listen(_reportSyncError); - onRoomKeyRequestSub[name] ??= - c.onRoomKeyRequest.stream.listen((RoomKeyRequest request) async { - if (widget.clients.any(((cl) => - cl.userID == request.requestingDevice.userId && - cl.identityKey == request.requestingDevice.curve25519Key))) { + onRoomKeyRequestSub[name] ??= c.onRoomKeyRequest.stream.listen(( + RoomKeyRequest request, + ) async { + if (widget.clients.any( + ((cl) => + cl.userID == request.requestingDevice.userId && + cl.identityKey == request.requestingDevice.curve25519Key), + )) { Logs().i( - '[Key Request] Request is from one of our own clients, forwarding the key...'); + '[Key Request] Request is from one of our own clients, forwarding the key...', + ); await request.forwardKey(); } }); onKeyVerificationRequestSub[name] ??= c.onKeyVerificationRequest.stream .listen((KeyVerification request) async { - var hidPopup = false; - request.onUpdate = () { - if (!hidPopup && - {KeyVerificationState.done, KeyVerificationState.error} - .contains(request.state)) { - Navigator.of(navigatorContext).pop('dialog'); - } - hidPopup = true; - }; - request.onUpdate = null; - hidPopup = true; - await KeyVerificationDialog(request: request).show(navigatorContext); - }); - onLoginStateChanged[name] ??= c.onLoginStateChanged.stream.listen((state) { - final loggedInWithMultipleClients = widget.clients.length > 1; - if (loggedInWithMultipleClients && state != LoginState.loggedIn) { - _cancelSubs(c.clientName); - widget.clients.remove(c); - ClientManager.removeClientNameFromStore(c.clientName); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context)!.oneClientLoggedOut), - ), - ); - - if (state != LoginState.loggedIn) { - widget.router!.currentState!.to( - '/rooms', - queryParameters: widget.router!.currentState!.queryParameters, + var hidPopup = false; + request.onUpdate = () { + if (!hidPopup && + { + KeyVerificationState.done, + KeyVerificationState.error, + }.contains(request.state)) { + FluffyChatApp.router.pop('dialog'); + } + hidPopup = true; + }; + request.onUpdate = null; + hidPopup = true; + await KeyVerificationDialog(request: request).show( + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context, ); - } - } else { - widget.router!.currentState!.to( - state == LoginState.loggedIn ? '/rooms' : '/home', - queryParameters: widget.router!.currentState!.queryParameters, - ); - } - }); - // Cache and resend status message - onOwnPresence[name] ??= c.onPresenceChanged.stream.listen((presence) { - if (c.isLogged() && - c.userID == presence.userid && - presence.statusMsg != null) { - Logs().v('Update status message: "${presence.statusMsg}"'); - store.setItem(SettingKeys.ownStatusMessage, presence.statusMsg); - } - }); + }); + onLogoutSub[name] ??= c.onLoginStateChanged.stream + .where((state) => state == LoginState.loggedOut) + .listen((_) { + final loggedInWithMultipleClients = widget.clients.length > 1; + + _cancelSubs(c.clientName); + widget.clients.remove(c); + ClientManager.removeClientNameFromStore(c.clientName, store); + InitWithRestoreExtension.deleteSessionBackup(name); + + if (loggedInWithMultipleClients) { + final snackbarContext = + FluffyChatApp + .router + .routerDelegate + .navigatorKey + .currentContext ?? + context; + + if (!snackbarContext.mounted) return; + final l10n = L10n.of(snackbarContext); + ScaffoldMessenger.of( + snackbarContext, + ).showSnackBar(SnackBar(content: Text(l10n.oneClientLoggedOut))); + return; + } + FluffyChatApp.router.go('/'); + }); onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler); if (PlatformInfos.isWeb || PlatformInfos.isLinux) { + FlutterLocalNotificationsPlugin().initialize( + settings: InitializationSettings( + linux: LinuxInitializationSettings( + defaultActionName: FluffyChatNotificationActions.open.name, + ), + ), + onDidReceiveNotificationResponse: (response) => notificationTap( + response, + clients: widget.clients, + router: FluffyChatApp.router, + l10n: null, + ), + ); c.onSync.stream.first.then((s) { html.Notification.requestPermission(); - onNotification[name] ??= c.onEvent.stream - .where((e) => - e.type == EventUpdateType.timeline && - [EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] - .contains(e.content['type']) && - e.content['sender'] != c.userID) - .listen(showLocalNotification); + onNotification[name] ??= c.onNotification.stream.listen( + showLocalNotification, + ); }); } } @@ -370,201 +309,133 @@ class MatrixState extends State with WidgetsBindingObserver { onRoomKeyRequestSub.remove(name); onKeyVerificationRequestSub[name]?.cancel(); onKeyVerificationRequestSub.remove(name); - onLoginStateChanged[name]?.cancel(); - onLoginStateChanged.remove(name); - onOwnPresence[name]?.cancel(); - onOwnPresence.remove(name); + onLogoutSub[name]?.cancel(); + onLogoutSub.remove(name); onNotification[name]?.cancel(); onNotification.remove(name); } void initMatrix() { - // Display the app lock - if (PlatformInfos.isMobile) { - WidgetsBinding.instance.addPostFrameCallback((_) { - ([TargetPlatform.linux].contains(Theme.of(context).platform) - ? SharedPreferences.getInstance() - .then((prefs) => prefs.getString(SettingKeys.appLockKey)) - : const FlutterSecureStorage() - .read(key: SettingKeys.appLockKey)) - .then((lock) { - if (lock?.isNotEmpty ?? false) { - AppLock.of(widget.context)!.enable(); - AppLock.of(widget.context)!.showLockScreen(); - } - }); - }); - } - - _initWithStore(); - for (final c in widget.clients) { _registerSubs(c.clientName); } - if (kIsWeb) { - onFocusSub = html.window.onFocus.listen((_) => webHasFocus = true); - onBlurSub = html.window.onBlur.listen((_) => webHasFocus = false); - } - if (PlatformInfos.isMobile) { - _backgroundPush = BackgroundPush( - client, - context, - widget.router, - onFcmError: (errorMsg, {Uri? link}) => Timer( - const Duration(seconds: 1), - () { - final banner = SnackBar( - content: Text(errorMsg), - duration: const Duration(seconds: 30), - action: link == null - ? null - : SnackBarAction( - label: L10n.of(context)!.link, - onPressed: () => launch(link.toString()), - ), + backgroundPush = BackgroundPush( + this, + onFcmError: (errorMsg, {Uri? link}) async { + final context = + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + this.context; + if (!context.mounted) return; + final result = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).pushNotificationsNotAvailable, + message: errorMsg, + okLabel: link == null + ? L10n.of(context).ok + : L10n.of(context).learnMore, + cancelLabel: L10n.of(context).doNotShowAgain, + ); + if (result == OkCancelResult.ok && link != null) { + launchUrlString( + link.toString(), + mode: LaunchMode.externalApplication, ); - ScaffoldMessenger.of(navigatorContext).showSnackBar(banner); - }, - ), + } + if (result == OkCancelResult.cancel) { + await AppSettings.showNoGoogle.setItem(true); + } + }, ); } createVoipPlugin(); } - void createVoipPlugin() async { - if (await store.getItemBool(SettingKeys.experimentalVoip) == false) { + Future createVoipPlugin() async { + if (!AppSettings.experimentalVoip.value) { voipPlugin = null; return; } - voipPlugin = - webrtcIsSupported ? VoipPlugin(client: client, context: context) : null; + voipPlugin = VoipPlugin(this); } - bool _firstStartup = true; - - @override void didChangeAppLifecycleState(AppLifecycleState state) { - Logs().v('AppLifecycleState = $state'); - final foreground = state != AppLifecycleState.detached && + final foreground = + state != AppLifecycleState.inactive && state != AppLifecycleState.paused; - client.backgroundSync = foreground; - client.syncPresence = foreground ? null : PresenceType.unavailable; - client.requestHistoryOnLimitedTimeline = !foreground; - if (_firstStartup) { - _firstStartup = false; - _backgroundPush?.setupPush(); - } - } - - void initSettings() { - store.getItem(SettingKeys.wallpaper).then((final path) async { - if (path == null) return; - final file = File(path); - if (await file.exists()) { - wallpaper = file; - } - }); - store.getItem(SettingKeys.fontSizeFactor).then((value) => - AppConfig.fontSizeFactor = - double.tryParse(value ?? '') ?? AppConfig.fontSizeFactor); - store.getItem(SettingKeys.bubbleSizeFactor).then((value) => - AppConfig.bubbleSizeFactor = - double.tryParse(value ?? '') ?? AppConfig.bubbleSizeFactor); - store - .getItemBool(SettingKeys.renderHtml, AppConfig.renderHtml) - .then((value) => AppConfig.renderHtml = value); - store - .getItemBool( - SettingKeys.hideRedactedEvents, AppConfig.hideRedactedEvents) - .then((value) => AppConfig.hideRedactedEvents = value); - store - .getItemBool(SettingKeys.hideUnknownEvents, AppConfig.hideUnknownEvents) - .then((value) => AppConfig.hideUnknownEvents = value); - store - .getItemBool(SettingKeys.showDirectChatsInSpaces, - AppConfig.showDirectChatsInSpaces) - .then((value) => AppConfig.showDirectChatsInSpaces = value); - store - .getItemBool(SettingKeys.separateChatTypes, AppConfig.separateChatTypes) - .then((value) => AppConfig.separateChatTypes = value); - store - .getItemBool(SettingKeys.autoplayImages, AppConfig.autoplayImages) - .then((value) => AppConfig.autoplayImages = value); - store - .getItemBool(SettingKeys.sendOnEnter, AppConfig.sendOnEnter) - .then((value) => AppConfig.sendOnEnter = value); - store - .getItemBool(SettingKeys.experimentalVoip, AppConfig.experimentalVoip) - .then((value) => AppConfig.experimentalVoip = value); - store.getItem(SettingKeys.chatColor).then((value) { - if (value != null && int.tryParse(value) != null) { - AppConfig.colorSchemeSeed = Color(int.parse(value)); - AdaptiveTheme.of(context).setTheme( - light: FluffyThemes.light(), - dark: FluffyThemes.dark(), - ); + for (final client in widget.clients) { + client.syncPresence = state == AppLifecycleState.resumed + ? null + : PresenceType.unavailable; + if (PlatformInfos.isMobile) { + client.backgroundSync = foreground; + client.requestHistoryOnLimitedTimeline = !foreground; + Logs().v('Set background sync to', foreground); } - }); + } } @override void dispose() { - WidgetsBinding.instance.removeObserver(this); - - onRoomKeyRequestSub.values.map((s) => s.cancel()); - onKeyVerificationRequestSub.values.map((s) => s.cancel()); - onLoginStateChanged.values.map((s) => s.cancel()); - onOwnPresence.values.map((s) => s.cancel()); - onNotification.values.map((s) => s.cancel()); - client.httpClient.close(); - onFocusSub?.cancel(); - onBlurSub?.cancel(); - _backgroundPush?.onLogin?.cancel(); + _listener?.dispose(); - linuxNotifications?.close(); + for (final sub in onRoomKeyRequestSub.values) { + sub.cancel(); + } + for (final sub in onKeyVerificationRequestSub.values) { + sub.cancel(); + } + for (final sub in onLogoutSub.values) { + sub.cancel(); + } + for (final sub in onNotification.values) { + sub.cancel(); + } + for (final sub in onUiaRequest.values) { + sub.cancel(); + } + onRoomKeyRequestSub.clear(); + onKeyVerificationRequestSub.clear(); + onLogoutSub.clear(); + onNotification.clear(); + onUiaRequest.clear(); super.dispose(); } @override Widget build(BuildContext context) { - return Provider( - create: (_) => this, - child: widget.child, - ); + return Provider(create: (_) => this, child: widget.child); } -} -class FixedThreepidCreds extends ThreepidCreds { - FixedThreepidCreds({ - required String sid, - required String clientSecret, - String? idServer, - String? idAccessToken, - }) : super( - sid: sid, - clientSecret: clientSecret, - idServer: idServer, - idAccessToken: idAccessToken, - ); + Future dehydrateAction(BuildContext context) async { + final l10n = L10n.of(context); + final response = await showOkCancelAlertDialog( + context: context, + isDestructive: true, + title: l10n.dehydrate, + message: l10n.dehydrateWarning, + ); + if (response != OkCancelResult.ok) { + return; + } + if (!context.mounted) return; + final result = await showFutureLoadingDialog( + context: context, + future: client.exportDump, + ); + final export = result.result; + if (export == null) return; - @override - Map toJson() { - final data = {}; - data['sid'] = sid; - data['client_secret'] = clientSecret; - if (idServer != null) data['id_server'] = idServer; - if (idAccessToken != null) data['id_access_token'] = idAccessToken; - return data; - } -} + final exportBytes = Uint8List.fromList(const Utf8Codec().encode(export)); -class _AccountBundleWithClient { - final Client? client; - final AccountBundle? bundle; + final exportFileName = + 'fluffychat-export-${DateFormat(DateFormat.YEAR_MONTH_DAY).format(DateTime.now())}.fluffybackup'; - _AccountBundleWithClient({this.client, this.bundle}); + final file = MatrixFile(bytes: exportBytes, name: exportFileName); + if (!context.mounted) return; + file.save(context); + } } diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart new file mode 100644 index 0000000000..460cd78d21 --- /dev/null +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -0,0 +1,377 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/permission_slider_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'adaptive_dialogs/show_text_input_dialog.dart'; +import 'adaptive_dialogs/user_dialog.dart'; +import 'avatar.dart'; +import 'future_loading_dialog.dart'; + +Future showMemberActionsPopupMenu({ + required BuildContext context, + required User user, + void Function()? onMention, +}) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); + final theme = Theme.of(context); + final displayname = user.calcDisplayname(); + final isMe = user.room.client.userID == user.id; + + final overlay = Overlay.of(context).context.findRenderObject() as RenderBox; + + final button = context.findRenderObject() as RenderBox; + + final position = RelativeRect.fromRect( + Rect.fromPoints( + button.localToGlobal(const Offset(0, -65), ancestor: overlay), + button.localToGlobal( + button.size.bottomRight(Offset.zero) + const Offset(-50, 0), + ancestor: overlay, + ), + ), + Offset.zero & overlay.size, + ); + + const defaultPowerLevels = {0, 50, 100, 9007199254740991}; + + final action = await showMenu<_MemberActions>( + context: context, + position: position, + items: >[ + PopupMenuItem( + value: _MemberActions.info, + child: Row( + spacing: 12.0, + children: [ + Avatar(name: displayname, size: 30, mxContent: user.avatarUrl), + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 200), + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + if (onMention != null) + PopupMenuItem( + value: _MemberActions.mention, + child: Row( + children: [ + const Icon(Icons.alternate_email_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).mention), + ], + ), + ), + if (user.membership == Membership.knock) + PopupMenuItem( + value: _MemberActions.approve, + child: Row( + children: [ + const Icon(Icons.how_to_reg_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).approve), + ], + ), + ), + if (user.canChangeUserPowerLevel) ...[ + if (user.powerLevel.level < 100) + PopupMenuItem( + value: _MemberActions.makeAdmin, + child: Row( + children: [ + const Icon(Icons.admin_panel_settings_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).makeAdmin), + ], + ), + ), + if (user.powerLevel.level < 50) + PopupMenuItem( + value: _MemberActions.makeModerator, + child: Row( + children: [ + const Icon(Icons.add_moderator_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).makeModerator), + ], + ), + ), + if (user.powerLevel.role == PowerLevelRole.admin) + PopupMenuItem( + value: _MemberActions.removeAdmin, + child: Row( + children: [ + const Icon(Icons.remove_moderator_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).removeAdminRights), + ], + ), + ) + else if (user.powerLevel.role == PowerLevelRole.moderator) + PopupMenuItem( + value: _MemberActions.removeModerator, + child: Row( + children: [ + const Icon(Icons.remove_moderator_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).removeModeratorRights), + ], + ), + ), + ], + if (user.canChangeUserPowerLevel || + !defaultPowerLevels.contains(user.powerLevel.level)) + PopupMenuItem( + value: _MemberActions.setPowerLevel, + enabled: user.canChangeUserPowerLevel, + child: Row( + children: [ + const Icon(Icons.manage_accounts_outlined), + const SizedBox(width: 18), + Text( + user.canChangeUserPowerLevel + ? L10n.of(context).setPowerLevel + : L10n.of(context).powerLevel, + ), + if (!defaultPowerLevels.contains(user.powerLevel.level)) + Text(' (${user.powerLevel})'), + ], + ), + ), + if (user.canKick) + PopupMenuItem( + value: _MemberActions.kick, + child: Row( + children: [ + Icon( + Icons.person_remove_outlined, + color: theme.colorScheme.onErrorContainer, + ), + const SizedBox(width: 18), + Text( + L10n.of(context).kickFromChat, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ], + ), + ), + if (user.canBan && user.membership != Membership.ban) + PopupMenuItem( + value: _MemberActions.ban, + child: Row( + children: [ + Icon( + Icons.block_outlined, + color: theme.colorScheme.onErrorContainer, + ), + const SizedBox(width: 18), + Text( + L10n.of(context).banFromChat, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ], + ), + ), + if (user.canBan && user.membership == Membership.ban) + PopupMenuItem( + value: _MemberActions.unban, + child: Row( + children: [ + const Icon(Icons.warning), + const SizedBox(width: 18), + Text(L10n.of(context).unbanFromChat), + ], + ), + ), + if (!isMe) + PopupMenuItem( + value: _MemberActions.report, + child: Row( + children: [ + Icon( + Icons.gavel_outlined, + color: theme.colorScheme.onErrorContainer, + ), + const SizedBox(width: 18), + Text( + L10n.of(context).reportUser, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), + ], + ), + ), + ], + ); + if (action == null) return; + if (!context.mounted) return; + + switch (action) { + case _MemberActions.mention: + onMention?.call(); + return; + case _MemberActions.setPowerLevel: + final power = await showPermissionChooser( + context, + currentLevel: user.powerLevel.level, + maxLevel: user.room.ownPowerLevel.level, + ); + if (power == null) return; + if (!context.mounted) return; + if (power >= 100) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).makeAdminDescription, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + } + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(power), + ); + return; + case _MemberActions.approve: + await showFutureLoadingDialog( + context: context, + future: () => user.room.invite(user.id), + ); + return; + case _MemberActions.kick: + if (await showOkCancelAlertDialog( + context: context, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.no, + message: l10n.kickUserDescription, + ) == + OkCancelResult.ok) { + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => user.kick(), + ); + } + return; + case _MemberActions.ban: + if (await showOkCancelAlertDialog( + context: context, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.no, + message: l10n.banUserDescription, + ) == + OkCancelResult.ok) { + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => user.ban(), + ); + } + return; + case _MemberActions.report: + final reason = await showTextInputDialog( + context: context, + title: l10n.whyDoYouWantToReportThis, + okLabel: l10n.report, + cancelLabel: l10n.cancel, + hintText: l10n.reason, + ); + if (reason == null || reason.isEmpty) return; + if (!context.mounted) return; + + final result = await showFutureLoadingDialog( + context: context, + future: () => user.room.client.reportUser(user.id, reason), + ); + if (result.error != null) return; + if (!context.mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.contentHasBeenReported)), + ); + return; + case _MemberActions.info: + await UserDialog.show( + context: context, + profile: Profile( + userId: user.id, + displayName: user.displayName, + avatarUrl: user.avatarUrl, + ), + ); + return; + case _MemberActions.unban: + if (await showOkCancelAlertDialog( + context: context, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.no, + message: l10n.unbanUserDescription, + ) == + OkCancelResult.ok) { + if (!context.mounted) return; + await showFutureLoadingDialog( + context: context, + future: () => user.unban(), + ); + } + case _MemberActions.makeAdmin: + if (user.room.ownPowerLevel.level <= 100) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).makeAdminDescription, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + } + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(100), + ); + case _MemberActions.makeModerator: + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(50), + ); + case _MemberActions.removeAdmin: + case _MemberActions.removeModerator: + final defaultUserLevel = + user.room + .getState(EventTypes.RoomPowerLevels) + ?.content + .tryGet('users_default') ?? + 0; + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(defaultUserLevel), + ); + } +} + +enum _MemberActions { + info, + mention, + setPowerLevel, + makeAdmin, + makeModerator, + removeAdmin, + removeModerator, + kick, + ban, + approve, + unban, + report, +} diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart new file mode 100644 index 0000000000..e83e3b0b46 --- /dev/null +++ b/lib/widgets/mxc_image.dart @@ -0,0 +1,215 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:io'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/utils/client_download_content_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class MxcImage extends StatefulWidget { + final Uri? uri; + final Event? event; + final double? width; + final double? height; + final BoxFit? fit; + final bool isThumbnail; + final bool animated; + final Duration retryDuration; + final Duration animationDuration; + final Curve animationCurve; + final ThumbnailMethod thumbnailMethod; + final Widget Function(BuildContext context)? placeholder; + final String? cacheKey; + final String? cacheName; + final Client? client; + final BorderRadius borderRadius; + + static void clearCache(String cacheName) => + _MxcImageState._imageDataCaches.remove(cacheName); + + const MxcImage({ + this.uri, + this.event, + this.width, + this.height, + this.fit, + this.placeholder, + this.isThumbnail = true, + this.animated = false, + this.animationDuration = FluffyThemes.animationDuration, + this.retryDuration = const Duration(seconds: 2), + this.animationCurve = FluffyThemes.animationCurve, + this.thumbnailMethod = ThumbnailMethod.scale, + this.cacheKey, + this.client, + this.borderRadius = BorderRadius.zero, + this.cacheName, + super.key, + }); + + @override + State createState() => _MxcImageState(); +} + +class _MxcImageState extends State { + static final Map> _imageDataCaches = {}; + Map get _imageDataCache => + _imageDataCaches[widget.cacheName ?? ''] ??= {}; + + Uint8List? _imageDataNoCache; + + Uint8List? get _imageData => widget.cacheKey == null + ? _imageDataNoCache + : _imageDataCache[widget.cacheKey]; + + set _imageData(Uint8List? data) { + if (data == null) return; + final cacheKey = widget.cacheKey; + cacheKey == null + ? _imageDataNoCache = data + : _imageDataCache[cacheKey] = data; + } + + Future _load() async { + if (!mounted) return; + final client = + widget.client ?? widget.event?.room.client ?? Matrix.of(context).client; + final uri = widget.uri; + final event = widget.event; + + if (uri != null) { + final devicePixelRatio = MediaQuery.devicePixelRatioOf(context); + final width = widget.width; + final realWidth = width == null ? null : width * devicePixelRatio; + final height = widget.height; + final realHeight = height == null ? null : height * devicePixelRatio; + + final remoteData = await client.downloadMxcCached( + uri, + width: realWidth, + height: realHeight, + thumbnailMethod: widget.thumbnailMethod, + isThumbnail: widget.isThumbnail, + animated: widget.animated, + ); + if (!mounted) return; + setState(() { + _imageData = remoteData; + }); + } + + if (event != null) { + final data = await event.downloadAndDecryptAttachment( + getThumbnail: widget.isThumbnail, + ); + if (data.detectFileType is MatrixImageFile || widget.isThumbnail) { + if (!mounted) return; + setState(() { + _imageData = data.bytes; + }); + return; + } + } + } + + Future _tryLoad() async { + if (_imageData != null) { + return; + } + try { + await _load(); + } on IOException catch (_) { + if (!mounted) return; + await Future.delayed(widget.retryDuration); + _tryLoad(); + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) => _tryLoad()); + } + + @override + Widget build(BuildContext context) { + final data = _imageData; + final hasData = data != null && data.isNotEmpty; + + return AnimatedCrossFade( + duration: FluffyThemes.animationDuration, + firstChild: ClipRRect( + borderRadius: widget.borderRadius, + child: data == null + ? _MxcImagePlaceholder( + width: widget.width, + height: widget.height, + placeholder: widget.placeholder, + ) + : Image.memory( + data, + width: widget.width, + height: widget.height, + fit: widget.fit, + filterQuality: widget.isThumbnail + ? FilterQuality.low + : FilterQuality.medium, + errorBuilder: (context, e, s) { + Logs().d('Unable to render mxc image', e, s); + return SizedBox( + width: widget.width, + height: widget.height, + child: Material( + color: Theme.of(context).colorScheme.surfaceContainer, + child: Icon( + Icons.broken_image_outlined, + size: min(widget.height ?? 64, 64), + color: Theme.of(context).colorScheme.onSurface, + ), + ), + ); + }, + ), + ), + secondChild: _MxcImagePlaceholder( + width: widget.width, + height: widget.height, + placeholder: widget.placeholder, + ), + crossFadeState: hasData + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + ); + } +} + +class _MxcImagePlaceholder extends StatelessWidget { + final double? width; + final double? height; + final Widget Function(BuildContext context)? placeholder; + + const _MxcImagePlaceholder({ + required this.width, + required this.height, + required this.placeholder, + }); + + @override + Widget build(BuildContext context) { + return placeholder?.call(context) ?? + Container( + width: width, + height: height, + alignment: Alignment.center, + child: const CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } +} diff --git a/lib/widgets/mxc_image_viewer.dart b/lib/widgets/mxc_image_viewer.dart new file mode 100644 index 0000000000..da6275cfc1 --- /dev/null +++ b/lib/widgets/mxc_image_viewer.dart @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; + +import 'mxc_image.dart'; + +class MxcImageViewer extends StatelessWidget { + final Uri mxContent; + + const MxcImageViewer(this.mxContent, {super.key}); + + @override + Widget build(BuildContext context) { + final iconButtonStyle = IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(200), + foregroundColor: Colors.white, + ); + return GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: iconButtonStyle, + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + color: Colors.white, + tooltip: L10n.of(context).close, + ), + backgroundColor: Colors.transparent, + ), + body: InteractiveViewer( + minScale: 1.0, + maxScale: 10.0, + onInteractionEnd: (endDetails) { + if (endDetails.velocity.pixelsPerSecond.dy > + MediaQuery.sizeOf(context).height * 1.5) { + Navigator.of(context, rootNavigator: false).pop(); + } + }, + child: Center( + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: MxcImage( + key: ValueKey(mxContent.toString()), + uri: mxContent, + fit: BoxFit.contain, + isThumbnail: false, + animated: true, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index 47733e1b09..03529bbbd0 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -1,91 +1,66 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; - -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_flat_button.dart'; - -class PermissionSliderDialog extends StatefulWidget { - const PermissionSliderDialog({ - Key? key, - this.initialPermission = 0, - }) : super(key: key); - - Future show(BuildContext context) => PlatformInfos.isCupertinoStyle - ? showCupertinoDialog( - context: context, - builder: (context) => this, - useRootNavigator: false, - ) - : showDialog( - context: context, - builder: (context) => this, - useRootNavigator: false, - ); - - final int initialPermission; - @override - _PermissionSliderDialogState createState() => _PermissionSliderDialogState(); -} +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -class _PermissionSliderDialogState extends State { - late int _permission; - @override - void initState() { - _permission = widget.initialPermission; - super.initState(); - } +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:flutter/material.dart'; - @override - Widget build(BuildContext context) { - final title = Text( - L10n.of(context)!.setPermissionsLevel, - textAlign: TextAlign.center, - ); - final content = Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Level: ' + - (_permission == 100 - ? '$_permission (${L10n.of(context)!.admin})' - : _permission >= 50 - ? '$_permission (${L10n.of(context)!.moderator})' - : _permission.toString())), - SizedBox( - height: 56, - child: Slider.adaptive( - value: _permission.toDouble(), - onChanged: (d) => setState(() => _permission = d.round()), - max: 100.0, - min: 0.0, - ), +Future showPermissionChooser( + BuildContext context, { + int currentLevel = 0, + int maxLevel = 100, +}) async { + final controller = TextEditingController(text: currentLevel.toString()); + final error = ValueNotifier(null); + return await showAdaptiveDialog( + context: context, + builder: (context) => AlertDialog.adaptive( + title: Center(child: Text(L10n.of(context).chatPermissions)), + content: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .stretch, + spacing: 16.0, + children: [ + Text(L10n.of(context).setPowerLevelDescription), + ValueListenableBuilder( + valueListenable: error, + builder: (context, errorText, _) => DialogTextField( + controller: controller, + hintText: currentLevel.toString(), + keyboardType: TextInputType.number, + labelText: L10n.of(context).custom, + errorText: errorText, + ), + ), + ], ), - ], - ); - final buttons = [ - AdaptiveFlatButton( - label: L10n.of(context)!.cancel, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(null), - ), - AdaptiveFlatButton( - label: L10n.of(context)!.confirm, - onPressed: () => - Navigator.of(context, rootNavigator: false).pop(_permission), ), - ]; - if (PlatformInfos.isCupertinoStyle) { - return CupertinoAlertDialog( - title: title, - content: content, - actions: buttons, - ); - } - return AlertDialog( - title: title, - content: content, - actions: buttons, - ); - } + actions: [ + AdaptiveDialogAction( + onPressed: () { + final level = int.tryParse(controller.text.trim()); + if (level == null) { + error.value = L10n.of(context).pleaseEnterANumber; + return; + } + if (level > maxLevel) { + error.value = L10n.of(context).noPermission; + return; + } + Navigator.of(context).pop(level); + }, + child: Text(L10n.of(context).setPowerLevel), + ), + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(L10n.of(context).cancel), + ), + ], + ), + ); } diff --git a/lib/widgets/presence_builder.dart b/lib/widgets/presence_builder.dart new file mode 100644 index 0000000000..bfafea2e5d --- /dev/null +++ b/lib/widgets/presence_builder.dart @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'dart:async'; + +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +class PresenceBuilder extends StatefulWidget { + final Widget Function(BuildContext context, CachedPresence? presence) builder; + final String? userId; + final Client? client; + + const PresenceBuilder({ + required this.builder, + this.userId, + this.client, + super.key, + }); + + @override + State createState() => _PresenceBuilderState(); +} + +class _PresenceBuilderState extends State { + CachedPresence? _presence; + StreamSubscription? _sub; + + void _updatePresence(CachedPresence? presence) { + if (!mounted) return; + setState(() { + _presence = presence; + }); + } + + @override + void initState() { + super.initState(); + final client = widget.client ?? Matrix.of(context).client; + final userId = widget.userId; + if (userId != null) { + client.fetchCurrentPresence(userId).then(_updatePresence); + _sub = client.onPresenceChanged.stream + .where((presence) => presence.userid == userId) + .listen(_updatePresence); + } + } + + @override + void dispose() { + _sub?.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => widget.builder(context, _presence); +} diff --git a/lib/widgets/profile_bottom_sheet.dart b/lib/widgets/profile_bottom_sheet.dart deleted file mode 100644 index 6ab03a4909..0000000000 --- a/lib/widgets/profile_bottom_sheet.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/widgets/content_banner.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/localized_exception_extension.dart'; - -class ProfileBottomSheet extends StatelessWidget { - final String userId; - final BuildContext outerContext; - const ProfileBottomSheet({ - required this.userId, - required this.outerContext, - Key? key, - }) : super(key: key); - - void _startDirectChat(BuildContext context) async { - final client = Matrix.of(context).client; - final result = await showFutureLoadingDialog( - context: context, - future: () => client.startDirectChat(userId), - ); - if (result.error == null) { - VRouter.of(context).toSegments(['rooms', result.result!]); - Navigator.of(context, rootNavigator: false).pop(); - return; - } - } - - @override - Widget build(BuildContext context) { - return Center( - child: SizedBox( - width: min( - MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5), - child: Material( - elevation: 4, - child: SafeArea( - child: Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - backgroundColor: - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), - onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, - ), - ), - body: FutureBuilder( - future: - Matrix.of(context).client.getProfileFromUserId(userId), - builder: (context, snapshot) { - final profile = snapshot.data; - - return Column( - children: [ - Expanded( - child: profile == null - ? Container( - alignment: Alignment.center, - color: Theme.of(context).secondaryHeaderColor, - child: snapshot.hasError - ? Text(snapshot.error! - .toLocalizedString(context)) - : const CircularProgressIndicator - .adaptive(strokeWidth: 2), - ) - : ContentBanner( - mxContent: profile.avatarUrl, - defaultIcon: Icons.account_circle_outlined, - client: Matrix.of(context).client, - ), - ), - ListTile( - title: Text( - profile?.displayName ?? userId.localpart ?? ''), - subtitle: Text(userId), - trailing: const Icon(Icons.account_box_outlined), - ), - Container( - width: double.infinity, - padding: const EdgeInsets.all(12), - child: ElevatedButton.icon( - onPressed: () => _startDirectChat(context), - label: Text(L10n.of(context)!.newChat), - icon: const Icon(Icons.send_outlined), - ), - ), - const SizedBox(height: 8), - ], - ); - }), - ), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/public_room_bottom_sheet.dart b/lib/widgets/public_room_bottom_sheet.dart deleted file mode 100644 index 40b9d5544d..0000000000 --- a/lib/widgets/public_room_bottom_sheet.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'dart:math'; - -import 'package:flutter/material.dart'; - -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:flutter_matrix_html/flutter_html.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; - -import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/widgets/content_banner.dart'; -import 'package:fluffychat/widgets/matrix.dart'; -import '../utils/localized_exception_extension.dart'; - -class PublicRoomBottomSheet extends StatelessWidget { - final String roomAlias; - final BuildContext outerContext; - final PublicRoomsChunk? chunk; - const PublicRoomBottomSheet({ - required this.roomAlias, - required this.outerContext, - this.chunk, - Key? key, - }) : super(key: key); - - void _joinRoom(BuildContext context) async { - final client = Matrix.of(context).client; - final result = await showFutureLoadingDialog( - context: context, - future: () => client.joinRoom(roomAlias), - ); - if (result.error == null) { - if (client.getRoomById(result.result!) == null) { - await client.onSync.stream.firstWhere( - (sync) => sync.rooms?.join?.containsKey(result.result) ?? false); - } - VRouter.of(context).toSegments(['rooms', result.result!]); - Navigator.of(context, rootNavigator: false).pop(); - return; - } - } - - bool _testRoom(PublicRoomsChunk r) => r.canonicalAlias == roomAlias; - - Future _search(BuildContext context) async { - final chunk = this.chunk; - if (chunk != null) return chunk; - final query = await Matrix.of(context).client.queryPublicRooms( - server: roomAlias.domain, - filter: PublicRoomQueryFilter( - genericSearchTerm: roomAlias, - ), - ); - if (!query.chunk.any(_testRoom)) { - throw (L10n.of(context)!.noRoomsFound); - } - return query.chunk.firstWhere(_testRoom); - } - - @override - Widget build(BuildContext context) { - final roomAlias = this.roomAlias; - return Center( - child: SizedBox( - width: min( - MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5), - child: Material( - elevation: 4, - child: SafeArea( - child: Scaffold( - extendBodyBehindAppBar: true, - appBar: AppBar( - elevation: 0, - titleSpacing: 0, - backgroundColor: - Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5), - title: Text( - roomAlias, - overflow: TextOverflow.fade, - ), - leading: IconButton( - icon: const Icon(Icons.arrow_downward_outlined), - onPressed: Navigator.of(context, rootNavigator: false).pop, - tooltip: L10n.of(context)!.close, - ), - actions: [ - TextButton.icon( - onPressed: () => _joinRoom(context), - label: Text(L10n.of(context)!.joinRoom), - icon: const Icon(Icons.login_outlined), - ), - ], - ), - body: FutureBuilder( - future: _search(context), - builder: (context, snapshot) { - final profile = snapshot.data; - return ListView( - padding: EdgeInsets.zero, - children: [ - if (profile == null) - Container( - height: 156, - alignment: Alignment.center, - color: Theme.of(context).secondaryHeaderColor, - child: snapshot.hasError - ? Text( - snapshot.error!.toLocalizedString(context)) - : const CircularProgressIndicator.adaptive( - strokeWidth: 2), - ) - else - ContentBanner( - mxContent: profile.avatarUrl, - height: 156, - defaultIcon: Icons.group_outlined, - client: Matrix.of(context).client, - ), - ListTile( - title: - Text(profile?.name ?? roomAlias.localpart ?? ''), - subtitle: Text( - '${L10n.of(context)!.participant}: ${profile?.numJoinedMembers ?? 0}'), - trailing: const Icon(Icons.account_box_outlined), - ), - if (profile?.topic?.isNotEmpty ?? false) - ListTile( - subtitle: Html(data: profile!.topic!), - ), - ], - ); - }), - ), - ), - ), - ), - ); - } -} diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart new file mode 100644 index 0000000000..ab892a2bee --- /dev/null +++ b/lib/widgets/qr_code_viewer.dart @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:image/image.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; +import 'package:qr_image/qr_image.dart'; + +import '../config/themes.dart'; + +Future showQrCodeViewer(BuildContext context, String content) => + showDialog( + context: context, + builder: (context) => QrCodeViewer(content: content), + ); + +class QrCodeViewer extends StatelessWidget { + final String content; + + const QrCodeViewer({required this.content, super.key}); + + Future _save(BuildContext context) async { + final imageResult = await showFutureLoadingDialog( + context: context, + future: () { + final inviteLink = 'https://matrix.to/#/$content'; + final image = QRImage(inviteLink, size: 256, radius: 1).generate(); + return compute(encodePng, image); + }, + ); + final bytes = imageResult.result; + if (bytes == null) return; + if (!context.mounted) return; + + MatrixImageFile( + bytes: bytes, + name: 'QR_Code_$content.png', + mimeType: 'image/png', + ).save(context); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final inviteLink = 'https://matrix.to/#/$content'; + return Scaffold( + backgroundColor: Colors.black.withAlpha(128), + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + leading: IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: const Icon(Icons.close), + onPressed: Navigator.of(context).pop, + color: Colors.white, + tooltip: L10n.of(context).close, + ), + backgroundColor: Colors.transparent, + actions: [ + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: Icon(Icons.adaptive.share_outlined), + onPressed: () => FluffyShare.share(inviteLink, context), + color: Colors.white, + tooltip: L10n.of(context).share, + ), + const SizedBox(width: 8), + IconButton( + style: IconButton.styleFrom( + backgroundColor: Colors.black.withAlpha(128), + ), + icon: const Icon(Icons.download_outlined), + onPressed: () => _save(context), + color: Colors.white, + tooltip: L10n.of(context).downloadFile, + ), + const SizedBox(width: 8), + ], + ), + body: Center( + child: Container( + margin: const EdgeInsets.all(32.0), + padding: const EdgeInsets.all(32.0), + decoration: BoxDecoration( + border: Border.all( + color: theme.colorScheme.onPrimaryContainer, + width: 4, + ), + color: theme.colorScheme.surfaceBright, + borderRadius: BorderRadius.circular(AppConfig.borderRadius), + ), + child: Column( + mainAxisSize: .min, + children: [ + ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth, + ), + child: PrettyQrView.data( + data: inviteLink, + decoration: PrettyQrDecoration( + shape: PrettyQrSmoothSymbol( + roundFactor: 1, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + const SizedBox(height: 8.0), + SelectableText( + content, + textAlign: TextAlign.center, + style: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontSize: 12, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/widgets/sentry_switch_list_tile.dart b/lib/widgets/sentry_switch_list_tile.dart deleted file mode 100644 index d60df5ee5a..0000000000 --- a/lib/widgets/sentry_switch_list_tile.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/utils/sentry_controller.dart'; - -class SentrySwitchListTile extends StatefulWidget { - final String label; - - const SentrySwitchListTile.adaptive({Key? key, required this.label}) - : super(key: key); - - @override - _SentrySwitchListTileState createState() => _SentrySwitchListTileState(); -} - -class _SentrySwitchListTileState extends State { - bool _enabled = false; - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: SentryController.getSentryStatus(), - builder: (context, snapshot) { - _enabled = snapshot.data ?? false; - return SwitchListTile.adaptive( - title: Text(widget.label), - value: _enabled, - onChanged: (b) => - SentryController.toggleSentryAction(context, b).then( - (_) => setState(() {}), - ), - ); - }); - } -} diff --git a/lib/widgets/settings_switch_list_tile.dart b/lib/widgets/settings_switch_list_tile.dart index 11e3b5adf9..f773b6f98f 100644 --- a/lib/widgets/settings_switch_list_tile.dart +++ b/lib/widgets/settings_switch_list_tile.dart @@ -1,41 +1,42 @@ -import 'package:flutter/material.dart'; +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later -import 'matrix.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:flutter/material.dart'; class SettingsSwitchListTile extends StatefulWidget { - final bool defaultValue; - final String storeKey; + final AppSettings setting; final String title; + final String? subtitle; final Function(bool)? onChanged; const SettingsSwitchListTile.adaptive({ - Key? key, - this.defaultValue = false, - required this.storeKey, + super.key, + required this.setting, required this.title, + this.subtitle, this.onChanged, - }) : super(key: key); + }); @override - _SettingsSwitchListTileState createState() => _SettingsSwitchListTileState(); + SettingsSwitchListTileState createState() => SettingsSwitchListTileState(); } -class _SettingsSwitchListTileState extends State { +class SettingsSwitchListTileState extends State { @override Widget build(BuildContext context) { - return FutureBuilder( - future: Matrix.of(context) - .store - .getItemBool(widget.storeKey, widget.defaultValue), - builder: (context, snapshot) => SwitchListTile.adaptive( - value: snapshot.data ?? widget.defaultValue, - title: Text(widget.title), - onChanged: (bool newValue) async { - widget.onChanged?.call(newValue); - await Matrix.of(context).store.setItemBool(widget.storeKey, newValue); - setState(() {}); - }, - ), + final subtitle = widget.subtitle; + return SwitchListTile.adaptive( + value: widget.setting.value, + title: Text(widget.title), + subtitle: subtitle == null ? null : Text(subtitle), + onChanged: (bool newValue) async { + widget.onChanged?.call(newValue); + await widget.setting.setItem(newValue); + setState(() {}); + }, ); } } diff --git a/lib/widgets/share_scaffold_dialog.dart b/lib/widgets/share_scaffold_dialog.dart new file mode 100644 index 0000000000..1550e08ea7 --- /dev/null +++ b/lib/widgets/share_scaffold_dialog.dart @@ -0,0 +1,209 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + +abstract class ShareItem {} + +class TextShareItem extends ShareItem { + final String value; + TextShareItem(this.value); +} + +class ContentShareItem extends ShareItem { + final Map value; + ContentShareItem(this.value); +} + +class FileShareItem extends ShareItem { + final XFile value; + FileShareItem(this.value); +} + +class ShareScaffoldDialog extends StatefulWidget { + final List items; + + const ShareScaffoldDialog({required this.items, super.key}); + + @override + State createState() => _ShareScaffoldDialogState(); +} + +class _ShareScaffoldDialogState extends State { + final TextEditingController _filterController = TextEditingController(); + + String? selectedRoomId; + + void _toggleRoom(String roomId) { + setState(() { + selectedRoomId = roomId; + }); + } + + Future _forwardAction() async { + final roomId = selectedRoomId; + if (roomId == null) { + throw Exception( + 'Started forward action before room was selected. This should never happen.', + ); + } + if (widget.items.any((item) => item is! FileShareItem)) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).forwardCountMessages(widget.items.length), + okLabel: L10n.of(context).forward, + cancelLabel: L10n.of(context).cancel, + ); + if (consent != OkCancelResult.ok) return; + } + if (!mounted) return; + while (context.canPop()) { + context.pop(); + } + context.go('/rooms/$roomId', extra: widget.items); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final rooms = Matrix.of(context).client.rooms + .where( + (room) => + room.canSendDefaultMessages && + !room.isSpace && + room.membership == Membership.join, + ) + .toList(); + final filter = _filterController.text.trim().toLowerCase(); + return Scaffold( + appBar: AppBar( + leading: Center(child: CloseButton(onPressed: context.pop)), + title: Text(L10n.of(context).share), + ), + body: CustomScrollView( + slivers: [ + SliverAppBar( + floating: true, + toolbarHeight: 72, + scrolledUnderElevation: 0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + title: TextField( + controller: _filterController, + onChanged: (_) => setState(() {}), + textInputAction: TextInputAction.search, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), + ), + contentPadding: EdgeInsets.zero, + hintText: L10n.of(context).search, + hintStyle: TextStyle( + color: theme.colorScheme.onPrimaryContainer, + fontWeight: FontWeight.normal, + ), + floatingLabelBehavior: FloatingLabelBehavior.never, + prefixIcon: IconButton( + onPressed: () {}, + icon: Icon( + Icons.search_outlined, + color: theme.colorScheme.onPrimaryContainer, + ), + ), + ), + ), + ), + SliverList.builder( + itemCount: rooms.length, + itemBuilder: (context, i) { + final room = rooms[i]; + final displayname = room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final value = selectedRoomId == room.id; + final filterOut = !displayname.toLowerCase().contains(filter); + if (!value && filterOut) { + return const SizedBox.shrink(); + } + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Opacity( + opacity: filterOut ? 0.5 : 1, + child: FutureBuilder( + future: room.loadHeroUsers(), + builder: (context, _) => CheckboxListTile.adaptive( + checkboxShape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(90), + ), + controlAffinity: ListTileControlAffinity.trailing, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + secondary: Avatar( + mxContent: room.avatar, + name: displayname, + size: Avatar.defaultSize * 0.75, + ), + title: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + room.directChatMatrixID ?? + L10n.of(context).countParticipants( + (room.summary.mJoinedMemberCount ?? 0) + + (room.summary.mInvitedMemberCount ?? 0), + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + value: selectedRoomId == room.id, + onChanged: (_) => _toggleRoom(room.id), + ), + ), + ), + ); + }, + ), + ], + ), + bottomNavigationBar: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: selectedRoomId == null + ? const SizedBox.shrink() + : Material( + elevation: 8, + shadowColor: theme.appBarTheme.shadowColor, + child: SafeArea( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: ElevatedButton( + onPressed: _forwardAction, + child: Text(L10n.of(context).forward), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart new file mode 100644 index 0000000000..998e8c1ea2 --- /dev/null +++ b/lib/widgets/theme_builder.dart @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:collection/collection.dart'; +import 'package:dynamic_color/dynamic_color.dart'; +import 'package:fluffychat/utils/color_value.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ThemeBuilder extends StatefulWidget { + final Widget Function( + BuildContext context, + ThemeMode themeMode, + Color? primaryColor, + ) + builder; + + final String themeModeSettingsKey; + final String primaryColorSettingsKey; + + const ThemeBuilder({ + required this.builder, + this.themeModeSettingsKey = 'theme_mode', + this.primaryColorSettingsKey = 'primary_color', + super.key, + }); + + @override + State createState() => ThemeController(); +} + +class ThemeController extends State { + SharedPreferences? _sharedPreferences; + ThemeMode? _themeMode; + Color? _primaryColor; + + ThemeMode get themeMode => _themeMode ?? ThemeMode.system; + + Color? get primaryColor => _primaryColor; + + static ThemeController of(BuildContext context) => + Provider.of(context, listen: false); + + Future _loadData(_) async { + final preferences = _sharedPreferences ??= + await SharedPreferences.getInstance(); + + final rawThemeMode = preferences.getString(widget.themeModeSettingsKey); + final rawColor = preferences.getInt(widget.primaryColorSettingsKey); + + setState(() { + _themeMode = ThemeMode.values.singleWhereOrNull( + (value) => value.name == rawThemeMode, + ); + _primaryColor = rawColor == null ? null : Color(rawColor); + }); + } + + Future setThemeMode(ThemeMode newThemeMode) async { + final preferences = _sharedPreferences ??= + await SharedPreferences.getInstance(); + await preferences.setString(widget.themeModeSettingsKey, newThemeMode.name); + setState(() { + _themeMode = newThemeMode; + }); + } + + Future setPrimaryColor(Color? newPrimaryColor) async { + final preferences = _sharedPreferences ??= + await SharedPreferences.getInstance(); + if (newPrimaryColor == null) { + await preferences.remove(widget.primaryColorSettingsKey); + } else { + await preferences.setInt( + widget.primaryColorSettingsKey, + newPrimaryColor.hexValue, + ); + } + setState(() { + _primaryColor = newPrimaryColor; + }); + } + + @override + void initState() { + WidgetsBinding.instance.addPostFrameCallback(_loadData); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Provider( + create: (_) => this, + child: DynamicColorBuilder( + builder: (light, _) => + widget.builder(context, themeMode, primaryColor ?? light?.primary), + ), + ); + } +} diff --git a/lib/widgets/unread_badge_back_button.dart b/lib/widgets/unread_badge_back_button.dart deleted file mode 100644 index 679e28e796..0000000000 --- a/lib/widgets/unread_badge_back_button.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -import '../config/app_config.dart'; -import 'matrix.dart'; - -class UnreadBadgeBackButton extends StatelessWidget { - final String roomId; - - const UnreadBadgeBackButton({ - Key? key, - required this.roomId, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - const Center(child: BackButton()), - StreamBuilder( - stream: Matrix.of(context).client.onSync.stream, - builder: (context, _) { - final unreadCount = Matrix.of(context) - .client - .rooms - .where((r) => - r.id != roomId && - (r.isUnread || r.membership == Membership.invite)) - .length; - return unreadCount > 0 - ? Align( - alignment: Alignment.bottomRight, - child: Container( - padding: const EdgeInsets.all(4), - margin: const EdgeInsets.only(bottom: 4, right: 8), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primaryContainer, - borderRadius: - BorderRadius.circular(AppConfig.borderRadius), - ), - child: Text( - '$unreadCount', - style: TextStyle( - fontSize: 12, - color: Theme.of(context) - .colorScheme - .onPrimaryContainer, - ), - ), - ), - ) - : Container(); - }), - ], - ); - } -} diff --git a/lib/widgets/unread_rooms_badge.dart b/lib/widgets/unread_rooms_badge.dart new file mode 100644 index 0000000000..c47ae1d68b --- /dev/null +++ b/lib/widgets/unread_rooms_badge.dart @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:badges/badges.dart' as b; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + +import 'matrix.dart'; + +class UnreadRoomsBadge extends StatelessWidget { + final bool Function(Room) filter; + final b.BadgePosition? badgePosition; + final Widget? child; + + const UnreadRoomsBadge({ + super.key, + required this.filter, + this.badgePosition, + this.child, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + final unreadCount = Matrix.of(context).client.rooms + .where(filter) + .where((r) => (r.isUnread || r.membership == Membership.invite)) + .length; + return b.Badge( + badgeStyle: b.BadgeStyle( + badgeColor: theme.colorScheme.primary, + elevation: 4, + borderSide: BorderSide(color: theme.colorScheme.surface, width: 2), + ), + badgeContent: Text( + unreadCount.toString(), + style: TextStyle(color: theme.colorScheme.onPrimary, fontSize: 12), + ), + showBadge: unreadCount != 0, + badgeAnimation: const b.BadgeAnimation.scale(), + position: badgePosition ?? b.BadgePosition.bottomEnd(), + child: child, + ); + } +} diff --git a/lib/widgets/view_model_builder.dart b/lib/widgets/view_model_builder.dart new file mode 100644 index 0000000000..c12764bfca --- /dev/null +++ b/lib/widgets/view_model_builder.dart @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import 'package:flutter/material.dart'; + +class ViewModelBuilder extends StatefulWidget { + final T Function() create; + final Widget Function(BuildContext context, T viewModel, Widget? child) + builder; + final Widget? child; + const ViewModelBuilder({ + super.key, + required this.create, + required this.builder, + this.child, + }); + + @override + State> createState() => _ViewModelBuilderState(); +} + +class _ViewModelBuilderState + extends State> { + late final T _viewModel; + + @override + void initState() { + _viewModel = widget.create(); + super.initState(); + } + + @override + void dispose() { + _viewModel.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: _viewModel, + builder: (context, value, child) => + widget.builder.call(context, _viewModel, child), + ); + } +} diff --git a/licenses.yaml b/licenses.yaml new file mode 100644 index 0000000000..eb98c4546a --- /dev/null +++ b/licenses.yaml @@ -0,0 +1,47 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +# This is a config for a license compliance checker script. It runs in CI. +# +# To run locally: +# dart run license_checker check-licenses -c licenses.yaml --problematic +# +# SPDX license list: https://spdx.org/licenses/ + +# Before you add a license here: Is it free software? Is it compatible with AGPL-3.0? +permittedLicenses: + - AGPL-3.0 + - Apache-2.0 + - BSD-2-Clause + - BSD-3-Clause + - EUPL-1.2 + - ISC + - LGPL-3.0 + - MIT + - MPL-2.0 + - Zlib + +packageLicenseOverride: + dependency_validator: Apache-2.0 + flutter_gen: MIT + hive: Apache-2.0 + hive_flutter: Apache-2.0 + latlong2: Apache-2.0 + platform_detect: Apache-2.0 + rxdart: Apache-2.0 + flutter_new_badger: MIT + sqlcipher_flutter_libs: MIT + + # flutter's internal packages + flutter_driver: BSD-3-Clause + flutter_localizations: BSD-3-Clause + flutter_test: BSD-3-Clause + flutter_web_plugins: BSD-3-Clause + fuchsia_remote_debug_protocol: BSD-3-Clause + integration_test: BSD-3-Clause + sky_engine: BSD-3-Clause + +rejectedLicenses: + - BUSL-1.1 diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 9e00441c64..ecb5b8764a 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -1,11 +1,21 @@ +# Project-level configuration. cmake_minimum_required(VERSION 3.10) project(runner LANGUAGES CXX) +# smth sqlcipher_flutter_libs static linking Hundreds +set(OPENSSL_USE_STATIC_LIBS OFF) +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. set(BINARY_NAME "fluffychat") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID set(APPLICATION_ID "chat.fluffy.fluffychat") +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. cmake_policy(SET CMP0063 NEW) +# Load bundled libraries from the lib/ directory relative to the binary. set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") # Root filesystem for cross-building. @@ -18,7 +28,7 @@ if(FLUTTER_TARGET_PLATFORM_SYSROOT) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) endif() -# Configure build options. +# Define build configuration options. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Flutter build mode" FORCE) @@ -27,6 +37,10 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) endif() # Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. function(APPLY_STANDARD_SETTINGS TARGET) target_compile_features(${TARGET} PUBLIC cxx_std_14) target_compile_options(${TARGET} PRIVATE -Wall -Werror) @@ -34,9 +48,8 @@ function(APPLY_STANDARD_SETTINGS TARGET) target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") endfunction() -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - # Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") add_subdirectory(${FLUTTER_MANAGED_DIR}) # System-level dependencies. @@ -45,16 +58,27 @@ pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") -# Application build +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. add_executable(${BINARY_NAME} "main.cc" "my_application.cc" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" ) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter) target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. add_dependencies(${BINARY_NAME} flutter_assemble) + # Only the install-generated bundle's copy of the executable will launch # correctly, since the resources must in the right relative locations. To avoid # people trying to run the unbundled copy, put it in a subdirectory instead of @@ -64,6 +88,7 @@ set_target_properties(${BINARY_NAME} RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" ) + # Generated plugin build rules, which manage building the plugins and adding # them to the application. include(flutter/generated_plugins.cmake) @@ -94,11 +119,17 @@ install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR} install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -endif() +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt index 33fd5801e7..d5bd01648a 100644 --- a/linux/flutter/CMakeLists.txt +++ b/linux/flutter/CMakeLists.txt @@ -1,3 +1,4 @@ +# This file controls Flutter-level build steps. It should not be edited. cmake_minimum_required(VERSION 3.10) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 9d2206953a..e52345f603 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -7,25 +7,69 @@ #include "generated_plugin_registrant.h" #include -#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) desktop_drop_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); - g_autoptr(FlPluginRegistrar) desktop_lifecycle_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopLifecyclePlugin"); - desktop_lifecycle_plugin_register_with_registrar(desktop_lifecycle_registrar); + g_autoptr(FlPluginRegistrar) desktop_webview_window_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopWebviewWindowPlugin"); + desktop_webview_window_plugin_register_with_registrar(desktop_webview_window_registrar); + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) emoji_picker_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "EmojiPickerFlutterPlugin"); + emoji_picker_flutter_plugin_register_with_registrar(emoji_picker_flutter_registrar); g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); + flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); + g_autoptr(FlPluginRegistrar) handy_window_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin"); + handy_window_plugin_register_with_registrar(handy_window_registrar); + g_autoptr(FlPluginRegistrar) open_file_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "OpenFileLinuxPlugin"); + open_file_linux_plugin_register_with_registrar(open_file_linux_registrar); + g_autoptr(FlPluginRegistrar) pasteboard_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PasteboardPlugin"); + pasteboard_plugin_register_with_registrar(pasteboard_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); + g_autoptr(FlPluginRegistrar) sqlcipher_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); + sqlite3_flutter_libs_plugin_register_with_registrar(sqlcipher_flutter_libs_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); + g_autoptr(FlPluginRegistrar) window_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); + window_manager_plugin_register_with_registrar(window_manager_registrar); + g_autoptr(FlPluginRegistrar) window_to_front_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowToFrontPlugin"); + window_to_front_plugin_register_with_registrar(window_to_front_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 43424f5e23..8778a355cf 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -4,13 +4,26 @@ list(APPEND FLUTTER_PLUGIN_LIST desktop_drop - desktop_lifecycle + desktop_webview_window + dynamic_color + emoji_picker_flutter file_selector_linux flutter_secure_storage_linux + flutter_webrtc + handy_window + open_file_linux + pasteboard + record_linux + screen_retriever_linux + sqlcipher_flutter_libs url_launcher_linux + window_manager + window_to_front ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + flutter_vodozemac + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/linux/my_application.cc b/linux/my_application.cc index 4c0501c1a6..986be4ea35 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -28,43 +28,55 @@ static void my_application_activate(GApplication* application) { // If running on Wayland assume the header bar will work (may need changing // if future cases occur). gboolean use_header_bar = TRUE; + // Lines added to the template start + // Please re-add these lines after updating the linux build files + // If the user explicitly requests to disable the header bar, switch back to + // using a traditional title bar + const gchar* gtk_csd_env = g_getenv("GTK_CSD"); + if (gtk_csd_env != nullptr && g_strcmp0(gtk_csd_env, "1") != 0) + use_header_bar = FALSE; + // Lines added to the template end #ifdef GDK_WINDOWING_X11 - GdkScreen *screen = gtk_window_get_screen(window); + GdkScreen* screen = gtk_window_get_screen(window); if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + // Lines added to the template start + // Please re-add these lines after updating the linux build files + // Disable libhandy here, otherwise the close button disappears on KDE X11 + g_setenv("GTK_CSD", "0", TRUE); + // Lines added to the template end + } } #endif if (use_header_bar) { - GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); gtk_header_bar_set_title(header_bar, "FluffyChat"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } - else { + } else { gtk_window_set_title(window, "FluffyChat"); } - gtk_window_set_default_size(window, 800, 600); - gtk_widget_show(GTK_WIDGET(window)); + gtk_window_set_default_size(window, 864, 720); g_autoptr(FlDartProject) project = fl_dart_project_new(); fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + gtk_widget_show(GTK_WIDGET(window)); + gtk_widget_show(GTK_WIDGET(view)); gtk_widget_grab_focus(GTK_WIDGET(view)); } // Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar ***arguments, int *exit_status) { +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { MyApplication* self = MY_APPLICATION(application); // Strip out the first argument as it is the binary name. self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); @@ -82,8 +94,26 @@ static gboolean my_application_local_command_line(GApplication* application, gch return TRUE; } +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + // Implements GObject::dispose. -static void my_application_dispose(GObject *object) { +static void my_application_dispose(GObject* object) { MyApplication* self = MY_APPLICATION(object); g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); G_OBJECT_CLASS(my_application_parent_class)->dispose(object); @@ -92,6 +122,8 @@ static void my_application_dispose(GObject *object) { static void my_application_class_init(MyApplicationClass* klass) { G_APPLICATION_CLASS(klass)->activate = my_application_activate; G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; G_OBJECT_CLASS(klass)->dispose = my_application_dispose; } diff --git a/macos/.gitignore b/macos/.gitignore index d2fd377230..746adbb6b9 100644 --- a/macos/.gitignore +++ b/macos/.gitignore @@ -3,4 +3,5 @@ **/Pods/ # Xcode-related +**/dgph **/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index 785633d3a8..4b81f9b2d2 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1,2 +1,2 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index 5fba960c3a..5caa9d1579 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1,2 +1,2 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 6f2fa9d236..afc17259b3 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,47 +6,65 @@ import FlutterMacOS import Foundation import audio_session -import connectivity_plus_macos import desktop_drop -import desktop_lifecycle -import device_info_plus_macos +import desktop_webview_window +import device_info_plus +import dynamic_color import emoji_picker_flutter +import file_picker +import file_selector_macos import flutter_local_notifications -import flutter_secure_storage_macos -import flutter_web_auth +import flutter_new_badger +import flutter_secure_storage_darwin +import flutter_web_auth_2 import flutter_webrtc import geolocator_apple import just_audio -import package_info_plus_macos -import path_provider_macos +import local_auth_darwin +import open_file_mac +import package_info_plus +import pasteboard import record_macos -import share_plus_macos -import shared_preferences_macos -import sqflite +import screen_retriever_macos +import share_plus +import shared_preferences_foundation +import sqlcipher_flutter_libs import url_launcher_macos import video_compress -import wakelock_macos +import video_player_avfoundation +import wakelock_plus +import window_manager +import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) - ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) - DesktopLifecyclePlugin.register(with: registry.registrar(forPlugin: "DesktopLifecyclePlugin")) + DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) EmojiPickerFlutterPlugin.register(with: registry.registrar(forPlugin: "EmojiPickerFlutterPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) - FlutterSecureStorageMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageMacosPlugin")) - FlutterWebAuthPlugin.register(with: registry.registrar(forPlugin: "FlutterWebAuthPlugin")) + FlutterNewBadgerPlugin.register(with: registry.registrar(forPlugin: "FlutterNewBadgerPlugin")) + FlutterSecureStorageDarwinPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageDarwinPlugin")) + FlutterWebAuth2Plugin.register(with: registry.registrar(forPlugin: "FlutterWebAuth2Plugin")) FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) - FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin")) + LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) + OpenFilePlugin.register(with: registry.registrar(forPlugin: "OpenFilePlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PasteboardPlugin.register(with: registry.registrar(forPlugin: "PasteboardPlugin")) + RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) - SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) VideoCompressPlugin.register(with: registry.registrar(forPlugin: "VideoCompressPlugin")) - WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) + VideoPlayerPlugin.register(with: registry.registrar(forPlugin: "VideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) + WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) } diff --git a/macos/Podfile b/macos/Podfile index 22966c3f04..b9bae3abcf 100644 --- a/macos/Podfile +++ b/macos/Podfile @@ -36,5 +36,8 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET' + end end end diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 6b664a2b20..9098a8cb29 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,159 +1,217 @@ PODS: - audio_session (0.0.1): - FlutterMacOS - - connectivity_plus_macos (0.0.1): - - FlutterMacOS - - ReachabilitySwift - desktop_drop (0.0.1): - FlutterMacOS - - desktop_lifecycle (0.0.1): + - desktop_webview_window (0.0.1): + - FlutterMacOS + - device_info_plus (0.0.1): - FlutterMacOS - - device_info_plus_macos (0.0.1): + - dynamic_color (0.0.2): - FlutterMacOS - emoji_picker_flutter (0.0.1): - FlutterMacOS + - file_picker (0.0.1): + - Flutter + - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS - flutter_local_notifications (0.0.1): - FlutterMacOS - - flutter_secure_storage_macos (3.3.1): + - flutter_new_badger (0.0.1): + - FlutterMacOS + - flutter_secure_storage_darwin (10.0.0): + - Flutter + - FlutterMacOS + - flutter_vodozemac (0.0.1): - FlutterMacOS - - flutter_web_auth (0.4.1): + - flutter_web_auth_2 (5.0.0): - FlutterMacOS - - flutter_webrtc (0.7.1): + - flutter_webrtc (1.4.0): - FlutterMacOS - - WebRTC-SDK (= 97.4692.05) + - WebRTC-SDK (= 144.7559.09) - FlutterMacOS (1.0.0) - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - geolocator_apple (1.2.0): + - Flutter - FlutterMacOS - just_audio (0.0.1): + - Flutter - FlutterMacOS - - package_info_plus_macos (0.0.1): + - open_file_mac (1.0.3): - FlutterMacOS - - path_provider_macos (0.0.1): + - package_info_plus (0.0.1): - FlutterMacOS - - ReachabilitySwift (5.0.0) - - record_macos (1.0.0): + - pasteboard (0.0.1): - FlutterMacOS - - share_plus_macos (0.0.1): + - record_macos (1.2.1): - FlutterMacOS - - shared_preferences_macos (0.0.1): + - screen_retriever_macos (0.0.1): - FlutterMacOS - - sqflite (0.0.2): + - share_plus (0.0.1): - FlutterMacOS - - FMDB (>= 2.7.5) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - SQLCipher (4.10.0): + - SQLCipher/standard (= 4.10.0) + - SQLCipher/common (4.10.0) + - SQLCipher/standard (4.10.0): + - SQLCipher/common + - sqlcipher_flutter_libs (0.0.1): + - FlutterMacOS + - SQLCipher (~> 4.10.0) - url_launcher_macos (0.0.1): - FlutterMacOS - video_compress (0.3.0): - FlutterMacOS - - wakelock_macos (0.0.1): + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - WebRTC-SDK (144.7559.09) + - window_manager (0.5.0): + - FlutterMacOS + - window_to_front (0.0.1): - FlutterMacOS - - WebRTC-SDK (97.4692.05) DEPENDENCIES: - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - - connectivity_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos`) - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - - desktop_lifecycle (from `Flutter/ephemeral/.symlinks/plugins/desktop_lifecycle/macos`) - - device_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus_macos/macos`) + - desktop_webview_window (from `Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - dynamic_color (from `Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos`) - emoji_picker_flutter (from `Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos`) + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/darwin`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - - flutter_web_auth (from `Flutter/ephemeral/.symlinks/plugins/flutter_web_auth/macos`) + - flutter_new_badger (from `Flutter/ephemeral/.symlinks/plugins/flutter_new_badger/macos`) + - flutter_secure_storage_darwin (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_darwin/darwin`) + - flutter_vodozemac (from `Flutter/ephemeral/.symlinks/plugins/flutter_vodozemac/macos`) + - flutter_web_auth_2 (from `Flutter/ephemeral/.symlinks/plugins/flutter_web_auth_2/macos`) - flutter_webrtc (from `Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) - - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - - package_info_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos`) - - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) + - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin`) + - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/darwin`) + - open_file_mac (from `Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - pasteboard (from `Flutter/ephemeral/.symlinks/plugins/pasteboard/macos`) - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`) - - share_plus_macos (from `Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos`) - - shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqlcipher_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - video_compress (from `Flutter/ephemeral/.symlinks/plugins/video_compress/macos`) - - wakelock_macos (from `Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos`) + - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) + - window_to_front (from `Flutter/ephemeral/.symlinks/plugins/window_to_front/macos`) SPEC REPOS: trunk: - - FMDB - - ReachabilitySwift + - SQLCipher - WebRTC-SDK EXTERNAL SOURCES: audio_session: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos - connectivity_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus_macos/macos desktop_drop: :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos - desktop_lifecycle: - :path: Flutter/ephemeral/.symlinks/plugins/desktop_lifecycle/macos - device_info_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus_macos/macos + desktop_webview_window: + :path: Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + dynamic_color: + :path: Flutter/ephemeral/.symlinks/plugins/dynamic_color/macos emoji_picker_flutter: :path: Flutter/ephemeral/.symlinks/plugins/emoji_picker_flutter/macos + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/darwin + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos flutter_local_notifications: :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos - flutter_secure_storage_macos: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos - flutter_web_auth: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_web_auth/macos + flutter_new_badger: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_new_badger/macos + flutter_secure_storage_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_darwin/darwin + flutter_vodozemac: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_vodozemac/macos + flutter_web_auth_2: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_web_auth_2/macos flutter_webrtc: :path: Flutter/ephemeral/.symlinks/plugins/flutter_webrtc/macos FlutterMacOS: :path: Flutter/ephemeral geolocator_apple: - :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos + :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin just_audio: - :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos - package_info_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus_macos/macos - path_provider_macos: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos + :path: Flutter/ephemeral/.symlinks/plugins/just_audio/darwin + open_file_mac: + :path: Flutter/ephemeral/.symlinks/plugins/open_file_mac/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + pasteboard: + :path: Flutter/ephemeral/.symlinks/plugins/pasteboard/macos record_macos: :path: Flutter/ephemeral/.symlinks/plugins/record_macos/macos - share_plus_macos: - :path: Flutter/ephemeral/.symlinks/plugins/share_plus_macos/macos - shared_preferences_macos: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + sqlcipher_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/sqlcipher_flutter_libs/macos url_launcher_macos: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos video_compress: :path: Flutter/ephemeral/.symlinks/plugins/video_compress/macos - wakelock_macos: - :path: Flutter/ephemeral/.symlinks/plugins/wakelock_macos/macos + video_player_avfoundation: + :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + window_manager: + :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos + window_to_front: + :path: Flutter/ephemeral/.symlinks/plugins/window_to_front/macos SPEC CHECKSUMS: - audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 - connectivity_plus_macos: f6e86fd000e971d361e54b5afcadc8c8fa773308 - desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 - desktop_lifecycle: a600c10e12fe033c7be9078f2e929b8241f2c1e3 - device_info_plus_macos: 1ad388a1ef433505c4038e7dd9605aadd1e2e9c7 - emoji_picker_flutter: 533634326b1c5de9a181ba14b9758e6dfe967a20 - flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 - flutter_secure_storage_macos: 6ceee8fbc7f484553ad17f79361b556259df89aa - flutter_web_auth: ae2c29ca9b98c00b4e0e8c0919bb4a05d44b76df - flutter_webrtc: 37c4efd66d9d306878c1323d5ac5a1d10c748b3a - FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - geolocator_apple: 821be05bbdb1b49500e029ebcbf2d6acf2dfb966 - just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 - package_info_plus_macos: f010621b07802a241d96d01876d6705f15e77c1c - path_provider_macos: 160cab0d5461f0c0e02995469a98f24bdb9a3f1f - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - record_macos: dcf4f2bb654970437e012521cb4ea1fca4f78bb9 - share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4 - shared_preferences_macos: a64dc611287ed6cbe28fd1297898db1336975727 - sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 - video_compress: c896234f100791b5fef7f049afa38f6d2ef7b42f - wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9 - WebRTC-SDK: a6ee40bda0e3f7dba057907c3897374005c5715b + audio_session: eaca2512cf2b39212d724f35d11f46180ad3a33e + desktop_drop: 10a3e6a7fa9dbe350541f2574092fecfa345a07b + desktop_webview_window: 07ec5b575166556b3b9c96c5b7c962b2c044b452 + device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76 + dynamic_color: cb7c2a300ee67ed3bd96c3e852df3af0300bf610 + emoji_picker_flutter: 51ca408e289d84d1e460016b2a28721ec754fcf7 + file_picker: 70164d9778c42c47218d6cd79ce435de0856b11a + file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7 + flutter_local_notifications: 1fc7ffb10a83d6a2eeeeddb152d43f1944b0aad0 + flutter_new_badger: 6fe9bf7e42793a164032c21f164c0ad9985cd0f2 + flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 + flutter_vodozemac: fd2ea9cb3e2a37beaac883a369811fbfe042fc53 + flutter_web_auth_2: 7fe624ff12ddcb4c19e5dbcd56c9e9ea4899d967 + flutter_webrtc: fec3dc9284a1f6d21ec2caa91c90bb4c1824eb04 + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e + just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed + open_file_mac: 76f06c8597551249bdb5e8fd8827a98eae0f4585 + package_info_plus: f0052d280d17aa382b932f399edf32507174e870 + pasteboard: b594eaf838d930b276d7a35a44a32b4f489170cb + record_macos: 5d55909f9650314be6424ffd6b123ac75a08c3c1 + screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f + share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb + SQLCipher: eb79c64049cb002b4e9fcb30edb7979bf4706dfc + sqlcipher_flutter_libs: 01ead34db27ae5e49987cae46c8a34199eb22cfe + url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd + video_compress: 752b161da855df2492dd1a8fa899743cc8fe9534 + video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52 + wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b + WebRTC-SDK: e6006119cd730d6315d875e4a421b6cc8bb88833 + window_manager: b729e31d38fb04905235df9ea896128991cad99e + window_to_front: 9e76fd432e36700a197dac86a0011e49c89abe0a -PODFILE CHECKSUM: 9b8d08a513b178c33212d1b54cc9e3cba756d95b +PODFILE CHECKSUM: d0975b16fbdecb73b109d8fbc88aa77ffe4c7a8d -COCOAPODS: 1.11.3 +COCOAPODS: 1.16.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 0f19f640fe..5b297f8abe 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -26,7 +26,7 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 9795BB5F91BF4775B6B0D9D5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F69524ABCBB1D526AF7967B9 /* Pods_Runner.framework */; }; + 9CAF203E1D098383F2EDFFCB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -53,7 +53,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 2D20EFA3D49BBBDA1F07645D /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 2D119A6B273B2CE4A6AE3322 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 33CC10ED2044A3C60003C045 /* FluffyChat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FluffyChat.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -68,11 +68,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 3CD34DC616BB2AF9B1580285 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 35E6B919318905352ECC7D69 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 5CDC3DD55F4AC23D2067B292 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - 997C663EFCBF8E403128D1D1 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - F69524ABCBB1D526AF7967B9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A1CEA3AEDDC9976F00DB3AFE /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF767714B5564068E3D500A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B5C1522B2F3865267414BD3C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + CC70F3DF47EEC43FC2D35C75 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -80,7 +84,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9795BB5F91BF4775B6B0D9D5 /* Pods_Runner.framework in Frameworks */, + 9CAF203E1D098383F2EDFFCB /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -105,7 +109,7 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - E41DDAA8A3B17F99D7E5251E /* Pods */, + F9F203356080D460FB6D4567 /* Pods */, ); sourceTree = ""; }; @@ -155,17 +159,21 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - F69524ABCBB1D526AF7967B9 /* Pods_Runner.framework */, + B3C62FEBAA272B5A33AFFC95 /* Pods_Runner.framework */, + A1CEA3AEDDC9976F00DB3AFE /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; - E41DDAA8A3B17F99D7E5251E /* Pods */ = { + F9F203356080D460FB6D4567 /* Pods */ = { isa = PBXGroup; children = ( - 2D20EFA3D49BBBDA1F07645D /* Pods-Runner.debug.xcconfig */, - 997C663EFCBF8E403128D1D1 /* Pods-Runner.release.xcconfig */, - 3CD34DC616BB2AF9B1580285 /* Pods-Runner.profile.xcconfig */, + CC70F3DF47EEC43FC2D35C75 /* Pods-Runner.debug.xcconfig */, + B5C1522B2F3865267414BD3C /* Pods-Runner.release.xcconfig */, + AF767714B5564068E3D500A8 /* Pods-Runner.profile.xcconfig */, + 5CDC3DD55F4AC23D2067B292 /* Pods-RunnerTests.debug.xcconfig */, + 2D119A6B273B2CE4A6AE3322 /* Pods-RunnerTests.release.xcconfig */, + 35E6B919318905352ECC7D69 /* Pods-RunnerTests.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -177,13 +185,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - E26D3B733E5CAE51F86A6BE1 /* [CP] Check Pods Manifest.lock */, + 213E973AEF6461D8FA01037B /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 28EE3A13194E86CCA3B8236A /* [CP] Embed Pods Frameworks */, + 889FA79FC2223BE511C611AF /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -202,13 +210,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = "The Flutter Authors"; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { CreatedOnToolsVersion = 9.2; LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.Sandbox = { enabled = 1; @@ -222,7 +229,7 @@ }; }; buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 8.0"; + compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -253,72 +260,31 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 28EE3A13194E86CCA3B8236A /* [CP] Embed Pods Frameworks */ = { + 213E973AEF6461D8FA01037B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); + inputFileListPaths = ( + ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", - "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/audio_session/audio_session.framework", - "${BUILT_PRODUCTS_DIR}/connectivity_plus_macos/connectivity_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/desktop_drop/desktop_drop.framework", - "${BUILT_PRODUCTS_DIR}/desktop_lifecycle/desktop_lifecycle.framework", - "${BUILT_PRODUCTS_DIR}/device_info_plus_macos/device_info_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/emoji_picker_flutter/emoji_picker_flutter.framework", - "${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework", - "${BUILT_PRODUCTS_DIR}/flutter_secure_storage_macos/flutter_secure_storage_macos.framework", - "${BUILT_PRODUCTS_DIR}/flutter_web_auth/flutter_web_auth.framework", - "${BUILT_PRODUCTS_DIR}/flutter_webrtc/flutter_webrtc.framework", - "${BUILT_PRODUCTS_DIR}/geolocator_apple/geolocator_apple.framework", - "${BUILT_PRODUCTS_DIR}/just_audio/just_audio.framework", - "${BUILT_PRODUCTS_DIR}/package_info_plus_macos/package_info_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/path_provider_macos/path_provider_macos.framework", - "${BUILT_PRODUCTS_DIR}/record_macos/record_macos.framework", - "${BUILT_PRODUCTS_DIR}/share_plus_macos/share_plus_macos.framework", - "${BUILT_PRODUCTS_DIR}/shared_preferences_macos/shared_preferences_macos.framework", - "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework", - "${BUILT_PRODUCTS_DIR}/url_launcher_macos/url_launcher_macos.framework", - "${BUILT_PRODUCTS_DIR}/video_compress/video_compress.framework", - "${BUILT_PRODUCTS_DIR}/wakelock_macos/wakelock_macos.framework", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/WebRTC-SDK/WebRTC.framework/WebRTC", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( ); - name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/audio_session.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/desktop_drop.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/desktop_lifecycle.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/emoji_picker_flutter.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_secure_storage_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_web_auth.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_webrtc.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/geolocator_apple.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/just_audio.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/record_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_compress.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock_macos.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -352,28 +318,23 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh\ntouch Flutter/ephemeral/tripwire\n"; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - E26D3B733E5CAE51F86A6BE1 /* [CP] Check Pods Manifest.lock */ = { + 889FA79FC2223BE511C611AF /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -465,19 +426,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4NXF6Z997G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter/ephemeral", - ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_NAME = FluffyChat; + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -487,7 +448,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = FluffyChat; }; name = Profile; }; @@ -597,19 +558,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4NXF6Z997G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter/ephemeral", - ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_NAME = FluffyChat; + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -623,19 +584,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4NXF6Z997G; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter/ephemeral", - ); INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = FluffyChat; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - PRODUCT_NAME = FluffyChat; + MACOSX_DEPLOYMENT_TARGET = 12.2; + PRODUCT_COPYRIGHT = "Copyright © 2023 FluffyChat authors. All rights reserved."; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; @@ -645,7 +606,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = FluffyChat; }; name = Debug; }; @@ -653,7 +614,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = FluffyChat; }; name = Release; }; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 50396d3d56..1a20155a29 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -27,29 +27,28 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - - - + + + + + + - - diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index d53ef64377..b3c1761412 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,9 +1,13 @@ import Cocoa import FlutterMacOS -@NSApplicationMain +@main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } } diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png new file mode 100644 index 0000000000..7d0807b331 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png new file mode 100644 index 0000000000..86e89d9554 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png new file mode 100644 index 0000000000..77ef66d1d8 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png new file mode 100644 index 0000000000..b1634c7acd Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png new file mode 100644 index 0000000000..7b22bd48f5 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png new file mode 100644 index 0000000000..c0a9729d79 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png new file mode 100644 index 0000000000..ef2962a703 Binary files /dev/null and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/64-mac.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f19f..ac5afcb2f1 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,64 @@ { - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} + "images": [ + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_16.png", + "scale": "1x" + }, + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "2x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "1x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_64.png", + "scale": "2x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_128.png", + "scale": "1x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "2x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "1x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "2x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "1x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_1024.png", + "scale": "2x" + } + ] +} \ No newline at end of file diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index fb1434bfef..594166632c 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index 34d07d5eac..b7e0fe1552 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index e78ba9054b..db791dc5b7 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png index f7508e359d..f96daefa66 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png index 6154ba14c8..6809be06c1 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png index 6245280ee2..d21f27a810 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index 7de4d1f3eb..e5b187bec5 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib index 537341abf9..80e867a4e0 100644 --- a/macos/Runner/Base.lproj/MainMenu.xib +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -323,6 +323,10 @@ + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 362569a7de..11b3701b2e 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = fluffychat +PRODUCT_NAME = FluffyChat // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = chat.fluffy.fluffychat +PRODUCT_BUNDLE_IDENTIFIER = im.fluffychat.fluffychat // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2020 chat.fluffy. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2023 FluffyChat authors. All rights reserved. diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index 5d5d548397..a964b6bd56 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -4,21 +4,23 @@ com.apple.security.app-sandbox - com.apple.security.assets.movies.read-only - - com.apple.security.assets.music.read-only - com.apple.security.assets.pictures.read-only com.apple.security.cs.allow-jit - com.apple.security.files.downloads.read-write + com.apple.security.device.audio-input - com.apple.security.files.user-selected.read-only + com.apple.security.device.camera + + com.apple.security.files.user-selected.read-write com.apple.security.network.client com.apple.security.network.server + com.apple.security.personal-information.location + + keychain-access-groups + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 2722837ec9..3cc05eb234 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -3,7 +3,7 @@ import FlutterMacOS class MainFlutterWindow: NSWindow { override func awakeFromNib() { - let flutterViewController = FlutterViewController.init() + let flutterViewController = FlutterViewController() let windowFrame = self.frame self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 61a7ad0c7c..cfeb4e70fb 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -4,19 +4,19 @@ com.apple.security.app-sandbox - com.apple.security.assets.movies.read-only - - com.apple.security.assets.music.read-only - com.apple.security.assets.pictures.read-only - com.apple.security.files.downloads.read-write + com.apple.security.device.audio-input + + com.apple.security.device.camera - com.apple.security.files.user-selected.read-only + com.apple.security.files.user-selected.read-write com.apple.security.network.client - com.apple.security.network.server + com.apple.security.personal-information.location + keychain-access-groups + diff --git a/pubspec.lock b/pubspec.lock index f4032c9f22..72c32a8628 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,574 +5,556 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + url: "https://pub.dev" source: hosted - version: "31.0.0" - adaptive_dialog: - dependency: "direct main" - description: - name: adaptive_dialog - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.1" - adaptive_theme: - dependency: "direct main" + version: "93.0.0" + analysis_server_plugin: + dependency: transitive description: - name: adaptive_theme - url: "https://pub.dartlang.org" + name: analysis_server_plugin + sha256: "5f3920acbd5765764ec9ef6c5bbdd102015424281232ee4fb4f5431c87abb4eb" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "0.3.7" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + url: "https://pub.dev" source: hosted - version: "2.8.0" + version: "10.0.1" analyzer_plugin: dependency: transitive description: name: analyzer_plugin - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.0" - animations: - dependency: "direct main" - description: - name: animations - url: "https://pub.dartlang.org" + sha256: "7df504f0c9d6891bacc9f73a5a8c5f6fe4fc49c90ec8e3379916372906ba0b32" + url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "0.14.1" ansicolor: dependency: transitive description: name: ansicolor - url: "https://pub.dartlang.org" + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.3" archive: - dependency: transitive + dependency: "direct main" description: name: archive - url: "https://pub.dartlang.org" + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" source: hosted - version: "3.1.11" + version: "4.0.9" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" source: hosted - version: "2.3.0" - asn1lib: - dependency: transitive - description: - name: asn1lib - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" + version: "2.7.0" async: - dependency: transitive + dependency: "direct main" description: name: async - url: "https://pub.dartlang.org" + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.13.1" audio_session: dependency: transitive description: name: audio_session - url: "https://pub.dartlang.org" + sha256: "7217b229db57cc4dc577a8abb56b7429a5a212b978517a5be578704bfe5e568b" + url: "https://pub.dev" + source: hosted + version: "0.2.3" + badges: + dependency: "direct main" + description: + name: badges + sha256: cf1c88fb3777df69ccd630b80de5267f54efa4a39381b0404a7c03d56cb7c041 + url: "https://pub.dev" + source: hosted + version: "3.2.0" + barbecue: + dependency: transitive + description: + name: barbecue + sha256: e3a0afaf9005e466887d6c87411a2ddd8d72fc46db3caabf278ee600f1e2f92c + url: "https://pub.dev" source: hosted - version: "0.1.6+1" + version: "0.4.0" base58check: dependency: transitive description: name: base58check - url: "https://pub.dartlang.org" + sha256: "6c300dfc33e598d2fe26319e13f6243fea81eaf8204cb4c6b69ef20a625319a5" + url: "https://pub.dev" source: hosted version: "2.0.0" blurhash_dart: dependency: "direct main" description: name: blurhash_dart - url: "https://pub.dartlang.org" + sha256: "43955b6c2e30a7d440028d1af0fa185852f3534b795cc6eb81fbf397b464409f" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.1" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - cached_network_image: - dependency: "direct main" - description: - name: cached_network_image - url: "https://pub.dartlang.org" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" source: hosted - version: "3.2.0" - cached_network_image_platform_interface: + version: "2.1.2" + build_cli_annotations: dependency: transitive description: - name: cached_network_image_platform_interface - url: "https://pub.dartlang.org" + name: build_cli_annotations + sha256: e563c2e01de8974566a1998410d3f6f03521788160a02503b0b1f1a46c7b3d95 + url: "https://pub.dev" source: hosted - version: "1.0.0" - cached_network_image_web: + version: "2.1.1" + canonical_json: dependency: transitive description: - name: cached_network_image_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - callkeep: - dependency: "direct main" - description: - name: callkeep - url: "https://pub.dartlang.org" + name: canonical_json + sha256: "618db0b1ea4238a3ef2f325908beee6269550d73b69dc5220456b75ce3cec072" + url: "https://pub.dev" source: hosted - version: "0.3.2" - canonical_json: + version: "1.1.3" + change_case: dependency: transitive description: - name: canonical_json - url: "https://pub.dartlang.org" + name: change_case + sha256: e41ef3df58521194ef8d7649928954805aeb08061917cf658322305e61568003 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "2.2.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.1" charcode: dependency: transitive description: name: charcode - url: "https://pub.dartlang.org" + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" chewie: dependency: "direct main" description: name: chewie - url: "https://pub.dartlang.org" + sha256: "5b8f00a9373252ddd2296d0d734b3b754380e6b4728ba848aff40e97fabad339" + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.14.1" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.4.2" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" source: hosted - version: "1.1.0" - collection: - dependency: "direct main" - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - connectivity_plus: - dependency: "direct main" - description: - name: connectivity_plus - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.1" - connectivity_plus_linux: - dependency: transitive - description: - name: connectivity_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - connectivity_plus_macos: + version: "1.1.2" + code_assets: dependency: transitive description: - name: connectivity_plus_macos - url: "https://pub.dartlang.org" + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" source: hosted - version: "1.2.1" - connectivity_plus_platform_interface: - dependency: transitive + version: "1.0.0" + collection: + dependency: "direct main" description: - name: connectivity_plus_platform_interface - url: "https://pub.dartlang.org" + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" source: hosted - version: "1.2.0" - connectivity_plus_web: - dependency: "direct overridden" - description: - path: "packages/connectivity_plus/connectivity_plus_web" - ref: a04401cb48abe92d138c0e9288b360739994a9e9 - resolved-ref: a04401cb48abe92d138c0e9288b360739994a9e9 - url: "https://github.com/TheOneWithTheBraid/plus_plugins.git" - source: git - version: "1.2.1" - connectivity_plus_windows: + version: "1.19.1" + colorize: dependency: transitive description: - name: connectivity_plus_windows - url: "https://pub.dartlang.org" + name: colorize + sha256: "584746cd6ba1cba0633b6720f494fe6f9601c4170f0666c1579d2aa2a61071ba" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "3.0.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.2" coverage: dependency: transitive description: name: coverage - url: "https://pub.dartlang.org" + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.15.0" cross_file: - dependency: transitive + dependency: "direct main" description: name: cross_file - url: "https://pub.dartlang.org" + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.3.5+2" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.7" csslib: dependency: transitive description: name: csslib - url: "https://pub.dartlang.org" + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" source: hosted - version: "0.17.1" + version: "1.0.2" cupertino_icons: - dependency: "direct main" + dependency: transitive description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" source: hosted - version: "1.0.4" - dart_code_metrics: + version: "1.0.9" + dart_code_linter: dependency: "direct dev" description: - name: dart_code_metrics - url: "https://pub.dartlang.org" + name: dart_code_linter + sha256: "44cce8527a2094201067b50aed97778930638cc43e8bb3cb0b40a90c36fb9c84" + url: "https://pub.dev" source: hosted - version: "4.12.0" + version: "4.1.6" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dart_polylabel2: + dependency: transitive + description: + name: dart_polylabel2 + sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6" + url: "https://pub.dev" + source: hosted + version: "1.0.0" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "3.1.7" dart_webrtc: dependency: transitive description: name: dart_webrtc - url: "https://pub.dartlang.org" + sha256: f6d615bddea5e458ce180a914f3055c234ffb52fb7397a51b3491e76d6d7edb2 + url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.8.1" dbus: - dependency: "direct overridden" + dependency: transitive description: name: dbus - url: "https://pub.dartlang.org" + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 + url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.12" desktop_drop: dependency: "direct main" description: name: desktop_drop - url: "https://pub.dartlang.org" + sha256: aa1e797255bfbc76f9eb5aa4f61e5b68dbf69962ab1be6495816d2f251bc0d1f + url: "https://pub.dev" source: hosted - version: "0.3.3" - desktop_lifecycle: - dependency: "direct main" - description: - name: desktop_lifecycle - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.0" - desktop_notifications: - dependency: "direct main" + version: "0.7.1" + desktop_webview_window: + dependency: transitive description: - name: desktop_notifications - url: "https://pub.dartlang.org" + name: desktop_webview_window + sha256: b6fdae2cbf9571879b1761c12f27facaf82e22d0bdc74d049907c2a09a432957 + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.3.0" device_info_plus: dependency: "direct main" description: name: device_info_plus - url: "https://pub.dartlang.org" + sha256: "0891702f96b2e465fe567b7ec448380e6b1c14f60af552a8536d9f583b6b8442" + url: "https://pub.dev" source: hosted - version: "4.0.0" - device_info_plus_linux: - dependency: transitive - description: - name: device_info_plus_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - device_info_plus_macos: - dependency: transitive - description: - name: device_info_plus_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.2.3" + version: "13.2.0" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0+1" - device_info_plus_web: - dependency: transitive - description: - name: device_info_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - device_info_plus_windows: - dependency: transitive - description: - name: device_info_plus_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.1" - disk_space: - dependency: transitive - description: - name: disk_space - url: "https://pub.dartlang.org" + sha256: "04b173a92e2d9161dfead145667037c8d834db725ce2e7b942bfe18fd2f45a46" + url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "8.1.0" dynamic_color: dependency: "direct main" description: name: dynamic_color - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.2" - email_validator: - dependency: "direct main" - description: - name: email_validator - url: "https://pub.dartlang.org" + sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "1.8.1" emoji_picker_flutter: dependency: "direct main" description: name: emoji_picker_flutter - url: "https://pub.dartlang.org" + sha256: "984d3e9b9cf3175df9a868ce4a2d9611491e80e5d3b8e2b1e8991a4998972885" + url: "https://pub.dev" source: hosted - version: "1.1.2" - encrypt: - dependency: "direct main" - description: - name: encrypt - url: "https://pub.dartlang.org" - source: hosted - version: "5.0.1" - enhanced_enum: - dependency: transitive - description: - name: enhanced_enum - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.2" + version: "4.4.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.3" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "2.2.0" + ffi_leak_tracker: + dependency: transitive + description: + name: ffi_leak_tracker + sha256: "4093d4ef9ca06ffe2786e73bfb25e22aa92112b9bb4ec941f11e3e6b61489a97" + url: "https://pub.dev" + source: hosted + version: "0.1.2" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "7.0.1" file_picker: - dependency: transitive + dependency: "direct main" description: name: file_picker - url: "https://pub.dartlang.org" + sha256: fdc6a37f715d19f35b131decf1ce39242eeed5ddae18c0818c3eccb731ab76be + url: "https://pub.dev" source: hosted - version: "4.5.1" - file_picker_cross: + version: "12.0.0-beta.7" + file_selector: dependency: "direct main" description: - name: file_picker_cross - url: "https://pub.dartlang.org" + name: file_selector + sha256: bd15e43e9268db636b53eeaca9f56324d1622af30e5c34d6e267649758c84d9a + url: "https://pub.dev" source: hosted - version: "4.6.0" - file_selector: + version: "1.1.0" + file_selector_android: dependency: transitive description: - name: file_selector - url: "https://pub.dartlang.org" + name: file_selector_android + sha256: "89243030ea4b3463fb402b44d5eeacc4ccb1c46a88870cb2a5080d693200c1ed" + url: "https://pub.dev" source: hosted - version: "0.8.2+1" + version: "0.5.2+6" + file_selector_ios: + dependency: transitive + description: + name: file_selector_ios + sha256: e2ecf2885c121691ce13b60db3508f53c01f869fb6e8dc5c1cfa771e4c46aeca + url: "https://pub.dev" + source: hosted + version: "0.5.3+5" file_selector_linux: dependency: transitive description: name: file_selector_linux - url: "https://pub.dartlang.org" + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.dev" source: hosted - version: "0.0.2+1" + version: "0.9.5" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - url: "https://pub.dartlang.org" + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.7.0" file_selector_web: dependency: transitive description: name: file_selector_web - url: "https://pub.dartlang.org" + sha256: c4c0ea4224d97a60a7067eca0c8fd419e708ff830e0c83b11a48faf566cec3e7 + url: "https://pub.dev" source: hosted - version: "0.8.1+3" - fluffybox: + version: "0.9.4+2" + file_selector_windows: dependency: transitive description: - name: fluffybox - url: "https://pub.dartlang.org" + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.dev" source: hosted - version: "0.4.3" + version: "0.9.3+5" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" - flutter_app_badger: - dependency: "direct main" - description: - name: flutter_app_badger - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - flutter_app_lock: - dependency: "direct main" - description: - name: flutter_app_lock - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - flutter_blurhash: - dependency: "direct main" - description: - name: flutter_blurhash - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.0" - flutter_cache_manager: - dependency: "direct main" - description: - name: flutter_cache_manager - url: "https://pub.dartlang.org" - source: hosted - version: "3.3.0" flutter_driver: dependency: transitive description: flutter source: sdk version: "0.0.0" - flutter_file_dialog: - dependency: transitive - description: - name: flutter_file_dialog - url: "https://pub.dartlang.org" - source: hosted - version: "2.3.0" - flutter_highlight: - dependency: transitive - description: - name: flutter_highlight - url: "https://pub.dartlang.org" - source: hosted - version: "0.7.0" - flutter_keyboard_visibility: - dependency: transitive + flutter_foreground_task: + dependency: "direct main" description: - name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" + name: flutter_foreground_task + sha256: fc5c01a5e1b8f7bb51d0c737714f0c50440dbdf1aeddc5f8cbba313aa6fd4856 + url: "https://pub.dev" source: hosted - version: "5.2.0" - flutter_keyboard_visibility_platform_interface: - dependency: transitive + version: "9.2.2" + flutter_launcher_icons: + dependency: "direct dev" description: - name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" source: hosted - version: "2.0.0" - flutter_keyboard_visibility_web: - dependency: transitive + version: "0.14.4" + flutter_linkify: + dependency: "direct main" description: - name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" + name: flutter_linkify + sha256: "74669e06a8f358fee4512b4320c0b80e51cffc496607931de68d28f099254073" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "6.0.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "6.0.0" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - url: "https://pub.dartlang.org" + sha256: a0d7141f14cabcee42967470a858dfc99dd6cfb70d3cab404bacfcafa9e84e70 + url: "https://pub.dev" source: hosted - version: "9.4.1" + version: "22.0.1" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - url: "https://pub.dartlang.org" + sha256: "9ca97e63776f29ab1b955725c09999fc2c150523269db150c39274f2a43c5a8b" + url: "https://pub.dev" source: hosted - version: "0.4.2" + version: "8.0.1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - url: "https://pub.dartlang.org" + sha256: ff0013eae795e8dc8fad4a8992a209e64d3ba2fbd8bf5e43c36bf448f95bd814 + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "12.0.0" + flutter_local_notifications_web: + dependency: transitive + description: + name: flutter_local_notifications_web + sha256: "516afaf97a2d1e67a036c6617321b00d205d72f7a67b6eccf936cd565f985878" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + flutter_local_notifications_windows: + dependency: transitive + description: + name: flutter_local_notifications_windows + sha256: "6f43bdd03b171b7a90f22647506fea33e2bb12294b7c7c7a3d690e960a382945" + url: "https://pub.dev" + source: hosted + version: "3.1.1" flutter_localizations: dependency: "direct main" description: flutter @@ -582,133 +564,119 @@ packages: dependency: "direct main" description: name: flutter_map - url: "https://pub.dartlang.org" + sha256: ce1debbb29cade61964334b2a19c7c76e5bb2ef7dacf126c6424ee44036232f8 + url: "https://pub.dev" source: hosted - version: "1.1.0" - flutter_math_fork: - dependency: transitive - description: - name: flutter_math_fork - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.2+2" - flutter_matrix_html: - dependency: "direct main" - description: - name: flutter_matrix_html - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - flutter_native_splash: - dependency: "direct dev" - description: - name: flutter_native_splash - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2+1" - flutter_olm: + version: "8.3.1" + flutter_new_badger: dependency: "direct main" description: - name: flutter_olm - url: "https://pub.dartlang.org" + name: flutter_new_badger + sha256: d3742ace8009663db1ac6ba0377b092f479c35deb33e05514ba05cc0b0a5aaaa + url: "https://pub.dev" source: hosted - version: "1.2.0" - flutter_openssl_crypto: - dependency: "direct main" - description: - name: flutter_openssl_crypto - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.0" + version: "1.1.1" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "38d1c268de9097ff59cf0e844ac38759fc78f76836d37edad06fa21e182055a0" + url: "https://pub.dev" source: hosted - version: "2.0.5" - flutter_ringtone_player: - dependency: "direct main" + version: "2.0.34" + flutter_rust_bridge: + dependency: transitive description: - name: flutter_ringtone_player - url: "https://pub.dartlang.org" + name: flutter_rust_bridge + sha256: "37ef40bc6f863652e865f0b2563ea07f0d3c58d8efad803cc01933a4b2ee067e" + url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "2.11.1" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - url: "https://pub.dartlang.org" + sha256: "7686b1d6a29985dcbb808c59518226e603e3bfa7c0ddfd1a0d00e4cda77c868e" + url: "https://pub.dev" source: hosted - version: "5.0.2" - flutter_secure_storage_linux: + version: "10.3.1" + flutter_secure_storage_darwin: dependency: transitive description: - name: flutter_secure_storage_linux - url: "https://pub.dartlang.org" + name: flutter_secure_storage_darwin + sha256: "82329fa5cdf343773b1b6897dea959105a29f092454259edff92f9f6637e8149" + url: "https://pub.dev" source: hosted - version: "1.1.0" - flutter_secure_storage_macos: + version: "0.3.2" + flutter_secure_storage_linux: dependency: transitive description: - name: flutter_secure_storage_macos - url: "https://pub.dartlang.org" + name: flutter_secure_storage_linux + sha256: a5f35ddab43cf5c8215d2feb4ce1957851f28c5c37e6f04335066a0602087bf5 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "3.0.1" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - url: "https://pub.dartlang.org" + sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "2.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - url: "https://pub.dartlang.org" + sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.1.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - url: "https://pub.dartlang.org" + sha256: "471951813a97006d899db4948acc654a4f28c440083ea08178935ce20b173ec1" + url: "https://pub.dev" source: hosted - version: "1.1.2" - flutter_slidable: + version: "4.2.2" + flutter_shortcuts_new: dependency: "direct main" description: - name: flutter_slidable - url: "https://pub.dartlang.org" + name: flutter_shortcuts_new + sha256: "16ee1c8a9bc9586b5117ebb774a8ff6b396f856743e97251eb483c4dc5769d7f" + url: "https://pub.dev" source: hosted - version: "1.2.0" - flutter_svg: - dependency: "direct main" - description: - name: flutter_svg - url: "https://pub.dartlang.org" - source: hosted - version: "0.22.0" + version: "2.0.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" - flutter_typeahead: + flutter_vodozemac: dependency: "direct main" description: - name: flutter_typeahead - url: "https://pub.dartlang.org" + name: flutter_vodozemac + sha256: ef4c3580a7f2fe8eebb7602c6cba593a42b4a5e5466c372a022f77ccc14914a5 + url: "https://pub.dev" source: hosted - version: "4.0.0" - flutter_web_auth: + version: "0.5.0" + flutter_web_auth_2: dependency: "direct main" description: - name: flutter_web_auth - url: "https://pub.dartlang.org" + name: flutter_web_auth_2 + sha256: "8f9303471dcd96670878c9b7c0c4e14c37595b2add67465f6a868f17a5872dfc" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + flutter_web_auth_2_platform_interface: + dependency: transitive + description: + name: flutter_web_auth_2_platform_interface + sha256: ba0fbba55bffb47242025f96852ad1ffba34bc451568f56ef36e613612baffab + url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "5.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -718,1334 +686,1690 @@ packages: dependency: "direct main" description: name: flutter_webrtc - url: "https://pub.dartlang.org" + sha256: "0f89dee7f4c35dab5611f351c3897a3bfe9f7057720cc7da209b52455af4316e" + url: "https://pub.dev" source: hosted - version: "0.8.7" + version: "1.5.2" frontend_server_client: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "4.0.0" fuchsia_remote_debug_protocol: dependency: transitive description: flutter source: sdk version: "0.0.0" - future_loading_dialog: - dependency: "direct main" + geoclue: + dependency: transitive description: - name: future_loading_dialog - url: "https://pub.dartlang.org" + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "0.1.1" geolocator: dependency: "direct main" description: name: geolocator - url: "https://pub.dartlang.org" + sha256: e146a6d63776582651e97a79cbe459f8e1211b100101fadcd84db83361fa599f + url: "https://pub.dev" source: hosted - version: "7.7.1" + version: "14.0.3" geolocator_android: - dependency: "direct overridden" + dependency: transitive description: name: geolocator_android - url: "https://hanntech-gmbh.gitlab.io/free2pass/flutter-geolocator-floss/" + sha256: "86ea1654e4f61ff51466848e91c116b422d6010ea269fda0fbe1af7e9e742ce1" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "5.0.3" geolocator_apple: dependency: transitive description: name: geolocator_apple - url: "https://pub.dartlang.org" + sha256: "853803d6bb1713c094e935b4a5ae5f19c0308acf81da13fa9ff84fb4c70c0b73" + url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "2.3.14" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: "3da7420f11c3496511a5bd3c18fd67b88e5659f12e46b7ce00a788f6996e850a" + url: "https://pub.dev" + source: hosted + version: "0.2.6" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface - url: "https://pub.dartlang.org" + sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" + url: "https://pub.dev" source: hosted - version: "2.3.6" + version: "4.2.6" geolocator_web: dependency: transitive description: name: geolocator_web - url: "https://pub.dartlang.org" + sha256: "19e485a0f8d6a88abcf9c53cba3a4105e14b7435ed8ac1c108c067b938fe8429" + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "4.1.4" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" source: hosted - version: "2.0.2" - highlight: - dependency: transitive + version: "2.1.3" + go_router: + dependency: "direct main" description: - name: highlight - url: "https://pub.dartlang.org" + name: go_router + sha256: "5922b2861e2235a3504896f0d6fa07d84141b480cf52eecd2f42cd25585a9e8a" + url: "https://pub.dev" source: hosted - version: "0.7.0" - hive: + version: "17.3.0" + gsettings: dependency: transitive description: - name: hive - url: "https://pub.dartlang.org" + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" source: hosted - version: "2.2.1" - hive_flutter: + version: "0.2.8" + handy_window: dependency: "direct main" description: - name: hive_flutter - url: "https://pub.dartlang.org" + name: handy_window + sha256: "06cc2747607022dbcea54b9b863db0962d34d606f998831a9b05a551c5184462" + url: "https://pub.dev" source: hosted - version: "1.1.0" - html: + version: "0.4.2" + highlight: + dependency: "direct main" + description: + name: highlight + sha256: "5353a83ffe3e3eca7df0abfb72dcf3fa66cc56b953728e7113ad4ad88497cf21" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + hooks: dependency: transitive + description: + name: hooks + sha256: "025f060e86d2d4c3c47b56e33caf7f93bf9283340f26d23424ebcfccf34f621e" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + html: + dependency: "direct main" description: name: html - url: "https://pub.dartlang.org" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" source: hosted - version: "0.15.0" + version: "0.15.6" html_unescape: dependency: transitive description: name: html_unescape - url: "https://pub.dartlang.org" + sha256: "15362d7a18f19d7b742ef8dcb811f5fd2a2df98db9f80ea393c075189e0b61e3" + url: "https://pub.dev" source: hosted version: "2.0.0" http: - dependency: "direct dev" + dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" source: hosted - version: "0.13.4" + version: "1.6.0" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.2" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.2" image: dependency: "direct main" description: name: image - url: "https://pub.dartlang.org" + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "4.8.0" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.dartlang.org" + sha256: d8402284df184bc05f4a2210c6c23983b0720f4cd87cbd05c5390a78af602667 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f + url: "https://pub.dev" source: hosted - version: "0.8.4+11" + version: "0.8.13+17" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - url: "https://pub.dartlang.org" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "3.1.1" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + url: "https://pub.dev" + source: hosted + version: "0.8.13+6" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" + url: "https://pub.dev" + source: hosted + version: "0.2.2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - url: "https://pub.dartlang.org" + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" + url: "https://pub.dev" source: hosted - version: "2.4.4" - import_sorter: - dependency: "direct dev" + version: "2.11.1" + image_picker_windows: + dependency: transitive description: - name: import_sorter - url: "https://pub.dartlang.org" + name: image_picker_windows + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae + url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "0.2.2" integration_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" - intersperse: - dependency: transitive - description: - name: intersperse - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.20.2" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" source: hosted - version: "1.0.3" - isolate: + version: "1.0.5" + jni: dependency: transitive description: - name: isolate - url: "https://pub.dartlang.org" + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "4.12.0" just_audio: dependency: "direct main" description: name: just_audio - url: "https://pub.dartlang.org" + sha256: e60aa97b233ddea025e13dfac59195207f528fa5e9e4a4a49a8c0766701e5fe6 + url: "https://pub.dev" source: hosted - version: "0.9.20" + version: "0.10.6" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - url: "https://pub.dartlang.org" + sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a" + url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.6.0" just_audio_web: dependency: transitive description: name: just_audio_web - url: "https://pub.dartlang.org" + sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" + url: "https://pub.dev" source: hosted - version: "0.4.7" - keyboard_shortcuts: + version: "0.4.16" + latlong2: dependency: "direct main" description: - path: "." - ref: null-safety - resolved-ref: a3d4020911860ff091d90638ab708604b71d2c5a - url: "https://github.com/TheOneWithTheBraid/keyboard_shortcuts.git" - source: git - version: "0.1.4" - latlong2: + name: latlong2 + sha256: "84b776b100a84a684a0aaa3fa4dc2c9b1931c658de533701ee4e09bfa991f8dc" + url: "https://pub.dev" + source: hosted + version: "0.10.1" + leak_tracker: dependency: transitive description: - name: latlong2 - url: "https://pub.dartlang.org" + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + license_checker: + dependency: "direct dev" + description: + name: license_checker + sha256: "8a35b6946e50811e070ac6fe4717ee431cd1a334e080df2116956b54b0bb0d0f" + url: "https://pub.dev" + source: hosted + version: "1.6.2" + linkify: + dependency: transitive + description: + name: linkify + sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" + url: "https://pub.dev" + source: hosted + version: "5.0.0" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" source: hosted - version: "1.0.1" - lists: + version: "6.1.0" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: ae6f382f638108c6becd134318d7c3f0a93875383a54010f61d7c97ac05d5137 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + local_auth_android: dependency: transitive description: - name: lists - url: "https://pub.dartlang.org" + name: local_auth_android + sha256: fdb936d59ab945c7af297defd67bd1ed87b11b6db1bc16d01e94677a8f1c38ec + url: "https://pub.dev" source: hosted - version: "1.0.1" - localstorage: - dependency: "direct main" + version: "2.0.9" + local_auth_darwin: + dependency: transitive description: - name: localstorage - url: "https://pub.dartlang.org" + name: local_auth_darwin + sha256: a8c3d4e17454111f7fd31ff72a31222359f6059f7fe956c2dcfe0f88f49826d4 + url: "https://pub.dev" source: hosted - version: "4.0.0+1" - logging: + version: "2.0.3" + local_auth_platform_interface: dependency: transitive description: - name: logging - url: "https://pub.dartlang.org" + name: local_auth_platform_interface + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 + url: "https://pub.dev" source: hosted - version: "1.0.2" - lottie: - dependency: "direct main" + version: "1.1.0" + local_auth_windows: + dependency: transitive description: - name: lottie - url: "https://pub.dartlang.org" + name: local_auth_windows + sha256: be12c5b8ba5e64896983123655c5f67d2484ecfcc95e367952ad6e3bff94cb16 + url: "https://pub.dev" source: hosted - version: "1.2.2" - macos_ui: + version: "2.0.1" + logger: dependency: transitive description: - name: macos_ui - url: "https://pub.dartlang.org" + name: logger + sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + url: "https://pub.dev" source: hosted - version: "0.13.1" + version: "2.7.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" markdown: dependency: transitive description: name: markdown - url: "https://pub.dartlang.org" + sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "7.3.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.13.0" matrix: dependency: "direct main" description: - name: matrix - url: "https://pub.dartlang.org" + path: "." + ref: main + resolved-ref: c8f10627bdd122ca12fe393bdd8fdfafc95526a6 + url: "https://github.com/famedly/matrix-dart-sdk.git" + source: git + version: "7.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" + url: "https://pub.dev" source: hosted - version: "0.10.3" - matrix_api_lite: + version: "1.18.0" + mgrs_dart: dependency: transitive description: - name: matrix_api_lite - url: "https://pub.dartlang.org" + name: mgrs_dart + sha256: "385e7168ecc77eb545220223c49eef8ab249da7bf57f22781c40a04d23fb196f" + url: "https://pub.dev" source: hosted - version: "1.1.1" - matrix_homeserver_recommendations: + version: "3.0.0" + mime: dependency: "direct main" description: - name: matrix_homeserver_recommendations - url: "https://pub.dartlang.org" + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" source: hosted - version: "0.2.1" - matrix_link_text: + version: "2.0.0" + native_imaging: dependency: "direct main" description: - name: matrix_link_text - url: "https://pub.dartlang.org" + name: native_imaging + sha256: ced7acb18b80a431578c9068eb9c3ee75f8df39491e8adaf471635bac282d651 + url: "https://pub.dev" source: hosted - version: "1.0.2" - meta: + version: "0.4.0" + native_toolchain_c: dependency: transitive description: - name: meta - url: "https://pub.dartlang.org" + name: native_toolchain_c + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" + url: "https://pub.dev" source: hosted - version: "1.7.0" - mgrs_dart: + version: "0.17.6" + native_toolchain_cmake: dependency: transitive description: - name: mgrs_dart - url: "https://pub.dartlang.org" + name: native_toolchain_cmake + sha256: cd4865568c57f03c7ab1f138cc5032c5f77825d27083d6f5a3e9bbb3e8014a87 + url: "https://pub.dev" source: hosted - version: "2.0.0" - mime: + version: "0.2.5" + nested: dependency: transitive description: - name: mime - url: "https://pub.dartlang.org" + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" source: hosted - version: "1.0.2" - move_to_background: + version: "1.0.0" + node_preamble: dependency: transitive description: - name: move_to_background - url: "https://pub.dartlang.org" + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" source: hosted - version: "1.0.2" - native_imaging: + version: "2.0.2" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" + open_file: dependency: "direct main" description: - path: "." - ref: HEAD - resolved-ref: "8c6a5afe2c965b79b5959bb4b49c4aad020cb980" - url: "https://gitlab.com/famedly/company/frontend/libraries/native_imaging.git" - source: git - version: "0.1.0" - nested: + name: open_file + sha256: "4f9b00d42565249ed4346976bc0d57f91303bec391f6b0b217921277cf8e6e4f" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + open_file_android: dependency: transitive description: - name: nested - url: "https://pub.dartlang.org" + name: open_file_android + sha256: f48a342b0347bf82bebf68c752f5cfce162965ce8449c5ecdafc406d294aa63d + url: "https://pub.dev" source: hosted - version: "1.0.0" - nm: + version: "1.1.0" + open_file_ios: dependency: transitive description: - name: nm - url: "https://pub.dartlang.org" + name: open_file_ios + sha256: "0e3e67dcd12f69888128f533cacc092039627dd4f1d7a95a2826b814ae4ea8aa" + url: "https://pub.dev" source: hosted - version: "0.5.0" - node_preamble: + version: "1.1.0" + open_file_linux: dependency: transitive description: - name: node_preamble - url: "https://pub.dartlang.org" + name: open_file_linux + sha256: efd9c1f9679745cf35a54d21d809a1fe5a1196d4a1353fe2d205ba298ae86dc9 + url: "https://pub.dev" source: hosted - version: "2.0.1" - octo_image: + version: "1.1.0" + open_file_mac: dependency: transitive description: - name: octo_image - url: "https://pub.dartlang.org" + name: open_file_mac + sha256: "1abe00e65f792b9baa1e15fdf4d44af5e813b1696ac307d71535543122a01e30" + url: "https://pub.dev" source: hosted - version: "1.0.2" - olm: + version: "1.1.0" + open_file_platform_interface: dependency: transitive description: - name: olm - url: "https://pub.dartlang.org" + name: open_file_platform_interface + sha256: dc302e4bd5c1d77acec4240bd0dbc1d9f2ee6882b1ce52bca5298369da7acf12 + url: "https://pub.dev" source: hosted - version: "2.0.0" - package_config: + version: "1.1.0" + open_file_web: dependency: transitive description: - name: package_config - url: "https://pub.dartlang.org" + name: open_file_web + sha256: "4945221c9ee98a5a6cdf26730fe0fabb3a36c1e423148bff4c32c283079ee532" + url: "https://pub.dev" source: hosted - version: "2.0.2" - package_info_plus: + version: "1.1.0" + open_file_windows: + dependency: transitive + description: + name: open_file_windows + sha256: "6a97d8f2a5966fb0a7f613a901f1d502f93456f64e8a7519d3204184413aab79" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + opus_caf_converter_dart: dependency: "direct main" description: - name: package_info_plus - url: "https://pub.dartlang.org" + name: opus_caf_converter_dart + sha256: e08156066916f790a54df305e103d6dec4d853ec23147e6a02eda3c06f67ba1a + url: "https://pub.dev" source: hosted - version: "1.4.2" - package_info_plus_linux: + version: "1.0.1" + package_config: dependency: transitive description: - name: package_info_plus_linux - url: "https://pub.dartlang.org" + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" source: hosted - version: "1.0.5" - package_info_plus_macos: - dependency: transitive + version: "2.2.0" + package_info_plus: + dependency: "direct main" description: - name: package_info_plus_macos - url: "https://pub.dartlang.org" + name: package_info_plus + sha256: f5c435dc0e0d461e5b32471a870f769b6a1cc46930637efe24fbc535314e78ad + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "10.2.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - url: "https://pub.dartlang.org" + sha256: db762cb2f4f25ee60fb6359773861b0f199e00b90d237bd85a76a1e806b46ef4 + url: "https://pub.dev" source: hosted - version: "1.0.2" - package_info_plus_web: - dependency: transitive - description: - name: package_info_plus_web - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - package_info_plus_windows: + version: "4.1.0" + pana: dependency: transitive description: - name: package_info_plus_windows - url: "https://pub.dartlang.org" + name: pana + sha256: "847ee5df6ac13fdc6c53d641095de1b25886c973d0b0f0469c73521ebe4602fa" + url: "https://pub.dev" source: hosted - version: "1.0.5" - path: - dependency: transitive + version: "0.23.12" + particles_network: + dependency: "direct main" description: - name: path - url: "https://pub.dartlang.org" + name: particles_network + sha256: afa9c9c70d7f13dcb2a4059edde4b6baa3b9a69ab899712522cbbd68bbd59095 + url: "https://pub.dev" source: hosted - version: "1.8.1" - path_drawing: - dependency: transitive + version: "1.9.5" + pasteboard: + dependency: "direct main" description: - name: path_drawing - url: "https://pub.dartlang.org" + name: pasteboard + sha256: fedbe8da188d2f713aa8b01260737342e6e1087534a3ab26e1a719f8d3e8f32f + url: "https://pub.dev" source: hosted - version: "0.5.1+1" - path_parsing: - dependency: transitive + version: "0.5.0" + path: + dependency: "direct main" description: - name: path_parsing - url: "https://pub.dartlang.org" + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "1.9.1" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 + url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.1.6" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" source: hosted - version: "2.0.12" - path_provider_ios: + version: "2.3.1" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.6.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.5" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "2.3.0" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" - source: hosted - version: "4.4.0" - pin_code_text_field: - dependency: "direct main" - description: - name: pin_code_text_field - url: "https://pub.dartlang.org" + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "7.0.2" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" source: hosted - version: "2.1.2" - pointycastle: - dependency: transitive - description: - name: pointycastle - url: "https://pub.dartlang.org" - source: hosted - version: "3.5.2" - polylabel: - dependency: transitive - description: - name: polylabel - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" + version: "2.1.8" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" source: hosted - version: "1.5.0" - positioned_tap_detector_2: + version: "1.5.2" + posix: dependency: transitive description: - name: positioned_tap_detector_2 - url: "https://pub.dartlang.org" + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "6.5.0" + pretty_qr_code: + dependency: "direct main" + description: + name: pretty_qr_code + sha256: "474f8a4512113fba06f14a6ec9bbf42353b4e651d7a520e3096f2a9b6bbe7a8a" + url: "https://pub.dev" + source: hosted + version: "3.6.0" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 + url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "5.0.5" proj4dart: dependency: transitive description: name: proj4dart - url: "https://pub.dartlang.org" + sha256: ddcedc1f7876e62717de43ab3491e2829bdad0b028261805f94aa080967e5859 + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" provider: dependency: "direct main" description: name: provider - url: "https://pub.dartlang.org" + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.1.5+1" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" + pub_updater: + dependency: transitive + description: + name: pub_updater + sha256: "739a0161d73a6974c0675b864fb0cf5147305f7b077b7f03a58fa7a9ab3e7e7d" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" punycode: dependency: "direct main" description: name: punycode - url: "https://pub.dartlang.org" + sha256: "39b874cc1f78b94e57db17e74b3f2ba2a96e25c0bebdcc8a571614dccda0ff0c" + url: "https://pub.dev" source: hosted version: "1.0.0" qr: dependency: transitive description: name: qr - url: "https://pub.dartlang.org" + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" + url: "https://pub.dev" source: hosted - version: "2.1.0" - qr_code_scanner: - dependency: "direct main" - description: - path: "." - ref: fix_break_changes_platform - resolved-ref: "0feca6f15042c279ff575c559a3430df917b623d" - url: "https://github.com/xeinebiu/qr_code_scanner.git" - source: git - version: "0.7.0" - qr_flutter: + version: "3.0.2" + qr_code_scanner_plus: dependency: "direct main" description: - name: qr_flutter - url: "https://pub.dartlang.org" + name: qr_code_scanner_plus + sha256: "20a1abc3d12e48ad1c58eb6f31cabed23cc29469c325e750d6e838613170c94b" + url: "https://pub.dev" source: hosted - version: "4.0.0" - quiver: - dependency: transitive + version: "2.2.0" + qr_image: + dependency: "direct main" description: - name: quiver - url: "https://pub.dartlang.org" + name: qr_image + sha256: c3cd2ac2c6cd6b14604c97b45c477b18988b6518f72120fa04418fc54e3b0d76 + url: "https://pub.dev" source: hosted - version: "3.0.1+1" + version: "1.0.0" random_string: dependency: transitive description: name: random_string - url: "https://pub.dartlang.org" + sha256: "03b52435aae8cbdd1056cf91bfc5bf845e9706724dd35ae2e99fa14a1ef79d02" + url: "https://pub.dev" source: hosted version: "2.3.1" receive_sharing_intent: dependency: "direct main" description: name: receive_sharing_intent - url: "https://pub.dartlang.org" + sha256: ec76056e4d258ad708e76d85591d933678625318e411564dcb9059048ca3a593 + url: "https://pub.dev" source: hosted - version: "1.4.5" + version: "1.8.1" record: dependency: "direct main" description: name: record - url: "https://pub.dartlang.org" + sha256: "82539d1372e23cf51375fdfcba084f39912bcbf9a953b75d56596691f8f11c0f" + url: "https://pub.dev" + source: hosted + version: "7.1.1" + record_android: + dependency: transitive + description: + name: record_android + sha256: "28f1108626a190e249b01ffa9f639070e31e5157474b64a5ae380bf36aec9559" + url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "2.1.2" + record_ios: + dependency: transitive + description: + name: record_ios + sha256: "21d189f49a598af4697dac4cc9e48389ac0a1fb3e916622b5504a58d9b96313e" + url: "https://pub.dev" + source: hosted + version: "2.1.1" record_linux: dependency: transitive description: name: record_linux - url: "https://pub.dartlang.org" + sha256: "305526af0560866a0cc4219aa3726ef8541f819e14bd5f65b73ffdb7dc5911be" + url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "2.1.0" record_macos: dependency: transitive description: name: record_macos - url: "https://pub.dartlang.org" + sha256: ced7495abf3d683e8a7dbe8fc96df8ea5722837a26f922b7cb7c5de11661bb46 + url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "2.1.1" record_platform_interface: dependency: transitive description: name: record_platform_interface - url: "https://pub.dartlang.org" + sha256: d94b37cadb8fe203e64b0e9893271c0b71b34f2550ee7fb0c6105d650e00c1f5 + url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "2.1.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" record_web: dependency: transitive description: name: record_web - url: "https://pub.dartlang.org" + sha256: "7d75ed681b5bf40c3a9b51b6c105fe53705f752284d859d5f030ab5a2bfd49cf" + url: "https://pub.dev" source: hosted - version: "0.3.1" + version: "2.1.1" record_windows: dependency: transitive description: name: record_windows - url: "https://pub.dartlang.org" + sha256: "39ca03e7ae4df5e2512bc3c92b0ef9a7b148d9295ae8ac92df6beb4daf939d94" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + retry: + dependency: transitive + description: + name: retry + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" + url: "https://pub.dev" source: hosted - version: "0.4.3" + version: "3.1.2" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" source: hosted - version: "0.27.3" - scroll_to_index: - dependency: "direct main" + version: "0.28.0" + safe_url_check: + dependency: transitive description: - name: scroll_to_index - url: "https://pub.dartlang.org" + name: safe_url_check + sha256: "49a3e060a7869cbafc8f4845ca1ecbbaaa53179980a32f4fdfeab1607e90f41d" + url: "https://pub.dev" source: hosted - version: "3.0.1" - sdp_transform: + version: "1.1.2" + screen_retriever: dependency: transitive description: - name: sdp_transform - url: "https://pub.dartlang.org" + name: screen_retriever + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev" source: hosted - version: "0.3.2" - sentry: - dependency: "direct main" + version: "0.2.0" + screen_retriever_linux: + dependency: transitive description: - name: sentry - url: "https://pub.dartlang.org" + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" source: hosted - version: "6.4.0" - share_plus: - dependency: "direct main" + version: "0.2.0" + screen_retriever_macos: + dependency: transitive description: - name: share_plus - url: "https://pub.dartlang.org" + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" source: hosted - version: "4.0.9" - share_plus_linux: + version: "0.2.0" + screen_retriever_platform_interface: dependency: transitive description: - name: share_plus_linux - url: "https://pub.dartlang.org" + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" source: hosted - version: "3.0.0" - share_plus_macos: + version: "0.2.0" + screen_retriever_windows: dependency: transitive description: - name: share_plus_macos - url: "https://pub.dartlang.org" + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" source: hosted - version: "3.0.0" - share_plus_platform_interface: - dependency: transitive + version: "0.2.0" + scroll_to_index: + dependency: "direct main" description: - name: share_plus_platform_interface - url: "https://pub.dartlang.org" + name: scroll_to_index + sha256: b707546e7500d9f070d63e5acf74fd437ec7eeeb68d3412ef7b0afada0b4f176 + url: "https://pub.dev" source: hosted - version: "3.0.2" - share_plus_web: + version: "3.0.1" + sdp_transform: dependency: transitive description: - name: share_plus_web - url: "https://pub.dartlang.org" + name: sdp_transform + sha256: "73e412a5279a5c2de74001535208e20fff88f225c9a4571af0f7146202755e45" + url: "https://pub.dev" source: hosted - version: "3.0.0" - share_plus_windows: + version: "0.3.2" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "9eee8283462d91a7a1c8bdb67d08874abd75a2f8fae3bc0ca033035e375fb3d8" + url: "https://pub.dev" + source: hosted + version: "13.2.0" + share_plus_platform_interface: dependency: transitive description: - name: share_plus_windows - url: "https://pub.dartlang.org" + name: share_plus_platform_interface + sha256: "7f7ae28cf400d13f811e297ff37742dba83b79e0a6f5dce14eec0248274e6ce9" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "7.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - url: "https://pub.dartlang.org" + sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf + url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.5.5" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - url: "https://pub.dartlang.org" + sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 + url: "https://pub.dev" source: hosted - version: "2.0.11" - shared_preferences_ios: + version: "2.4.23" + shared_preferences_foundation: dependency: transitive description: - name: shared_preferences_ios - url: "https://pub.dartlang.org" + name: shared_preferences_foundation + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.0" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - url: "https://pub.dartlang.org" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - url: "https://pub.dartlang.org" + sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.4.2" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - url: "https://pub.dartlang.org" + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.4.3" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - url: "https://pub.dartlang.org" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.4.1" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - url: "https://pub.dartlang.org" + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.2" shelf_static: dependency: transitive description: name: shelf_static - url: "https://pub.dartlang.org" + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "3.0.0" + simple_sparse_list: + dependency: transitive + description: + name: simple_sparse_list + sha256: aa648fd240fa39b49dcd11c19c266990006006de6699a412de485695910fbc1f + url: "https://pub.dev" + source: hosted + version: "0.1.4" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" slugify: dependency: "direct main" description: name: slugify - url: "https://pub.dartlang.org" + sha256: b272501565cb28050cac2d96b7bf28a2d24c8dae359280361d124f3093d337c3 + url: "https://pub.dev" source: hosted version: "2.0.0" - snapping_sheet: - dependency: "direct main" - description: - path: "." - ref: listenable - resolved-ref: "2d9f2a40590c13aadfd226c2e41b08e155e6a92e" - url: "https://github.com/TheOneWithTheBraid/snapping_sheet.git" - source: git - version: "3.1.0" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - url: "https://pub.dartlang.org" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" source_maps: dependency: transitive description: name: source_maps - url: "https://pub.dartlang.org" + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" source: hosted - version: "0.10.10" + version: "0.10.13" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" source: hosted - version: "1.8.2" - sqflite: + version: "1.10.2" + sqflite_common: dependency: transitive description: - name: sqflite - url: "https://pub.dartlang.org" + name: sqflite_common + sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + url: "https://pub.dev" source: hosted - version: "2.0.2" - sqflite_common: + version: "2.5.8" + sqflite_common_ffi: + dependency: "direct main" + description: + name: sqflite_common_ffi + sha256: "8d7b8749a516cbf6e9057f9b480b716ad14fc4f3d3873ca6938919cc626d9025" + url: "https://pub.dev" + source: hosted + version: "2.3.7+1" + sqlcipher_flutter_libs: + dependency: "direct main" + description: + name: sqlcipher_flutter_libs + sha256: dd1fcc74d5baf3c36ad53e2652b2d06c9f8747494a3ccde0076e88b159dfe622 + url: "https://pub.dev" + source: hosted + version: "0.6.8" + sqlite3: dependency: transitive description: - name: sqflite_common - url: "https://pub.dartlang.org" + name: sqlite3 + sha256: "3145bd74dcdb4fd6f5c6dda4d4e4490a8087d7f286a14dee5d37087290f0f8a2" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.9.4" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.4.1" + string_validator: + dependency: transitive + description: + name: string_validator + sha256: "50dd8ecf91db6a732f4a851eeae81ee12406eedc62d0da72f2d91a04a2d10dd8" + url: "https://pub.dev" + source: hosted + version: "0.3.0" swipe_to_action: dependency: "direct main" description: name: swipe_to_action - url: "https://pub.dartlang.org" + sha256: "05289a2bff6a0227deeff382afa1c46643d1f077e678d78f76440e153ea1ef7d" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.3.0" sync_http: dependency: transitive description: name: sync_http - url: "https://pub.dartlang.org" + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.3.1" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + url: "https://pub.dev" source: hosted - version: "3.0.0+2" + version: "3.4.0+1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.2" test: dependency: transitive description: name: test - url: "https://pub.dartlang.org" + sha256: "8d9ceddbab833f180fbefed08afa76d7c03513dfdba87ffcec2718b02bbcbf20" + url: "https://pub.dev" source: hosted - version: "1.20.2" + version: "1.31.0" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.7.11" test_core: dependency: transitive description: name: test_core - url: "https://pub.dartlang.org" + sha256: "1991d4cfe85d5043241acac92962c3977c8d2f2add1ee73130c7b286417d1d34" + url: "https://pub.dev" source: hosted - version: "0.4.11" + version: "0.6.17" timezone: dependency: transitive description: name: timezone - url: "https://pub.dartlang.org" - source: hosted - version: "0.8.0" - tint: - dependency: transitive - description: - name: tint - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" - tuple: - dependency: transitive - description: - name: tuple - url: "https://pub.dartlang.org" + sha256: "784a5e34d2eb62e1326f24d6f600aaaee452eb8ca8ef2f384a59244e292d158b" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "0.11.0" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" - uni_links: - dependency: "direct main" - description: - name: uni_links - url: "https://pub.dartlang.org" - source: hosted - version: "0.5.1" - uni_links_platform_interface: - dependency: transitive - description: - name: uni_links_platform_interface - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - uni_links_web: - dependency: transitive - description: - name: uni_links_web - url: "https://pub.dartlang.org" + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "1.4.0" unicode: dependency: transitive description: name: unicode - url: "https://pub.dartlang.org" + sha256: a6f7bcfc8ea1d5ce1f6c0b1c39117a9919f4953edd9fd7a64090a9796c499b57 + url: "https://pub.dev" source: hosted - version: "0.3.1" + version: "1.1.9" unifiedpush: dependency: "direct main" description: name: unifiedpush - url: "https://pub.dartlang.org" + sha256: "8ed9767f750a1dc6159a77e2171641d0cb825dc87682d1ce1b8618689b79f58e" + url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "6.2.0" unifiedpush_android: dependency: transitive description: name: unifiedpush_android - url: "https://pub.dartlang.org" + sha256: "2e6684e0a1a39ad8d6c7bc0d197954d50686acb1b1a7614b18ab0e0126f5492a" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + unifiedpush_linux: + dependency: transitive + description: + name: unifiedpush_linux + sha256: c062d5eedd1cec70bcd33270cc4e01ae0ff6501f33d471167c06b34a968adfeb + url: "https://pub.dev" source: hosted version: "1.0.0" unifiedpush_platform_interface: dependency: transitive description: name: unifiedpush_platform_interface - url: "https://pub.dartlang.org" + sha256: "83372bc8d794b8b12ef6993b518d7be907dcfc2191bdf6de0ece5c4445d89880" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + unifiedpush_storage_interface: + dependency: transitive + description: + name: unifiedpush_storage_interface + sha256: b8d423a4695efc616aa21d8ab48fb5ef99d6288c68b56282b8faac1579ceabd9 + url: "https://pub.dev" source: hosted version: "1.0.0" + unifiedpush_ui: + dependency: "direct main" + description: + name: unifiedpush_ui + sha256: "1b36b2aa0bc6b61577e2661c1183bd3442969ecf77b4c78174796d324f66dd1d" + url: "https://pub.dev" + source: hosted + version: "0.2.0" universal_html: dependency: "direct main" description: name: universal_html - url: "https://pub.dartlang.org" + sha256: c0bcae5c733c60f26c7dfc88b10b0fd27cbcc45cb7492311cdaa6067e21c9cd4 + url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.3.0" universal_io: dependency: transitive description: name: universal_io - url: "https://pub.dartlang.org" + sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.3.1" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" unorm_dart: dependency: transitive description: name: unorm_dart - url: "https://pub.dartlang.org" + sha256: "0c69186b03ca6addab0774bcc0f4f17b88d4ce78d9d4d8f0619e30a99ead58e7" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.3.2" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" source: hosted - version: "6.0.20" + version: "6.3.2" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + url: "https://pub.dev" source: hosted - version: "6.0.15" + version: "6.3.30" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" source: hosted - version: "6.0.15" + version: "6.4.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.4.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.0" - url_strategy: - dependency: transitive - description: - name: url_strategy - url: "https://pub.dartlang.org" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "3.1.5" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "4.5.3" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.1.2" - very_good_analysis: - dependency: transitive - description: - name: very_good_analysis - url: "https://pub.dartlang.org" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.2.0" video_compress: dependency: "direct main" description: name: video_compress - url: "https://pub.dartlang.org" + sha256: "31bc5cdb9a02ba666456e5e1907393c28e6e0e972980d7d8d619a7beda0d4f20" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.4" video_player: dependency: "direct main" description: name: video_player - url: "https://pub.dartlang.org" + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" + url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.11.1" video_player_android: dependency: transitive description: name: video_player_android - url: "https://pub.dartlang.org" + sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0" + url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.9.5" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - url: "https://pub.dartlang.org" + sha256: "9338f3ec22774f88146b22f13273a446719b1da010fd200c4d1d97802156ac58" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.9.7" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - url: "https://pub.dartlang.org" + sha256: "16eaed5268c571c31840dc58ef8da5f0cd4db2a98490c3b8f1cf70122546c6e0" + url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.7.0" video_player_web: dependency: transitive description: name: video_player_web - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.7" - visibility_detector: - dependency: transitive - description: - name: visibility_detector - url: "https://pub.dartlang.org" + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" + url: "https://pub.dev" source: hosted - version: "0.3.3" + version: "2.4.0" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" source: hosted - version: "8.2.2" - vrouter: - dependency: "direct main" + version: "15.2.0" + vodozemac: + dependency: transitive description: - name: vrouter - url: "https://pub.dartlang.org" + name: vodozemac + sha256: bbe7dd31d7f623e2aeedb92e4b71a8b519e6109ce1e2911b5a220f6752b65cda + url: "https://pub.dev" source: hosted - version: "1.2.0+21" - wakelock: + version: "0.5.0" + wakelock_plus: dependency: "direct main" description: - name: wakelock - url: "https://pub.dartlang.org" + name: wakelock_plus + sha256: "824c5bba0f800e86d32e57d3d1843c531f090005cc89d9a837933e6601093d53" + url: "https://pub.dev" source: hosted - version: "0.6.1+2" - wakelock_macos: - dependency: transitive - description: - name: wakelock_macos - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" - wakelock_platform_interface: + version: "1.6.1" + wakelock_plus_platform_interface: dependency: transitive description: - name: wakelock_platform_interface - url: "https://pub.dartlang.org" + name: wakelock_plus_platform_interface + sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b + url: "https://pub.dev" source: hosted - version: "0.3.0" - wakelock_web: + version: "1.5.1" + watcher: dependency: transitive description: - name: wakelock_web - url: "https://pub.dartlang.org" + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_windows: + version: "1.2.1" + web: dependency: transitive description: - name: wakelock_windows - url: "https://pub.dartlang.org" + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" source: hosted - version: "0.2.0" - watcher: + version: "1.1.1" + web_socket: dependency: transitive description: - name: watcher - url: "https://pub.dartlang.org" + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" source: hosted version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.3" + webcrypto: + dependency: transitive + description: + name: webcrypto + sha256: "9885ed99a846191542dd6ca820c83a098117df56be57453832233a3fef68f3f2" + url: "https://pub.dev" + source: hosted + version: "0.6.1" webdriver: dependency: transitive description: name: webdriver - url: "https://pub.dartlang.org" + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - url: "https://pub.dartlang.org" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" source: hosted - version: "1.0.0" - webrtc_interface: + version: "1.2.1" + webpush_encryption: dependency: transitive + description: + name: webpush_encryption + sha256: "5b83272b91acda6ae515fcd980c94f06bf413702282497c5a68f5dfc64fed27f" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + webrtc_interface: + dependency: "direct main" description: name: webrtc_interface - url: "https://pub.dartlang.org" + sha256: c6f100eac5057d9a817a60473126f9828c796d42884d498af4f339c97b21014f + url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.5.1" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: ba6f4bba816c8d7e3c1580e170f3786d216951cc6b94babc3b814c08d2cb2738 + url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "6.3.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "73b1d78920a9d6e03f8b4e43e612b87bf3152a0e5c5e5150267762b7c4116904" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + window_manager: + dependency: transitive + description: + name: window_manager + sha256: "7eb6d6c4164ec08e1bf978d6e733f3cebe792e2a23fb07cbca25c2872bfdbdcd" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + window_to_front: + dependency: transitive + description: + name: window_to_front + sha256: "7aef379752b7190c10479e12b5fd7c0b9d92adc96817d9e96c59937929512aee" + url: "https://pub.dev" + source: hosted + version: "0.0.3" wkt_parser: dependency: transitive description: name: wkt_parser - url: "https://pub.dartlang.org" + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" source: hosted version: "2.0.0" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" source: hosted - version: "0.2.0+1" + version: "1.1.0" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "6.6.1" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.3" + yaml_edit: + dependency: transitive + description: + name: yaml_edit + sha256: "07c9e63ba42519745182b88ca12264a7ba2484d8239958778dfe4d44fe760488" + url: "https://pub.dev" + source: hosted + version: "2.2.4" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0" diff --git a/pubspec.yaml b/pubspec.yaml index b0e4daeff7..432468b596 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,160 +1,133 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + name: fluffychat description: Chat with your friends. publish_to: none -version: 1.5.0+2323 +# On version bump please also increase: +# 1. The build number (for F-Droid) +# 2. The version in /snap/snapcraft.yaml +version: 2.7.2+3556 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=3.11.1 <4.0.0" dependencies: - adaptive_dialog: ^1.5.1 - adaptive_theme: ^3.0.0 - animations: ^2.0.2 - blurhash_dart: ^1.1.0 - cached_network_image: ^3.2.0 - callkeep: ^0.3.2 - chewie: ^1.2.2 - collection: ^1.15.0-nullsafety.4 - connectivity_plus: ^2.2.0 - cupertino_icons: any - desktop_drop: ^0.3.2 - desktop_lifecycle: ^0.1.0 - desktop_notifications: ^0.6.3 - device_info_plus: ^4.0.0 - dynamic_color: ^1.2.2 - email_validator: ^2.0.1 - emoji_picker_flutter: ^1.1.2 - encrypt: ^5.0.1 - #fcm_shared_isolate: ^0.1.0 - file_picker_cross: ^4.6.0 + archive: ^4.0.7 + async: ^2.13.1 + badges: ^3.2.0 + blurhash_dart: ^1.2.1 + chewie: ^1.14.1 + collection: ^1.18.0 + cross_file: ^0.3.5 + desktop_drop: ^0.7.1 + device_info_plus: ^13.2.0 + dynamic_color: ^1.8.1 + emoji_picker_flutter: ^4.4.0 + file_picker: ^12.0.0-beta.7 + file_selector: ^1.1.0 flutter: sdk: flutter - flutter_app_badger: ^1.3.0 - flutter_app_lock: ^2.0.0 - flutter_blurhash: ^0.7.0 - flutter_cache_manager: ^3.3.0 - flutter_local_notifications: ^9.4.0 + flutter_foreground_task: ^9.2.2 + flutter_linkify: ^6.0.0 + flutter_local_notifications: ^22.0.1 flutter_localizations: sdk: flutter - flutter_map: ^1.1.0 - flutter_matrix_html: ^1.1.0 - flutter_olm: ^1.2.0 - flutter_openssl_crypto: ^0.1.0 - flutter_ringtone_player: ^3.1.1 - flutter_secure_storage: ^5.0.2 - flutter_slidable: ^1.2.0 - flutter_svg: ^0.22.0 - flutter_typeahead: ^4.0.0 - flutter_web_auth: ^0.4.0 - flutter_webrtc: ^0.8.7 - future_loading_dialog: ^0.2.3 - geolocator: ^7.6.2 - hive_flutter: ^1.1.0 - image: ^3.1.1 - image_picker: ^0.8.4+8 + flutter_map: ^8.3.1 + flutter_new_badger: ^1.1.1 + flutter_secure_storage: ^10.3.1 + flutter_shortcuts_new: ^2.0.0 + flutter_vodozemac: ^0.5.0 + flutter_web_auth_2: ^5.0.3 + flutter_webrtc: ^1.5.2 + geolocator: ^14.0.3 + go_router: ^17.3.0 + handy_window: ^0.4.2 + highlight: ^0.7.0 + html: ^0.15.4 + http: ^1.6.0 + image: ^4.7.2 + image_picker: ^1.2.3 intl: any - just_audio: ^0.9.20 - keyboard_shortcuts: ^0.1.4 - localstorage: ^4.0.0+1 - lottie: ^1.2.2 - matrix: ^0.10.3 - matrix_homeserver_recommendations: ^0.2.0 - matrix_link_text: ^1.0.2 - native_imaging: - git: https://gitlab.com/famedly/company/frontend/libraries/native_imaging.git - package_info_plus: ^1.3.0 - path_provider: ^2.0.9 - pin_code_text_field: ^1.8.0 + just_audio: ^0.10.6 + latlong2: ^0.10.1 + local_auth: ^3.0.1 + matrix: #^7.5.0 + git: + url: https://github.com/famedly/matrix-dart-sdk.git + ref: main + mime: ^2.0.0 + native_imaging: ^0.4.0 + open_file: ^4.0.0 + opus_caf_converter_dart: ^1.0.1 + package_info_plus: ^10.2.0 + particles_network: ^1.9.5 + pasteboard: ^0.5.0 + path: ^1.9.0 + path_provider: ^2.1.6 + pretty_qr_code: ^3.6.0 provider: ^6.0.2 punycode: ^1.0.0 - qr_code_scanner: ^0.7.0 - qr_flutter: ^4.0.0 - receive_sharing_intent: ^1.4.5 - record: ^4.1.1 + qr_code_scanner_plus: ^2.2.0 + qr_image: ^1.0.0 + receive_sharing_intent: ^1.8.1 + record: ^7.1.1 scroll_to_index: ^3.0.1 - sentry: ^6.3.0 - share_plus: ^4.0.9 - shared_preferences: ^2.0.13 + share_plus: ^13.2.0 + shared_preferences: ^2.5.5 # Pinned because https://github.com/flutter/flutter/issues/118401 slugify: ^2.0.0 - snapping_sheet: ^3.1.0 - swipe_to_action: ^0.2.0 - uni_links: ^0.5.1 - unifiedpush: ^4.0.0 - universal_html: ^2.0.8 - url_launcher: ^6.0.20 - video_compress: ^3.1.0 - video_player: ^2.2.18 - vrouter: ^1.2.0+21 - wakelock: ^0.6.1+1 + sqflite_common_ffi: ^2.3.7+1 + sqlcipher_flutter_libs: ^0.6.8 + swipe_to_action: ^0.3.0 + unifiedpush: ^6.2.0 + unifiedpush_ui: ^0.2.0 + universal_html: ^2.3.0 + url_launcher: ^6.3.2 + video_compress: ^3.1.4 + video_player: ^2.11.1 + wakelock_plus: ^1.6.1 + webrtc_interface: ^1.5.1 dev_dependencies: - dart_code_metrics: ^4.10.1 - flutter_lints: ^1.0.4 - flutter_native_splash: ^2.0.3+1 + dart_code_linter: ^4.1.6 + flutter_launcher_icons: ^0.14.4 + flutter_lints: ^6.0.0 flutter_test: sdk: flutter - http: ^0.13.4 - import_sorter: ^4.6.0 integration_test: sdk: flutter - -flutter_native_splash: - color: "#ffffff" - color_dark: "#000000" - image: "assets/info-logo.png" + license_checker: ^1.6.2 flutter: generate: true uses-material-design: true assets: - assets/ + - assets/logo/mini/ - assets/sounds/ - - assets/js/ - - assets/js/package/ + - assets/vodozemac/ - fonts: - - family: Roboto - fonts: - - asset: fonts/Roboto/Roboto-Regular.ttf - - asset: fonts/Roboto/Roboto-Italic.ttf - style: italic - - asset: fonts/Roboto/Roboto-Bold.ttf - weight: 700 - - family: NotoEmoji - fonts: - - asset: fonts/NotoEmoji/NotoColorEmoji.ttf +flutter_launcher_icons: + image_path: assets/logo/img/logo.png + android: true + adaptive_icon_foreground: assets/logo/img/logo_foreground.png + adaptive_icon_background: assets/logo/img/logo_background.png + adaptive_icon_monochrome: assets/logo/img/logo_mono.png + ios: true + macos: + generate: true + windows: + generate: true + web: + generate: true + image_path: assets/logo/img/logo_standalone.png + background_color: "#FFFFFF" + theme_color: "#41a2bc" +# Guidelines for adding a dependency override: +# 1. Don't do it if you can avoid it or fix it upstream in a manageable time +# 2. Always link an (upstream?) issue +# 3. Explain how and when this can be removed (overrides must be temporarily) dependency_overrides: - # Necessary for webRTC on web. - # Fix for stream fallback for unsupported browsers: - # https://github.com/fluttercommunity/plus_plugins/pull/746 - # Upstream pull request: https://github.com/fluttercommunity/plus_plugins/pull/746 - connectivity_plus_web: - git: - url: https://github.com/TheOneWithTheBraid/plus_plugins.git - ref: a04401cb48abe92d138c0e9288b360739994a9e9 - path: packages/connectivity_plus/connectivity_plus_web - dbus: ^0.7.1 - geolocator_android: - hosted: - name: geolocator_android - url: https://hanntech-gmbh.gitlab.io/free2pass/flutter-geolocator-floss - # waiting for null safety - # Upstream pull request: https://github.com/AntoineMarcel/keyboard_shortcuts/pull/13 - keyboard_shortcuts: - git: - url: https://github.com/TheOneWithTheBraid/keyboard_shortcuts.git - ref: null-safety - provider: 5.0.0 - # For Flutter 3.0.0 compatibility - # https://github.com/juliuscanute/qr_code_scanner/issues/532 - qr_code_scanner: - git: - url: https://github.com/xeinebiu/qr_code_scanner.git - ref: fix_break_changes_platform - # wating for `Listenable` implementation - # Upstream pull request: https://github.com/AdamJonsson/snapping_sheet/pull/84 - snapping_sheet: - git: - url: https://github.com/TheOneWithTheBraid/snapping_sheet.git - ref: listenable diff --git a/recommended_homeservers.json b/recommended_homeservers.json new file mode 100644 index 0000000000..fef6018475 --- /dev/null +++ b/recommended_homeservers.json @@ -0,0 +1,35 @@ +{ + "public_servers": [ + { + "name": "matrix.org", + "website": "https://matrix.org", + "description": "The Matrix.org Foundation offers the matrix.org homeserver as an easy entry point for anyone wanting to try out Matrix.", + "reg_method": "oidc", + "languages": [ + "All", + "English" + ] + }, + { + "name": "mozilla.org", + "website": "https://mozilla.org", + "description": "Matrix homeserver hosted by Mozilla.", + "reg_method": "oidc", + "languages": [ + "All", + "English" + ] + }, + { + "name": "tchncs.de", + "website": "https://tchncs.de", + "description": "A general homeserver. Owner also hosts other FOSS services.", + "reg_method": "oidc", + "languages": [ + "All", + "English", + "Deutsch" + ] + } + ] +} \ No newline at end of file diff --git a/scripts/add-firebase-messaging.sh b/scripts/add-firebase-messaging.sh new file mode 100755 index 0000000000..0c8ee1c559 --- /dev/null +++ b/scripts/add-firebase-messaging.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +flutter pub add fcm_shared_isolate +flutter pub get + +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's,//,,g' lib/utils/background_push.dart + sed -i '' -e 's,^/\*,,' -e 's,\*/$,,' android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt +else + sed -i 's,//,,g' lib/utils/background_push.dart + sed -i -e 's,^/\*,,' -e 's,\*/$,,' android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt +fi diff --git a/scripts/build-android-apk.sh b/scripts/build-android-apk.sh deleted file mode 100755 index 4b1b641be6..0000000000 --- a/scripts/build-android-apk.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -flutter pub get -flutter build apk --release -mkdir -p build/android -cp build/app/outputs/apk/release/app-release.apk build/android/ diff --git a/scripts/build-android-debug.sh b/scripts/build-android-debug.sh deleted file mode 100755 index 5c2744a4ca..0000000000 --- a/scripts/build-android-debug.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -flutter build apk --debug diff --git a/scripts/build-ios.sh b/scripts/build-ios.sh index 7fd791b5e0..6f2703bf5e 100755 --- a/scripts/build-ios.sh +++ b/scripts/build-ios.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + git apply ./scripts/enable-android-google-services.patch FLUFFYCHAT_ORIG_GROUP="im.fluffychat" FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G" diff --git a/scripts/build-linux.sh b/scripts/build-linux.sh deleted file mode 100755 index e1df0e603d..0000000000 --- a/scripts/build-linux.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -ve -flutter config --enable-linux-desktop -flutter clean -flutter pub get -flutter build linux --release -v diff --git a/scripts/build-macos.sh b/scripts/build-macos.sh index 3a9ca059c6..bbc45cf1b0 100755 --- a/scripts/build-macos.sh +++ b/scripts/build-macos.sh @@ -1,9 +1,39 @@ -#!/bin/sh -ve -flutter config --enable-macos-desktop -flutter clean -flutter pub get -cd macos -pod install -pod update -cd .. +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +git apply ./scripts/enable-android-google-services.patch +FLUFFYCHAT_ORIG_GROUP="im.fluffychat" +FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G" +#FLUFFYCHAT_NEW_GROUP="com.example.fluffychat" +#FLUFFYCHAT_NEW_TEAM="ABCDE12345" + +# In some cases (ie: running beta XCode releases) some pods haven't updated their minimum version +# but XCode will reject the package for using too old of a minimum version. +# This will fix that, but. Well. Use at your own risk. +# export I_PROMISE_IM_REALLY_SMART=1 + +# If you want to automatically install the app +# export FLUFFYCHAT_INSTALL_IPA=1 + +### Rotate IDs ### +[ -n "${FLUFFYCHAT_NEW_GROUP}" ] && { + # App group IDs + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner/Runner.entitlements" + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner.xcodeproj/project.pbxproj" + # Bundle identifiers + sed -i "" "s/${FLUFFYCHAT_ORIG_GROUP}.app/${FLUFFYCHAT_NEW_GROUP}.app/g" "macos/Runner.xcodeproj/project.pbxproj" +} + +[ -n "${FLUFFYCHAT_NEW_TEAM}" ] && { + # Code signing team + sed -i "" "s/${FLUFFYCHAT_ORIG_TEAM}/${FLUFFYCHAT_NEW_TEAM}/g" "macos/Runner.xcodeproj/project.pbxproj" +} + +### Make release build ### flutter build macos --release + +echo "Build build/macos/Build/Products/Release/FluffyChat.app" diff --git a/scripts/build-web.sh b/scripts/build-web.sh deleted file mode 100755 index a136aeea23..0000000000 --- a/scripts/build-web.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -ve -flutter config --enable-web -flutter clean -flutter pub get -flutter build web --release --verbose --source-maps diff --git a/scripts/build-windows.ps1 b/scripts/build-windows.ps1 index dea9cf8fb9..4824dee72a 100644 --- a/scripts/build-windows.ps1 +++ b/scripts/build-windows.ps1 @@ -1,5 +1,12 @@ +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + flutter doctor flutter config --enable-windows-desktop flutter clean flutter pub get -flutter build windows --release -v \ No newline at end of file + +flutter build windows --release -v + diff --git a/scripts/clear-translations.sh b/scripts/clear-translations.sh new file mode 100755 index 0000000000..75bec361a8 --- /dev/null +++ b/scripts/clear-translations.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +rm lib/l10n/l10n*.dart +flutter pub run translations_cleaner clean-translations +flutter pub get \ No newline at end of file diff --git a/scripts/code_analyze.sh b/scripts/code_analyze.sh deleted file mode 100755 index c0249a7c56..0000000000 --- a/scripts/code_analyze.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -ve -flutter pub get -flutter pub run import_sorter:main --no-comments --exit-if-changed -flutter format lib/ test/ --set-exit-if-changed -git apply ./scripts/enable-android-google-services.patch -flutter pub get -flutter analyze -flutter pub run dart_code_metrics:metrics lib -r gitlab > code-quality-report.json || true \ No newline at end of file diff --git a/scripts/enable-android-google-services.patch b/scripts/enable-android-google-services.patch deleted file mode 100644 index a190cbc37c..0000000000 --- a/scripts/enable-android-google-services.patch +++ /dev/null @@ -1,168 +0,0 @@ -diff --git a/android/app/build.gradle b/android/app/build.gradle -index 001fbd72..339b35af 100644 ---- a/android/app/build.gradle -+++ b/android/app/build.gradle -@@ -44,7 +44,7 @@ android { - - defaultConfig { - applicationId "chat.fluffy.fluffychat" -- minSdkVersion 16 -+ minSdkVersion 19 - targetSdkVersion 30 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName -@@ -68,6 +68,10 @@ android { - } - release { - signingConfig signingConfigs.release -+ minifyEnabled false -+ shrinkResources false -+ -+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - } -@@ -78,8 +82,11 @@ flutter { - - dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -- //implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 -+ implementation 'com.google.firebase:firebase-messaging:19.0.1' // Workaround for https://github.com/microg/android_packages_apps_GmsCore/issues/313#issuecomment-617651698 -+ testImplementation 'junit:junit:4.12' -+ androidTestImplementation 'androidx.test:runner:1.1.1' -+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' - implementation 'androidx.multidex:multidex:2.0.1' - } - --//apply plugin: 'com.google.gms.google-services' -+apply plugin: 'com.google.gms.google-services' -diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro -new file mode 100644 -index 00000000..40570865 ---- /dev/null -+++ b/android/app/proguard-rules.pro -@@ -0,0 +1,41 @@ -+-optimizationpasses 5 -+## Flutter wrapper -+-keep class io.flutter.app.** { *; } -+-keep class io.flutter.plugin.** { *; } -+-keep class io.flutter.util.** { *; } -+-keep class io.flutter.view.** { *; } -+-keep class io.flutter.** { *; } -+-keep class io.flutter.plugins.** { *; } -+-dontwarn io.flutter.embedding.** -+ -+##---------------Begin: proguard configuration for Gson (Needed for flutter_local_notifications) ---------- -+# Gson uses generic type information stored in a class file when working with fields. Proguard -+# removes such information by default, so configure it to keep all of it. -+-keepattributes Signature -+ -+# For using GSON @Expose annotation -+-keepattributes *Annotation* -+ -+# Gson specific classes -+-dontwarn sun.misc.** -+ -+# Application classes that will be serialized/deserialized over Gson -+-keep class com.google.gson.examples.android.model.** { ; } -+ -+# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory, -+# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) -+-keep class * extends com.google.gson.TypeAdapter -+-keep class * implements com.google.gson.TypeAdapterFactory -+-keep class * implements com.google.gson.JsonSerializer -+-keep class * implements com.google.gson.JsonDeserializer -+ -+# Prevent R8 from leaving Data object members always null -+-keepclassmembers,allowobfuscation class * { -+ @com.google.gson.annotations.SerializedName ; -+} -+ -+# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher. -+-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken -+-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken -+ -+##---------------End: proguard configuration for Gson (Needed for flutter_local_notifications) ---------- -\ No newline at end of file -diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt -index d9930f55..510e9845 100644 ---- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt -+++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/FcmPushService.kt -@@ -1,4 +1,4 @@ --/*package chat.fluffy.fluffychat -+package chat.fluffy.fluffychat - - import com.famedly.fcm_shared_isolate.FcmSharedIsolateService - -@@ -33,4 +33,3 @@ class FcmPushService : FcmSharedIsolateService() { - } - } - } --*/ -\ No newline at end of file -diff --git a/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt b/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt -index 1afc4606..894d1571 100644 ---- a/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt -+++ b/android/app/src/main/kotlin/chat/fluffy/fluffychat/MainActivity.kt -@@ -7,13 +7,11 @@ import android.content.Context - import androidx.multidex.MultiDex - - class MainActivity : FlutterActivity() { -- - override fun attachBaseContext(base: Context) { - super.attachBaseContext(base) - MultiDex.install(this) - } - -- - override fun provideFlutterEngine(context: Context): FlutterEngine? { - return provideEngine(this) - } -diff --git a/android/build.gradle b/android/build.gradle -index 85aa8647..3b7e09e7 100644 ---- a/android/build.gradle -+++ b/android/build.gradle -@@ -8,7 +8,7 @@ buildscript { - dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" -- //classpath 'com.google.gms:google-services:4.3.8' -+ classpath 'com.google.gms:google-services:4.3.8' - } - } - -diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart -index cd79b0ab..c2db0f1e 100644 ---- a/lib/utils/background_push.dart -+++ b/lib/utils/background_push.dart -@@ -39,7 +39,7 @@ import '../config/setting_keys.dart'; - import 'famedlysdk_store.dart'; - import 'platform_infos.dart'; - --//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; -+import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; - - class NoTokenException implements Exception { - String get cause => 'Cannot get firebase token'; -@@ -65,7 +65,7 @@ class BackgroundPush { - - final pendingTests = >{}; - -- final dynamic firebase = null; //FcmSharedIsolate(); -+ final dynamic firebase = FcmSharedIsolate(); - - DateTime? lastReceivedPush; - -diff --git a/pubspec.yaml b/pubspec.yaml -index 6999d0b8..b2c9144f 100644 ---- a/pubspec.yaml -+++ b/pubspec.yaml -@@ -25,7 +25,7 @@ dependencies: - email_validator: ^2.0.1 - emoji_picker_flutter: ^1.1.2 - encrypt: ^5.0.1 -- #fcm_shared_isolate: ^0.1.0 -+ fcm_shared_isolate: ^0.1.0 - file_picker_cross: ^4.6.0 - flutter: - sdk: flutter diff --git a/scripts/generate-locale-config.sh b/scripts/generate-locale-config.sh new file mode 100755 index 0000000000..5f719b145e --- /dev/null +++ b/scripts/generate-locale-config.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +# Directory containing the ARB files +l10n_dir="./lib/l10n" +# Target directory for the locale_config.xml file +xml_dir="./android/app/src/main/res/xml" + +# Create the target directory if it does not exist +mkdir -p "$xml_dir" + +# Output file name +xml_file="$xml_dir/locale_config.xml" + +rm -rf "$xml_file" + +# XML Header +echo '' > "$xml_file" +echo '' >> "$xml_file" + +# Search for ARB files and extract language codes +for file in "$l10n_dir"/intl_*.arb; do + # Extract language code + language_code=$(basename "$file" | cut -d'_' -f2 | cut -d'.' -f1) + # Write language code to the XML file + echo " " >> "$xml_file" +done + +# XML Footer +echo '' >> "$xml_file" + +echo "locale_config.xml file has been successfully created in the $xml_dir directory." diff --git a/scripts/generate_command_hints_glue.sh b/scripts/generate_command_hints_glue.sh index f0c941cecc..75a457cd77 100755 --- a/scripts/generate_command_hints_glue.sh +++ b/scripts/generate_command_hints_glue.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + # Generates some glue code for translation of /command hints. # How to use this: @@ -9,7 +15,7 @@ # Looking to add descriptions for a new command, but don't know what it does? # It is likely defined here (in registerDefaultCommands()): -# https://gitlab.com/famedly/company/frontend/famedlysdk/-/blob/main/lib/src/utils/commands_extension.dart +# https://github.com/famedly/matrix-dart-sdk/tree/main/lib/src/utils/commands_extension.dart echo "\ // This file is auto-generated using scripts/generate_command_hints_glue.sh. @@ -21,7 +27,7 @@ String commandHint(L10n l10n, String command) { $(sed -n \ 's/[[:blank:]]*\"\(commandHint_\([[:lower:]]*\)\)\".*/ case "\2":\ return l10n.\1;/p' \ - assets/l10n/intl_en.arb + lib/l10n/intl_en.arb ) default: return \"\"; diff --git a/scripts/open-mr.sh b/scripts/open-mr.sh deleted file mode 100755 index 4af2c71288..0000000000 --- a/scripts/open-mr.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -ve - -# source: https://about.gitlab.com/blog/2017/09/05/how-to-automatically-create-a-new-mr-on-gitlab-with-gitlab-ci/ - -# Extract the host where the server is running, and add the URL to the APIs -[[ $HOST =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/" - -# Look which is the default branch -TARGET_BRANCH=`curl --silent "${HOST}${CI_PROJECT_ID}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" | python3 -c "import sys, json; print(json.load(sys.stdin)['default_branch'])"`; - -# The description of our new MR, we want to remove the branch after the MR has -# been closed -BODY="{ - \"id\": ${CI_PROJECT_ID}, - \"source_branch\": \"${UPDATE_BRANCH}\", - \"target_branch\": \"${TARGET_BRANCH}\", - \"remove_source_branch\": true, - \"title\": \"chore: automated dependency update\" -}"; - -# Require a list of all the merge request and take a look if there is already -# one with the same source branch -LISTMR=`curl --silent "${HOST}${CI_PROJECT_ID}/merge_requests?state=opened" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}"`; -COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${UPDATE_BRANCH}\"" | wc -l`; - -# No MR found, let's create a new one -if [ ${COUNTBRANCHES} -eq "0" ]; then - curl -X POST "${HOST}${CI_PROJECT_ID}/merge_requests" \ - --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \ - --header "Content-Type: application/json" \ - --data "${BODY}"; - - echo "Opened a new dependency update MR." - exit; -fi - -echo "No new merge request opened."; diff --git a/scripts/prepare-android-release.sh b/scripts/prepare-android-release.sh index 8204f7ca13..53f60b289c 100755 --- a/scripts/prepare-android-release.sh +++ b/scripts/prepare-android-release.sh @@ -1,5 +1,10 @@ #!/usr/bin/env bash -git apply ./scripts/enable-android-google-services.patch + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + cd android echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks echo "storePassword=${FDROID_KEY_PASS}" >> key.properties diff --git a/scripts/prepare-web.sh b/scripts/prepare-web.sh index 2c05a2030d..d3d3efa662 100755 --- a/scripts/prepare-web.sh +++ b/scripts/prepare-web.sh @@ -1,6 +1,29 @@ #!/bin/sh -ve -rm -r assets/js/package -cd assets/js/ && curl -L 'https://gitlab.com/famedly/company/frontend/libraries/olm/-/jobs/artifacts/master/download?job=build:js' > olm.zip && cd ../../ -cd assets/js/ && unzip olm.zip && cd ../../ -cd assets/js/ && rm olm.zip && cd ../../ -cd assets/js/ && mv javascript package && cd ../../ + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +# Compile Vodozemac for web +version=$(yq ".dependencies.flutter_vodozemac" < pubspec.yaml) +version=$(printf "%s" "$version" | tr -d '"^') +git clone https://github.com/famedly/dart-vodozemac.git -b ${version} .vodozemac +cd .vodozemac +cargo install flutter_rust_bridge_codegen +flutter_rust_bridge_codegen build-web --dart-root dart --rust-root $(readlink -f rust) --release +cd .. +rm -f ./assets/vodozemac/vodozemac_bindings_dart* +mv .vodozemac/dart/web/pkg/vodozemac_bindings_dart* ./assets/vodozemac/ +rm -rf .vodozemac +flutter pub get +dart compile js ./web/native_executor.dart -o ./web/native_executor.js -m + +# Download native_imaging for web: +version=$(yq ".dependencies.native_imaging" < pubspec.yaml) +version=$(printf "%s" "$version" | tr -d '"^') +curl -L "https://github.com/famedly/dart_native_imaging/releases/download/v${version}/native_imaging.zip" > native_imaging.zip +unzip native_imaging.zip +mv js/* web/ +rmdir js +rm native_imaging.zip \ No newline at end of file diff --git a/scripts/prepare-windows.ps1 b/scripts/prepare-windows.ps1 index 7b749091f4..5eed4fa2c3 100644 --- a/scripts/prepare-windows.ps1 +++ b/scripts/prepare-windows.ps1 @@ -1,3 +1,10 @@ -choco install flutter -y +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +choco install flutter cmake --installargs 'ADD_CMAKE_TO_PATH=System' -y Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" -refreshenv \ No newline at end of file +refreshenv + +flutter config --no-analytics diff --git a/scripts/prepare_integration_test.sh b/scripts/prepare_integration_test.sh new file mode 100755 index 0000000000..20ae0332ec --- /dev/null +++ b/scripts/prepare_integration_test.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +source integration_test/data/integration_users.env + +docker rm -f synapse 2>/dev/null || true + +docker run -d --name synapse --tmpfs /data \ + --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ + --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ + -p 80:80 matrixdotorg/synapse:latest + +while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do +echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" + sleep 2 +done + +echo "Homeserver is online!" + +# create users +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" + +echo "Homeserver is ready! Please rerun this script every time before starting an integration test!" \ No newline at end of file diff --git a/scripts/release-ios-testflight.sh b/scripts/release-ios-testflight.sh index f536702ceb..01dc4be0b1 100755 --- a/scripts/release-ios-testflight.sh +++ b/scripts/release-ios-testflight.sh @@ -1,15 +1,28 @@ #!/bin/sh -ve -git apply ./scripts/enable-android-google-services.patch + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +# Enable FCM and get packages +flutter pub add fcm_shared_isolate +sed -i '' 's,//,,g' lib/utils/background_push.dart flutter clean flutter pub get -cd ios -rm -rf Pods -rm Podfile.lock -arch -x86_64 pod install -arch -x86_64 pod update -cd .. -flutter build ios --release -cd ios -bundle update fastlane -bundle exec fastlane beta -cd .. \ No newline at end of file + +# Reload all cocoapods +( + cd ios + rm -rf Pods Podfile.lock + pod install + pod update +) + +# Build and open archive dialog +xcodebuild \ + -workspace ios/Runner.xcworkspace \ + -scheme Runner \ + -configuration Release \ + -archivePath build/Runner.xcarchive \ + archive && open -a Xcode build/Runner.xcarchive \ No newline at end of file diff --git a/scripts/release-playstore-beta.sh b/scripts/release-playstore-beta.sh deleted file mode 100755 index 7d4dcd4b0a..0000000000 --- a/scripts/release-playstore-beta.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -flutter pub get -flutter build appbundle --target-platform android-arm,android-arm64,android-x64 -mkdir -p build/android -cp build/app/outputs/bundle/release/app-release.aab build/android/ -cd android -bundle install -bundle update fastlane -bundle exec fastlane deploy_internal_test -cd .. diff --git a/scripts/release-playstore.sh b/scripts/release-playstore.sh deleted file mode 100755 index f78d38cb5f..0000000000 --- a/scripts/release-playstore.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -ve -RELEASE_TYPE=$(echo $CI_COMMIT_TAG | grep -oE "[a-z]+") -cd android -if [ "$RELEASE_TYPE" = "rc" ]; then - bundle exec fastlane deploy_candidate -else - bundle exec fastlane deploy_release -fi -cd .. diff --git a/scripts/update-dependencies.sh b/scripts/update-dependencies.sh deleted file mode 100755 index 5f783fc55c..0000000000 --- a/scripts/update-dependencies.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -ve -flutter pub upgrade --major-versions -flutter pub get -dart fix --apply -flutter format lib test -flutter pub run import_sorter:main --no-comments \ No newline at end of file diff --git a/scripts/update-license-headers.sh b/scripts/update-license-headers.sh new file mode 100755 index 0000000000..6a97582200 --- /dev/null +++ b/scripts/update-license-headers.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +# SPDX-FileCopyrightText: 2019-Present Christian Kußowski +# SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +find . -type f \ + -not -path "*/.*" \ + -not -path "*/*.json" \ + -not -path "*/pubspec.lock" \ + -not -path "*/build/*" \ + -not -path "*/assets/*" \ + -not -path "*/lib/l10n/*" \ + -not -path "*/android/*" \ + -not -path "*/ios/*" \ + -not -path "*/linux/*" \ + -not -path "*/macos/*" \ + -not -path "*/LICENSE" \ + -not -path "*/LICENSES/*" \ + -not -path "*/integration_test/synapse/*" \ + -not -path "*/integration_test/data/*" \ + -not -path "*/snap/*" \ + -not -path "*/web/*" \ + -not -path "*/windows/*" \ + -exec reuse annotate \ + --copyright="Christian Kußowski" \ + --copyright="Contributors to FluffyChat" \ + --license="AGPL-3.0-or-later" \ + --year="2019-Present" \ + --merge-copyrights \ + {} + \ No newline at end of file diff --git a/snap/gui/fluffychat.desktop b/snap/gui/fluffychat.desktop new file mode 100755 index 0000000000..886148753b --- /dev/null +++ b/snap/gui/fluffychat.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=FluffyChat +GenericName=Matrix Client +Comment=Chat with your friends +Exec=fluffychat +Icon=${SNAP}/meta/gui/fluffychat.png +Terminal=false +Type=Application +Categories=Network;Chat;InstantMessaging; diff --git a/snap/gui/fluffychat.png b/snap/gui/fluffychat.png new file mode 100644 index 0000000000..1e32231dff Binary files /dev/null and b/snap/gui/fluffychat.png differ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000000..42742e38a1 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,133 @@ +name: fluffychat +title: FluffyChat +base: core24 +version: 2.7.2 +license: AGPL-3.0 +summary: The cutest messenger in the Matrix network +description: | + FluffyChat is an open source, nonprofit and cute matrix messenger app. The app is easy to use but secure and decentralized. + + + ## Features + + - Send all kinds of messages, images and files + - Voice messages + - Location sharing + - Push notifications + - Unlimited private and public group chats + - Public channels with thousands of participants + - Feature rich group moderation including all matrix features + - Discover and join public groups + - Dark mode + - Hides complexity of Matrix IDs behind simple QR codes + - Custom emotes and stickers + - Video calls via sharing links to Jitsi + - Spaces + - Compatible with Element, Nheko, NeoChat and all other Matrix apps + - End to end encryption + - Emoji verification & cross signing + - And much more... + + + ## FluffyChat comes with a dream + + Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends. + + A world where there are no companies spying on you when you send selfies to friends and lovers. + + And a world where apps are made for fluffyness and not for profit. ♥ + + Join the community: https://matrix.to/#/#fluffy-space:matrix.org + Website: http://fluffychat.im + Microblog: https://mastodon.art/@krille + +grade: stable +confinement: strict + +platforms: + amd64: + build-on: amd64 + arm64: + build-on: arm64 + +parts: + flutter-git: + source: https://github.com/flutter/flutter.git + source-tag: 3.44.4 + source-depth: 1 + plugin: nil + override-build: | + mkdir -p $CRAFT_PART_INSTALL/usr/bin + mkdir -p $CRAFT_PART_INSTALL/usr/libexec + cp -r $CRAFT_PART_SRC $CRAFT_PART_INSTALL/usr/libexec/flutter + ln -s $CRAFT_PART_INSTALL/usr/libexec/flutter/bin/flutter $CRAFT_PART_INSTALL/usr/bin/flutter + ln -s $SNAPCRAFT_PART_INSTALL/usr/libexec/flutter/bin/dart $SNAPCRAFT_PART_INSTALL/usr/bin/dart + $CRAFT_PART_INSTALL/usr/bin/flutter doctor + build-packages: + - clang + - cmake + - curl + - libgtk-3-dev + - ninja-build + - unzip + - xz-utils + - zip + - lld + - llvm-18 + override-prime: '' + + fluffychat: + after: [flutter-git] + plugin: nil + source: . + override-build: | + # Workaround for Flutter build error: + rm -rf build + + flutter build linux --release -v + mkdir -p $CRAFT_PART_INSTALL/bin/ + cp -r build/linux/*/release/bundle/* $CRAFT_PART_INSTALL/bin/ + build-packages: + - libsecret-1-dev + - libjsoncpp-dev + - libssl-dev + - curl + - libpciaccess-dev + build-snaps: + - rustup + stage-packages: + - libsecret-1-0 + - libjsoncpp25 + - libpciaccess0 + +slots: + dbus-svc: + interface: dbus + bus: session + name: chat.fluffy.fluffychat + +apps: + fluffychat: + command: bin/fluffychat + extensions: [ gnome ] + plugs: + - audio-playback + - desktop + - desktop-legacy + - home + - network + - network-manager + - network-manager-observe + - opengl + - removable-media + - browser-support + - password-manager-service + slots: + - dbus-svc + # Workaround for: + # https://github.com/flutter-webrtc/flutter-webrtc/issues/1212#issuecomment-1611899344 + environment: + XDG_DATA_HOME: $SNAP_USER_DATA + XDG_DATA_DIRS: $SNAP/usr/share + GDK_GL: gles + LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET" diff --git a/test/archive_test.dart b/test/archive_test.dart index 25bb090e78..3f69390bea 100644 --- a/test/archive_test.dart +++ b/test/archive_test.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'package:flutter_test/flutter_test.dart'; void main() { @@ -6,5 +11,6 @@ void main() { testWidget: Archive(), testClient: await testClient(loggedIn: true), ));*/ + return; }); } diff --git a/test/command_hint_test.dart b/test/command_hint_test.dart index b94732373f..c4e1a41334 100644 --- a/test/command_hint_test.dart +++ b/test/command_hint_test.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + import 'dart:convert'; import 'dart:io'; @@ -8,16 +13,17 @@ import 'utils/test_client.dart'; void main() async { test('Check for missing /command hints', () async { final translated = - jsonDecode(File('assets/l10n/intl_en.arb').readAsStringSync()) - .keys + jsonDecode(File('lib/l10n/intl_en.arb').readAsStringSync()).keys .where((String k) => k.startsWith('commandHint_')) .map((k) => k.replaceFirst('commandHint_', '')); final commands = (await prepareTestClient()).commands.keys; final missing = commands.where((c) => !translated.contains(c)).toList(); - expect(0, missing.length, - reason: 'missing hints for ' + - missing.toString() + - '\nAdding hints? See scripts/generate_command_hints_glue.sh'); + expect( + 0, + missing.length, + reason: + 'missing hints for $missing\nAdding hints? See scripts/generate_command_hints_glue.sh', + ); }); } diff --git a/test/homeserver_picker_test.dart b/test/homeserver_picker_test.dart index 054f49cab0..cfd5215ac3 100644 --- a/test/homeserver_picker_test.dart +++ b/test/homeserver_picker_test.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + //import 'package:fluffychat/pages/homeserver_picker.dart'; //import 'package:fluffychat/main.dart'; @@ -13,5 +18,6 @@ void main() { testWidget: HomeserverPicker(), ), );*/ + return; }); } diff --git a/test/utils/test_client.dart b/test/utils/test_client.dart index ac9bacf4a6..1f2995019e 100644 --- a/test/utils/test_client.dart +++ b/test/utils/test_client.dart @@ -1,8 +1,13 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +// ignore_for_file: depend_on_referenced_packages + import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_api_lite/fake_matrix_api.dart'; - -import 'package:fluffychat/utils/matrix_sdk_extensions.dart/flutter_hive_collections_database.dart'; +import 'package:sqflite_common_ffi/sqflite_ffi.dart'; Future prepareTestClient({ bool loggedIn = false, @@ -12,7 +17,8 @@ Future prepareTestClient({ homeserver ??= Uri.parse('https://fakeserver.notexisting'); final client = Client( 'FluffyChat Widget Tests', - httpClient: FakeMatrixApi(), + httpClient: FakeMatrixApi() + ..api['GET']!['/.well-known/matrix/client'] = (req) => {}, verificationMethods: { KeyVerificationMethod.numbers, KeyVerificationMethod.emoji, @@ -20,10 +26,14 @@ Future prepareTestClient({ importantStateEvents: { 'im.ponies.room_emotes', // we want emotes to work properly }, - databaseBuilder: FlutterHiveCollectionsDatabase.databaseBuilder, + database: await MatrixSdkDatabase.init( + 'test', + database: await databaseFactoryFfi.openDatabase(':memory:'), + sqfliteFactory: databaseFactoryFfi, + ), supportedLoginTypes: { AuthenticationTypes.password, - AuthenticationTypes.sso + AuthenticationTypes.sso, }, ); await client.checkHomeserver(homeserver); diff --git a/test/widget_test.dart b/test/widget_test.dart index 7d1d98eb6e..85c1f7ce89 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,3 +1,8 @@ +// SPDX-FileCopyrightText: 2019-Present Christian Kußowski +// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat +// +// SPDX-License-Identifier: AGPL-3.0-or-later + // This is a basic Flutter widget test. // // To perform an interaction with a widget in your test, use the WidgetTester @@ -16,5 +21,6 @@ void main() { /* await tester.pumpWidget(FluffyChatApp( client: await prepareTestClient(), ));*/ + return; }); } diff --git a/test_driver/integration_test.dart b/test_driver/integration_test.dart deleted file mode 100644 index b38629cca9..0000000000 --- a/test_driver/integration_test.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:integration_test/integration_test_driver.dart'; - -Future main() => integrationDriver(); diff --git a/web/auth.html b/web/auth.html index 9e0e115c04..806485b73a 100644 --- a/web/auth.html +++ b/web/auth.html @@ -1,14 +1,13 @@ - - Authentication complete - - -

Authentication is complete. If this does not happen automatically, please - close the window. - - + } else { + localStorage.setItem('flutter-web-auth-2', window.location.href); + } + window.close(); + \ No newline at end of file diff --git a/web/favicon.png b/web/favicon.png index e062b83e7b..0aab8764e5 100644 Binary files a/web/favicon.png and b/web/favicon.png differ diff --git a/web/icons/Icon-16.png b/web/icons/Icon-16.png new file mode 100644 index 0000000000..0aab8764e5 Binary files /dev/null and b/web/icons/Icon-16.png differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png index 3781c0638f..86aeff2000 100644 Binary files a/web/icons/Icon-192.png and b/web/icons/Icon-192.png differ diff --git a/web/icons/Icon-32.png b/web/icons/Icon-32.png new file mode 100644 index 0000000000..94aba63419 Binary files /dev/null and b/web/icons/Icon-32.png differ diff --git a/web/icons/Icon-48.png b/web/icons/Icon-48.png new file mode 100644 index 0000000000..871841b2b3 Binary files /dev/null and b/web/icons/Icon-48.png differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png index 8b824e807a..a4418f3cca 100644 Binary files a/web/icons/Icon-512.png and b/web/icons/Icon-512.png differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000..86aeff2000 Binary files /dev/null and b/web/icons/Icon-maskable-192.png differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000..a4418f3cca Binary files /dev/null and b/web/icons/Icon-maskable-512.png differ diff --git a/web/index.html b/web/index.html index 4bf6331c62..a3c336da47 100644 --- a/web/index.html +++ b/web/index.html @@ -11,101 +11,53 @@ For more details: * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base + + This is a placeholder for base href that will be replaced by the value of + the `--base-href` argument provided to `flutter build`. --> - + - + - + + + FluffyChat - + + + + - - + - - - - - - \ No newline at end of file diff --git a/web/manifest.json b/web/manifest.json index e4f6c31cfd..117b277fcf 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -3,8 +3,8 @@ "short_name": "FluffyChat", "start_url": ".", "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", + "background_color": "#FFFFFF", + "theme_color": "#41a2bc", "description": "The cutest messenger in the Matrix network", "orientation": "portrait-primary", "prefer_related_applications": false, @@ -18,6 +18,18 @@ "src": "icons/Icon-512.png", "sizes": "512x512", "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" } ] } \ No newline at end of file diff --git a/web/native_executor.dart b/web/native_executor.dart new file mode 100644 index 0000000000..888af44a91 --- /dev/null +++ b/web/native_executor.dart @@ -0,0 +1,3 @@ +import 'package:matrix/matrix.dart'; + +void main() => startWebWorker(); diff --git a/web/splash/img/dark-1x.png b/web/splash/img/dark-1x.png deleted file mode 100644 index f4c0bdb922..0000000000 Binary files a/web/splash/img/dark-1x.png and /dev/null differ diff --git a/web/splash/img/dark-2x.png b/web/splash/img/dark-2x.png deleted file mode 100644 index dafa3b7070..0000000000 Binary files a/web/splash/img/dark-2x.png and /dev/null differ diff --git a/web/splash/img/dark-3x.png b/web/splash/img/dark-3x.png deleted file mode 100644 index b627f52801..0000000000 Binary files a/web/splash/img/dark-3x.png and /dev/null differ diff --git a/web/splash/img/dark-4x.png b/web/splash/img/dark-4x.png deleted file mode 100644 index 0d1d2a74df..0000000000 Binary files a/web/splash/img/dark-4x.png and /dev/null differ diff --git a/web/splash/img/light-1x.png b/web/splash/img/light-1x.png deleted file mode 100644 index f4c0bdb922..0000000000 Binary files a/web/splash/img/light-1x.png and /dev/null differ diff --git a/web/splash/img/light-2x.png b/web/splash/img/light-2x.png deleted file mode 100644 index dafa3b7070..0000000000 Binary files a/web/splash/img/light-2x.png and /dev/null differ diff --git a/web/splash/img/light-3x.png b/web/splash/img/light-3x.png deleted file mode 100644 index b627f52801..0000000000 Binary files a/web/splash/img/light-3x.png and /dev/null differ diff --git a/web/splash/img/light-4x.png b/web/splash/img/light-4x.png deleted file mode 100644 index 0d1d2a74df..0000000000 Binary files a/web/splash/img/light-4x.png and /dev/null differ diff --git a/web/splash/style.css b/web/splash/style.css deleted file mode 100644 index 455b79370a..0000000000 --- a/web/splash/style.css +++ /dev/null @@ -1,43 +0,0 @@ -body, html { - margin:0; - height:100%; - background: #ffffff; - background-image: url("img/light-background.png"); - background-size: 100% 100%; -} - -.center { - margin: 0; - position: absolute; - top: 50%; - left: 50%; - -ms-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} - -.contain { - display:block; - width:100%; height:100%; - object-fit: contain; -} - -.stretch { - display:block; - width:100%; height:100%; -} - -.cover { - display:block; - width:100%; height:100%; - object-fit: cover; -} - -@media (prefers-color-scheme: dark) { - body { - margin:0; - height:100%; - background: #000000; - background-image: url("img/dark-background.png"); - background-size: 100% 100%; - } -} diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index a18ebc9deb..1c2b994514 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -1,13 +1,16 @@ -cmake_minimum_required(VERSION 3.15) +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) project(fluffychat LANGUAGES CXX) +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. set(BINARY_NAME "fluffychat") +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. cmake_policy(SET CMP0063 NEW) -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Configure build options. +# Define build configuration option. get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(IS_MULTICONFIG) set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" @@ -20,7 +23,7 @@ else() "Debug" "Profile" "Release") endif() endif() - +# Define settings for the Profile build mode. set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") @@ -30,6 +33,10 @@ set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") add_definitions(-DUNICODE -D_UNICODE) # Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. function(APPLY_STANDARD_SETTINGS TARGET) target_compile_features(${TARGET} PUBLIC cxx_std_17) target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") @@ -38,12 +45,11 @@ function(APPLY_STANDARD_SETTINGS TARGET) target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") endfunction() -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - # Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") add_subdirectory(${FLUTTER_MANAGED_DIR}) -# Application build +# Application build; see runner/CMakeLists.txt. add_subdirectory("runner") # Generated plugin build rules, which manage building the plugins and adding diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index 744f08a938..930d2071a3 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.15) +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") @@ -23,6 +24,7 @@ list(APPEND FLUTTER_LIBRARY_HEADERS "flutter_windows.h" "flutter_messenger.h" "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" ) list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") add_library(flutter INTERFACE) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 56ab0b39e7..5fa6fba843 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,24 +6,57 @@ #include "generated_plugin_registrant.h" -#include #include -#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { - ConnectivityPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); DesktopDropPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("DesktopDropPlugin")); - DesktopLifecyclePluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("DesktopLifecyclePlugin")); + DesktopWebviewWindowPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopWebviewWindowPlugin")); + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); + EmojiPickerFlutterPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("EmojiPickerFlutterPluginCApi")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); FlutterWebRTCPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); + PasteboardPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PasteboardPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + Sqlite3FlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); + WindowManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowManagerPlugin")); + WindowToFrontPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowToFrontPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b337d49a15..9b54d5e3e7 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,15 +3,29 @@ # list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus_windows desktop_drop - desktop_lifecycle + desktop_webview_window + dynamic_color + emoji_picker_flutter + file_selector_windows flutter_secure_storage_windows flutter_webrtc + geolocator_windows + local_auth_windows + pasteboard + record_windows + screen_retriever_windows + share_plus + sqlcipher_flutter_libs url_launcher_windows + window_manager + window_to_front ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + flutter_local_notifications_windows + flutter_vodozemac + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index 977e38b5d1..b9e550fba8 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -1,18 +1,32 @@ -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.14) project(runner LANGUAGES CXX) +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. add_executable(${BINARY_NAME} WIN32 "flutter_window.cpp" "main.cpp" - "run_loop.cpp" "utils.cpp" "win32_window.cpp" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" "Runner.rc" "runner.exe.manifest" ) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. apply_standard_settings(${BINARY_NAME}) + +# Disable Windows macros that collide with C++ standard library functions. target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 7951cb5091..52aa4877ac 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -90,12 +90,12 @@ BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "chat.fluffy" "\0" - VALUE "FileDescription", "A new Flutter project." "\0" + VALUE "FileDescription", "fluffychat" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "FluffyChat" "\0" - VALUE "LegalCopyright", "Copyright (C) 2020 chat.fluffy. All rights reserved." "\0" + VALUE "InternalName", "fluffychat" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 chat.fluffy. All rights reserved." "\0" VALUE "OriginalFilename", "fluffychat.exe" "\0" - VALUE "ProductName", "FluffyChat" "\0" + VALUE "ProductName", "fluffychat" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp index c422723045..b43b9095ea 100644 --- a/windows/runner/flutter_window.cpp +++ b/windows/runner/flutter_window.cpp @@ -4,9 +4,8 @@ #include "flutter/generated_plugin_registrant.h" -FlutterWindow::FlutterWindow(RunLoop* run_loop, - const flutter::DartProject& project) - : run_loop_(run_loop), project_(project) {} +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} FlutterWindow::~FlutterWindow() {} @@ -26,14 +25,12 @@ bool FlutterWindow::OnCreate() { return false; } RegisterPlugins(flutter_controller_->engine()); - run_loop_->RegisterFlutterInstance(flutter_controller_->engine()); SetChildContent(flutter_controller_->view()->GetNativeWindow()); return true; } void FlutterWindow::OnDestroy() { if (flutter_controller_) { - run_loop_->UnregisterFlutterInstance(flutter_controller_->engine()); flutter_controller_ = nullptr; } @@ -44,7 +41,7 @@ LRESULT FlutterWindow::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opporutunity to handle window messages. + // Give Flutter, including plugins, an opportunity to handle window messages. if (flutter_controller_) { std::optional result = flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h index b663ddd501..6da0652f05 100644 --- a/windows/runner/flutter_window.h +++ b/windows/runner/flutter_window.h @@ -6,16 +6,13 @@ #include -#include "run_loop.h" #include "win32_window.h" // A window that does nothing but host a Flutter view. class FlutterWindow : public Win32Window { public: - // Creates a new FlutterWindow driven by the |run_loop|, hosting a - // Flutter view running |project|. - explicit FlutterWindow(RunLoop* run_loop, - const flutter::DartProject& project); + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); virtual ~FlutterWindow(); protected: @@ -26,9 +23,6 @@ class FlutterWindow : public Win32Window { LPARAM const lparam) noexcept override; private: - // The run loop driving events for this window. - RunLoop* run_loop_; - // The project to run. flutter::DartProject project_; diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 553f9c0fd7..3c2f3ab5e8 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -3,7 +3,6 @@ #include #include "flutter_window.h" -#include "run_loop.h" #include "utils.h" int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, @@ -18,10 +17,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, // plugins. ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - RunLoop run_loop; - flutter::DartProject project(L"data"); - FlutterWindow window(&run_loop, project); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); if (!window.CreateAndShow(L"FluffyChat", origin, size)) { @@ -29,7 +32,11 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, } window.SetQuitOnClose(true); - run_loop.Run(); + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } ::CoUninitialize(); return EXIT_SUCCESS; diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index f53c6c0053..6995a1126a 100644 Binary files a/windows/runner/resources/app_icon.ico and b/windows/runner/resources/app_icon.ico differ diff --git a/windows/runner/run_loop.cpp b/windows/runner/run_loop.cpp deleted file mode 100644 index f23c5f2169..0000000000 --- a/windows/runner/run_loop.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "run_loop.h" - -#include - -#include - -RunLoop::RunLoop() {} - -RunLoop::~RunLoop() {} - -void RunLoop::Run() { - MSG msg; - while (GetMessage(&msg, nullptr, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } -} - -void RunLoop::RegisterFlutterInstance( - flutter::FlutterEngine* flutter_instance) { - flutter_instances_.insert(flutter_instance); -} - -void RunLoop::UnregisterFlutterInstance( - flutter::FlutterEngine* flutter_instance) { - flutter_instances_.erase(flutter_instance); -} - -RunLoop::TimePoint RunLoop::ProcessFlutterMessages() { - TimePoint next_event_time = TimePoint::max(); - for (auto instance : flutter_instances_) { - std::chrono::nanoseconds wait_duration = instance->ProcessMessages(); - if (wait_duration != std::chrono::nanoseconds::max()) { - next_event_time = - std::min(next_event_time, TimePoint::clock::now() + wait_duration); - } - } - return next_event_time; -} diff --git a/windows/runner/run_loop.h b/windows/runner/run_loop.h deleted file mode 100644 index 000d362463..0000000000 --- a/windows/runner/run_loop.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef RUNNER_RUN_LOOP_H_ -#define RUNNER_RUN_LOOP_H_ - -#include - -#include -#include - -// A runloop that will service events for Flutter instances as well -// as native messages. -class RunLoop { - public: - RunLoop(); - ~RunLoop(); - - // Prevent copying - RunLoop(RunLoop const&) = delete; - RunLoop& operator=(RunLoop const&) = delete; - - // Runs the run loop until the application quits. - void Run(); - - // Registers the given Flutter instance for event servicing. - void RegisterFlutterInstance( - flutter::FlutterEngine* flutter_instance); - - // Unregisters the given Flutter instance from event servicing. - void UnregisterFlutterInstance( - flutter::FlutterEngine* flutter_instance); - - private: - using TimePoint = std::chrono::steady_clock::time_point; - - // Processes all currently pending messages for registered Flutter instances. - TimePoint ProcessFlutterMessages(); - - std::set flutter_instances_; -}; - -#endif // RUNNER_RUN_LOOP_H_ diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp index 37501e5db7..f5bf9fa0f5 100644 --- a/windows/runner/utils.cpp +++ b/windows/runner/utils.cpp @@ -20,3 +20,45 @@ void CreateAndAttachConsole() { FlutterDesktopResyncOutputStreams(); } } + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h index d792603bb1..3879d54755 100644 --- a/windows/runner/utils.h +++ b/windows/runner/utils.h @@ -1,8 +1,19 @@ #ifndef RUNNER_UTILS_H_ #define RUNNER_UTILS_H_ +#include +#include + // Creates a console for the process, and redirects stdout and stderr to // it for both the runner and the Flutter library. void CreateAndAttachConsole(); +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + #endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index efc3eb9f22..c10f08dc7d 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -173,7 +173,7 @@ Win32Window::MessageHandler(HWND hwnd, return 0; } - case WM_SIZE: + case WM_SIZE: { RECT rect = GetClientArea(); if (child_content_ != nullptr) { // Size and position the child window. @@ -181,6 +181,7 @@ Win32Window::MessageHandler(HWND hwnd, rect.bottom - rect.top, TRUE); } return 0; + } case WM_ACTIVATE: if (child_content_ != nullptr) { diff --git a/winuwp/.gitignore b/winuwp/.gitignore deleted file mode 100644 index d492d0d98c..0000000000 --- a/winuwp/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ diff --git a/winuwp/CMakeLists.txt b/winuwp/CMakeLists.txt deleted file mode 100644 index 7530c80c6f..0000000000 --- a/winuwp/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) -project(fluffychat LANGUAGES CXX) - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0079 NEW) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "fluffychat") - -# Define build configuration options. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() -# Define settings for the Profile build mode. -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100" /await) - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") - target_compile_definitions(${TARGET} PRIVATE WINUWP) - set_target_properties(${TARGET} PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.18362.0) -endfunction() - -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - -# Flutter library and tool build rules. -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -add_subdirectory("runner_uwp") - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) diff --git a/winuwp/flutter/CMakeLists.txt b/winuwp/flutter/CMakeLists.txt deleted file mode 100644 index 9adbd9ddb3..0000000000 --- a/winuwp/flutter/CMakeLists.txt +++ /dev/null @@ -1,92 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -include(CMakePrintHelpers) - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows_winuwp.dll") - -# === Assets === -set(CMAKE_INSTALL_MANIFEST "${EPHEMERAL_DIR}/install_manifest") -file(STRINGS ${CMAKE_INSTALL_MANIFEST} INSTALL_MANIFEST_CONTENT) - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(INSTALL_MANIFEST_CONTENT ${INSTALL_MANIFEST_CONTENT} PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) diff --git a/winuwp/flutter/flutter_windows.h b/winuwp/flutter/flutter_windows.h deleted file mode 100644 index 0aeb6fdc15..0000000000 --- a/winuwp/flutter/flutter_windows.h +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_H_ -#define FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_H_ - -#include -#include -#include - -#include "flutter_export.h" -#include "flutter_messenger.h" -#include "flutter_plugin_registrar.h" - -#ifdef WINUWP -#include -#include -#endif - -#if defined(__cplusplus) -extern "C" { -#endif - -// Opaque reference to a Flutter window controller. -typedef struct FlutterDesktopViewControllerState* - FlutterDesktopViewControllerRef; - -// Opaque reference to a Flutter window. -struct FlutterDesktopView; -typedef struct FlutterDesktopView* FlutterDesktopViewRef; - -// Opaque reference to a Flutter engine instance. -struct FlutterDesktopEngine; -typedef struct FlutterDesktopEngine* FlutterDesktopEngineRef; - -// Properties for configuring a Flutter engine instance. -typedef struct { - // The path to the flutter_assets folder for the application to be run. - // This can either be an absolute path or a path relative to the directory - // containing the executable. - const wchar_t* assets_path; - - // The path to the icudtl.dat file for the version of Flutter you are using. - // This can either be an absolute path or a path relative to the directory - // containing the executable. - const wchar_t* icu_data_path; - - // The path to the AOT library file for your application, if any. - // This can either be an absolute path or a path relative to the directory - // containing the executable. This can be nullptr for a non-AOT build, as - // it will be ignored in that case. - const wchar_t* aot_library_path; - - // Number of elements in the array passed in as dart_entrypoint_argv. - int dart_entrypoint_argc; - - // Array of Dart entrypoint arguments. This is deep copied during the call - // to FlutterDesktopEngineCreate. - const char** dart_entrypoint_argv; - -} FlutterDesktopEngineProperties; - -// ========== View Controller ========== - -// Creates a view that hosts and displays the given engine instance. -// -// This takes ownership of |engine|, so FlutterDesktopEngineDestroy should no -// longer be called on it, as it will be called internally when the view -// controller is destroyed. If creating the view controller fails, the engine -// will be destroyed immediately. -// -// If |engine| is not already running, the view controller will start running -// it automatically before displaying the window. -// -// The caller owns the returned reference, and is responsible for calling -// FlutterDesktopViewControllerDestroy. Returns a null pointer in the event of -// an error. -#ifdef WINUWP -// The CoreApplicationView implementation accepts a pointer to the host -// CoreApplicationView and view hookup is performed in the construction path. -FLUTTER_EXPORT FlutterDesktopViewControllerRef -FlutterDesktopViewControllerCreateFromCoreApplicationView( - ABI::Windows::ApplicationModel::Core::CoreApplicationView* window, - ABI::Windows::ApplicationModel::Activation::IActivatedEventArgs* args, - FlutterDesktopEngineRef engine); -#else //! WINUWP -// The Win32 implementation accepts width, height -// with view hookup explicitly performed using the caller using HWND parenting. -FLUTTER_EXPORT FlutterDesktopViewControllerRef -FlutterDesktopViewControllerCreate(int width, - int height, - FlutterDesktopEngineRef engine); -#endif - -// Shuts down the engine instance associated with |controller|, and cleans up -// associated state. -// -// |controller| is no longer valid after this call. -FLUTTER_EXPORT void FlutterDesktopViewControllerDestroy( - FlutterDesktopViewControllerRef controller); - -// Returns the handle for the engine running in FlutterDesktopViewControllerRef. -// -// Its lifetime is the same as the |controller|'s. -FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine( - FlutterDesktopViewControllerRef controller); -// Returns the view managed by the given controller. - -FLUTTER_EXPORT FlutterDesktopViewRef -FlutterDesktopViewControllerGetView(FlutterDesktopViewControllerRef controller); - -// Requests new frame from engine and repaints the view -FLUTTER_EXPORT void FlutterDesktopViewControllerForceRedraw( - FlutterDesktopViewControllerRef controller); - -#ifndef WINUWP -// Allows the Flutter engine and any interested plugins an opportunity to -// handle the given message. -// -// If the WindowProc was handled and further handling should stop, this returns -// true and |result| will be populated. |result| is not set if returning false. -FLUTTER_EXPORT bool FlutterDesktopViewControllerHandleTopLevelWindowProc( - FlutterDesktopViewControllerRef controller, - HWND hwnd, - UINT message, - WPARAM wparam, - LPARAM lparam, - LRESULT* result); -#endif - -// ========== Engine ========== - -// Creates a Flutter engine with the given properties. -// -// The caller owns the returned reference, and is responsible for calling -// FlutterDesktopEngineDestroy. The lifetime of |engine_properties| is required -// to extend only until the end of this call. -FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopEngineCreate( - const FlutterDesktopEngineProperties* engine_properties); - -// Shuts down and destroys the given engine instance. Returns true if the -// shutdown was successful, or if the engine was not running. -// -// |engine| is no longer valid after this call. -FLUTTER_EXPORT bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine); - -// Starts running the given engine instance and optional entry point in the Dart -// project. If the entry point is null, defaults to main(). -// -// If provided, entry_point must be the name of a top-level function from the -// same Dart library that contains the app's main() function, and must be -// decorated with `@pragma(vm:entry-point)` to ensure the method is not -// tree-shaken by the Dart compiler. -// -// Returns false if running the engine failed. -FLUTTER_EXPORT bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, - const char* entry_point); - -#ifndef WINUWP -// DEPRECATED: This is no longer necessary to call, Flutter will take care of -// processing engine messages transparently through DispatchMessage. -// -// Processes any pending events in the Flutter engine, and returns the -// number of nanoseconds until the next scheduled event (or max, if none). -// -// This should be called on every run of the application-level runloop, and -// a wait for native events in the runloop should never be longer than the -// last return value from this function. -FLUTTER_EXPORT uint64_t -FlutterDesktopEngineProcessMessages(FlutterDesktopEngineRef engine); -#endif - -FLUTTER_EXPORT void FlutterDesktopEngineReloadSystemFonts( - FlutterDesktopEngineRef engine); - -FLUTTER_EXPORT void FlutterDesktopEngineReloadPlatformBrightness( - FlutterDesktopEngineRef engine); - -// Returns the plugin registrar handle for the plugin with the given name. -// -// The name must be unique across the application. -FLUTTER_EXPORT FlutterDesktopPluginRegistrarRef -FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, - const char* plugin_name); - -// Returns the messenger associated with the engine. -FLUTTER_EXPORT FlutterDesktopMessengerRef -FlutterDesktopEngineGetMessenger(FlutterDesktopEngineRef engine); - -// Returns the texture registrar associated with the engine. -FLUTTER_EXPORT FlutterDesktopTextureRegistrarRef -FlutterDesktopEngineGetTextureRegistrar( - FlutterDesktopTextureRegistrarRef texture_registrar); - -// ========== View ========== - -#ifdef WINUWP -// Return backing CoreApplicationView for manipulation of CoreWindow and -// CoreTitleBar in host application. -FLUTTER_EXPORT ABI::Windows::ApplicationModel::Core::CoreApplicationView* -FlutterDesktopViewGetCoreApplicationView(FlutterDesktopViewRef view); -#else -// Return backing HWND for manipulation in host application. -FLUTTER_EXPORT HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef view); -#endif - -// ========== Plugin Registrar (extensions) ========== -// These are Windows-specific extensions to flutter_plugin_registrar.h - -// Function pointer type for top level WindowProc delegate registration. -// -// The user data will be whatever was passed to -// FlutterDesktopRegisterTopLevelWindowProcHandler. -// -// Implementations should populate |result| and return true if the WindowProc -// was handled and further handling should stop. |result| is ignored if the -// function returns false. -typedef bool (*FlutterDesktopWindowProcCallback)(HWND /* hwnd */, - UINT /* uMsg */, - WPARAM /*wParam*/, - LPARAM /* lParam*/, - void* /* user data */, - LRESULT* result); - -// Returns the view associated with this registrar's engine instance. -FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetView( - FlutterDesktopPluginRegistrarRef registrar); - -#ifndef WINUWP -FLUTTER_EXPORT void -FlutterDesktopPluginRegistrarRegisterTopLevelWindowProcDelegate( - FlutterDesktopPluginRegistrarRef registrar, - FlutterDesktopWindowProcCallback delegate, - void* user_data); - -FLUTTER_EXPORT void -FlutterDesktopPluginRegistrarUnregisterTopLevelWindowProcDelegate( - FlutterDesktopPluginRegistrarRef registrar, - FlutterDesktopWindowProcCallback delegate); -#endif - -// ========== Freestanding Utilities ========== - -// Gets the DPI for a given |hwnd|, depending on the supported APIs per -// windows version and DPI awareness mode. If nullptr is passed, returns the DPI -// of the primary monitor. -// -// This uses the same logic and fallback for older Windows versions that is used -// internally by Flutter to determine the DPI to use for displaying Flutter -// content, so should be used by any code (e.g., in plugins) that translates -// between Windows and Dart sizes/offsets. -FLUTTER_EXPORT UINT FlutterDesktopGetDpiForHWND(HWND hwnd); - -// Gets the DPI for a given |monitor|. If the API is not available, a default -// DPI of 96 is returned. -// -// See FlutterDesktopGetDpiForHWND for more information. -FLUTTER_EXPORT UINT FlutterDesktopGetDpiForMonitor(HMONITOR monitor); - -// Reopens stdout and stderr and resysncs the standard library output streams. -// Should be called if output is being directed somewhere in the runner process -// (e.g., after an AllocConsole call). -FLUTTER_EXPORT void FlutterDesktopResyncOutputStreams(); - -#if defined(__cplusplus) -} // extern "C" -#endif - -#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_WINDOWS_H_ diff --git a/winuwp/flutter/generated_plugin_registrant.cc b/winuwp/flutter/generated_plugin_registrant.cc deleted file mode 100644 index 8b6d4680af..0000000000 --- a/winuwp/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void RegisterPlugins(flutter::PluginRegistry* registry) { -} diff --git a/winuwp/flutter/generated_plugin_registrant.h b/winuwp/flutter/generated_plugin_registrant.h deleted file mode 100644 index dc139d85a9..0000000000 --- a/winuwp/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/winuwp/flutter/generated_plugins.cmake b/winuwp/flutter/generated_plugins.cmake deleted file mode 100644 index 4d10c25186..0000000000 --- a/winuwp/flutter/generated_plugins.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) diff --git a/winuwp/project_version b/winuwp/project_version deleted file mode 100644 index c227083464..0000000000 --- a/winuwp/project_version +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-100.png b/winuwp/runner_uwp/Assets/LargeTile.scale-100.png deleted file mode 100644 index fa651eb710..0000000000 Binary files a/winuwp/runner_uwp/Assets/LargeTile.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-125.png b/winuwp/runner_uwp/Assets/LargeTile.scale-125.png deleted file mode 100644 index 649e07696b..0000000000 Binary files a/winuwp/runner_uwp/Assets/LargeTile.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-150.png b/winuwp/runner_uwp/Assets/LargeTile.scale-150.png deleted file mode 100644 index fd14c60cb1..0000000000 Binary files a/winuwp/runner_uwp/Assets/LargeTile.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-200.png b/winuwp/runner_uwp/Assets/LargeTile.scale-200.png deleted file mode 100644 index 873537f333..0000000000 Binary files a/winuwp/runner_uwp/Assets/LargeTile.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/LargeTile.scale-400.png b/winuwp/runner_uwp/Assets/LargeTile.scale-400.png deleted file mode 100644 index 979878f735..0000000000 Binary files a/winuwp/runner_uwp/Assets/LargeTile.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png b/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png deleted file mode 100644 index 735f57adb5..0000000000 Binary files a/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-100.png b/winuwp/runner_uwp/Assets/SmallTile.scale-100.png deleted file mode 100644 index 35e7f6242f..0000000000 Binary files a/winuwp/runner_uwp/Assets/SmallTile.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-125.png b/winuwp/runner_uwp/Assets/SmallTile.scale-125.png deleted file mode 100644 index 2a74cc67e6..0000000000 Binary files a/winuwp/runner_uwp/Assets/SmallTile.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-150.png b/winuwp/runner_uwp/Assets/SmallTile.scale-150.png deleted file mode 100644 index 157124823d..0000000000 Binary files a/winuwp/runner_uwp/Assets/SmallTile.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-200.png b/winuwp/runner_uwp/Assets/SmallTile.scale-200.png deleted file mode 100644 index 07ec2ddcb1..0000000000 Binary files a/winuwp/runner_uwp/Assets/SmallTile.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SmallTile.scale-400.png b/winuwp/runner_uwp/Assets/SmallTile.scale-400.png deleted file mode 100644 index c205729b72..0000000000 Binary files a/winuwp/runner_uwp/Assets/SmallTile.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png deleted file mode 100644 index 6012579815..0000000000 Binary files a/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png deleted file mode 100644 index 0c35be827f..0000000000 Binary files a/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png deleted file mode 100644 index f1e60f33c3..0000000000 Binary files a/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png deleted file mode 100644 index 73d2461cec..0000000000 Binary files a/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png b/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png deleted file mode 100644 index b2b7ca9c40..0000000000 Binary files a/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png deleted file mode 100644 index cdc3e97326..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png deleted file mode 100644 index 71e5a11537..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png deleted file mode 100644 index 60f2e18275..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png deleted file mode 100644 index 20814081db..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png b/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png deleted file mode 100644 index 605aacb023..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png deleted file mode 100644 index 1c78d96bf8..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png deleted file mode 100644 index d49d3d8990..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png deleted file mode 100644 index 8896224683..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png deleted file mode 100644 index 6389ede5a6..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png deleted file mode 100644 index 47e3cd29bd..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png deleted file mode 100644 index 50faa93285..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png deleted file mode 100644 index f0293ed814..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png deleted file mode 100644 index e54a56dbca..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png b/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png deleted file mode 100644 index 4b5fb179f3..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png deleted file mode 100644 index a1a6ec70ab..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png deleted file mode 100644 index c67a8e12f8..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png deleted file mode 100644 index 47d36f63e4..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png deleted file mode 100644 index 50efc008dc..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png deleted file mode 100644 index f86682c9ff..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png b/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png deleted file mode 100644 index 7561269af9..0000000000 Binary files a/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.png b/winuwp/runner_uwp/Assets/StoreLogo.png deleted file mode 100644 index 7385b56c0e..0000000000 Binary files a/winuwp/runner_uwp/Assets/StoreLogo.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png deleted file mode 100644 index fcefe81ba9..0000000000 Binary files a/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png deleted file mode 100644 index 4381be777f..0000000000 Binary files a/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png deleted file mode 100644 index e49390bf3d..0000000000 Binary files a/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png deleted file mode 100644 index fb740e846a..0000000000 Binary files a/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png b/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png deleted file mode 100644 index d1472741ec..0000000000 Binary files a/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png b/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png deleted file mode 100644 index 288995b397..0000000000 Binary files a/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-100.png b/winuwp/runner_uwp/Assets/WideTile.scale-100.png deleted file mode 100644 index 1cb688c7b7..0000000000 Binary files a/winuwp/runner_uwp/Assets/WideTile.scale-100.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-125.png b/winuwp/runner_uwp/Assets/WideTile.scale-125.png deleted file mode 100644 index 7292396154..0000000000 Binary files a/winuwp/runner_uwp/Assets/WideTile.scale-125.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-150.png b/winuwp/runner_uwp/Assets/WideTile.scale-150.png deleted file mode 100644 index d4b275a573..0000000000 Binary files a/winuwp/runner_uwp/Assets/WideTile.scale-150.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-200.png b/winuwp/runner_uwp/Assets/WideTile.scale-200.png deleted file mode 100644 index 6012579815..0000000000 Binary files a/winuwp/runner_uwp/Assets/WideTile.scale-200.png and /dev/null differ diff --git a/winuwp/runner_uwp/Assets/WideTile.scale-400.png b/winuwp/runner_uwp/Assets/WideTile.scale-400.png deleted file mode 100644 index 73d2461cec..0000000000 Binary files a/winuwp/runner_uwp/Assets/WideTile.scale-400.png and /dev/null differ diff --git a/winuwp/runner_uwp/CMakeLists.txt b/winuwp/runner_uwp/CMakeLists.txt deleted file mode 100644 index b4362a4fc5..0000000000 --- a/winuwp/runner_uwp/CMakeLists.txt +++ /dev/null @@ -1,141 +0,0 @@ -cmake_minimum_required (VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) - -include(CMakePrintHelpers) - -project (runner LANGUAGES CXX) - -# UWP tile and icon assets. -set(ASSET_FILES ${ASSET_FILES} - Assets/LargeTile.scale-100.png - Assets/LargeTile.scale-125.png - Assets/LargeTile.scale-150.png - Assets/LargeTile.scale-200.png - Assets/LargeTile.scale-400.png - Assets/LockScreenLogo.scale-200.png - Assets/SmallTile.scale-100.png - Assets/SmallTile.scale-125.png - Assets/SmallTile.scale-150.png - Assets/SmallTile.scale-200.png - Assets/SmallTile.scale-400.png - Assets/SplashScreen.scale-100.png - Assets/SplashScreen.scale-125.png - Assets/SplashScreen.scale-150.png - Assets/SplashScreen.scale-200.png - Assets/SplashScreen.scale-400.png - Assets/Square44x44Logo.altform-unplated_targetsize-16.png - Assets/Square44x44Logo.altform-unplated_targetsize-32.png - Assets/Square44x44Logo.altform-unplated_targetsize-48.png - Assets/Square44x44Logo.altform-unplated_targetsize-256.png - Assets/Square44x44Logo.scale-100.png - Assets/Square44x44Logo.scale-125.png - Assets/Square44x44Logo.scale-150.png - Assets/Square44x44Logo.scale-200.png - Assets/Square44x44Logo.scale-400.png - Assets/Square44x44Logo.targetsize-16.png - Assets/Square44x44Logo.targetsize-24.png - Assets/Square44x44Logo.targetsize-24_altform-unplated.png - Assets/Square44x44Logo.targetsize-32.png - Assets/Square44x44Logo.targetsize-48.png - Assets/Square44x44Logo.targetsize-256.png - Assets/Square150x150Logo.scale-100.png - Assets/Square150x150Logo.scale-125.png - Assets/Square150x150Logo.scale-150.png - Assets/Square150x150Logo.scale-200.png - Assets/Square150x150Logo.scale-400.png - Assets/StoreLogo.png - Assets/StoreLogo.scale-100.png - Assets/StoreLogo.scale-125.png - Assets/StoreLogo.scale-150.png - Assets/StoreLogo.scale-200.png - Assets/StoreLogo.scale-400.png - Assets/Wide310x150Logo.scale-200.png - Assets/WideTile.scale-100.png - Assets/WideTile.scale-125.png - Assets/WideTile.scale-150.png - Assets/WideTile.scale-200.png - Assets/WideTile.scale-400.png -) - -# Configure package manifest file. -set(APP_MANIFEST_NAME Package.appxmanifest) -set(APP_MANIFEST_TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}) -set(SHORT_NAME ${BINARY_NAME}) -set(PACKAGE_GUID "086F9B60-CB52-4D0B-9B4E-AE891E7859D1") - -configure_file( - appxmanifest.in - ${APP_MANIFEST_TARGET_LOCATION} - @ONLY) - -set(CONTENT_FILES ${APP_MANIFEST_TARGET_LOCATION}) - -# Configure package content files. -set_property(SOURCE ${CONTENT_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1) - -set(RESOURCE_FILES ${ASSET_FILES} ${CONTENT_FILES} Windows_TemporaryKey.pfx) -set_property(SOURCE ${ASSET_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1) -set_property(SOURCE ${ASSET_FILES} PROPERTY VS_DEPLOYMENT_LOCATION "Assets") - -set(STRING_FILES Resources.pri) -set_property(SOURCE ${STRING_FILES} PROPERTY VS_TOOL_OVERRIDE "PRIResource") - -source_group("Resource Files" FILES ${RESOURCE_FILES} ${CONTENT_FILES} ${STRING_FILES}) - -# Configure Flutter assets using tool generated install manifest -foreach(ITEM ${INSTALL_MANIFEST_CONTENT}) - get_filename_component(ITEM_REL ${CMAKE_BINARY_DIR} DIRECTORY) - file(RELATIVE_PATH RELPATH ${ITEM_REL} ${ITEM}) - - get_filename_component(RELPATH ${RELPATH} DIRECTORY) - get_filename_component(ITEMEXT ${ITEM} LAST_EXT) - - if("${ITEMEXT}" STREQUAL ".dll" OR "${ITEMEXT}" STREQUAL ".pdb") - string(CONCAT RELPATH "") - elseif ("${ITEMEXT}" STREQUAL ".so") - file(RELATIVE_PATH RELPATH "${ITEM_REL}/winuwp" ${ITEM}) - string(REGEX REPLACE "/" "\\\\" RELPATH ${RELPATH}) - string(CONCAT RELPATH "Assets\\Data") - elseif("${ITEMEXT}" STREQUAL ".dat") - string(CONCAT RELPATH "Assets\\Data") - else() - string(REGEX REPLACE "/" "\\\\" RELPATH ${RELPATH}) - string(CONCAT RELPATH "Assets\\Data\\" ${RELPATH}) - endif() - - cmake_print_variables(${RELPATH}) - - set_property(SOURCE ${ITEM} PROPERTY VS_DEPLOYMENT_CONTENT 1) - set_property(SOURCE ${ITEM} PROPERTY VS_DEPLOYMENT_LOCATION ${RELPATH}) -endforeach() - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable (${BINARY_NAME} WIN32 - main.cpp - flutter_frameworkview.cpp - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - ${RESOURCE_FILES} - ${INSTALL_MANIFEST_CONTENT} -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE WindowsApp flutter flutter_wrapper_app) -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/winuwp/runner_uwp/CMakeSettings.json b/winuwp/runner_uwp/CMakeSettings.json deleted file mode 100644 index ba63a530d7..0000000000 --- a/winuwp/runner_uwp/CMakeSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. - "configurations": [ - { - "name": "Debug", - "generator": "Visual Studio 15 2017 Win64", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", - "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, - { - "name": "Release", - "generator": "Visual Studio 15 2017 Win64", - "configurationType": "Release", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", - "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - } - ] -} diff --git a/winuwp/runner_uwp/Windows_TemporaryKey.pfx b/winuwp/runner_uwp/Windows_TemporaryKey.pfx deleted file mode 100644 index 1cad9993d6..0000000000 Binary files a/winuwp/runner_uwp/Windows_TemporaryKey.pfx and /dev/null differ diff --git a/winuwp/runner_uwp/appxmanifest.in b/winuwp/runner_uwp/appxmanifest.in deleted file mode 100644 index 570d424ee8..0000000000 --- a/winuwp/runner_uwp/appxmanifest.in +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - @SHORT_NAME@ - CMake Test Cert - Assets/StoreLogo.png - - - - - - - - - - - - - - - - - - - - - - diff --git a/winuwp/runner_uwp/flutter_frameworkview.cpp b/winuwp/runner_uwp/flutter_frameworkview.cpp deleted file mode 100644 index bcdc73adbf..0000000000 --- a/winuwp/runner_uwp/flutter_frameworkview.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "winrt/Windows.ApplicationModel.Core.h" -#include "winrt/Windows.Foundation.h" -#include "winrt/Windows.System.Profile.h" -#include "winrt/Windows.System.Threading.h" -#include "winrt/Windows.UI.Core.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -struct FlutterFrameworkView - : winrt::implements< - FlutterFrameworkView, - winrt::Windows::ApplicationModel::Core::IFrameworkView> { - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void - Initialize(winrt::Windows::ApplicationModel::Core::CoreApplicationView const - &applicationView) { - - // Layout scaling must be disabled in the appinitialization phase in order - // to take effect correctly. - if (winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo() - .DeviceFamily() == L"Windows.Xbox") { - - bool result = winrt::Windows::UI::ViewManagement::ApplicationViewScaling:: - TrySetDisableLayoutScaling(true); - if (!result) { - OutputDebugString(L"Couldn't disable layout scaling"); - } - } - - main_view_ = applicationView; - main_view_.Activated({this, &FlutterFrameworkView::OnActivated}); - } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void Uninitialize() { - main_view_.Activated(nullptr); - main_view_ = nullptr; - } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void Load(winrt::hstring const &) {} - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void Run() { - winrt::Windows::UI::Core::CoreWindow window = - winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread(); - - winrt::Windows::UI::Core::CoreDispatcher dispatcher = window.Dispatcher(); - dispatcher.ProcessEvents( - winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessUntilQuit); - } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - winrt::Windows::Foundation::IAsyncAction - SetWindow(winrt::Windows::UI::Core::CoreWindow const &window) { - - // Capture reference to window. - window_ = window; - - // Lay out the window's content within the region occupied by the - // CoreWindow. - auto appView = winrt::Windows::UI::ViewManagement::ApplicationView:: - GetForCurrentView(); - - appView.SetDesiredBoundsMode(winrt::Windows::UI::ViewManagement:: - ApplicationViewBoundsMode::UseCoreWindow); - - // Configure folder paths. - try { - winrt::Windows::Storage::StorageFolder folder = - winrt::Windows::ApplicationModel::Package::Current() - .InstalledLocation(); - - winrt::Windows::Storage::StorageFolder assets = - co_await folder.GetFolderAsync(L"Assets"); - winrt::Windows::Storage::StorageFolder data = - co_await assets.GetFolderAsync(L"data"); - winrt::Windows::Storage::StorageFolder flutter_assets = - co_await data.GetFolderAsync(L"flutter_assets"); - winrt::Windows::Storage::StorageFile icu_data = - co_await data.GetFileAsync(L"icudtl.dat"); - -#if NDEBUG - winrt::Windows::Storage::StorageFile aot_data = - co_await data.GetFileAsync(L"app.so"); -#endif - - std::wstring flutter_assets_path{flutter_assets.Path()}; - std::wstring icu_data_path{icu_data.Path()}; - std::wstring aot_data_path { -#if NDEBUG - aot_data.Path() -#endif - }; - - flutter::DartProject project(flutter_assets_path, icu_data_path, - aot_data_path); - - // Construct viewcontroller using the Window and project - flutter_view_controller_ = std::make_unique( - static_cast(winrt::get_abi(main_view_)), - static_cast(winrt::get_abi(launch_args_)), - project); - - // If plugins present, register them. - RegisterPlugins(flutter_view_controller_.get()->engine()); - } catch (winrt::hresult_error &err) { - winrt::Windows::UI::Popups::MessageDialog md = - winrt::Windows::UI::Popups::MessageDialog::MessageDialog( - L"There was a problem starting the engine: " + err.message()); - md.ShowAsync(); - } - } - - void OnActivated( - winrt::Windows::ApplicationModel::Core::CoreApplicationView const - &applicationView, - winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const - &args) { - // Activate the application window, making it visible and enabling it to - // receive events. - applicationView.CoreWindow().Activate(); - - // Capture launch args to later pass to Flutter. - launch_args_ = args; - } - - // Current CoreApplicationView. - winrt::Windows::ApplicationModel::Core::CoreApplicationView main_view_{ - nullptr}; - - // Current CoreWindow. - winrt::Windows::UI::Core::CoreWindow window_{nullptr}; - - // Current FlutterViewController. - std::unique_ptr flutter_view_controller_{ - nullptr}; - - // Launch args that were passed in on activation. - winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs - launch_args_; -}; diff --git a/winuwp/runner_uwp/main.cpp b/winuwp/runner_uwp/main.cpp deleted file mode 100644 index 1ce54b1fc1..0000000000 --- a/winuwp/runner_uwp/main.cpp +++ /dev/null @@ -1,30 +0,0 @@ - -#include - -#include "winrt/Windows.ApplicationModel.Core.h" -#include "winrt/Windows.Foundation.h" -#include -#include -#include - -#include - -#include "flutter_frameworkview.cpp" - -struct App - : winrt::implements< - App, winrt::Windows::ApplicationModel::Core::IFrameworkViewSource> { - App() { view_ = winrt::make_self(); } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkViewSource| - winrt::Windows::ApplicationModel::Core::IFrameworkView CreateView() { - return view_.as(); - } - - winrt::com_ptr view_; -}; - -int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) { - winrt::Windows::ApplicationModel::Core::CoreApplication::Run( - winrt::make()); -} diff --git a/winuwp/runner_uwp/resources.pri b/winuwp/runner_uwp/resources.pri deleted file mode 100644 index 7de03c9dc3..0000000000 Binary files a/winuwp/runner_uwp/resources.pri and /dev/null differ